POWRÓĆ
TOP

Alarm z powiadomieniem SMS (Arduino)

Posiadam garaż oraz działkę i chciałbym zostać powiadomiony o sytuacji, kiedy ktoś niepowołany znajdzie się w zasięgu czujki ruchu.

Można oczywiście samemu kupić gotowe alarmy w sklepie, ale uważam, że cena oraz możliwości nie idą w parze. Postanowiłem, że stworzę coś takiego sam przy pomocy Arduino. Z uwagi że jest to mój pierwszy projekt, posiada szereg niedociągnięć i umożliwia zastosować wiele poprawek – do czego zresztą zachęcam. To jest projekt wyjściowy, pokazujący pomysł oraz możliwości jakie ma Arduino z kilkoma dodatkowymi modułami.

Możliwości zastosowania tego projektu są ogromnie – od nadzoru nad działką, garażem poprzez zabezpieczenie mieszkania na czas naszej nieobecności, na monitoringu szafki z naszymi skarbami (tam trzymam np. zestawy Arduino). Ogranicza nas tylko wyobraźnia oraz ilość modułów.

Założenia:

Seria wiadomości ma na celu wybudzenie nas np. w nocy. Często jeden SMS możemy zignorować, ale po 30’tym będziemy mieli na tyle przytomni że będziemy mogli podjąć jakieś działania. W takim przypadku, jeśli alarm będzie cały czas aktywny, niezbędne może się okazać dodanie numeru do zablokowanych, aby móc korzystać z telefonu w innych celach. Jest to wada na jaką byłem przygotowany, jeśli ktoś chce otrzymać tylko jedną wiadomość, należy zmodyfikować kod źródłowy.

Niezbędne elementy:

Schemat całego urządzenia:

Podłączyłem już przewód, umożliwiający wykonywanie telefonów – jest to nieużywana w obecnym kodzie funkcja, ale pozostawiam to jako przyszłościowe rozszerzenie. Były o to pytania na grupie FB – czy można sprawić, aby moduł dzwonił do nas, zamiast wysyłał SMS -tak, może. Wystarczy w miejsce wysyłania wiadomości SMS lub obok niej dodać ATD+48xxxxxxx; (nie zapominajmy o znaku ; ponieważ jest on niezbędny). Komenda ATH kończy połączenie (np. po 20 sekundach).

Na samym początku powstał poniższy kod źródłowy:

Pierwszy kod Arduino


#include
//piny na których jest podłączona komunikacja z modułem GSM
SoftwareSerial gsm800(11,12);

void setup() {
Serial.begin(9600);
//definiujemy PIN, gdzie podłączamy czuję ruchu - nie wszystkie złącza potrafią wybudzić urządzenie
pinMode(2, INPUT);
//definiujemy przerwanie, obsługujące alarm
attachInterrupt(digitalPinToInterrupt(2),alarm,RISING);

while(!Serial);
gsm800.begin(9600);
delay(100);
// Jeśli używasz blokady karty SIM, poniższa komenda ją odblokuje
// gsm800.println("AT+CPIN=\"xxxx\"");
// delay(1000);
gsm800.write("AT+CMGF=1\r\n");
delay(100);
//wpisujemy numer telefonu pod który nasze urządzenie ma wysyłaś SMS
gsm800.write("AT+CMGS=\"+48xxxxxxxxx\"\r\n");
delay(100);
//treść wiadomości podczas startu systemu, ma na celu zweryfikowanie czy całość działa poprawnie
gsm800.write("START SYSTEMU");
delay(100);
gsm800.write((char)26);
delay(100);
}

void alarm(){
gsm800.write("AT+CMGF=1\r\n");
delay(1000);
//wpisujemy numer telefonu pod który nasze urządzenie ma wysyłaś SMS
gsm800.write("AT+CMGS=\"+48xxxxxxxxx\"\r\n");
delay(1000);
//treść wiadomości w przypadku alarmu
gsm800.write("ALARM");
delay(1000);
gsm800.write((char)26);
delay(1000);
}

void loop() {
delay(1000);
}

Jest to bardzo prosty kod (skrytykowany już na grupie FB – jako okropny, brzydki, nieczytelny, wstrętny itd.), wykonujący przedstawione założenia. Wysyła SMS co kilka sekund jeśli czujka jest wzbudzona. Zachęcam mocno do własnoręcznego poprawiania i modyfikacji kodu źródłowego. Tym bardziej, jeśli potraficie programować i posiadanie niezbędną wiedzę oraz umiejętności – rewelacyjnie będzie, jeśli zamieścicie poprawki w uwagach.

