This is an old revision of the document!


Stație meteorologică inteligentă

Introducere

Proiectul constă în realizarea unei stații meteorologice inteligente avansate care:

  • măsoară și afișează temperatura, umiditatea și calitatea aerului în timp real
  • înregistrează datele colectate și afișează data și ora curentă
  • utilizează o placă Arduino, senzori de temperatură și umiditate, un senzor de calitate a aerului, un breadboard, un display și funcționalități de conectivitate wireless și înregistrare a datelor
  • ideea de la care am pornit a fost să creez o stație meteorologică care să ofere date precise și în timp real despre condițiile de mediu dintr-o locație anume
  • proiectul este util atat pentru mine cat si pentru altii, deoarece poate fi utilizat pentru monitorizarea mediului înconjurător și pentru a lua măsuri adecvate în cazul depășirii limitelor acceptabile ale parametrilor măsurați

Descriere generală

Schemă bloc a proiectului:

  • Placa Arduino controlează senzorii, modulul Wi-Fi, modulul RTC, precum și afișajul LCD
  • Senzorii de temperatură, umiditate și calitatea aerului trimit datele măsurate către placa Arduino
  • Modulul Wi-Fi trimite datele colectate către un server Node.js
  • Modulul RTC furnizează data și ora curentă pentru afișare pe ecranul LCD
  • Ecranul LCD afișează valorile măsurate de senzori, data și ora curentă
  • Serverul trimite datele catre o baza de date PostgreSQL
  • Vom genera 3 grafice care monitorizeaza datele prinmite de la Arduino, pe un site care primeste datele de la server printr-un request GET

Hardware

  +--------------------+
  |                    |
  |      Arduino       |
  |                    |
  +----------+---------+
             |
             | I2C, Analog, Digital
             |
  +----------+---------+
  |                    |
  |    Sensori + RTC   |
  |                    |
  +----------+---------+
             |
             | Wireless (ESP32)
             |

Software

  +----------+---------+
  |                    |
  |    Cod Arduino     |
  | (C++ cu librarii)  |
  |                    |
  +----------+---------+
             |
             | HTTP POST
             |
  +----------+---------+      +-------------------+
  |                    |      |                   |
  |     Server Node    |      |     Baza de       |
  |  (JavaScript cu    |      |  date PostgreSQL  |
  |   Express și Prisma)      |                   |
  |                    |      |                   |
  +----------+---------+      +-------------------+
             |                        ^
             | HTTP GET               |
             |                        | Query SQL
  +----------+---------+              |
  |                    |              |
  |     Frontend       |              |
  |   (React, Vue etc) |--------------+
  |                    |
  +--------------------+

Hardware Design

Listă de piese:

  1. Placă Arduino Wemos R32 (cu modul wi-fi implementat):
  2. Senzor de temperatură și umiditate: DHT11
  3. Senzor de calitate a aerului: MQ135 
  4. Breadboard
  5. Display 16x2
  7. Fire de conexiune
  10. Modul RTC (Real Time Clock)

In schema de pe thinkercad nu am inclus modulul RTC, de asemenea senzorul de calitatea aerului a fost reprezentat printr-un senzor de gaz.

Software Design

Arduino:

Software-ul proiectului constă intr-un program încărcat pe placa Arduino. Acesta citește datele de la senzorii conectați la placa, le afișează pe display-ul LCD și le trimite pe un server prin intermediul modulului WiFi.

Librării utilizate în acest proiect:

Wire.h: O bibliotecă care oferă comunicare I2C, utilizată pentru interacțiunea cu display-ul LCD și cu RTC.

LiquidCrystal_I2C.h: Biblioteca care controlează display-ul LCD.

DHT.h: Biblioteca utilizată pentru a comunica cu senzorul DHT11.

MQ135.h: Biblioteca folosită pentru a comunica cu senzorul de calitate a aerului MQ135.

RTClib.h: O bibliotecă pentru a lucra cu Real-Time Clock.

WiFi.h: O bibliotecă care permite conectarea la o rețea WiFi și comunicarea prin aceasta.

HTTPClient.h: Biblioteca pentru efectuarea de cereri HTTP (POST, în cazul nostru).

Structura codului este simplă și se bazează pe două funcții principale ale Arduino IDE:

setup(): Aceasta este funcția unde toate modulele hardware sunt inițializate. Se inițializează modulul LCD, senzorul de temperatură și umiditate (DHT11), senzorul de calitate a aerului (MQ135) și Real Time Clock (RTC).

De asemenea, se inițializează modulul WiFi și se conectează la rețeaua specificată prin SSID și parola. În cazul în care conexiunea la WiFi nu reușește, Arduino începe un proces de reîncercare la fiecare secundă. După ce s-a realizat conexiunea, adresa IP alocată modulului WiFi este afișată pe LCD.

loop(): Aceasta este funcția unde se realizează citirea datelor de la senzorii conectați, afișarea lor pe LCD și trimiterea lor pe server.

La începutul funcției loop, se inițializează clientul HTTP care va fi folosit pentru a trimite cereri HTTP la serverul nostru. Se adaugă apoi un header pentru a specifica că tipul de conținut care va fi trimis va fi text.

Se creează apoi trei șiruri de caractere, unul pentru fiecare dată pe care dorim să o trimitem la server: temperatura, umiditatea și calitatea aerului.

Următoarea buclă for trece prin toate aceste șiruri de caractere și pentru fiecare dintre ele, actualizează display-ul LCD cu ora curentă și cu valoarea datelor, apoi trimite o cerere HTTP POST către server cu datele. Această buclă se repetă la fiecare secundă.

După ce toate datele au fost trimise la server, se închide clientul HTTP. De asemenea, există funcții auxiliare pentru conversia datelor de la senzori în șiruri de caractere, pentru afișarea timpului și pentru ștergerea unui rând de pe display.

Server:

Serverul Node.js, scris în JavaScript și folosind Express.js și Prisma pentru interacțiunea cu baza de date, primește aceste date, le parsează și le stochează în baza de date. Acest server este și punctul de plecare pentru solicitările GET ale frontend-ului, răspunzând cu datele cerute.

Frontend:

Site-ul este scris în React.js și conține două componente principale: App și AirChart.

Componenta App este componenta principală a aplicației. În interiorul acesteia, folosim Hook-urile useState și useEffect pentru a obține și actualiza datele primite de la serverul Node.js.

useState: Este un Hook în React care ne permite să adăugăm stare în componentele noastre funcționale. În acest caz, starea este utilizată pentru a stoca datele primite de la server.

useEffect: Acest Hook acceptă o funcție care conține efecte secundare - operațiuni pe care le putem efectua în componenta noastră funcțională. În acest caz, se folosește pentru a face o cerere HTTP la server și pentru a actualiza starea cu datele primite. Acest efect va rula după fiecare randare și la un interval de 5 secunde datorită apelului setInterval.

Datele obținute sunt apoi filtrate pe baza tipului lor (Air, Temp, Hum) și fiecare set de date este trimis ca prop la componenta AirChart pentru a fi afișat în graficul corespunzător.

Componenta AirChart este responsabilă pentru afișarea datelor într-un grafic de linii, folosind biblioteca Recharts. Aceasta primește datele ca prop și calculează valoarea minimă, maximă și media a datelor. Acestea sunt folosite pentru a configura axa Y a graficului și pentru a trasa o linie de referință care reprezintă media datelor. În final, datele sunt afișate într-un grafic de linii, cu timpul pe axa X și valorile pe axa Y.

În concluzie, această aplicație React.js preia date de la serverul Node.js și le afișează în trei grafice de linii, unul pentru fiecare tip de date (Air, Temp, Hum), actualizându-se în timp real la un interval de 5 secunde.

cod arduino si server:

https://github.com/bubu798/Intelligent_Meteo_Station/blob/main/sketch_may28b.ino

cod frontend:

https://github.com/bubu798/Intelligent_Meteo_Station_Frontend

Rezultate Obținute

Rezultatele obtinute sunt 3 grafice care monitorizeaza temperatura, umiditatea, respectiv calitatea aerului dintr-un anumit loc, pe un site.

Acestea sunt actualizare in timp real, aici: https://meteo-stats.vercel.app/, atata timp cat statia meteorologica este conectata.

Concluzii

Download

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ă ;-). Fișierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fișierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.

Jurnal

07.05 - Creat pagina de proiect și adăugat documentația inițială

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software și Resurse Hardware.

Export to PDF

pm/prj2023/apredescu/statie_meteo_inteligenta.1685385021.txt.gz · Last modified: 2023/05/29 21:30 by razvan.petrisor
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0