Despre ce este vorba?
Desi sistemele de securitate existente la momentul actual pe piata sunt destul de sofisticate si evolueaza continuu, probabil printre noi sunt si persoane care doresc sa isi creeze singuri un astfel de sistem, sau doresc sa aiba unul de backup in caz ca cel primar cedeaza.
In aceasta serie de articole va vom prezenta construirea un sistem de securitate DIY din module si placi de dezvoltare disponibile online la un pret decent.
In acest articol va vom prezenta cum puteti construi un sistem de detectare a miscarilor cu notificare prin Telegram, cu ajutorul unui senzor PIR (Passive InfraRed sensor) si a unei placi de dezvoltare ESP 8266 (sau ESP32).
Materiale necesare pentru realizarea acestui proiect:
- O placa de dezvoltare ESP 8266 sau ESP32;
- Un senzor PIR HC-SR501 (va recomandam versiunea mare cu potentiometre pentru reglaj);
- Un AP (Access Point) cu acces la internet;
- O sursa de 5V;
Cum functioneaza proiectul?
Principiul de functionare al acestui proiect este simplu si consta in proprietatea unui senzor PIR de a detecta schimbarea pozitiei unui obiect. Senzorul PIR va trimite un semnal de 3.3V a carui durata poate fi ajustata cu ajutorul unui potentiometru existent pe senzor.
Acest semnal va ajunge la placa de dezvoltare ESP8266 care va va trimite pe Telegram un mesaj cu ajutorul unui bot. Cel de-al doilea potentiometru de pe senzor este pentru a ajusta sensibilitatea acestuia.
Cum cream botul pentru Telegram?
Un bot (sau intreg: robot) este un program de computer care preia diverse sarcini automatizate. In primul rand trebuie sa instalati aplicatia Telegram de pe „Magazin Play”, „Play Store” sau „App Store”.
Dupa ce ati instalat aplicatia Telegram, creati-va un cont si initiati o conversatie cu „Botfather”, in care scrieti „/start”, iar dupa aceasta „/newbot”.
Dupa care, alegeti un nume pentru botul dvs. ; daca numele este disponibil veti primi un mesaj ca si cel din poza de mai jos:
Dupa ce ati realizat aceasta operatiune, cautati utilizatorul „IDBot” si in conversatie scrieti comanda „/getid”, iar ca raspuns ar trebui sa primiti un cod.
Partea software
Pentru a putea compila codul pe care-l vom prezenta, trebuie sa descarcati urmatoarea librarie: https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot, si sa o instalati in Arduino IDE.
Pentru a instala libraria in Arduino IDE trebuie doar sa intrati in meniul Sketch -> Include Library -> Add .zip library, dupa care sa selectati arhiva descarcata precedent de pe GitHub.
Pentru a folosi API-ul Telegram aveti nevoie si de libraria „arduinojson” care o puteti instala simplu, mergand in meniul Sketch > Include Library > Manage Libraries, unde trebuie sa cautati „ArduinoJson” si sa instalati cea mai noua versiune disponibila (pentru acest tutorial s-a folosit versiunea 6.5.12).
Acum trebuie sa intrati intr-un browser web si sa cautati urmatoarea adresa: https://t.me/”inlocuiti cu numele botului”.
Partea hardware
Pentru a conecta senzorul PIR (dreapta) la placa de dezvoltare (stanga), trebuie sa realizati urmatoarele conexiuni:
- 5V – Vcc
- GND – GND
- D5(GPIO14) – Out
Codul pentru ESP8266
#include „ESP8266WiFi.h”
#include „WiFiClientSecure.h”
#include „UniversalTelegramBot.h”
#include „ArduinoJson.h”
const char* ssid = „****”;//inlocuiti **** cu numele retelei dvs. de WiFi
const char* password = „***”;//inlocuiti *** cu parola retelei dvs. de WiFi
#define BOTtoken „XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX” // Codul dvs. primit de la BotFather
#define CHAT_ID „XXXXXXXXXX” // numarul id primit de la IDBot
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
const int motionSensor = 14; // PIR Motion Sensor
bool motionDetected = false;
// Indicates when motion is detected
void ICACHE_RAM_ATTR detectsMovement() {
//Serial.println(„MOTION DETECTED!!!”);
motionDetected = true;
}
void setup() {
Serial.begin(115200);
client.setInsecure();
// PIR Motion Sensor mode INPUT_PULLUP
pinMode(motionSensor, INPUT_PULLUP);
// Set motionSensor pin as interrupt, assign interrupt function and set RISING mode
attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, RISING);
// Attempt to connect to Wifi network:
Serial.print(„Connecting Wifi: „);
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(„.”);
delay(500);
}
Serial.println(„”);
Serial.println(„WiFi connected”);
Serial.print(„IP address: „);
Serial.println(WiFi.localIP());
bot.sendMessage(CHAT_ID, „Senzorul pir este initializat”, „”);
}
void loop() {
if(motionDetected){
bot.sendMessage(CHAT_ID, „A fost detectata miscare!!”, „”);
Serial.println(„Motion Detected”);
motionDetected = false;
}
}
Codul pentru ESP32:
#include „WiFi.h”
#include „WiFiClientSecure.h”
#include „UniversalTelegramBot.h”
#include „ArduinoJson.h”
const char* ssid = „****”;//inlocuiti **** cu numele retelei dvs. de WiFi
const char* password = „***”;//inlocuiti *** cu parola retelei dvs. de WiFi
#define BOTtoken „XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX” // Codul dvs. primit de la BotFather
#define CHAT_ID „XXXXXXXXXX” //numarul id primit de la IDBot
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
const int motionSensor = 14; // PIR Motion Sensor
bool motionDetected = false;
// Indicates when motion is detected
void ICACHE_RAM_ATTR detectsMovement() {
//Serial.println(„MOTION DETECTED!!!”);
motionDetected = true;
}
void setup() {
Serial.begin(115200);
// PIR Motion Sensor mode INPUT_PULLUP
pinMode(motionSensor, INPUT_PULLUP);
// Set motionSensor pin as interrupt, assign interrupt function and set RISING mode
attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, RISING);
// Attempt to connect to Wifi network:
Serial.print(„Connecting Wifi: „);
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(„.”);
delay(500);
}
Serial.println(„”);
Serial.println(„WiFi connected”);
Serial.print(„IP address: „);
Serial.println(WiFi.localIP());
bot.sendMessage(CHAT_ID, „Senzorul pir este initializat”, „”);
}
void loop() {
if(motionDetected){
bot.sendMessage(CHAT_ID, „A fost detectata miscare!!”, „”);
Serial.println(„Motion Detected”);
motionDetected = false;
}
}
Cum functioneaza codul?
#include „WiFi.h”
#include „WiFiClientSecure.h”
#include „UniversalTelegramBot.h”
#include „ArduinoJson.h”
Acestea sunt librariile de care avem nevoie pentru rularea codului.
attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, RISING);
Aici atribuim pinul 14 (motionSenzor), ca pin de intrerupere; cand tensiunea de pe pin creste (rising), se va executa functia detectsMovment().
Serial.print(„Connecting Wifi: „);
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(„.”);
delay(500);
}
Serial.println(„”);
Serial.println(„WiFi connected”);
Serial.print(„IP address: „);
Serial.println(WiFi.localIP());
In aceasta parte a codului placa de dezvoltare se conecteaza la reteaua WiFi specificata la inceputul codului; de asemenea scrie in Serial Monitor adresa IP a placii de dezvoltare si numele retelei la care s-a conectat;
if(motionDetected){
bot.sendMessage(CHAT_ID, „A fost detectata miscare!!”, „”);
Serial.println(„Motion Detected”);
motionDetected = false;
}
In aceasta sectiune a codului bucla „if” verifica daca valoarea variabilei „motionDetected” a fost modificata de catre functia „detectsMovment()” in adevarat (true); In cazul in care a fost modificata, placa de dezvoltare ne va trimite un mesaj de alerta pe Telegram si va restabili valoarea variabilei inapoi la fals (false).
Bibliografie:
https://www.elektor.com/nodemcu
Eu nu as folosi esp8266 in aplicatii de securitate: https://hackaday.com/…/05/esp8266-and-esp32-wifi-hacked/
Pai intr-un articol trecut era o bresa in protocolul 802.11 🙂 Ce facem acum?
Wifi inseamna radio, radio inseamna emisie-receptie, receptie inseamna prag de zgomot. Doua diode cap in cap si o bucata de sarma conectate la o sursa de alimentare inseamna papa receptie pe o raza de cateva sute de metri. Deci securizare radio? Pe de alta parte poti programa ceva fallback in caz de nasoale, de exemplu cu o versiune mai veche de espeasy procesorul ingheata daca nu se poate conecta la serverul mqtt, deci in programare poti verifica intai daca ai acces la server.
Buna,
ma poate ajuta cineva sa completez codul pentru esp8266, astfel incat sa pot primi notificari de la mai multi senzori? Notificarile sa fie diferite, in functie de senzorul care se declanseaza.
Multumesc.