Kod można rozbudować o reakcje na zarządzanie, obsługę SMS’ów oraz numerów uprawnionych. Zostało to bardzo fajnie przedstawione w jednym z artykułów  – zachęcam do przeczytania i analizy. W moim projekcie, najważniejsza była prostota i możliwość napisania czegoś samemu. Na pewno wraz z czasem i umiejętnościami, całość ulegnie modyfikacji i przekształceniu w długi, piękny oraz funkcjonalny kod.

Czujka ruchu ma możliwość regulacji czułości oraz zasięgu – tutaj dostosujmy jej parametry do naszych potrzeb, raczej już doświadczalnie i w miejscu przeznaczenia. Zamiast czujki ruchu, można użyć innego ‚detektora obecności’.

Samego modułu Arduino Nano nie trzeba prezentować, każda z osób składająca podobne układy miała z nim do czynienia.

Maleństwo, które łączy w sobie prostotę programowania (w przeciwieństwie do Pro Mini) i możliwości UNO. Natomiast wybór modułu GSM był spowodowany jego ceną i dostępnością. Na poniższym zdjęciu coś, co przypomina antenę – choć w przypadku tego projektu i lokalizacji miejsca docelowego, całkowicie wystarczyła aby poprawnie nawiązywać połączenie z siecią GSM.

Jeśli natomiast umieszczać całość będziemy przy słabym zasięgu (np. dom na działce, itp.), zalecam podłączanie zewnętrznej anteny – moduł Sim800L posiada na szczęście takie dedykowane złącze.

Całość zestawu ostatecznie prezentuje się następująco:

Na zdjęciu nie widać użycia konwertera stanów logicznych (5V-3,3V), który jest zabezpieczeniem naszego najdroższego elementu, czyli modułu GSM. Podłączamy go pomiędzy Arduino D11 i D12 a RX i TX modułu Sim800L – inaczej musimy się liczyć z możliwością jego uszkodzenia.

Poniżej zamieszczam kod ostateczny, który usypia moduł i czeka na wzbudzenia go przez czuję ruchu.

#include
//wskazujemy użycie biblioteki LowPower
#include "LowPower.h"
//piny na których jest podłączona komunikacja z modułem GSM
SoftwareSerial gsm800(11,12);
const int wakeUpPin = 2;


void wakeUp()
{
gsm800.write("AT+CMGF=1\r\n");
delay(1000);
//wpisujemy numer telefonu pod który nasze urządzenie ma wysyłaś SMS
gsm800.write("AT+CMGS=\"+48xxxxxxxxx\"\r\n");
delay(1000);
//treść wiadomości w przypadku alarmu
gsm800.write("ALARM");
delay(1000);
gsm800.write((char)26);
delay(1000);
}


void setup() {
pinMode(wakeUpPin, INPUT);
gsm800.begin(9600);
delay(100);


// Jeśli używasz blokady PIN
// gsm800.println("AT+CPIN=\"xxxx\"");
// delay(1000);

gsm800.write("AT+CMGF=1\r\n");
delay(100);
//wpisujemy numer telefonu pod który nasze urządzenie ma wysyłaś SMS
gsm800.write("AT+CMGS=\"+48xxxxxxxxx\"\r\n");
delay(100);
//treść wiadomości podczas startu systemu, ma na celu zweryfikowanie czy całość działa poprawnie
gsm800.write("START SYSTEMU");
delay(100);
gsm800.write((char)26);
delay(100);
}

void loop()
{
attachInterrupt(0, wakeUp, HIGH);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
detachInterrupt(0);
}

Znaczącą różnicę widać na załączonych zdjęciach. Moduł w stanie spoczynku przed modyfikacją kodu źródłowego i użyciem biblioteki Low-Power. Jestem zaskoczony dużą oszczędnością energii, jaką można osiągnąć wyłączając niepotrzebne moduły Arduino.

oraz po modyfikacjach i jego usypianiu:

Na pierwszy rzut oka, nie jest to duża różnica – ale przy zastosowaniu innego czujnika wzbudzającego zamiast czujki ruchu (np. przycisk/czujnik), będzie to wartość w okolicy zera. Wtedy nawet niewielki PowerBank, będzie działał bardzo długi czas.

Użyte części

Całość wyszła w okolicy 55-60 zł

Można oczywiście zastosować jakąś gotową obudowę lub ukryć w miejscu, gdzie nie będzie się rzucało w oczy (diody świecące można zakleić czarną taśmą izolacyjną).

Opis modułu SIM900 i komend AT





Żródło: https://majsterkowo.pl/alarm-z-powiadomieniem-sms-arduino/