[024] Wysyłanie SMS-ów - praktycznie
W poprzednim artykule opisywałem moduł GSM, na przykładzie płytki o nazwie SIM800L Można się tam dowiedzieć w jaki sposób Arduino może wysłać SMS-y. Zróbmy teraz coś praktycznego. W tym celu skorzystam z wykrywacza ruchu, który opisałem tutaj. To taki plastikowy bąbelek, który jest sprzężony z elektroniką zajmującą się wykrywaniem poruszających się obiektów w kilkumetrowym polu widzenia. Znakomicie nadaje się on do budowy różnego rodzaju alarmów włamaniowych i coś takiego właśnie przedstawię.
Przypomnę: na płytce znajdziemy dwa potencjometry. Pierwszym ustawiamy latencję, czyli czas stanu wysokiego na wyjściu po wykryciu ruchu. Drugim – czułość elementu. Potencjometry należy ustawić tak, by czujnik działał pewnie, ale nie nazbyt czule. Element łączymy trzema przewodami z masą, napięciem zasilania, czyli z pięcioma woltami i z portem czytającym stan alarmu. Wybrałem pin 12. Rozbudujemy nieco program, który pojawił się w poprzednim artykule. Będzie on wyglądał tak:
#include <Sim800L.h> // Biblioteka obsługująca moduł GSM
Sim800L telefon(10, 11); // W nawiasie: port RX oraz TX modułu.
const byte czujnikRuchu = 12; // Adres wejścia czujnika ruchu.
const byte led = 13; // Adres wyjścia diody świecącej wykrycia ruchu.
byte sekundy; // licznik sekund w pętli opóźniającej wysyłanie kolejnych SMS-ów
void setup() {
pinMode(czujnikRuchu, INPUT_PULLUP); // Deklaruj port czujnika ruchu.
pinMode(led, OUTPUT); // Deklaruj port diody świecącej.
telefon.begin(); // Inicjuj moduł GSM
telefon.sendSms("+48452554602", "Wlasnie sie zresetowalem."); // Wyślij SMS-a
}
void loop() {
digitalWrite(led, LOW); // Wyłącz diodę alarmu.
while (digitalRead(czujnikRuchu) == LOW) {} // Pozostań w pętli, dopóki czujnik nie wykryje ruchu.
digitalWrite(led, HIGH); // Włącz diodę alarmu.
telefon.sendSms("+48452554602", "Jakis lobuz wlaz i broi."); // Wyślij SMS-a
for (sekundy = 0; sekundy <= 60; sekundy++) { // Włącz minutową pętlę opóźniającą wysyłanie kolejnego SMS-a
digitalWrite(led, digitalRead(czujnikRuchu)); // Ustaw stan diody zgodnie ze stanem aktualnego alarmu.
delay(900); // Czas migania diodą.
digitalWrite(led, !digitalRead(led)); // Włącz miganie diodą, gdy nastąpił alarm w ostatniej minucie.
delay(100);
}
}
W bloku deklaracji musimy dodać port wykrywacza ruchu (12) oraz diody świecącej (13), która przyda nam się przy regulacjach czujnika. Zmienna sekundy natomiast będzie potrzebna, by po wykryciu ruchu nie wysyłać całego hurtu SMS-ów, a dozować je rozsądnie – w tym przypadku maksymalnie jeden na minutę.
W części wstępnej będziemy wysyłać jednorazowego SMS-a o treści „Właśnie się zresetowałem”. Po pierwsze, da nam znać, że wszystko działa, po drugie – w razie resetu np. na skutek burzy czy zaniku zasilania, dowiemy się o tym, że znowu wszystko pracuje jak należy.
Główna pętla wykrywa ruch i wysyła informacje, jeśli ruch zostanie wykryty. A więc najpierw wyłączamy diodę świecącą, a następnie będziemy czekać na wykrycie ruchu. Dopóki to nie nastąpi, nic się dziać nie będzie.
digitalWrite(led, LOW); // Wyłącz diodę alarmu.
while (digitalRead(czujnikRuchu) == LOW) {} // Pozostań w pętli, dopóki czujnik nie wykryje ruchu.
Jeśli czujnik wykryje ruch, dioda się zaświeci. Następnie moduł wyśle esemesa o treści „Jakiś łobuz wlazł i broi”.
digitalWrite(led, HIGH); // Włącz diodę alarmu.
telefon.sendSms("+48452554602", "Jakis lobuz wlaz i broi."); // Wyślij SMS-a
Teraz przejdziemy do pętli opóźniającej, w której esemesy nie będą wysyłane przez 60 sekund. Czas ten można dobrać według własnych potrzeb.
for (sekundy = 0; sekundy <= 60; sekundy++) { // Włącz minutową pętlę opóźniającą wysyłanie kolejnego SMS-a
digitalWrite(led, digitalRead(czujnikRuchu)); // Ustaw stan diody zgodnie ze stanem aktualnego alarmu.
delay(900); // Czas migania diodą.
digitalWrite(led, !digitalRead(led)); // Włącz miganie diodą, gdy nastąpił alarm w ostatniej minucie.
delay(100);
}
W każdym sekundowym przebiegu pętli będziemy przekazywać na diodę świecącą stan czujnika, po czym zaczekamy 900 ms. Następnie zaprzeczymy stanowi diody i zaczekamy brakujące do pełnej sekundy 100 ms. Po co tak? By z jednej strony cały ten minutowy czas po wykryciu ruchu wskazywać mruganiem, iż takie nastąpiło. Z drugiej – jeśli dioda błyska krótko, nie wykryto ruchu. Jeśli odwrotnie, dioda się świeci gasnąć na krótkie chwile – ruch wykryto ponownie. Po co tak kombinować, skoro i tak żaden esemes się nie wyśle? Ano po to, by na czas serwisu alarmu móc wyregulować czułość czujnika i zorientować się czy wszystko jest w porządku.
I to już koniec. Należy tylko zadbać o zasilanie, a w przypadku urządzeń zasilanych z akumulatorów, trzeba dopisać instrukcje ograniczające zużycie energii, czyli usypiające moduł i mikrokontroler, który powinien w tym wypadku pracować na przerwaniach, budzony czujnikiem. O tym jak to zrobić pisałem w tym artykule.