Jak jednoduše na GSM-VII.díl-Knihovna pro Arduinotech GSM Shield
Úvodní hrátky s GSM shieldem Arduinotech máme za sebou, někomu by se možná mohl zdát kód prezentovaný v minulém dílu trochu těžkopádný a je to pravda. Z Arduino světa jsme zvyklí mít všechno hezky dostupné z nějaké knihovny a ani náš vývojový tým nebude výjimkou a pro Arduinotech GSM shield jsme vypracovali knihovnu základních funkcí, které jsou potřeba pro zacházení s hovorem a SMSkou. Tato knihovna bude dále rozvíjená a na její aktualizace budete vždy na našich stránkách upozorněni včetně nějakých příkladů použití a popisů nových funkcí. V některých reakcích od Vás jsem zaznamenal, že by jste rádi nějaké příklady pro GPRS komunikaci – ano budou v rámci rozvoje knihovny již brzy.
Instalaci samotné knihovny nebudu popisovat, předpokládám již nějakou zručnost v tomto ohledu, nicméně návodu, jak to udělat je dost jak na zahraničních, tak českých webech.
Důležité upozornění, pro správnou funkci knihovny je potřeba zvětšit přijímací buffer knihovny SoftwareSerial a to v head file SoftwareSerial.h a to u proměnné size _SS_MAX_RX_BUFF, doporučuji nastavit buffer na alespoň 128 byte. Je třeba si uvědomit, že SIM800 na nás třeba při příjmu sms vysype jistě více, než 64 byte, které jsou nastaveny v SoftwareSerial po instalaci Arduino IDE
ArduinotechGSMShield knihovna
Probereme jednotlivé veřejné procedury této knihovny, jejich vstupy a výstupy a použití budeme demonstrovat na jednoduchém sketchi, který čeká na zavolání a po vyhodnocení, zda je číslo oprávněno volat pak na 2 sekundy přitáhne relé 1. Tato mini aplikace se hodí např. pro ovládání vjezdové brány, kdy podobná zařízení se na netu prodávají za nehorázně vysoké ceny. S naším shieldem a Arduino UNO jste na 1/3 nákladů a navíc máte celé ovládání pod kontrolou, takže doplnit jej o ovládání SMSkou nebo další funkce nebude žádný problém. Pojďme ale postupně k jednotlivým funkcím:
Třída AGS
Název třídy: AGS (zkratka ArduinotechGSMShield)
Vstupní parametry: debug mód -> 1=zapnutý, 0=vypnutý
Výstupní parametry: žádné
Příklad:
vytvoření instance třídy ve sketchi:
AGS modul(1); //debug mód povolen
AGS modul(0); //debug mód zakázán
begin();
Popis: inicializuje shield, definuje softwareSerial na portech RX=2, TX=3, rychlost 9600 b/s, inicializuje sériový kanál Arduina na rychlosti 9600b/s, spouští konfigurační proces SIM800Init()
Vstupní parametry: žádné
Výstupní parametry: žádné
Příklad:
modul.begin();
SIM800Init();
Popis: Konfigurační procedura pro SIM800 modul, lze použít samostatně např. pro inicializaci v případě zjištění nekorektního chování v určitých pasážích kódu. Tato procedura je zahrnuta do funkce begin();
Vstupní parametry: žádné
Výstupní parametry: žádné
Příklad:
modul.SIM800Init();
checkCallAndSMS();
Popis: Provádí otestování, zda je přítomen příchozí hovor nebo nová SMSka. Doporučuji vložit do hlavní smyčky
Vstupní parametry: žádné
Výstupní parametry: 0 = žádný hovor nebo nová SMS, 1 = nový hovor, 2 = nová SMS
Příklad:
callEnd();
Popis: Vyšle příkaz do SIM800 pro ukončení stávajícího hovoru – zavěšení
Vstupní parametry: žádné
Výstupní parametry: žádné
Příklad:
modul.callEnd();
makeCall(String callNumber);
Popis: Provede vytočení čísla – sestaví hlasový hovor
Vstupní parametry: String telefonní číslo v národním nebo mezinárodním tvaru bez +
Výstupní parametry: žádné
Příklad:
modul.makeCall(“739822476“);
getNumber();
Popis: Vrátí řetězec s telefonním číslem voljícího nebo účastníka, který poslal SMS. Obvykle je tento dotaz realizován bezprostředně po vyhodnocení stavu checkCallAndSMS() funkce.
Vstupní parametry: žádné
Výstupní parametry: String telefonní číslo
Příklad:
infoStatus = modul.checkCallAndSMS();
if (infoStatus == 1) Serial.println(“Volajici ucastnik:” + modul.getNumber());
if (infoStatus == 2) Serial.println(“SMS od:” + modul.getNumber());
getSMSContent();
Popis: Zjištění obsahu přijaté SMS
Vstupní parametry: žádné
Výstupní parametry: String obsah SMS
Příklad:
if (infoStatus == 2)
{
Serial.println(“SMS od:” + modul.getNumber());
Serial.println(“Obsah SMS:” + modul.getSMSContent());
}
sendSMS(String number,String sms);
Popis: funkce pro odeslání SMS na dané číslo s daným obsahem
Vstupní parametry: String číslo příjemce a String obsah SMS
Výstupní parametry: žádné
Příklad:
modul.sendSMS(“73982246”,”Ahoj!”);
getProviderName();
Popis: Vrací řetězec se jménem operátora GSM, které je prezentováno v rámci GSM sítě
Vstupní parametry: žádné
Výstupní parametry: String jméno operátora
Příklad:
Serial.println(“GSM operator:” + getProviderName());
getQuality();
Popis: Vrací řetězec s kvalitou GSM signálu dle momentálního měření. Kvalita signálu je parametr vypočtený ze síly, latence a jiných parametrů, není to jen síla signálu! Tento parametr se pohybuje od 1 do 30, 0 = není signál, 31 = přebuzení signál
Vstupní parametry: žádné
Výstupní parametry: String kvalita signálu
Příklad:
Serial.println(“GSM signal quality:” + getQuality());
timeStamp();
Popis: Vrací řetězec s časovou značkou obdrženou ze sítě GSM, tedy s poměrně přesným časem
Vstupní parametry: žádné
Výstupní parametry: String časová značka
Příklad:
Serial.println(“GSM time:” + timeStamp());
Knihovnu lze stáhnout zde. Knihovna je umístěna na repository GitHubu, takže bude i pravidelně na tomto místě aktualizovaná. Po její instalaci do prostředí IDE Arduina (nezapomeňte toto prostředí restartovat po nakopírování knihovny) lze přejít k napsání sketche, který se bude chovat dle popisu výše. Využitím této knihovny se dostaneme opravdu k velmi primitivnímu způsobu programování a implementace funkcí Vašeho zařízení bude trvat minuty.
Ovládání brány prozvoněním
Uvádím kompletní sketch v celé jeho jednoduchosti, snad netřeba nějakých zvláštních komentářů:
#include <ArduinotechGSMShield.h> #include <SoftwareSerial.h> #define LED 7 #define RELE1 8 //Vytvoření instance třídy AGS AGS modul(1); uint8_t infoStatus; String number; //Vstupní parametry a inicializace shieldu void setup() { pinMode(RELE1,OUTPUT); digitalWrite(RELE1,LOW); pinMode(LED,OUTPUT); digitalWrite(LED,HIGH); modul.begin(); } //Hlavní smyčka – čeká na příchod volání, jakmile jej detekuje, //hovor zavěsí a načte si číslo volajícího. //Je-li shoda s tím, na co čeká, zapne relé, //dvě sekundy počká, vypne relé a prozvoní zpět //prozvání 8sekund a pak hovor zavěsí. //Není-li shoda, hovor pouze zavěsí bez nějaké další aktivity. void loop() { infoStatus = modul.checkCallAndSMS(); if (infoStatus == 1) { number = modul.getNumber(); Serial.println("Call from:" + number); modul.callEnd(); if (number == "739822476") { digitalWrite(RELE1,HIGH); digitalWrite(LED,LOW); delay(2000); digitalWrite(RELE1,LOW); digitalWrite(LED,HIGH); modul.makeCall(number); delay(8000); modul.callEnd(); } else modul.callEnd(); } delay(1000); }
V dalším dílu seriálu se podíváme na příklady s SMS a hovory tak, abychom maximálně využili potenciálu ArduinoGSMShieldu a hlavně jeho knihovny.
PF
Přidat komentář
Přehled komentářů
-
Prijmanie SMS
(Lukáš, 27. 5. 2016 20:15:23)
Odpovědět
Dobrý deň, môžem sa Vás opýtať, prečo keď si na čislo SIM, ktorá je v modeme pošlem SMS s textom 1234, tak nič nepríde iba prázdny text ..
Dá sa s tým niečo urobiť ? -
Knihovna pro GSM Shield
(Jarda, 9. 2. 2017 23:58:10)
Odpovědět
| Zobrazit odpovědi
Dobrý den,
potřeboval bych si upravit knihovnu pro použití s ATMega2560(stejné piny s DUO) a tedy na serial1. Pokud jsem to správně pochopil pak by mělo stačit v ArduinotechGSMShield.h :
na ř 12. zaremovat #include "SoftwareSerial.h"
na ř. 35 změnit static SoftwareSerial SIM800; na static serial1 SIM800;
v ArduinotechGSMShield.cpp:
pak zaremovat řádky 5 a 7 s #include "SoftwareSerial.h" a SoftwareSerial AGS::SIM800(RX,TX);
a upravit metodu Begin() na
SIM800.begin(115200);
Serial.begin(115200);
Na něco jsem zapomněl? -
Re: Knihovna pro GSM Shield
(Jarda, 10. 2. 2017 0:54:26)
Odpovědět
Tak vše jsem změnil, ale v hesderu jsem jen musel řádek 35 static SoftwareSerial SIM800; zaremovat
a na začátku napsat definici
#define SIM800 Serial1.
Vše ostatní, jak jsem psal výše a jede to jak z praku, úplná absolutní fantazie. -
Re: Re: Knihovna pro GSM Shield
(Wladimir, 15. 6. 2017 21:06:13)
Odpovědět
Hned ked mi pride z aliho vyskusam podla vasich zmien napojit na mega.Inac super kniznica:)
-
aplikace knihovny na neoway m590
(minimartin, 8. 9. 2017 17:19:59)
Odpovědět
dobrý den, odvedl jste spoustu kvalitní práce. zkouším aplikovat knihovnu na shield neoway m590. po umazani kusu kodu v knihovně (asi timestamp) příklad gsm open gate funguje jen neprozvoni zpět (cislo je změněno). funguje tato funkce (prozvoňeni jako odezva) na arduinogsmshieldu?
-
Uprava pre SIM900 (1137B09SIM900B32_ST)
(Brano, 11. 2. 2020 4:01:33)
Odpovědět
| Zobrazit odpovědi
Dobry den,
Stravil som trochu casu, aby som knihovnu upravil pre nezavisly modul SIM900 (s firmware: 1137B09SIM900B32_ST), mozno niekomu pomoze.
Treba upravit 3 problemy v "ArduinotechGSMShield.cpp":
Vo funkcii "AGS::SIM800Init()"
while ((sendATcommand("AT+CREG?", "+CREG: 0,1", 1000) ||
sendATcommand("AT+CREG?", "+CREG: 0,5", 1000)) == 0);
predosle funkcie "sendATcommand()" ocakavaju odpovede +CREG: 0,1 a +CREG: 0,5. Nefunguje mi to. Moj modul odpoveda na registraciu cislom 1 a nie nulou. Teda spravna uprava vyzera nasledovne:
while ((sendATcommand("AT+CREG?", "+CREG: 1,1", 1000) ||
sendATcommand("AT+CREG?", "+CREG: 1,5", 1000)) == 0);
Dalej treba za nasledovnym riadkom cakat 200ms. S povodnymi 100ms program nezachyti odpoved:
SIM800.println("AT+CMGR=1");
delay(200); // povodne delay(100) nefunguje
Hned dalej pokracuje funkcia while:
while (SIM800.available()>0)
{
g = SIM900.read();
gcmd += g;
if (g == '\n')
{
gcmd = "";
break;
}
}
Tato "while" funkcia je na to, aby v odpovedi modulu SIM800 preskocila na dalsi riadok. Avsak moj modul SIM900 dava v odpovedi este jeden prazdny riadok a preto tuto funkciu "while" treba celu skopirovat a vlozit jej kopiu tak, aby sa tato funkcia zopakovala este raz. Takze to bude vyzerat takto:
while (SIM800.available()>0)
{
g = SIM900.read();
gcmd += g;
if (g == '\n')
{
gcmd = "";
break;
}
}
while (SIM800.available()>0)
{
g = SIM900.read();
gcmd += g;
if (g == '\n')
{
gcmd = "";
break;
}
}
Pekny den :) -
Re: Uprava pre SIM900 (1137B09SIM900B32_ST)
(Brano, 11. 2. 2020 4:06:53)
Odpovědět
Pozor, v mojom prvom komentari mam "g = SIM900.read()". Ma tam byt "g = SIM800.read()" :)
-
Uprava
(Stano, 15. 10. 2020 8:24:47)
Odpovědět
je mozne upravit kniznicu tak aby sme vyuzivali len Serial ? teda software serial bysa neppouzíval.... sim800l by bol pripojený priamo na rx,tx piny(0,1)