Hardware components | ||||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
Software apps and online services | ||||||
|
GSM Module enables to access something (nearly) enerywhere. GSM module has a lot of way to connect devices such as sound, SMS, or GPRS Internet connection.
I want to show most of devices can be turned on (or off) by an SMS to my pupils (I am a teacher). 14 leds and 8 relays can be controlled by SMS. I used Telit GM862 module. This module is tired and there are more capable modules of Telit or other manifacturers. There is some syntax differencies between gsm modules but they are controlled mostly same AT commands. If different module is used AT Command syntax should be modified.
L is prefix for leds
R is prefix for Relays
0 to 9 and A,B,C,D are led numbers
0 to 7 are relay numbers.
ON -> turns on device
OFF -> turns off device
Some Exampe
LAON --> Led 10 ON
LDOFF --> Led 14 OFF
R6OFF --> Relay 6 OFF
R0OFF --> relay 0 OFF
Stat SMS text reads relay and LED states and sends back SMS including which Relays and LEDs are on and off.
Lots of Analog capable ports of Arduino is null. Pots or sensors can be attached these ports. So sensor values can be read by sms or upload to the internet site by gprs.
Lots of device can be controlled by developing codes.
I love programming.
#include <LiquidCrystal.h>
const int rs = 37, en = 35, d4 = 33, d5 = 31, d6 = 29, d7 = 27;
#define led0 26
#define led1 28
#define led2 30
#define led3 32
#define led4 34
#define led5 36
#define led6 38
#define led7 40
#define led8 42
#define led9 44
#define ledA 46
#define ledB 48
#define ledC 50
#define ledD 52
#define rl0 53
#define rl1 51
#define rl2 49
#define rl3 47
#define rl4 45
#define rl5 43
#define rl6 41
#define rl7 39
int rl0Stat;
int rl1Stat;
int rl2Stat;
int rl3Stat;
int rl4Stat;
int rl5Stat;
int rl6Stat;
int rl7Stat;
//LCD backlight için pwm pini
#define pinDimm 8
//LCD backlight için pwm değeri
int dimm;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int led0Stat=0;
int led1Stat=0;
int led2Stat=0;
int led3Stat=0;
int led4Stat=0;
int led5Stat=0;
int led6Stat=0;
int led7Stat=0;
int led8Stat=0;
int led9Stat=0;
int ledAStat=0;
int ledBStat=0;
int ledCStat=0;
int ledDStat=0;
#define pinGsmOnOff 9
#define pinGsmState 10
String data;
String ser3Data;
int isGsmOn;
long int processPlanner;
int dataLen;
String smsNotice="+CMTI";
String telNum;
String enlemStr,boylamStr;
String smsBody;
int sayac,sure;
String temp;
char dirEW;
char dirNS;
String deg;
int mn;
int scnd;
long int dec;
int gun;
int ay;
int yil;
int sa;
int dk;
int sn;
enum enumCmd
{
eAT,
eATFCLASS,
eATGPSACP,
eATE,
eATCOPS,
eATCNMI,
eATCMGF,
eATCMGD,
eATCMGS,
eATCMGL,
eATCCLK,
eATNITZ
};
//typedef
struct command{
int nr;
String text;
int sure;
};
command myCmd[20]
{
eAT,{"AT"},300,
eATFCLASS,{"AT+FCLASS=8"},300,
eATGPSACP,{"AT$GPSACP"},1000,
eATE,{"ATE0"},300,
eATCOPS,{"AT+COPS?"},300,
eATCNMI,{"AT+CNMI=2,1"},300,
eATCMGF,{"AT+CMGF=1"},300,
eATCMGD,{"AT+CMGD=1,4"},300,
eATCMGS,{"AT+CMGS="},1000,
eATCMGL,{"AT+CMGL=\"ALL\""},2000,
eATCCLK,{"AT+CCLK"},300,
eATNITZ,{"AT#NITZ=1,1"},300
} ;
void sendCmd(int cmd)
{
Serial.print("cmd: ");
Serial.println(myCmd[cmd].text);
Serial3.println(myCmd[cmd].text);
//delay(myCmd[cmd].sure);
delay(10);//minimal bir süre bekle
sure=myCmd[cmd].sure/10;
for (sayac=0;sayac<sure;sayac++)
{
if (Serial3.available()>0)
{
break;
}
else
{
delay(10);
}
}
Serial.print("sayac:");
Serial.println(sayac);
if (Serial3.available()>0)
{
ser3Data=Serial3.readString();
Serial.print("Veri: ");
Serial.println(ser3Data);
if(ser3Data.startsWith("\r\n+CMGL:"))
{
//String smsBody=ser3Data;
//smsBody.replace('\n','_');
//smsBody.replace('\r','_');
//Serial.print("smsBody:");
//Serial.println(smsBody);
telNum=ser3Data.substring(26,39);
Serial.print("Tel Num:");
Serial.println(telNum);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("T:");
lcd.print(telNum);
lcd.setCursor(0,1);
lcd.print("SMS:");
lcd.print(ser3Data.substring(42,46));
//0
if (ser3Data.substring(42,46)=="L0ON")
{
led0Stat=HIGH;
digitalWrite(led0,led0Stat);
}
if (ser3Data.substring(42,47)=="L0OFF")
{
led0Stat=LOW;
digitalWrite(led0,led0Stat);
}
//1
if (ser3Data.substring(42,46)=="L1ON")
{
led1Stat=HIGH;
digitalWrite(led1,led1Stat);
}
if (ser3Data.substring(42,47)=="L1OFF")
{
led1Stat=LOW;
digitalWrite(led1,led1Stat);
}
//2
if (ser3Data.substring(42,46)=="L2ON")
{
led2Stat=HIGH;
digitalWrite(led2,led2Stat);
}
if (ser3Data.substring(42,47)=="L2OFF")
{
led2Stat=LOW;
digitalWrite(led2,led2Stat);
}
//3
if (ser3Data.substring(42,46)=="L3ON")
{
led3Stat=HIGH;
digitalWrite(led3,led3Stat);
}
if (ser3Data.substring(42,47)=="L3OFF")
{
led3Stat=LOW;
digitalWrite(led3,led3Stat);
}
//4
if (ser3Data.substring(42,46)=="L4ON")
{
led4Stat=HIGH;
digitalWrite(led4,led4Stat);
}
if (ser3Data.substring(42,47)=="L4OFF")
{
led4Stat=LOW;
digitalWrite(led4,led4Stat);
}
//5
if (ser3Data.substring(42,46)=="L5ON")
{
led5Stat=HIGH;
digitalWrite(led6,led6Stat);
}
if (ser3Data.substring(42,47)=="L5OFF")
{
led5Stat=LOW;
digitalWrite(led5,led5Stat);
}
//6
if (ser3Data.substring(42,46)=="L6ON")
{
led6Stat=HIGH;
digitalWrite(led6,led6Stat);
}
if (ser3Data.substring(42,47)=="L6OFF")
{
led6Stat=LOW;
digitalWrite(led6,led6Stat);
}
//7
if (ser3Data.substring(42,46)=="L7ON")
{
led7Stat=HIGH;
digitalWrite(led7,led7Stat);
}
if (ser3Data.substring(42,47)=="L7OFF")
{
led7Stat=LOW;
digitalWrite(led7,led7Stat);
}
//8
if (ser3Data.substring(42,46)=="L8ON")
{
led8Stat=HIGH;
digitalWrite(led8,led8Stat);
}
if (ser3Data.substring(42,47)=="L8OFF")
{
led8Stat=LOW;
digitalWrite(led8,led8Stat);
}
//9
if (ser3Data.substring(42,46)=="L9ON")
{
led9Stat=HIGH;
digitalWrite(led9,led9Stat);
}
if (ser3Data.substring(42,47)=="L9OFF")
{
led9Stat=LOW;
digitalWrite(led9,led9Stat);
}
//A
if (ser3Data.substring(42,46)=="LAON")
{
ledAStat=HIGH;
digitalWrite(ledA,ledAStat);
}
if (ser3Data.substring(42,47)=="LAOFF")
{
ledAStat=LOW;
digitalWrite(ledA,ledAStat);
}
//B
if (ser3Data.substring(42,46)=="LBON")
{
ledBStat=HIGH;
digitalWrite(ledB,ledBStat);
}
if (ser3Data.substring(42,47)=="LBOFF")
{
ledBStat=LOW;
digitalWrite(ledB,ledBStat);
}
//C
if (ser3Data.substring(42,46)=="LCON")
{
ledCStat=HIGH;
digitalWrite(ledC,ledCStat);
}
if (ser3Data.substring(42,47)=="LCOFF")
{
ledCStat=LOW;
digitalWrite(ledC,ledCStat);
}
//D
if (ser3Data.substring(42,46)=="LDON")
{
ledDStat=HIGH;
digitalWrite(ledD,ledDStat);
}
if (ser3Data.substring(42,47)=="LDOFF")
{
ledDStat=LOW;
digitalWrite(ledD,ledDStat);
}
//Röle Kontrol
//0
if (ser3Data.substring(42,46)=="R0ON")
{
rl0Stat=HIGH;
digitalWrite(rl0,rl0Stat);
}
if (ser3Data.substring(42,47)=="R0OFF")
{
rl0Stat=LOW;
digitalWrite(rl0,rl0Stat);
}
//1
if (ser3Data.substring(42,46)=="R1ON")
{
rl1Stat=HIGH;
digitalWrite(rl1,rl1Stat);
}
if (ser3Data.substring(42,47)=="R1OFF")
{
rl1Stat=LOW;
digitalWrite(rl1,rl1Stat);
}
//2
if (ser3Data.substring(42,46)=="R2ON")
{
rl2Stat=HIGH;
digitalWrite(rl2,rl2Stat);
}
if (ser3Data.substring(42,47)=="R2OFF")
{
rl2Stat=LOW;
digitalWrite(rl2,rl2Stat);
}
//3
if (ser3Data.substring(42,46)=="R3ON")
{
rl3Stat=HIGH;
digitalWrite(rl3,rl3Stat);
}
if (ser3Data.substring(42,47)=="R3OFF")
{
rl3Stat=LOW;
digitalWrite(rl3,rl3Stat);
}
//4
if (ser3Data.substring(42,46)=="R4ON")
{
rl4Stat=HIGH;
digitalWrite(rl4,rl4Stat);
}
if (ser3Data.substring(42,47)=="R4OFF")
{
rl4Stat=LOW;
digitalWrite(rl4,rl4Stat);
}
//5
if (ser3Data.substring(42,46)=="R5ON")
{
rl5Stat=HIGH;
digitalWrite(rl5,rl5Stat);
}
if (ser3Data.substring(42,47)=="R5OFF")
{
rl5Stat=LOW;
digitalWrite(rl5,rl5Stat);
}
//6
if (ser3Data.substring(42,46)=="R6ON")
{
rl6Stat=HIGH;
digitalWrite(rl6,rl6Stat);
}
if (ser3Data.substring(42,47)=="R6OFF")
{
rl6Stat=LOW;
digitalWrite(rl6,rl6Stat);
}
//7
if (ser3Data.substring(42,46)=="R7ON")
{
rl7Stat=HIGH;
digitalWrite(rl7,rl7Stat);
}
if (ser3Data.substring(42,47)=="R7OFF")
{
rl7Stat=LOW;
digitalWrite(rl7,rl7Stat);
}
if (ser3Data.substring(42,46)=="Stat")
{
String smsText="Led States\r\n 0:" + String(led0Stat) + "\r\n1:" + String(led1Stat)+ "\r\n2:" + String(led2Stat)+ "\r\n3:" + String(led3Stat)+ "\r\n4:" + String(led4Stat)+ "\r\n5:" + String(led5Stat)+ "\r\n6:" + String(led6Stat)+ "\r\n7:" + String(led7Stat)+ "\r\n8:" + String(led8Stat)+ "\r\n9:" + String(led9Stat)+ "\r\nA:" + String(ledAStat)+ "\r\nB:" + String(ledBStat)+ "\r\nC:" + String(ledCStat) + "\r\nD:" + String(ledDStat)+"\r\n Relay States\r\n 0:" + String(rl0Stat)+ "\r\n1:" + String(rl1Stat)+ "\r\n2:" + String(rl2Stat)+ "\r\n3:" + String(rl3Stat)+ "\r\n4:" + String(rl4Stat)+ "\r\n5:" + String(rl5Stat)+ "\r\n6:" + String(rl6Stat)+ "\r\n7:" + String(rl7Stat);
sendSms(telNum,smsText);
}
/*
if (ser3Data.substring(42,45)=="Loc")
{
sendSms(telNum,smsBody);
}
*/
/*
if(ser3Data.startsWith("\r\n$GPSACP:") and ser3Data.length()>81)
{
enlemStr=ser3Data.substring(22,32);
Serial2.println("enlemRAW: ");
Serial2.println(enlemStr);
deg=enlemStr.substring(0,2);
mn=enlemStr.substring(2,4).toInt();
scnd=enlemStr.substring(5,9).toInt();
dirNS=enlemStr[9];
dec = (mn *100000 +scnd* 10)/6;
enlemStr=deg + "." + String(dec);
//Serial2.println("enlem: ");
//Serial2.print(enlemStr);
//Serial2.println(dirNS);
boylamStr=ser3Data.substring(33,44);
//Serial2.println("boylamRAW: ");
//Serial2.println(boylamStr);
deg=boylamStr.substring(0,3);
mn=boylamStr.substring(3,5).toInt();
scnd=boylamStr.substring(6,11).toInt();
dirEW=boylamStr[10];
dec = (mn *100000 +scnd* 10)/6;
boylamStr=deg + "." + String(dec);
//Serial2.println("boylam: ");
//Serial2.print(boylamStr);
//Serial2.println(dirEW);
smsBody="Konum: https://www.google.com.tr/maps/place/" + enlemStr + dirNS + "+" +boylamStr + dirEW;
//Serial2.print("smsBody");
//Serial2.println(smsBody);
}
*/
/*
if(ser3Data.startsWith("\r\n+CCLK:"))
{
//Serial2.println("+CCLK komutu");
temp=ser3Data.substring(9,11);
yil=temp.toInt();
temp=ser3Data.substring(12,14);
ay=temp.toInt();
temp=ser3Data.substring(15,17);
gun=temp.toInt();
temp=ser3Data.substring(18,20);
sa=temp.toInt();
temp=ser3Data.substring(21,23);
dk=temp.toInt();
temp=ser3Data.substring(24,26);
sn=temp.toInt();
Serial2.print("gun:");
Serial2.println(gun);
Serial2.print("ay:");
Serial2.println(ay);
Serial2.print("yil:");
Serial2.println(yil);
Serial2.print("saat:");
Serial2.println(sa);
Serial2.print("dk:");
Serial2.println(dk);
Serial2.print("sn:");
Serial2.println(sn);
}
*/
}
}
}
void sendSms(String num,String text)
{
int chrBrk=26;
Serial3.print(myCmd[eATCMGS].text);
Serial3.println(num);
//Serial2.print(myCmd[eATCMGS].text);
//Serial2.println(num);
delay(myCmd[eATCMGS].sure);
Serial3.print(text);
Serial3.write(chrBrk);
//Serial2.print(text);
Serial2.println("SMS sent");
}
void gsmModuleCheck()
{
isGsmOn=digitalRead(pinGsmState);
Serial2.print("GSM State: ");
Serial2.println(isGsmOn);
if (isGsmOn==0)
{
digitalWrite(pinGsmOnOff,HIGH);
delay(1500);
digitalWrite(pinGsmOnOff,HIGH);
Serial2.println("GSM is on now");
delay(5000);
}
else
{
Serial2.println("GSM is already on");
}
sendCmd(eAT);
sendCmd(eATFCLASS);
sendCmd(eATE);
sendCmd(eATCOPS);
sendCmd(eATCMGF);
sendCmd(eATCNMI);
sendCmd(eATCMGD);
sendCmd(eATNITZ);
}
void setup() {
// put your setup code here, to run once:
pinMode(led0,OUTPUT);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
pinMode(led4,OUTPUT);
pinMode(led5,OUTPUT);
pinMode(led6,OUTPUT);
pinMode(led7,OUTPUT);
pinMode(led8,OUTPUT);
pinMode(led9,OUTPUT);
pinMode(ledA,OUTPUT);
pinMode(ledB,OUTPUT);
pinMode(ledC,OUTPUT);
pinMode(ledD,OUTPUT);
pinMode(rl0,OUTPUT);
pinMode(rl1,OUTPUT);
pinMode(rl2,OUTPUT);
pinMode(rl3,OUTPUT);
pinMode(rl4,OUTPUT);
pinMode(rl5,OUTPUT);
pinMode(rl6,OUTPUT);
pinMode(rl7,OUTPUT);
pinMode(pinGsmOnOff,OUTPUT);
pinMode(pinGsmState,INPUT);
lcd.begin(16, 2);
lcd.print("TOBB Fen Lisesi");
dimm=100;
//LCD backlight pwm
analogWrite(pinDimm,dimm);
Serial.begin(115200);
delay(500);
Serial3.begin(115200);
delay(500);
Serial.println("merhaba");
gsmModuleCheck();
processPlanner=0;
}
void loop() {
// put your main code here, to run repeatedly:
if (Serial3.available()>0)
{
data=Serial3.readString();
Serial.print("GSM:");
Serial.println(data);
if (data.startsWith("\r\n+CMTI"))
{
Serial.println("SMS Alindi");
Serial.println(data.length());
sendCmd(eATCMGL);
delay(100);
sendCmd(eATCMGD);
}
}
/*
if (processPlanner%5000==2500)
{
sendCmd(eATGPSACP);
}
if (processPlanner%5000==1500)
{
sendCmd(eATCCLK);
}
*/
processPlanner++;
delay(1);
}
Comments