Plant Weather Station

Introducere

Funcționalitățile pe care îmi propun să le implementez:

Stația măsoară umiditatea solului, temperatura, umiditatea aerului, presiunea atmosferică și nivelul radiației UV, afișează aceste valori pe un ecran OLED și emite alerte sonore (buzzer) și vizuale (mesaj pe OLED) atunci când pragurile predefinite sunt depășite. În plus, utilizatorul poate interacționa printr-un terminal Bluetooth Classic SPP pentru a interoga date și a regla pragurile în timp real și poate vizualiza datele reale prin intermediul aplicației Blynk, conectată la plăcuță prin WiFi.

Scopul proiectului:

Să ofere iubitorilor de plante (sau persoanelor care nu reușesc să își mențină plantele în viață m( ) o unealtă simplă și accesibilă pentru monitorizarea condițiilor de mediu și prevenirea stresului plantelor (creșterea UV, uscarea solului), optimizând astfel udarea și îngrijirea.

Ideea de la care am pornit:

Am pornit de la nevoia de a avea un sistem ușor de folosit, care să combine mai mulți senzori într-o interfață unificată și să permită atât vizualizare locală (OLED + buzzer + LED), cât și acces remote prin Bluetooth SPP și Blynk IOT. Cum nu mă consider o persoană responsabilă în îngirjirea plantelor, mi s-a părut un proiect care ar putea avea utilitatea în viața reală, ajutându-mă să am grijă mai ușor de plante.

De ce este util pentru alții și pentru noi:

Pentru alții: Simplifică monitorizarea plantelor de apartament sau din sere mici, fără a fi nevoie de echipamente complexe sau abonamente la servicii online.

Pentru mine: Îmi doresc să pot avea grijă de plante mai ușor și să îmi dau seama când și cum trebuie să le ofer atenție, lucru pe care uneori nu reușesc să îl fac pe cont propriu.

Descriere generală

Staţia meteo pentru plante este construită în jurul unei plăci ESP32, care:

Colectează datele de mediu

  1. Temperatură şi umiditate aer (DHT11 – interfaţă digitală cu pull-up)
  2. Umiditate sol (ieşire analogică → ADC1)
  3. Nivel de lumină ambientală (divizor LDR + rezistor → ADC1)

Procesează şi afişează local

  1. Ecran OLED 0.96” pentru valori şi mesaje de alertă (lab SPI)

Notifică şi alertează userul

  1. Buzzer controlat PWM (lab PWM) pentru praguri depăşite
  2. LED de semnalizare la nivel minim de lumină (lab GPIO)

Interacţiune utilizator

  1. Bluetooth (UART): meniu text pentru configurare praguri (min./max.) şi selectare tip plantă
  2. Wi-Fi (Blynk): afişare în timp real pe telefon/tabletă (gauge + chart)

Flux de funcţionare

  • La pornire, ESP32 aşteaptă conexiune Bluetooth şi afişează meniul principal.
  • Citirile de la senzori se fac la intervale fixe (lab Timer) şi se salvează pragurile.
  • Dacă o valoare iese din intervalul minim–maxim, se activează buzzerul.
  • Datele sunt trimise spre Blynk prin Wi-Fi şi actualizate pe OLED.
  • Utilizatorul poate oricând reconfigura pragurile prin comenzi Bluetooth.
  • În tot acest timp, datele înregistrate de senzori sunt transmise către platforma Blynk IOT, unde ultilizatorul poate vedea date reale despre planta de care are grijă, precum și grafice cu evoluția fiecărui parametru urmărit.

Hardware Design

Alimentare și ground (3.3 V și GND)

  • Toate modulele și senzorii de pe placa de test (breadboard) sunt alimentați de la pinul 3.3 V al ESP32 DevKit.
  • Linia de masă a ESP32 (GND) este comună pentru toate componentele.

DHT11 (temperatură & umiditate aer)

Pin DATA → GPIO 32 (ADC1_CH4)

  • Am folosit un pin din ADC1 pentru că acești pini sunt configurați intern ca intrări digitale stabile și nu interferează cu Wi-Fi/Bluetooth.

Pull-up 4.7 kΩ între DATA și 3.3 V

  • DHT11 comunică în mod open-collector, necesitând un rezistor de pull-up pentru a menține linia la HIGH când senzorul nu trage la LOW.

VCC → 3.3 V și GND → GND

  • DHT11 funcționează bine la 3.3 V, asigurând consum redus.

Soil Moisture Sensor (umiditate sol)

AOUT → GPIO 36 (ADC1_CH0, alias VP)

  • Am ales GPIO 36 deoarece face parte din ADC1 (canal 0), oferind citiri analogice consecvente chiar și cu Wi-Fi activ.

VCC → 3.3 V și GND → GND

  • Modulul este alimentat direct la 3.3 V.

Mapare în cod

  • map(raw, 3500, 1000, 0, 100) — valorile brute sunt calibrate empiric pentru intervalul 0–100 %.

LDR + rezistor de divizor (luminozitate)

LDR legat între 3.3 V și pinul ADC (GPIO 33 = ADC1_CH5)

Rezistor fix 10 kΩ între același pin ADC și GND

  • Formează un divizor de tensiune: când lumina crește, rezistența LDR scade ⇒ tensiunea la ADC crește; și invers.
  • Am folosit un rezistor de 10 kΩ pentru un compromis bun între sensibilitate și liniaritate.

GPIO 33 ales pentru stabilitate pe ADC1 (nu interferează cu WiFi sau Bluetooth)

OLED 0.96” (SPI)

  • MOSI → GPIO 23
  • SCLK → GPIO 18
  • CS → GPIO 5
  • D/C → GPIO 21
  • RST → GPIO 22
  • SPI: Protocolul SPI oferă rate de transfer ridicate, necesare pentru actualizări rapide pe ecran.

Buzzer

Controll PWM0 → GPIO 25

  • Am configurat canalul PWM0 la 2 kHz și rezoluție 8 biți pentru a genera tonuri clare.

Minus buzzer → GND

  • Conexiune directă la masă.

LED de alertă

  • Anod LED → GPIO 26
  • Catod LED → GND prin rezistor de 220 Ω
  • Rezistorul limitează curentul la ≈ 5–10 mA, protejând atât LED-ul, cât și pinul GPIO.

Interfețe de comunicare

BluetoothSerial (UART)

  • Folosește TX0/RX0 interne ale ESP32; nu necesită fire externe pe DevKit.

Wi-Fi (Blynk)

  • Modulul ESP32 se conectează direct la Internet și transmite datele senzorilor către aplicația Blynk.

Listă componente utilizate (alături de linkurile de unde le-am achiziționat):

Progres pe partea Hardware:

În fotografiile de mai jos, se poate urmări progresul făcut pe partea de hardware:

Schema Hardware

Pentru a face schematicul, am folosit platforma easy eda. Mai jos, am atașat schema circuitului electric pentru proiectul realizat de mine.

Software Design

Mediu de dezvoltare:

  • Platformă: PlatformIO sub Visual Studio Code
  • Framework: Arduino
  • Placă țintă: ESP32 DevKit
  • Monitor serial: 115200 baud (Serial și BluetoothSerial)

Biblioteci și surse 3rd-party:

Algoritmi și structuri implementate:

Citirea senzorilor:

  • DHT11 - dht.readTemperature(), dht.readHumidity() + verificare date primite
  • Soil moisture - analogRead(SOIL_MOISTURE_PIN) + map()/constrain() la %
  • LDR - 10-sample averaging (readLightRaw()), apoi map()/constrain() la %

State machine Bluetooth-menu:

  • 3 stări: MENU_MAIN, MENU_THRESHOLDS, MENU_PLANT
  • Funcții de afișare a diferitelor conținuturi: printMainMenu(), printThresholdMenu(), printPlantMenu()
  • Parsare comenzi cu String::startsWith(), pentru a verifica inputul primit de la utilizatori, urmând o decizie pe baza acestuia

Structură date plante:

  • struct Plant { name, tempMin/Max, humMin/Max, soilMin/Max, lightMin/Max }
  • Array plants[numPlants] pentru selecție automată de praguri

Alarmă și ieșiri:

  • Verificare praguri min/max pentru fiecare senzor - flag alarmOn
  • Buzzer - PWM canal 0, 2 kHz, 8-bit (ledcSetup(), ledcWrite())
  • LED de alertă - GPIO26 HIGH/LOW

Surse și funcții implementate:

setup()

  • Inițializare Serial, DHT, BluetoothSerial, pinMode, PWM, OLED
  • Apel printMainMenu() după conectare Bluetooth

loop()

Dacă SerialBT.available():

  • procesează meniul și iese din loop()

În caz contrar:

  • Citește toți senzorii
  • Compară cu pragurile (min/max)
  • Activează buzzer/LED dacă alarmOn == true
  • Afișează date și mesaje pe OLED
  • Trimite date la Blynk (Blynk.virtualWrite)
  • Apelează Blynk.run() și timer.run()

sendSensor() — trimite periodic datele la Blynk

readLightRaw() — eșantionare și media pentru stabilizare citiri LDR

Pe aplicația Blynk, afișarea va fi in felul următor:

În interfața serială Bluetooth, meniul va arăta astfel:

Rezultate Obţinute

Rezultate și observații făcute pe parcursul implementării:

Senzori

  • Senzorul DHT11 (temperatură & umiditate aer): măsurătorile făcute au fost precise în majoritatea cazurilor, lucru pe care l-am observat având lângă mine un termostat care oferea chiar temperatura și umiditatea aerului (se poate observa și într-una din pozele de la Hardware). Totuși, am observat că senzorul este destul de sensibil, iar umiditatea escalează foarte repede atunci când îl mișcăm din cauza contactului cu pielea.
  • Soil Moisture: după calibrare, rezultatele obținute au fost verosimile
  • LDR (lumină): deși am calibrat valorile primite făcând media mai multor intrări, senzorul este încă destul de sensibil, iar fluctuațiile pot fi mari în anumite situații. Totuși, rezultatele sunt proporționale cu datele reale, ceea ce consider că este un câștig pentru proiect.

Functionalități interactive

Bluetooth Serial Menu:

  • Navigare fără erori între meniul principal, submeniul praguri și cel de selecție plantă.
  • Setări praguri preluate instant și validate (intervale permise).
  • Selectarea unei plante din listă (14 opțiuni) aplică corect seturile de praguri asociate.

Blynk Web Dashboard:

  • Gauge-uri pentru fiecare parametru (V0–V3), actualizate la 1 s;
  • Chart-uri în timp real care confirmă evoluția senzorilor în timp;
  • Transfer stabil fără pierderi de pachete în rețeaua Wi-Fi locală.

Alerte și ieșiri

Buzzer PWM:

  • Generare ton continuu la 2 kHz când vreun senzor depășește pragurile min/max.

LED de avertizare:

  • Aprins automat când luminozitatea scade sub prag (10 %).

Pentru testele făcute de mine, modelul s-a comportat conform așteptărilor, iar senzorii au interceptat toate schimbările de mediu pe care le-am adus. Overall, sunt mulțumită de performanța pe care a avut-o proiectul.

Concluzii

Stația meteo pentru plante implementată pe ESP32 a demonstrat succes atât din perspectivă hardware, cât și software, îndeplinind așteptările proiectului pe care le-am setat inițial.

Funcționalitate completă

  • Colectează în timp real date de temperatură, umiditate aer, umiditate sol și lumină,
  • Afișează informațiile pe un OLED și le transmite prin Wi-Fi către Blynk,
  • Permite configurarea pragurilor prin Bluetooth fără recompilare.

Interacțiune cu utilizatorul:

  • Meniu Bluetooth intuitiv (state-machine)
  • Dashboard Blynk cu gauge-uri și chart-uri în timp real
  • Schimbarea instantanee a pragurilor și selecția tipului de plantă.

Extensibilitate

  • Cod modular și documentat, ușor de adaptat pentru alți senzori (UV, CO2 etc.)
  • Pot fi implementate și alte funcționalități plecând de la acest model de bază, pentru a eleva și mai mult experiența utilizatorului.

Îmbunătățiri posibile

  • Un senzor UV dedicat (ex. ML8511) ar aduce informații suplimentare utile.
  • Implementarea deep-sleep și wake-up pe timer pentru autonomie extinsă.
  • Interfață grafică locală mai complexă pe OLED (icon-uri, grafice).

În concluzie, proiectul satisface obiectivele educaționale și practice, oferind o platformă solidă și scalabilă pentru monitorizarea ambientală și îngrijirea plantelor.

Download

Proiectul a fost încărcat pe GitHub, la această adresă: https://github.com/teominea/PlantWeatherStation

Jurnal

Planul inițial pentru senzorul de lumină era să folosesc un senzor UV. Am încercat să îl conectez, însă nu reușea să citească în mod corect semnalele. Apoi, am modificat pinii conectați (am crezut că acolo e problema), până când am simțit că iese un miros de fum din proiect și am zis ca e momentul sa renunț la aceasta idee 😊

Așadar, am ajuns să folosesc un fotorezistor prin care înregistrez doar intensitatea luminii, nu și a razelor UV.

Întrucât mi s-a părut că interacțiunea user-aplicație/proiect poate să fie îmbunătățită, am venit cu ideea de a crea un meniu disponibil în iterfața serială bluetooth din care utilizatorul poate alege fie să schimbe parametrii min și max ai senzorilor, fie să selecteze planta pentru care vrea să folosească stația, setându-se niște threshold-uri standard.

Chiar dacă nu am mai avut timp să implementez funcționalități extra, m-am gândit la câteva care ar putea adăuga un plus stației de plante, asfel încât atunci când se depășesc niște limite, să facă acțiuni spre a diminua efectul nociv asupra plantelor. Ex: e prea cald, activează prin WiFi aerul condiționat. Cred că acestea ar fi niște extensii drăguțe ale proiectului. Eu am implementat un prototip de „acțiune autonomă”, prin aprinderea led-ului atunci când lumina scade sub pragul maxim, lucru care poate fi generalizat pe obiecte mai mari decât un simplu led.

Crearea carcasei a fost o adevărată provocare întrucât pe tot parcursul pregătirilor am lucrat cu două breadboard-uri de 830 de puncte, motivul principal fiind că plăcuța avea pinii distanțați în mod eronat și nu încăpea pe un singur breadboard. Așadar, a fost nevoie să folosesc două cutii pentru a aduce la o formă mai lipsită de fire vizibile proiectul, fapt care a cauzat niște mici întreruperi ale semnalelor din cauza faptului că prelungirea firelor pentru componente a condus la destabilizarea semnalelor.

Bibliografie/Resurse

pm/prj2025/rnedelcu/teodora_maria.minea.txt · Last modified: 2025/05/28 11:08 by teodora_maria.minea
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