Gsm modul
Nezařaditelné
-
- Příspěvky: 128
- Registrován: čtv led 01, 2015 6:30 pm
Re: Gsm modul
Něco jako http://tronixstuff.com/2014/01/08/tutor ... m-modules/ ?
Modulů je na internetu hodně. Takže stačí vybrat, naprogramovat a jede se. Levné moduly jsou třeba SIM800L - http://www.ebay.com/itm/1PCS-Smallest-S ... 2118758210
Modulů je na internetu hodně. Takže stačí vybrat, naprogramovat a jede se. Levné moduly jsou třeba SIM800L - http://www.ebay.com/itm/1PCS-Smallest-S ... 2118758210
-
- Příspěvky: 30
- Registrován: pát srp 19, 2011 10:12 am
Re: Gsm modul
Dakujem ja som kupil . http://www.ebay.com/itm/252276576232?_t ... EBIDX%3AIT Mam aj k tomu program ale vykona mi 1 sms a druhu uz nespracuje. Nevedel by niekdo kde je chyba? Dik
Kód: Vybrat vše
//SMS procesor pro Arduino UNO - upraveno Roman Simku
#include <SoftwareSerial.h> //pridano Roman Simku
#define GSMReset 5
#define LED1 13
#define LED2 12
SoftwareSerial SIM800(2, 3); // RX, TX //pridano Roman Simku
String GSMsignal;
void setup()
{
Serial.begin(19200);
SIM800.begin(9600);
delay(1000);
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);
restartSIMHW();
SIM800Init();
}
void loop()
{
//WDT_Restart(WDT);
delay(1000);
checkSMS();
}
void SIM800Init()
{
while (Serial.available() > 0) Serial.read();
Serial.println F("****************************************");
Serial.println F("****cekam na odezvu GSM Modulu *********"); //pridano Roman Simku
while (sendATcommand("AT","OK",2000) == 0);
Serial.println F("SIM800 modul dostupny, cekam na registraci do site!"); //upraven text Roman Simku
//otestuj registraci do site
while ( (sendATcommand("AT+CREG?", "+CREG: 0,1", 500) ||
sendATcommand("AT+CREG?", "+CREG: 0,5", 500)) == 0 );
while (Serial.available() > 0) Serial.read();
Serial.println F("SIM800 registrovan do site!");
//nastaveni parametru pro obdrzen? casu ze site
while( sendATcommand("AT+CLTS=1", "OK", 500) == 0 );
while( sendATcommand("AT+CENG=3", "OK", 500) == 0 );
while (Serial.available() > 0) Serial.read();
Serial.print("Casova znacka:");
Serial.println(timeStamp());
//CSQ, pozice 4
GSMsignal = sendATcommandResponse("AT+CSQ", "+CSQ:", 1000, 3);
Serial.println("GSM kvalita signalu:"+GSMsignal);
if (GSMsignal.length()==3) GSMsignal = GSMsignal.substring(1);
String providerName = sendATcommandResponse("AT+COPS?","+COPS:",1000,20);
uint8_t tempIndex = providerName.indexOf('"');
providerName = providerName.substring(tempIndex+1);
tempIndex = providerName.indexOf('"');
providerName = providerName.substring(0,tempIndex);
Serial.println("GSM operator:"+providerName);
sendATcommand("AT+CMGF=1", "OK", 500);
sendATcommand("AT+CMGF=1", "OK", 500);
//zakaz indikace SMS
sendATcommand("AT+CNMI=0,0", "OK",500);
sendATcommand("AT+CLIP=1", "OK", 500);
//smaz vsechny SMSky
sendATcommand("AT+CMGD=1,4", "OK", 2000);
sendATcommand("AT+CMGD=1", "OK", 2000);
Serial.println F("Zakladni parametry nastaveny!");
Serial.println F("Cekam na prikaz pres SMS, napr. prichozi sms ve tvaru LED1ON, LED1OFF , LED2ON , LED2OFF rozsviti LEDku!"); //pridano Roman Simku
Serial.println F("****************************************"); //pridano Roman Simku
}
int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout)
{
//WDT_Restart(WDT);
uint8_t x = 0, answer = 0;
char response[100];
unsigned long previous;
memset(response, '\0', 100); // Initialize the string
delay(100);
//clrSIMbuffer();
SIM800.println(ATcommand); // Send the AT command
//WDT_Restart(WDT);
x = 0;
previous = millis();
// this loop waits for the answer
do
{
// WDT_Restart(WDT);
if (SIM800.available() != 0) {
// if there are data in the UART input buffer, reads it and checks for the asnwer
response[x] = SIM800.read();
x++;
// check if the desired answer is in the response of the module
if (strstr(response, expected_answer) != NULL)
{
answer = 1;
}
}
// Waits for the asnwer with time out
}
while ((answer == 0) && ((millis() - previous) < timeout));
//clrSIMbuffer();
return answer;
}
//AT prikaz s ocekavanou odpovedi a zbytkem
String sendATcommandResponse(char* ATcommand, char* expected_answer, unsigned int timeout, unsigned int buf)
{
//WDT_Restart(WDT);
uint8_t x = 0, answer = 0;
char response[150];
unsigned long previous;
String rest;
memset(response, '\0', 100); // Initialize the string
delay(100);
//clrSIMbuffer();
SIM800.println(ATcommand); // Send the AT command
x = 0;
previous = millis();
//WDT_Restart(WDT);
// this loop waits for the answer
do
{
//WDT_Restart(WDT);
if (SIM800.available() != 0) {
// if there are data in the UART input buffer, reads it and checks for the asnwer
response[x] = SIM800.read();
x++;
// check if the desired answer is in the response of the module
if (strstr(response, expected_answer) != NULL)
{
answer = 1;
}
}
// Waits for the asnwer with time out
}
while ((answer == 0) && ((millis() - previous) < timeout));
//p?e?ti zbytek - max 20 byte
memset(response, '\0', buf); // Initialize the string
delay(100);
for (x = 0; x < buf; x++) response[x] = SIM800.read();
//clrSIMbuffer();
for (x = 0; x < buf; x++) rest += char(response[x]);
delay(100);
return rest;
}
//Prijem SMS
void checkSMS()
{
char g;
String gcmd;
String number;
uint8_t gindex;
clrSIMbuffer();
SIM800.println("AT+CMGR=1");
delay(100);
//potla?en? echa
while(SIM800.available()>0)
{
g=SIM800.read();
gcmd += g;
if (g=='\n')
{
gcmd = "";
break;
}
}
//na?ti prvn? ??dek odpov?di
while(SIM800.available()>0)
{
g=SIM800.read();
gcmd += g;
if (g=='\n')
{
if (gcmd.substring(0,2)=="OK") return;
if(gcmd.substring(0,5)=="+CMGR")
{
//Serial.println(gcmd);
Serial.println("Nova SMSka!!!!");
//prvni + "+CMGR"
gindex = gcmd.indexOf('+');
if(gindex < 0) return;
//odsekni prvn?
gcmd = gcmd.substring(gindex+1);
Serial.println(gcmd);
//dal?? + - obsahuje ??slo odes?latele
gindex = gcmd.indexOf('+');
number = gcmd.substring(gindex+4,gindex+13);
Serial.println("Od:" + number);
//precti obsah SMS
gcmd = "";
delay(50);
while (SIM800.available()>0)
{
g=SIM800.read();
gcmd += g;
if (g=='\n')
{
gcmd = gcmd.substring(0,gcmd.length()-2);
Serial.println("Obsah SMS:" + gcmd);
SMSparser(gcmd);
sendSMS(number,"Vykonano!");
gcmd = "";
sendATcommand("AT+CMGD=1", "OK", 1000);
sendATcommand("AT+CMGD=1,4", "OK", 1000);
Serial.println("SMS smazana z pameti.");
Serial.println("---------------------");
return;
}
}
gcmd="";
sendATcommand("AT+CMGD=1", "OK", 1000);
sendATcommand("AT+CMGD=1,4", "OK", 1000);
sendATcommand("AT+CMGD=1,4", "OK", 1000);
return;
}
}
}
}
//Poslani SMS
void sendSMS(String number, String sms)
{
Serial.println("SMS pro:"+number);
Serial.println("Obsah:"+sms);
delay(500);
clrSIMbuffer();
//number = "+420"+number;
SIM800.println ("AT+CMGS=\""+number+"\"");
delay(200);
//toSerial();
SIM800.println (sms); // message to send
delay(100);
SIM800.write ((char) 26); //CTRL+Z
delay(100);
SIM800.println();
delay(100);
sendATcommand("AT+CMGD=1", "OK", 2000);
sendATcommand("AT+CMGD=1,4", "OK", 2000);
delay(500);
clrSIMbuffer();
Serial.println("SMS odeslana!");
}
//Zpracovani SMS
void SMSparser(String command)
{
if (command == "LED1ON")
{
digitalWrite(LED1,HIGH);
return;
}
if (command == "LED1OFF")
{
digitalWrite(LED1,LOW);
return;
}
if (command == "LED2ON")
{
digitalWrite(LED2,HIGH);
return;
}
if (command == "LED2OFF")
{
digitalWrite(LED2,LOW);
return;
}
Serial.println("Neznamy prikaz!");
}
String timeStamp()
{
String ts="";
ts = sendATcommandResponse("AT+CCLK?", "+CCLK: \"", 1000, 20);
//13/11/04,15:23:19+04
//return ("20"+ts.substring(0,2)+ts.substring(3,5)+ts.substring(6,8)+ts.substring(9,11)+ts.substring(12,14)+ts.substring(15,17));
return ts;
}
void restartSIMHW()
{
//HW restart
digitalWrite(GSMReset,LOW);
delay(400);
digitalWrite(GSMReset,HIGH);
delay(400);
}
void clrSIMbuffer()
{
while(SIM800.available()>0)
{
delay(1);
SIM800.read();
}
}
-
- Příspěvky: 128
- Registrován: čtv led 01, 2015 6:30 pm
Re: Gsm modul
Takhle těžko říci. :/ Musel bych si to zkusit s tím modulem a ten znám zatím jen teoreticky. Co jsem to prolítl, tak v tom chybu nevidím. Jediný problém, který by tam mohl vznikat je to, že se používá software serial a tomu já nikdy moc nevěřím. Za mě tam může být problém v tom, že se tam někam zapadnou data... Kdybych to zkoušel, tak bych ten modem dal na HW serial a SW serial použil na debug přes nějaký další USB-RS232 převodník. Minimálně aspoň pro ověření, že SW serial dělá to samé co HW serial.
Když tak pošli výstup z terminálu, co ti to jak za sebou vypisuje. Aby člověk tušil jakými stavy to prochází.
Když tak pošli výstup z terminálu, co ti to jak za sebou vypisuje. Aby člověk tušil jakými stavy to prochází.
-
- Příspěvky: 30
- Registrován: pát srp 19, 2011 10:12 am
Re: Gsm modul
Toto je uvodny vystup.
Od cervenej ciary sa to neustale opakuje
//WDT_Restart(WDT);
delay(1000);
checkSMS();
Toto mam v uvodzovkach ked to tam dam tak mi vypise chybu.
EasySMS_UNO:30: error: 'WDT' was not declared in this scope
WDT_Restart(WDT);
^
EasySMS_UNO:30: error: 'WDT_Restart' was not declared in this scope
WDT_Restart(WDT);
Od cervenej ciary sa to neustale opakuje
//WDT_Restart(WDT);
delay(1000);
checkSMS();
Toto mam v uvodzovkach ked to tam dam tak mi vypise chybu.
EasySMS_UNO:30: error: 'WDT' was not declared in this scope
WDT_Restart(WDT);
^
EasySMS_UNO:30: error: 'WDT_Restart' was not declared in this scope
WDT_Restart(WDT);
-
- Příspěvky: 128
- Registrován: čtv led 01, 2015 6:30 pm
Re: Gsm modul
Tak co tam tak vidím. Pokud nechceš echo příkazu z modemu, což většinou člověk nechce, tak stačí zavolat "ATE0", vypne to to echo a ATE1 zase zapne. Když si s tím hraješ na Arduinu, tak bych to hned v inicializaci vypnul. ATE1 je dobré když člověk zadává příkazy ručně.
Pak bych asi použil nějakou knihovnu, než si to psát ručně. Co jsem chvilku googlil, tak třeba https://github.com/vesteraas/Sim900 umí pěkně sms s callbackama, na tohle ideální. Ale je jich hromada dalších knihoven. Rozdíl mezi SIM900 a SIM800L není skoro žádný a v SMS snad naprosto žádný, takže se dají použít stejné knihovny. Pokud si s tím nechceš hrát a neřešíš každý bajt paměti, tak není co řešit.
Chybu vidím v tom, že ten SW serial má 64 byte buffer, takže je krásně vidět, jak ti to tu odpověď CMGR ořízne a tam je asi někde začátek konce (za těch 100ms, co tam čekáš ti to pošle 120 znaků při téhle rychlosti, takže se ten buffer prostě přeplní. A u toho mazání SMS si nejsem jist, jestli nejdříve není třeba vybrat nějakou paměť. Protože ono to interně může mít rozděleno do více pamětí a pak třeba neví kde má mazat. A podle manuálu by to tak asi mělo být (https://www.adafruit.com/datasheets/sim ... _v1.01.pdf), pokud chceš smazat jednu sms, tak "AT+CMGD=1,0" a pro všechny "AT+CMGD=1,4" A nastavil bych si "AT+CPMS=SM,SM,SM" někde v začátku. U těch AT+CMGD comandů píšou celkem dlouhé časy na smazání, otázka jaká je skutečnost.
Kdybych si to chtěl obsloužit sám, tak bych nejdříve celou odpověď na to CMGR (a jakýkoliv AT příkaz) načetl až do OK (popřípadě ERROR) někam do bufferu (dalo by se něco paměti ušetřit tím, že by jsi nějaké věci třeba zahazoval a zapisoval jen to co tě zajímá, každopádně nějaký 256 bytový buffer by na tohle stačil a vyhnul bych se používání String třídy, která je celkem nenasytná, ale zase hodně věcí ulehčuje, takže pokud neřešíš paměť, tak dobrý). Každopádně v té nečítací smyčce nevypisuj nic debugovacího, aby se to nezdržovalo. A poté bych v klidu tu odpověď rozparsoval.
To jsou věci, co v tom vidím já.
Pak bych asi použil nějakou knihovnu, než si to psát ručně. Co jsem chvilku googlil, tak třeba https://github.com/vesteraas/Sim900 umí pěkně sms s callbackama, na tohle ideální. Ale je jich hromada dalších knihoven. Rozdíl mezi SIM900 a SIM800L není skoro žádný a v SMS snad naprosto žádný, takže se dají použít stejné knihovny. Pokud si s tím nechceš hrát a neřešíš každý bajt paměti, tak není co řešit.
Chybu vidím v tom, že ten SW serial má 64 byte buffer, takže je krásně vidět, jak ti to tu odpověď CMGR ořízne a tam je asi někde začátek konce (za těch 100ms, co tam čekáš ti to pošle 120 znaků při téhle rychlosti, takže se ten buffer prostě přeplní. A u toho mazání SMS si nejsem jist, jestli nejdříve není třeba vybrat nějakou paměť. Protože ono to interně může mít rozděleno do více pamětí a pak třeba neví kde má mazat. A podle manuálu by to tak asi mělo být (https://www.adafruit.com/datasheets/sim ... _v1.01.pdf), pokud chceš smazat jednu sms, tak "AT+CMGD=1,0" a pro všechny "AT+CMGD=1,4" A nastavil bych si "AT+CPMS=SM,SM,SM" někde v začátku. U těch AT+CMGD comandů píšou celkem dlouhé časy na smazání, otázka jaká je skutečnost.
Kdybych si to chtěl obsloužit sám, tak bych nejdříve celou odpověď na to CMGR (a jakýkoliv AT příkaz) načetl až do OK (popřípadě ERROR) někam do bufferu (dalo by se něco paměti ušetřit tím, že by jsi nějaké věci třeba zahazoval a zapisoval jen to co tě zajímá, každopádně nějaký 256 bytový buffer by na tohle stačil a vyhnul bych se používání String třídy, která je celkem nenasytná, ale zase hodně věcí ulehčuje, takže pokud neřešíš paměť, tak dobrý). Každopádně v té nečítací smyčce nevypisuj nic debugovacího, aby se to nezdržovalo. A poté bych v klidu tu odpověď rozparsoval.
To jsou věci, co v tom vidím já.
-
- Příspěvky: 128
- Registrován: čtv led 01, 2015 6:30 pm
Re: Gsm modul
Ani se nedivím, je to nějaká funkce, která slouží asi k restartu watchdogu a nikde není definována.Karya píše:...
//WDT_Restart(WDT);
delay(1000);
checkSMS();
Toto mam v uvodzovkach ked to tam dam tak mi vypise chybu.
...
-
- Podobná témata
- Odpovědi
- Zobrazení
- Poslední příspěvek
-
- 6 Odpovědi
- 1580 Zobrazení
-
Poslední příspěvek od Kopeto
-
- 3 Odpovědi
- 1068 Zobrazení
-
Poslední příspěvek od jahodovák
-
- 0 Odpovědi
- 608 Zobrazení
-
Poslední příspěvek od MarekCerhan
-
- 2 Odpovědi
- 134 Zobrazení
-
Poslední příspěvek od morphius
-
- 0 Odpovědi
- 948 Zobrazení
-
Poslední příspěvek od stanekl