Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2026:cezar.zlatea:ana_maria.focsa [2026/05/09 06:32]
ana_maria.focsa [Descriere generală]
pm:prj2026:cezar.zlatea:ana_maria.focsa [2026/05/23 02:03] (current)
ana_maria.focsa [Configurarea senzorului de umiditate]
Line 67: Line 67:
   * diagrame de semnal ​   * diagrame de semnal ​
   * rezultatele simulării   * rezultatele simulării
 +
 +==== Stadiul actual al implementării hardware ====
 +
 +În stadiul actual, partea hardware a proiectului a fost realizată la nivel de proiectare și montaj pe breadboard. Au fost alese componentele principale, au fost stabilite conexiunile dintre acestea și placa Arduino UNO R3, iar schema electrică a fost realizată în Fusion 360 Electronics.
 +
 +Montajul este realizat fără lipire, folosind breadboard și fire jumper. Alimentarea modulelor se face de la placa Arduino UNO R3, prin pinul de 5V și GND. Toate componentele împart aceeași masă comună, ceea ce este necesar pentru ca semnalele citite și transmise între module să fie interpretate corect.
 +
 +În schema electrică, modulele comerciale precum senzorul de umiditate, LCD-ul, RTC-ul, modulul microSD și modulul Bluetooth HC-05 sunt reprezentate prin conectori, deoarece acestea sunt deja asamblate și sunt conectate la Arduino prin pini.
 +
 +==== Componente folosite și rolul lor ====
 +
 +^ Componentă ^ Rol în proiect ^
 +| Arduino UNO R3 compatibil | Placa principală a proiectului. Coordonează citirea senzorului, afișarea datelor, avertizarea utilizatorului,​ salvarea datelor și comunicarea Bluetooth. |
 +| Breadboard | Permite realizarea montajului fără lipire și conectarea rapidă a componentelor. |
 +| Senzor higrometru capacitiv | Măsoară umiditatea solului și transmite către Arduino o valoare analogică. |
 +| LCD 16x2 cu I2C | Afișează umiditatea curentă și statusul plantei. |
 +| LED roșu | Oferă avertizare vizuală atunci când planta trebuie udată. |
 +| Rezistență 220Ω | Limitează curentul prin LED pentru a-l proteja. |
 +| Buzzer activ | Oferă avertizare sonoră atunci când umiditatea este sub pragul stabilit. |
 +| Buton Start/Stop | Permite pornirea și oprirea logică a monitorizării. |
 +| Modul RTC DS3231 | Oferă data și ora exactă pentru fiecare măsurătoare. |
 +| Baterie CR2032 | Menține funcționarea RTC-ului atunci când sistemul nu este alimentat. |
 +| Modul microSD | Permite salvarea măsurătorilor într-un fișier CSV. |
 +| Card microSD 4GB | Reprezintă mediul de stocare pentru datele salvate. |
 +| Modul Bluetooth HC-05 | Permite transmiterea datelor și statisticilor către telefon sau laptop. |
 +| Rezistențe 1kΩ și 2kΩ | Formează divizorul de tensiune pentru pinul RXD al modulului HC-05. |
 +| Fire jumper | Realizează conexiunile dintre Arduino, breadboard și module. |
 +| Cablu USB | Alimentează placa Arduino și permite încărcarea codului. |
 +
 +==== Pini folosiți și explicații ====
 +
 +^ Componentă ^ Pin componentă ^ Pin Arduino / conexiune ^ Explicație ^
 +| Senzor higrometru capacitiv | AOUT | A0 | Ieșirea senzorului este analogică, deci trebuie citită printr-un pin analogic al plăcii Arduino. |
 +| Senzor higrometru capacitiv | VCC | 5V | Senzorul este alimentat de la pinul de 5V al plăcii Arduino. |
 +| Senzor higrometru capacitiv | GND | GND | Este conectat la masa comună a sistemului. |
 +| LCD 16x2 I2C | SDA | A4 | Pe Arduino UNO, pinul A4 este folosit pentru linia SDA a comunicației I2C. |
 +| LCD 16x2 I2C | SCL | A5 | Pe Arduino UNO, pinul A5 este folosit pentru linia SCL a comunicației I2C. |
 +| LCD 16x2 I2C | VCC | 5V | Display-ul este alimentat la 5V. |
 +| LCD 16x2 I2C | GND | GND | Este conectat la masa comună. |
 +| RTC DS3231 | SDA | A4 | RTC-ul folosește tot comunicație I2C și poate împărți linia SDA cu LCD-ul. |
 +| RTC DS3231 | SCL | A5 | RTC-ul împarte linia SCL cu LCD-ul. |
 +| RTC DS3231 | VCC | 5V | Modulul RTC este alimentat la 5V. |
 +| RTC DS3231 | GND | GND | Este conectat la masa comună. |
 +| LED roșu | Anod | D7 prin rezistență 220Ω | Pinul D7 controlează aprinderea LED-ului. Rezistența limitează curentul prin LED. |
 +| LED roșu | Catod | GND | Catodul LED-ului este conectat la masă. |
 +| Buzzer activ | + | D8 | Pinul D8 controlează pornirea și oprirea buzzerului. |
 +| Buzzer activ | - | GND | Buzzerul este conectat la masa comună. |
 +| Buton Start/Stop | un pin | D2 | D2 este folosit ca intrare digitală pentru citirea stării butonului. |
 +| Buton Start/Stop | celălalt pin | GND | La apăsare, pinul D2 este conectat la GND. În cod se folosește INPUT_PULLUP. |
 +| Modul microSD | CS | D10 | Pinul CS selectează modulul microSD pe magistrala SPI. |
 +| Modul microSD | MOSI | D11 | MOSI transmite date de la Arduino către modulul microSD. |
 +| Modul microSD | MISO | D12 | MISO transmite date de la modulul microSD către Arduino. |
 +| Modul microSD | SCK | D13 | SCK este semnalul de ceas pentru comunicația SPI. |
 +| Modul microSD | 5V | 5V | Modulul microSD folosit este alimentat la 5V. |
 +| Modul microSD | GND | GND | Este conectat la masa comună. |
 +| Modul microSD | 3V3 | neconectat | Pinul 3V3 nu este folosit, deoarece modulul este alimentat prin pinul de 5V. |
 +| HC-05 Bluetooth | TXD | D5 | TXD al modulului transmite date către Arduino. D5 este folosit prin SoftwareSerial. |
 +| HC-05 Bluetooth | RXD | D6 prin divizor 1kΩ/2kΩ | Arduino transmite date către HC-05 prin D6. Divizorul reduce nivelul logic către RXD. |
 +| HC-05 Bluetooth | VCC | 5V | Modulul Bluetooth este alimentat la 5V. |
 +| HC-05 Bluetooth | GND | GND | Este conectat la masa comună. |
 +| HC-05 Bluetooth | STATE, EN | neconectat | Acești pini nu sunt necesari pentru funcționalitatea de bază a proiectului. |
 +
 +==== Schema electrică ====
 +
 +Schema electrică a fost realizată în Fusion 360 Electronics și prezintă conexiunile dintre placa Arduino UNO R3 și toate modulele folosite în proiect.
 +
 +{{:​pm:​prj2026:​cezar.zlatea:​focsa_izabela_schema.png?​500|Schema electrică}}
 +
 +În schema electrică, Arduino UNO R3 este componenta centrală. Senzorul de umiditate este conectat la pinul A0, deoarece acesta transmite un semnal analogic. LCD-ul și modulul RTC DS3231 sunt conectate pe aceeași magistrală I2C, folosind pinii A4 pentru SDA și A5 pentru SCL. Acest lucru este posibil deoarece magistrala I2C permite conectarea mai multor module pe aceleași două linii de comunicație.
 +
 +Modulul microSD folosește protocolul SPI, motiv pentru care este conectat la pinii D10-D13 ai plăcii Arduino. Modulul Bluetooth HC-05 comunică serial cu Arduino prin SoftwareSerial,​ folosind pinii D5 și D6. Pentru pinul RXD al modulului HC-05 se folosește un divizor de tensiune format din rezistențele de 1kΩ și 2kΩ, deoarece semnalul transmis de Arduino are nivel logic de 5V.
 +
 +LED-ul roșu este conectat la pinul D7 printr-o rezistență de 220Ω, iar buzzerul activ este conectat la pinul D8. Butonul Start/Stop este conectat între pinul D2 și GND, iar în cod va fi configurat folosind INPUT_PULLUP.
 +
 +==== Conexiuni principale ====
 +
 +=== Senzorul de umiditate ===
 +
 +<​code>​
 +Senzor VCC  -> Arduino 5V
 +Senzor GND  -> Arduino GND
 +Senzor AOUT -> Arduino A0
 +</​code>​
 +
 +Senzorul transmite o valoare analogică, iar Arduino o citește prin pinul A0. Această valoare va fi ulterior transformată într-un procent de umiditate.
 +
 +=== LCD și RTC pe I2C ===
 +
 +<​code>​
 +LCD SDA -> A4
 +LCD SCL -> A5
 +
 +RTC SDA -> A4
 +RTC SCL -> A5
 +</​code>​
 +
 +LCD-ul și RTC-ul folosesc același protocol de comunicație,​ I2C. De aceea, ambele module pot fi conectate la aceiași pini SDA și SCL ai plăcii Arduino.
 +
 +=== Modulul microSD ===
 +
 +<​code>​
 +microSD CS   -> D10
 +microSD MOSI -> D11
 +microSD MISO -> D12
 +microSD SCK  -> D13
 +</​code>​
 +
 +Modulul microSD folosește protocolul SPI. Pinul CS este folosit pentru selectarea modulului, iar MOSI, MISO și SCK sunt folosite pentru transferul efectiv de date.
 +
 +=== Modulul Bluetooth HC-05 ===
 +
 +<​code>​
 +HC-05 TXD -> D5
 +HC-05 RXD -> D6 prin divizor de tensiune
 +HC-05 VCC -> 5V
 +HC-05 GND -> GND
 +</​code>​
 +
 +Pentru RXD se folosește un divizor de tensiune:
 +
 +<​code>​
 +D6 Arduino -> rezistență 1kΩ -> nod comun -> HC-05 RXD
 +nod comun -> rezistență 2kΩ -> GND
 +</​code>​
 +
 +Această conexiune este necesară pentru a proteja intrarea RXD a modulului HC-05.
 +
 +=== LED, buzzer și buton ===
 +
 +<​code>​
 +D7 -> rezistență 220Ω -> LED roșu -> GND
 +D8 -> buzzer activ -> GND
 +D2 -> buton -> GND
 +</​code>​
 +
 +LED-ul și buzzerul sunt folosite ca ieșiri digitale. Butonul este folosit ca intrare digitală și va fi configurat în cod cu INPUT_PULLUP.
 +
 +==== Imagini cu componentele conectate ====
 +
 +{{:​pm:​prj2026:​cezar.zlatea:​focsa_izabela_componente.jpg?​500|Montaj hardware pe breadboard}}
 +
 +Imaginea de mai sus prezintă montajul hardware realizat pe breadboard. Se observă placa Arduino UNO R3, breadboard-ul și conexiunile dintre module.
 +
 +Schema electrică atașată prezintă echivalentul logic al montajului fizic. Aceasta include conexiunile către senzor, LCD, RTC, microSD, Bluetooth, LED, buzzer și buton.
 +
 +==== Verificarea schemei electrice ====
 +
 +Schema electrică a fost verificată în Fusion 360 Electronics folosind funcția ERC. După conectarea alimentării prin +5V și GND și după lăsarea neconectată a pinilor care nu sunt folosiți, schema nu mai prezintă erori critice.
 +
 +Pinii nefolosiți sunt:
 +
 +  * STATE și EN de la modulul HC-05;
 +  * 3V3 de la modulul microSD.
 +
 +Acești pini sunt nefolosiți deoarece nu sunt necesari pentru funcționalitățile planificate ale proiectului.
 +
 </​note>​ </​note>​
  
 ===== Software Design ===== ===== Software Design =====
 +
 ==== Mediu de dezvoltare ==== ==== Mediu de dezvoltare ====
  
