Detector de scurgeri de gaze si inundatii
Introducere
Acest proiect detecteaza scurgerile de gaze si inundatiile si trimite datele catre un server prin protocolul HTTP pentru a fi vizualizate de la distanta.
Am ales sa fac acest proiect deoarece eu plec din Bucuresti acasa aproximativ o data la 2 saptamani si de fiecare data ma gandesc peste weekend daca am lasat aragazul sau o baterie pornite. Cred ca ar fi util si pentru alti oameni uituci. :)
Descriere generală
Modulul Wifi ESP8266 se alimenteaza la iesirea de 3.3V a arduino-ului. Acesta are de asemenea si pin-urile Reset si CH_EN cnectate la 3.3V. Pin-ul TX a modulului este conectat la pin-ul RX al arduino-ului, iar pin-ul RX a modulului este conectat la pin-ul TX al arduino-ului pentru a asigura comunicarea.
Senzorul de gaze MQ-5 se alimenteaza cu 5V din arduino si are iesirea analog conectata la pin-ul A0 al arduino-ului.
Senzorul de ploaie se alimenteaza si el cu 5V din arduino si are iesirea analog conectata la pin-ul A1 al arduino-ului.
Atat modulul ESP8266 cat si senzorii au cate un pin GND si acestia sunt legati la GND-ul arduino-ului.
Hardware Design
Lista de piese:
Software Design
Cod Arduino
Setup
Algoritmul incepe prin configurarea initiala a microcontrolerului AVR si a modulului ESP8266 in functia setup(). In aceasta etapa, se realizeaza urmatoarele actiuni:
Se seteaza tipul pinilor pentru conectarea senzorilor de gaz si apa (input).
Se activeaza comunicarea seriala (USART) intre microcontroler si modulul ESP8266.
Se stabileste conexiunea la reteaua Wi-Fi folosind functia connectToWiFi().
Se asteapta o scurta perioada de timp pentru ca modulul ESP8266 sa se conecteze la retea.
Loop
Dupa configurarea initiala, algoritmul intra in bucla principala loop(), unde se realizeaza urmatoarele actiuni:
Se citesc valorile analogice de la senzorii de gaz si apa utilizand functia readAnalogValue().
Se analizeaza valorile citite pentru determinarea starii senzorului de gaz si a clasei de apa.
Pentru senzorul de gaz, daca valoarea citita este mai mare de 250, se considera ca exista gaz si se seteaza variabila gaz la 1. Altfel, se seteaza gaz la 0.
Pentru senzorul de apa, se realizeaza o serie de comparatii pentru a determina clasa apei in functie de valoarea citita (sunt 4 clase). Aceasta se atribuie variabilei current_class.
Se verifca daca s-au produs modificari in starea senzorului de gaz sau in clasa apei fata de masuratorile anterioare.
Daca s-au produs modificari, se seteaza variabila ok la 1 pentru a semnala ca trebuie trimise noi date catre server.
Daca s-a detectat o schimbare si trebuie trimise noi date, se apeleaza functia sendPostRequest() pentru a realiza o cerere POST catre serverul extern, transmitand valorile de gaz si apa.
Se asteapta o perioada de 5 secunde intre doua cereri consecutive.
Functii auxiliare
In algoritmul principal am definit cateva functii auxiliare care asigura functionalitatea sistemului:
connectToWiFi(): Aceasta functie realizeaza conectarea la reteaua Wi-Fi utilizand SSID-ul si parola specificate. Comunicarea se face prin comenzi AT trimise modulului ESP8266.
sendPostRequest(int gaz, int apa): Functia construieste o cerere POST formatata conform protocolului HTTP si o trimite catre serverul extern. Cererea contine valorile de gaz si apa si este transmisa prin comunicarea seriala cu modulul ESP8266.
readAnalogValue(int pin): Functia citeste valoarea analogica de la pinul specificat si o converteste intr-o valoare digitala folosind modulul ADC al microcontrolerului AVR.
Cod Server
Server
Se importa modulele necesare, cum ar fi Express, Body Parser si WebSocket. Se configureaza adresa IP si portul serverului
Se configureaza middleware-ul Express pentru a permite analiza cererilor si raspunsurilor HTTP. De asemenea, se seteaza motorul de vizualizare EJS pentru a genera pagini
HTML.
Odata ce se primeste o cerere GET pentru ruta de baza ”/”, se randeaza template-ul EJS “index.ejs”, care afiseaza valorile curente ale cheilor “gaz” si “apa”.
Atunci cand se primeste o cerere POST pentru ruta de baza ”/”, se actualizeaza valorile cheilor “gaz” si “apa” cu noile valori primite in corpul cererii POST. Apoi, se trimite o actualizare prin WebSocket catre toti clientii conectati.
Atunci cand un client se conecteaza prin WebSocket, acesta este adaugat la lista de clienti conectati. Se trimit clientului valorile curente ale cheilor “gaz” si “apa”. In momentul in care un client se deconecteaza, acesta este eliminat din lista de clienti.
Client
Se stabileste o conexiune WebSocket catre adresa IP si portul specificat.
Cand se primeste un mesaj WebSocket, acesta este parsat intr-un obiect JSON pentru a obtine valorile gazului si apei.
Utilizand un switch, se verifica valorile primite si se afiseaza mesaje corespunzatoare pentru fiecare valoare, insotite de schimbari ale imaginii de fundal si a culorii textului.
Elementele
HTML cu id-urile “gaz” si “apa” sunt actualizate pentru a afisa valorile corespunzatoare.
Rezultate Obţinute
In urma realizarii proiectului am reusit sa am un modul de detectie care trimite datele citite de la senzori la un server remote si astfel ma pot bucura de weekenduri linistit.
Download
Bibliografie/Resurse