In articolul precedent, „Sistem de securitate cu notificare prin Telegram” am prezentat cum puteti sa primiti notificari pe aplicatia Telegram cand cineva trece printr-o anumita zona.
Ce prezinta articolul?
Acest articol prezinta o imbunatatire a articolului precedent; in loc de a primi un simplu mesaj pe Telegram, veti primi o poza de fiecare data cand cineva trece prin fata senzorului PIR.
Mai in detaliu, va vom prezenta cum puteti construi un sistem de detectare a miscarilor, cu ajutorul unui senzor PIR (Passive InfraRed sensor), a unei placi de dezvoltare ESP 8266 (sau ESP32) si a aplicatiei Telegram care de aceasta data va primi o poza in loc de mesaj.
- Modul ESP32-CAM;
- Senzor PIR;
- Un condensator de 100uF;
- Un adaptor Serial – USB pentru a programa modulul ESP32-CAM;
Modulul ESP32-CAM are ca microcontroler arhicunoscutul ESP32, un microcontroler ce dispune de doua nuclee de procesare care ruleaza la 160 MHz sau 240 MHz, 520 KB de SRAM, aceste specificatii permitandu-i chiar sa poata creea un web-stream cu imaginea furnizata de camera.
Pe langa microcontroler, aceasta placa dispune de un LED pentru a lumina zonele intunecate, un slot pentru un card MicroSD si o camera + conector; camera este modulara si se poate schimba cu una mai performanta (cu mai multe lentine).
Configuratii pini – modul ESP32-CAM
Conexiunile hardware Senzor PIR – Modul ESP32-CAM
- GND – GND
- Vcc – 5V
- Signal – IO13
Cum programam modulul ESP32-CAM?
Pentru a programa modulul ESP32-CAM, in primul rand avem nevoie de un convertor USB-UART.
!!Atentie – Deoarece modulul ESP32 foloseste ca tensiune logica 3.3V, este necesar sa configuram si tensiunea logica a programatorului tot la 3.3V; daca din neatentie tensiunea logica a acestuia din urma este configurata la 5V, riscati sa avariati ireversibil modulul ESP32.
Programatorul trebuie conectat la placa de dezvoltare conform urmatoarei scheme:
Programator (stanga)-ESP32-CAM (dreapta);
- Vcc – 3.3V;
- TX – U0R;
- RX – U0R;
- GND – GND;
In timpul programarii este necesar sa creati o punte intre pinul GND si IO0;
Bot-ul pentru Telegram
Daca nu ati mai creat un bot pentru Telegram, este foarte simplu, trebuie doar sa urmati pasii prezentati in articolul „Sistem de securitate cu notificare prin Telegram”, sectiunea „Cum cream botul pentru Telegram?”;
Codul pentru modulul ESP32-CAM
// ESP32 Cam Motion Alert | Send Image to Telegram
// Enter your WiFi ssid and password
const char* ssid = „–––„; //WIFI SSID
const char* password = „–––„; //WIFI password
String token = „––––––––––„;
String chat_id = „––-„;
#include „WiFi.h”
#include „WiFiClientSecure.h”
#include „soc/soc.h”
#include „soc/rtc_cntl_reg.h”
#include „esp_camera.h”
//CAMERA_MODEL_AI_THINKER
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
int gpioPIR = 13; //PIR Motion Sensor
void setup()
{
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
Serial.begin(115200);
delay(10);
WiFi.mode(WIFI_STA);
Serial.println(„”);
Serial.print(„Connecting to „);
Serial.println(ssid);
WiFi.begin(ssid, password);
long int StartTime=millis();
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
if ((StartTime+10000) < millis()) break;
}
Serial.println(„”);
Serial.println(„STAIP address: „);
Serial.println(WiFi.localIP());
Serial.println(„”);
if (WiFi.status() != WL_CONNECTED) {
Serial.println(„Reset”);
ledcAttachPin(4, 3);
ledcSetup(3, 5000, 8);
ledcWrite(3,10);
delay(200);
ledcWrite(3,0);
delay(200);
ledcDetachPin(3);
delay(1000);
ESP.restart();
}
else
{
ledcAttachPin(4, 3);
ledcSetup(3, 5000, 8);
for (int i=0;i<5;i++) {
ledcWrite(3,10);
delay(200);
ledcWrite(3,0);
delay(200);
}
ledcDetachPin(3);
}
camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = Y2_GPIO_NUM;
config.pin_d1 = Y3_GPIO_NUM;
config.pin_d2 = Y4_GPIO_NUM;
config.pin_d3 = Y5_GPIO_NUM;
config.pin_d4 = Y6_GPIO_NUM;
config.pin_d5 = Y7_GPIO_NUM;
config.pin_d6 = Y8_GPIO_NUM;
config.pin_d7 = Y9_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.pin_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_sscb_sda = SIOD_GPIO_NUM;
config.pin_sscb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_JPEG;
if(psramFound())
{
config.frame_size = FRAMESIZE_VGA;
config.jpeg_quality = 10; //0-63 lower number means higher quality
config.fb_count = 2;
}
else
{
config.frame_size = FRAMESIZE_QQVGA;
config.jpeg_quality = 12; //0-63 lower number means higher quality
config.fb_count = 1;
}
// camera init
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK)
{
Serial.printf(„Camera init failed with error 0x%x”, err);
delay(1000);
ESP.restart();
}
sensor_t * s = esp_camera_sensor_get();
s->set_framesize(s, FRAMESIZE_XGA);
}
void loop()
{
pinMode(gpioPIR, INPUT_PULLUP);
int v = digitalRead(gpioPIR);
Serial.println(v);
if (v==1)
{
alerts2Telegram(token, chat_id);
delay(10000);
}
delay(1000);
}
String alerts2Telegram(String token, String chat_id)
{
const char* myDomain = „api.telegram.org”;
String getAll=””, getBody = „”;
camera_fb_t * fb = NULL;
fb = esp_camera_fb_get();
if(!fb)
{
Serial.println(„Camera capture failed”);
delay(1000);
ESP.restart();
return „Camera capture failed”;
}
WiFiClientSecure client_tcp;
if (client_tcp.connect(myDomain, 443))
{
Serial.println(„Connected to ” + String(myDomain));
String head = „–IndiarnContent-Disposition: form-data; name=”chat_id”; rnrn” + chat_id + „rn–IndiarnContent-Disposition: form-data; name=”photo”; filename=”esp32-cam.jpg”rnContent-Type: image/jpegrnrn”;
String tail = „rn–India–rn”;
uint16_t imageLen = fb->len;
uint16_t extraLen = head.length() + tail.length();
uint16_t totalLen = imageLen + extraLen;
client_tcp.println(„POST /bot”+token+”/sendPhoto HTTP/1.1”);
client_tcp.println(„Host: ” + String(myDomain));
client_tcp.println(„Content-Length: ” + String(totalLen));
client_tcp.println(„Content-Type: multipart/form-data; boundary=India”);
client_tcp.println();
client_tcp.print(head);
uint8_t *fbBuf = fb->buf;
size_t fbLen = fb->len;
for (size_t n=0;n {
if (n+1024 {
client_tcp.write(fbBuf, 1024);
fbBuf += 1024;
}
else if (fbLen%1024>0)
{
size_t remainder = fbLen%1024;
client_tcp.write(fbBuf, remainder);
}
}
client_tcp.print(tail);
esp_camera_fb_return(fb);
int waitTime = 10000; // timeout 10 seconds
long startTime = millis();
boolean state = false;
while ((startTime + waitTime) > millis())
{
Serial.print(„.”);
delay(100);
while (client_tcp.available())
{
char c = client_tcp.read();
if (c == ‘n’)
{
if (getAll.length()==0) state=true;
getAll = „”;
}
else if (c != ‘r’)
getAll += String(c);
if (state==true) getBody += String(c);
startTime = millis();
}
if (getBody.length()>0) break;
}
client_tcp.stop();
Serial.println(getBody);
}
else {
getBody = „Connection to telegram failed.”;
Serial.println(„Connection to telegram failed.”);
}
return getBody;
}
Inainte de a incarca codul in placa de dezvoltare, este necesar sa inlocuiti urmatorii parametrii: „ssid”, „password”, „token” si „chat_id”, cu numele retelei dvs. de WiFi, parola retelei dvs. de WiFi, codul si numarul chat-ului de pe Telegram; indicatii cu privire la obtinerea ultimelor doua coduri -> aici.
De asemenea este necesar sa aveti urmatoarele configuratii in meniul „Tools” din Arduino IDE:
Probleme si posibile rezolvari:
In fotografia trimisa pe Telegram exista dungi colorate
Dungile colorate din fotografie se datoreaza faptului ca folositi o sursa de alimentare neconforma; incercati sa schimbati sursa de alimentare de 5v si incercati din nou;
Imaginea primita pe Telegram este neclara
Va recomand sa ajustati focalizarea camerei (daca dispune de aceasta optiune) prin invartirea lentilei de pe modulul cu camera;
Camera nu se conecteaza la reteaua WiFi / nu trimite mesaj pe Telegram
Este recomandat sa verificati in codul incarcat pe placa de dezvoltare datele de autentificare, iar in caz de nu primiti poze, este recomandat sa ajustati potentiometrele disponiblie pe modulul PIR.
Surse:
https://randomnerdtutorials.com/