-Firmware-ul proiectului ​va fi dezvoltat în:+Firmware-ul proiectului ​este dezvoltat în:
  
   * PlatformIO în Visual Studio Code   * PlatformIO în Visual Studio Code
  
-Codul va fi scris în C/C++ pentru Arduino.+Codul este scris în C/C++ pentru Arduino ​UNO R3. 
 + 
 +Proiectul este organizat pe mai multe fișiere, pentru a separa logica aplicației de partea de configurare hardware și de calculul statisticilor. 
 + 
 +==== Structura proiectului ==== 
 + 
 +<​code>​ 
 +soil_moisture_monitor/​ 
 +│ 
 +├── platformio.ini 
 +│ 
 +├── include/ 
 +│   ​├── config.h 
 +│   ​├── hardware.h 
 +│   ​└── statistics.h 
 +│ 
 +├── src/ 
 +│   ​├── main.cpp 
 +│   ​├── hardware.cpp 
 +│   ​└── statistics.cpp 
 +│ 
 +├── README.md 
 +└── ChangeLog.md 
 +</​code>​ 
 + 
 +==== Fișiere implementate ==== 
 + 
 +^ Fișier ^ Rol ^ 
 +| platformio.ini | Conține configurația PlatformIO pentru placa Arduino UNO și librăriile externe folosite. | 
 +| include/​config.h | Conține pinii folosiți, adresa LCD-ului, valorile de calibrare pentru senzor, pragul de umiditate și intervalele de timp pentru măsurare, logare și transmitere Bluetooth. | 
 +| include/​hardware.h | Declară funcțiile folosite pentru interacțiunea cu hardware-ul:​ LCD, RTC, microSD, Bluetooth, LED, buzzer, buton și senzor. | 
 +| include/​statistics.h | Definește structura de date pentru statistici și funcțiile asociate. | 
 +| src/​main.cpp | Conține logica principală a aplicației și bucla principală de execuție. | 
 +| src/​hardware.cpp | Implementează inițializarea și controlul componentelor hardware. | 
 +| src/​statistics.cpp | Implementează funcțiile pentru calculul statisticilor. | 
 +| README.md | Conține descrierea proiectului,​ conexiunile și instrucțiuni de rulare. | 
 +| ChangeLog.md | Conține istoricul modificărilor proiectului|
  
 ==== Librării folosite ==== ==== Librării folosite ====
  
 ^ Librărie ^ Rol ^ ^ Librărie ^ Rol ^
