This is an old revision of the document!
Autor: Bogdan Dumitrescu
Grupa: 332CA
Email: bogdan.dumitrescu02@stud.acs.upb.ro
Proiectul reprezinta sistem de securitate al casei care consta intr-un sistem inteligent de deschidere al unei usi. El poate fi montat pe orice usa pentru acces cu parola si in cazul incercarii de intrare a unei persoane straine, se va declansa o alarma si vor fi trimise informatii despre momentul in care s-a declansat, catre persoana care detine produsul.
Proiectul este format pe de-o parte dintr-o placa de dezvoltare Arduino Mega2560, la care este legat un keypad 4x4, un modul led RGB, un micro servomotor(pentru a deschide usa), un buzzer si un ecran LED cu interfata I2C(pentru a afisa diferite informatii).
Pe de alta parte, proiectul mai contine o alta placa de dezvoltare, ESP32-CAM, folosita atat pentru camera OV2640, cat si pentru modulul Wifi, pentru a trimite date la un server, care notifica userul. Aceasta va schimba informatii cu placa de dezvoltare arduino pentru acces de la distanta, a afisa mesaje pe display-ul led, sau pentru a declansa alarma.
Arduino:
Probabil te intrebi de ce exista 3 componente de feedback(actuatori)(buzzer + led + display). Display-ul il voi folosi sa mai afisez mesaje de la server(acum are mai mult sens).
exemplu: Vad pe cineva la usa prin camera, afisez prin display mesajul: Nu sunt acasa
Acest arduino comunica cu un ESP32-CAM prin UART.
De ce atatia senzori? Vreau sa ii folosesc pentru optimizari, practic la un moment dat vreau sa fie activi doar senzorii de pe esp + tastatura de pe arduino, adica sa fie in sleep procesoarele ca sa nu consume multa baterie.
Totodata pe esp mai am si o ruta de live_video, care returneaza un video efectiv cu ce se intampla in momentul respectiv.(modulul de wifi l-as dezactiva daca senzorii nu returneaza nimic ca nu are sens sa pornesti camera sa nu vezi nimic).
Am un alt server pentru ca am observat ca se incarca greu pozele pe esp, si daca se apeleaza prin alt server(adica daca am un buton de take_photo si dupa am view_photo), se vede mai fluid si mi se pare mai buna logica.
Vreau pe serverul ca pe acest server sa am si un feature de activate alarm/deactivate alarm si allow access de la distanta.
Pentru comunicarea esp-arduino prin UART, folosesc un level shifter , deoarece pinii gpio opereaza la 3.3V(maxim 3.6V), iar pinii arduino opereaza 5VComponent | Arduino Pin(s) | Protocol/Communication Type |
---|---|---|
Keypad (Rows) | 6, 7, 8, 9 | Digital Input |
Keypad (Columns) | 2, 3, 4, 5 | Digital Input |
RGB LED (Red) | 10 | PWM |
RGB LED (Green) | 11 | PWM |
RGB LED (Blue) | 12 | PWM |
Active Buzzer | 13 | GPIO/Digital Output |
LCD (I2C Address) | I2C (A4 - SDA, A5 - SCL) | I2C |
Servo Motor 360 Continuous | A0 | PWM |
HC-SR04 Plus Trigger | A2 | GPIO |
HC-SR04 Plus Echo | A3 | GPIO |
RX | 0 | UART |
TX | 1 | UART |
Component | ESP32-CAM Pin(s) | Protocol/Communication Type |
---|---|---|
RX | 3 | UART |
TX | 1 | UART |
13 | GPIO | |
12 | GPIO | |
2 | ADC | |
4 | GPIO |
Am renuntat la senzorul de sunet deoarece nu era optim pentru distante mari, doar la apropiere detecta bine sunetele, oricat incercam sa il reglez din potentiometru, am ales in schimb sa maresc distanta de la senzorul ultrasonic ca sa detecteze mai din timp daca este cineva la usa
Github Repo: https://github.com/dumibxd26/HouseSecuritySystem/tree/main
In repository exista 3 directoare:
- ArduinoLock - contine codul pentru placa de dezvoltare Arduino UNO
- ESPServer - contine codul pentru placa de dezvoltare ESP32-CAM
- CloudServer - contine codul pentru serverul .NET care interactioneaza cu serverul tinut pe ESP32-CAM
void checkDistance()
{
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
if (distance > 0 && distance <= ACTIVATION_DISTANCE)
{
if (!systemActive)
{
systemActive = true;
activationTime = millis();
lcd.clear();
lcd.printMessage(ONE_LINE_MESSAGE, "Enter Password:");
lcd.backlight(); // Turn on the LCD backlight
wakeUp();
}
}
// Deactivate the system if the door is not opened within 120 seconds
if (millis() - activationTime >= DEACTIVATION_TIME && !policeAlarmActive && systemActive && !resettingPassword && !distanceDetected && enteredPassword == "")
{
deactivateSystem();
}
if (distance > 0 && distance <= distanceThreshold)
{
distanceDetected = true;
if (!previousDistanceDetected) // If it was not previously detected
{
Serial.println("start"); // Send message to ESP32-CAM
}
}
else
{
distanceDetected = false;
if (previousDistanceDetected) // If it was previously detected
{
Serial.println("stop"); // Send message to ESP32-CAM
}
}
previousDistanceDetected = distanceDetected;
}
La detectarea proximitatii se trimite un semnal de "start" catre esp32
Dupa partea de verificare a distantei, urmeaza partea de asteptare mesaje pe Seriala, adica mesajele de la server care acceseaza placuta de la distanta, acestea sunt de tipul Aon(alarm on), Aoff(alarm off), newPassword(setare de parola de la distanta), allowAccess(daca vrei sa ii deschizi cuiva usa de la distanta, practic nu stie parola, dar il vezi prin camera si il recunosti, si ii dai voie sa intre).
if (Serial.available() > 0)
{
String message = Serial.readString();
// Serial.println(message);
if (message.startsWith("Aon"))
{
lcd.clear();
lcd.printMessage(ONE_LINE_MESSAGE, "Calling 911");
policeAlarmActive = true;
enteredPassword = "";
attemptCount = 0;
}
else if (message.startsWith("Aoff"))
{
policeAlarmActive = false;
noTone(buzzerPin);
digitalWrite(buzzerPin, HIGH);
setLedColor(false, false, false);
lcd.clear();
lcd.printMessage(ONE_LINE_MESSAGE, "Alarm Deactivated!");
delay(1000);
lcd.clear();
lcd.printMessage(ONE_LINE_MESSAGE, "Enter Password:");
enteredPassword = "";
}
else if (message.startsWith("newPassword"))
{
// noticed when writing to the lcd the password
correctPassword = message.substring(message.indexOf("[") + 2, message.indexOf("]") - 1);
Serial.println(message);
lcd.clear();
// lcd.printMessage(ONE_LINE_MESSAGE, "Password Changed");
lcd.printMessage(TWO_LINE_MESSAGE, "Password Changed", correctPassword.c_str());
enteredPassword = "";
resettingPassword = false;
enteredAdminPassword = 0;
attemptCount = 0;
setLedColor(false, false, false);
delay(500);
lcd.clear();
lcd.printMessage(ONE_LINE_MESSAGE, "Enter Password:");
}
else if (message.startsWith("allowAccess"))
{
accessGranted();
}
}
Urmatoarea parte este verificarea daca alarma este activata, in cazul acela se asteapta scrierea parolei de administrator, care nu se afiseaza pe ecran, deoarece pe ecran se afiseaza doar mesajul "Calling 911", "infractroul" nestiind de existenta parolei de administrator si cum sa dezactivezi alarma
Intr-un final, este un handle pentru apasarea key-urilor, in momentul in care userul apasa o cheie aceasta este inregistrata, parola poate avea maxim 3 caractere in cazul actual, iar cand se ajunge la 3 caractere se verifica daca este corecta parola scrisa, daca se greseste parola de 3 ori, porneste alarma, daca parola este scrisa corect, porneste ledul rgb in cloarea verde, incepe o scurta melodie de deschidere a usii, iar servoul care tine locul unui zavor, se roteste 180 de grade(este un servo 360 continuu, deci practic se roteste 300 de milisecunde). Daca userul tine apasata tasta 'D' pentru 5 secunde, se intra in modul de resetare a parolei, ledul porneste in culoarea galben, se ateapta parola de admin si dupa aceea noua parola
void handlePoliceAlarmKeypad(char key)
{
if (key == 'D')
{
enteredPassword = "";
lastTimeKeyPressed = millis();
return;
}
if (key != keypad.getLastKeyPressed())
{
keypad.setLastKeyPressed(key);
lastTimeKeyPressed = millis();
enteredPassword += key;
if (enteredPassword.length() == 3)
{
if (enteredPassword == adminPassword)
{
policeAlarmActive = false;
noTone(buzzerPin);
digitalWrite(buzzerPin, HIGH);
setLedColor(false, false, false);
lcd.clear();
lcd.printMessage(ONE_LINE_MESSAGE, "Alarm Deactivated!");
delay(1000);
lcd.clear();
lcd.printMessage(ONE_LINE_MESSAGE, "Enter Password:");
}
enteredPassword = "";
}
delay(250);
}
}
if (httpd_resp_send_chunk(req, part_buf, len) != ESP_OK || httpd_resp_send_chunk(req, (const char *)fb->buf, fb->len) != ESP_OK)
{
esp_camera_fb_return(fb);
break;
}
Daca nu primesc ACK de la browser la o trimitere de imagine, nu mai trimit imagine.Care au fost rezultatele obţinute în urma realizării proiectului vostru.
Pot spune ca am invatat multe din acest proiect si doresc sa mentionez mai jos toate problemele de care m-am lovit
-Debug-ul se face foarte greu pe un esp32-cam deoarece placuta trebuie montata si demontata mereu pentru fiecare update -Ar fi fost mult mai optim sa folosesc doua placute la fel(esp32) pentru a face o comunicare mai optima, nu doar ca aduce un plus de fire prin prezenta unui level shifter, dar am avut de multe ori surpriza ca datele sa nu se trimita corect, sau foarte intarziat. -Pe langa folosirea a doua placute la fel, puteam sa nu folosesc deloc un arduino, deoarece dupa o analiza la pret si performanta(comparat cu un esp32-CAm sau orice tip de esp(chiar si 8266), arduino are un procesor foarte slab, foarte putina memorie ram si este prea mare, fara sens, comunicarea se face doar prin URAT, sau alta metoda pe care am incercat-o, comunicarea a doi senzori, foarte absurd, dar putea fi folosit un senzor de sunet si un buzzer unul langa altul pentru a trimite mesaje(insane dar functioneaza ;) ) -A fost greu sa flash-uiesc doua board-uri in paralel, deoarece imi trebuia un driver pentru a flash-ui esp32-CAM -CH340-, care odata ce detecta alta placuta in afara de esp32-cam, trebuia reinstalat si restart la laptop. -Problemele mentionate cu sleep modes -Am avut de multe ori surpriza ca esp-ul sa functioneze cand il tineam conectat la dev board dar sa nu mearga cand il conectam la bradboard PSU, totusi... mergea cand il conectam direct la bateria 9V, deci m-am prins dupa o zi ca problema era la breadboard PSU, de aceea acum il tin direct conectat la board-ul de development, chiar daca arata oribil, altcumva nu functioneaza, in plus, nereusing sa rezolv cu modurile de sleep, s-ar fi consumat foarte repede bateria(~6h) -Am cumparat o antena pentru esp32-cam pentru a avea conexiune mai buna la interent, inital avea, dar dupa, nu se mai conecta la wifi din cauzaei, fara motiv(inca ceva timp de debug)"O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-)"
Am folosit platformIO, librariile sunt deja salvate in fisierele platformio.ini, deci proiectul trebuie descarcate acelea si proiectul se va initializa automat
Cat despre serverul .Net, tot ce trebuie facut este sa fie instalat .Net 8(desi cred ca functioneaza si versiuni mai vechi precum .Net 5, sau chiar versiuni mai vechi de ASP.NET), dupa aceea sa fie rulata comanda dotnet run