-| Wire.h | Comunicare I2C | +| Arduino.h | Funcționalități de bază pentru Arduino. | 
-| LiquidCrystal_I2C.h | Control ​LCD 16x2 cu I2C | +| Wire.h | Comunicare I2C pentru LCD și RTC DS3231. ​
-| RTClib.h | Citirea datei și orei de la DS3231 | +| LiquidCrystal_I2C.h | Controlul display-ului ​LCD 16x2 cu interfață ​I2C
-| SPI.h | Comunicare SPI pentru modulul microSD | +| RTClib.h | Citirea datei și orei de la modulul RTC DS3231
-| SD.h | Scriere și citire fișiere ​pe cardul microSD | +| SPI.h | Comunicare SPI pentru modulul microSD
-| SoftwareSerial.h | Comunicare serială cu modulul Bluetooth HC-05 |+| SD.h | Scrierea datelor ​pe cardul microSD
 +| SoftwareSerial.h | Comunicare serială ​software ​cu modulul Bluetooth HC-05|
  
-==== Algoritmul ====+==== Configurarea pinilor ==== 
 + 
 +Pinii proiectului sunt definiți în fișierul `config.h`. 
 + 
 +<code c> 
 +const uint8_t PIN_SOIL_SENSOR = A0; 
 +const uint8_t PIN_BUTTON = 2; 
 + 
 +const uint8_t PIN_BT_RX = 5; 
 +const uint8_t PIN_BT_TX = 6; 
 + 
 +const uint8_t PIN_LED = 7; 
 +const uint8_t PIN_BUZZER = 8; 
 + 
 +const uint8_t PIN_SD_CS = 10; 
 +</​code>​ 
 + 
 +Pinii A4 și A5 sunt folosiți automat pentru comunicația I2C: 
 + 
 +<​code>​ 
 +A4 -> SDA 
 +A5 -> SCL 
 +</​code>​ 
 + 
 +Pentru modulul microSD sunt folosiți pinii SPI ai plăcii Arduino UNO: 
 + 
 +<​code>​ 
 +D10 -> CS 
 +D11 -> MOSI 
 +D12 -> MISO 
 +D13 -> SCK 
 +</​code>​ 
 + 
 +==== Configurarea senzorului de umiditate ==== 
 + 
 +Valorile de calibrare ale senzorului sunt definite în `config.h`:​ 
 + 
 +<code c> 
 +const int SENSOR_DRY_ADC = 750; 
 +const int SENSOR_WET_ADC = 350; 
 +const int HUMIDITY_THRESHOLD_PERCENT = 35; 
 +</​code>​ 
 + 
 +Conversia valorii ADC în procent se face în funcția `convertAdcToHumidityPercent()`:​ 
 + 
 +<code c> 
 +int convertAdcToHumidityPercent(int adcValue) { 
 +  long humidity = map(adcValue,​ SENSOR_DRY_ADC,​ SENSOR_WET_ADC,​ 0, 100); 
 +  humidity = constrain(humidity,​ 0, 100); 
 +  return (int)humidity;​ 
 +
 +</​code>​ 
 + 
 +==== Algoritmul ​aplicației ​====
  
 La pornirea sistemului: La pornirea sistemului:
  
-  - se inițializează ​LCD-ul+  - se inițializează ​statisticile
-  - se configurează pinii pentru ​senzor, ​LED, buzzer și buton;+  - se configurează pinii pentru LED, buzzer și buton
 +  - se pornește comunicația serială și comunicația Bluetooth;​ 
 +  - se inițializează magistrala I2C; 
 +  - se pornește LCD-ul;
   - se inițializează modulul RTC DS3231;   - se inițializează modulul RTC DS3231;
   - se inițializează cardul microSD;   - se inițializează cardul microSD;
-  ​- se inițializează comunicația Bluetooth;​ +  - se afișează ​mesajul ​de pornire pe LCD.
-  ​- se afișează ​un mesaj de pornire pe LCD.+
  
 În bucla principală:​ În bucla principală:​
  
-  - se verifică ​starea butonului ​Start/Stop;+  - se verifică ​dacă butonul ​Start/​Stop ​a fost apăsat;
   - dacă sistemul este oprit logic:   - dacă sistemul este oprit logic:
     * LED-ul este stins;     * LED-ul este stins;
Line 107: Line 356:
     * LCD-ul afișează mesajul „Sistem oprit”;     * LCD-ul afișează mesajul „Sistem oprit”;
   - dacă sistemul este pornit:   - dacă sistemul este pornit:
-    * se citește valoarea analogică ​a senzorului;+    * se citește valoarea analogică ​de la senzor;
     * valoarea ADC este convertită în procent de umiditate;     * valoarea ADC este convertită în procent de umiditate;
-    ​* se citește data și ora de la RTC; +    * se stabilește ​dacă planta este în status ​„OK” sau „USCAT”;
-    ​* se stabilește ​statusul plantei: ​„OK” sau „UDAȚI PLANTA+
-    * se actualizează LCD-ul; +
-    * se controlează LED-ul și buzzerul; +
-    * se salvează datele pe cardul microSD;+
     * se actualizează statisticile;​     * se actualizează statisticile;​
-    * se transmit datele prin Bluetooth.+    ​* se controlează LED-ul și buzzerul; 
 +    * se actualizează LCD-ul; 
 +    * se salvează periodic datele pe cardul microSD; 
 +    ​* se transmit ​periodic ​datele prin Bluetooth.
  
 +==== Funcții principale implementate ====
 +
 +^ Funcție ^ Rol ^
 +| initHardware() | Inițializează componentele hardware: pini, LCD, RTC, microSD, Bluetooth și Serial Monitor. |
 +| buttonPressedEvent() | Detectează apăsarea butonului Start/Stop folosind debounce. |
 +| readSoilAdc() | Citește valoarea analogică de la senzorul de umiditate. |
 +| convertAdcToHumidityPercent() | Transformă valoarea ADC într-un procent de umiditate. |
 +| setAlerts() | Pornește sau oprește LED-ul și buzzerul în funcție de statusul plantei. |
 +| updateLcd() | Actualizează informațiile afișate pe LCD. |
 +| getCurrentTime() | Citește data și ora de la modulul RTC DS3231. |
 +| logMeasurementToSd() | Salvează măsurătorile și statisticile pe cardul microSD. |
 +| sendBluetoothReport() | Trimite prin Bluetooth valorile curente și statisticile. |
 +| resetStats() | Resetează valorile statistice. |
 +| updateStats() | Actualizează media, minimul, maximul și numărul de măsurători. |
 +| getAverageHumidity() | Calculează media umidității. |
 +| getTrend() | Determină tendința umidității:​ creștere, scădere sau stabilă. |
 +| getDeltaFromFirst() | Calculează diferența față de prima măsurătoare. |
  
 ==== Stabilirea statusului plantei ==== ==== Stabilirea statusului plantei ====
 +
 +Statusul plantei este stabilit prin compararea umidității curente cu pragul definit în `config.h`.
 +
 +<code c>
 +currentDry = currentHumidity < HUMIDITY_THRESHOLD_PERCENT;​
 +currentStatus = currentDry ? "​USCAT"​ : "​OK";​
 +</​code>​
 +
 +Dacă umiditatea este sub prag, LED-ul și buzzerul sunt pornite. Dacă umiditatea este peste prag, acestea sunt oprite.
  
 <code c> <code c>
-if (umiditate < pragUmiditate) { +void setAlerts(bool systemActive,​ bool isDry) { 
-    status = "​USCAT";​ +  ​if (systemActive && isDry) { 
-    digitalWrite(ledPin, HIGH); +    digitalWrite(PIN_LED, HIGH); 
-    digitalWrite(buzzerPin, HIGH); +    digitalWrite(PIN_BUZZER, HIGH); 
-} else { +  } else { 
-    status = "​OK";​ +    digitalWrite(PIN_LED, LOW); 
-    digitalWrite(ledPin, LOW); +    digitalWrite(PIN_BUZZER, LOW); 
-    digitalWrite(buzzerPin, LOW);+  }
 } }
 </​code>​ </​code>​
Line 134: Line 408:
 ==== Structuri de date pentru statistici ==== ==== Structuri de date pentru statistici ====
  
-Pentru calculul statisticilor se pot folosi variabile simple:+Statisticile sunt păstrate într-o structură numită `MoistureStats`.
  
 <code c> <code c>
-int umiditateCurenta;​ +struct MoistureStats { 
-int umiditateMinima = 100+  bool initialized
-int umiditateMaxima = 0+  ​unsigned long count
-long sumaUmiditate = 0+  long sum
-unsigned long numarMasuratori = 0+  int minimum
-int primaMasurare+  int maximum
-int ultimaMasurare+  int first
-int masurareAnterioara+  int previous
-int masuratoriSolUscat = 0;+  int current; 
 +  unsigned long dryCount; 
 +};
 </​code>​ </​code>​
  
-Statisticile calculate:+Această structură permite calcularea următoarelor informații:
  
-  * umiditatea curentă;+  * numărul total de măsurători;​ 
 +  * suma valorilor măsurate;
   * media umidității;​   * media umidității;​
   * valoarea minimă;   * valoarea minimă;
   * valoarea maximă;   * valoarea maximă;
-  * diferența față de prima măsurătoare+  * prima valoare ​surată; 
-  * tendința: creștere, scădere sau stabilă;+  * valoarea anterioară
 +  * valoarea curentă;
   * numărul de măsurători în care solul a fost uscat.   * numărul de măsurători în care solul a fost uscat.
  
 ==== Calculul statisticilor ==== ==== Calculul statisticilor ====
 +
 +La fiecare măsurătoare,​ funcția `updateStats()` actualizează valorile statistice.
  
 <code c> <code c>
-sumaUmiditate +umiditateCurenta+void updateStats(MoistureStats &stats, int humidityPercent,​ bool isDry) { 
-numarMasuratori++;+  if (!stats.initialized) { 
 +    stats.initialized ​true
 +    ​stats.first = humidityPercent;​ 
 +    stats.previous = humidityPercent;​ 
 +    stats.current = humidityPercent;​ 
 +    stats.minimum = humidityPercent;​ 
 +    stats.maximum = humidityPercent;​ 
 +  } else { 
 +    stats.previous = stats.current;​ 
 +    stats.current = humidityPercent;
  
-int media sumaUmiditate / numarMasuratori;+    if (humidityPercent < stats.minimum) { 
 +      stats.minimum ​humidityPercent; 
 +    }
  
-if (umiditateCurenta < umiditateMinima) { +    ​if (humidityPercent > stats.maximum) { 
-    ​umiditateMinima ​umiditateCurenta;+      stats.maximum = humidityPercent;​ 
 +    ​
 +  } 
 + 
 +  stats.sum +humidityPercent; 
 +  stats.count++;​ 
 + 
 +  if (isDry) { 
 +    stats.dryCount++;​ 
 +  }
 } }
 +</​code>​
  
-if (umiditateCurenta > umiditateMaxima) { +Media este calculată astfel: 
-    ​umiditateMaxima = umiditateCurenta;+ 
 +<code c> 
 +int getAverageHumidity(const MoistureStats &stats) { 
 +  ​if (stats.count == 0) { 
 +    ​return 0; 
 +  } 
 + 
 +  return (int)(stats.sum / (long)stats.count);
 } }
 </​code>​ </​code>​
Line 177: Line 485:
 ==== Calculul tendinței ==== ==== Calculul tendinței ====
  
-<​code>​ +Tendința este calculată prin compararea valorii curente ​cu valoarea anterioară.
-dacă umiditatea curentă este cu peste 2 puncte mai mare decât ​valoarea anterioară+
-    tendință = CREȘTERE+
  
-dacă umiditatea curentă este cu peste puncte mai mică decât valoarea anterioară:​ +<code c> 
-    ​tendință = SCĂDERE+const char* getTrend(const MoistureStats &stats) { 
 +  if (!stats.initialized || stats.count < 2) { 
 +    ​return "​STABIL";​ 
 +  }
  
-altfel: +  int diff = stats.current - stats.previous;​ 
-    ​tendință = STABILĂ+ 
 +  if (diff > 2) { 
 +    ​return "​CRESTERE";​ 
 +  } 
 + 
 +  if (diff < -2) { 
 +    return "​SCADERE";​ 
 +  } 
 + 
 +  return "STABIL"; 
 +}
 </​code>​ </​code>​
  
 ==== Formatul fișierului CSV ==== ==== Formatul fișierului CSV ====
  
-Datele salvate pe cardul microSD ​pot avea următorul format:+Datele ​sunt salvate pe cardul microSD ​în fișierul:​ 
 + 
 +<​code>​ 
 +umid.csv 
 +</​code>​ 
 + 
 +Header-ul fișierului este: 
 + 
 +<code csv> 
 +date,​time,​adc,​humidity,​status,​average,​min,​max,​trend,​delta_from_first,​dry_count,​count 
 +</​code>​ 
 + 
 +Exemplu de linie salvată:
  
 <code csv> <code csv>
-data,​ora,​umiditate,​status,​media,​minim,​maxim,​tendinta +2026-05-08,​16:​40:00,522,​28,​USCAT,​45,​28,​72,​SCADERE,-14,3,10
-2026-05-08,​16:​30:00,42,​OK,​48,​35,​72,​SCADERE +
-2026-05-08,​16:​35:​00,​39,​OK,​47,​35,​72,​SCADERE +
-2026-05-08,​16:​40:​00,​28,​USCAT,​45,​28,​72,​SCADERE+
 </​code>​ </​code>​
  
 ==== Mesaj transmis prin Bluetooth ==== ==== Mesaj transmis prin Bluetooth ====
  
-Prin modulul HC-05 se poate transmite un mesaj de forma:+Prin modulul HC-05 se transmite ​periodic ​un raport cu valorile curente și statisticile calculate.
  
 <​code>​ <​code>​
-[16:40:00]+---------------- 
 +Timp: 2026-05-08 ​16:40:00 
 +ADC: 522
 Umiditate: 28% Umiditate: 28%
-Status: ​UDATI PLANTA+Status: ​USCAT
 Media: 45% Media: 45%
 Minim: 28% Minim: 28%
 Maxim: 72% Maxim: 72%
 Tendinta: SCADERE Tendinta: SCADERE
-LEDON +Diferenta fata de start-14 pct 
-BuzzerON+Masuratori sol uscat
 +SD: OK
 </​code>​ </​code>​
  
-==== Funcții planificate ​====+==== Funcționarea butonului Start/​Stop ​==== 
 + 
 +Butonul Start/Stop este configurat folosind rezistența internă de pull-up a microcontrollerului.
  
 <code c> <code c>
-void initHardware(); +pinMode(PIN_BUTTONINPUT_PULLUP);
-int citesteUmiditateADC();​ +
-int convertesteInProcent(int valoareADC);​ +
-void actualizeazaLCD(int umiditateString status); +
-void controleazaAvertizari(int umiditate);​ +
-void actualizeazaStatistici(int umiditate);​ +
-String calculeazaTendinta(int umiditateCurenta,​ int umiditateAnterioara);​ +
-void salveazaPeSD(DateTime timp, int umiditate, String status); +
-void trimiteBluetooth(DateTime timp, int umiditate, String status); +
-void verificaButon();+
 </​code>​ </​code>​
  
-===== Rezultate Obţinute ===== +Astfel:
-În urma realizării proiectului,​ se urmărește obținerea unui sistem funcțional care: +
- +
-  * măsoară umiditatea solului; +
-  * afișează umiditatea și statusul plantei pe LCD; +
-  * aprinde LED-ul roșu atunci când planta trebuie udată; +
-  * pornește buzzerul activ cât timp umiditatea este sub pragul stabilit; +
-  * permite pornirea și oprirea monitorizării cu ajutorul unui buton; +
-  * citește data și ora de la modulul RTC DS3231; +
-  * salvează măsurătorile pe cardul microSD într-un fișier CSV; +
-  * calculează statistici simple despre evoluția umidității;​ +
-  * transmite datele și statisticile prin Bluetooth către un dispozitiv extern. +
- +
-Exemplu de afișare pe LCD când planta are umiditate suficientă:+
  
 <​code>​ <​code>​
-Umiditate: 42% +buton neapăsat -> HIGH 
-Status: OK+buton apăsat ​  -> LOW
 </​code>​ </​code>​
  
-Exemplu de afișare pe LCD când planta trebuie udată:+Funcția `buttonPressedEvent()` detectează apăsarea butonului ​și schimbă starea sistemului între pornit și oprit.
  
-<​code>​ +<​code ​c
-Umiditate: 28% +if (buttonPressedEvent()) { 
-Status: UDATI+  ​systemActive = !systemActive;​ 
 +}
 </​code>​ </​code>​
  
-Exemplu ​de linie salvată pe cardul microSD:+==== Timpi de execuție ====
  
-<code csv> +Intervalele de timp sunt definite în `config.h`.
-2026-05-08,​16:​40:​00,​28,​USCAT,​45,​28,​72,​SCADERE +
-</​code>​+
  
-Exemplu de mesaj transmis prin Bluetooth:​ +<​code ​c
- +const unsigned long MEASURE_INTERVAL_MS = 1000; 
-<​code>​ +const unsigned long LCD_INTERVAL_MS = 1000; 
-Ora: 16:40:00 | Umiditate: 28% | Status: UDATI PLANTA | Media: 45%+const unsigned long SD_LOG_INTERVAL_MS = 10000; 
 +const unsigned long BT_SEND_INTERVAL_MS = 3000;
 </​code>​ </​code>​
  
-<note tip> +Astfel:
-Descrierea codului aplicaţiei (firmware): +
-  * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) +
-  * librării şi surse 3rd-party (e.g. Procyon AVRlib) +
-  * algoritmi şi structuri pe care plănuiţi să le implementaţi +
-  * (etapa 3) surse şi funcţii implementate +
-</​note>​+
  
-<note tip> +  * senzorul este citit la fiecare 1 secundă; 
-Care au fost rezultatele obţinute în urma realizării proiectului vostru. +  * LCD-ul este actualizat la fiecare 1 secundă; 
-</​note>​+  * datele sunt salvate pe microSD la fiecare 10 secunde; 
 +  * raportul Bluetooth este trimis la fiecare 3 secunde.
  
 ===== Concluzii ===== ===== Concluzii =====
Line 286: Line 592:
  
 <note warning> <note warning>
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectuluisurse, scheme, etcUn fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).+Codul sursă al proiectului ​este disponibil pe GitHub[[https://​github.com/Izabela-Focsa/​soil_moisture_monitor.git|soil_moisture_monitor]]
  
 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**. 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**.
pm/prj2026/cezar.zlatea/ana_maria.focsa.1778297554.txt.gz · Last modified: 2026/05/09 06:32 by ana_maria.focsa
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