This shows you the differences between two versions of the page.
|
pm:prj2026:alexandru.jipa2803:marius.dogeanu0509 [2026/05/19 11:28] marius.dogeanu0509 |
pm:prj2026:alexandru.jipa2803:marius.dogeanu0509 [2026/05/23 20:20] (current) marius.dogeanu0509 |
||
|---|---|---|---|
| Line 40: | Line 40: | ||
| * **Rezistorul R3 220** pe gate limitează curentul de încărcare al capacității gate-ului MOSFET-ului la pornire și oprire | * **Rezistorul R3 220** pe gate limitează curentul de încărcare al capacității gate-ului MOSFET-ului la pornire și oprire | ||
| * **Rezistorii R1 si R2 100k** creează un divizor de tensiune pentru a măsura nivelul bateriei. ESP-ul suportă maximum 3V3. Bateria poate ajunge la tensiuni mai ridicate | * **Rezistorii R1 si R2 100k** creează un divizor de tensiune pentru a măsura nivelul bateriei. ESP-ul suportă maximum 3V3. Bateria poate ajunge la tensiuni mai ridicate | ||
| + | |||
| + | ==== Consum ==== | ||
| + | |||
| + | **Panoul Solar**: operează în jur de 12V (tensiunea de putere maximă) | ||
| + | |||
| + | **Bateria Li-Ion 18650**: are o tensiune nominală de 3.7V. Când este complet descărcată are în jur de 3.0V, iar când modulul CN3791 o încarcă la maximum, ajunge la 4.2V | ||
| + | |||
| + | **ESP32**: are un regulator intern. Îl poți alimenta direct din baterie pe pinul BAT sau 3.3V, deoarece placa acceptă tensiunea variabilă a bateriei (3.0V - 4.2V) | ||
| + | |||
| + | **Pompa de apă**: funcționează între 3V și 6V | ||
| + | |||
| + | === Calcule încărcare(plin soare) === | ||
| + | |||
| + | **Putere panou**: 4.2W | ||
| + | |||
| + | **Curent maxim din modul spre baterie**: 500mA la 4.2V (Putere necesară = 4.2V * 0.5A = 2.1W) | ||
| + | |||
| + | **Timp de încărcare**: T = Capacitate baterie/Curent încărcare = 2850mAh/500mAh = 5.7h => deci, în realitate, ar veni undeva la 6h. | ||
| + | |||
| + | === Consum daca este ținut nonstop === | ||
| + | |||
| + | **ESP32**: ~100mA(cu Wi-fi pornit) | ||
| + | |||
| + | **Pompa de apă**: ~200mA | ||
| + | |||
| + | **Consum total** ~= 300mA | ||
| + | |||
| + | **Durata de viață**: 2850mA/300mA ~= 9.5h | ||
| + | |||
| + | Deci, daca sistemul funcționează nonstop acesta are autonomie ~9.5h. | ||
| ==== Stagiul curent ==== | ==== Stagiul curent ==== | ||
| Line 47: | Line 77: | ||
| Aceasta este o captură de ecran din serial monitor. Am scris un program scurt care arată funcționalitatea senzorului ultrasonic. | Aceasta este o captură de ecran din serial monitor. Am scris un program scurt care arată funcționalitatea senzorului ultrasonic. | ||
| + | |||
| + | ===== Software Design ===== | ||
| + | ==== Mediul de dezvoltare ==== | ||
| + | * PlatformIO | ||
| + | * limbajul C | ||
| + | |||
| + | === Biblioteci si surse externe === | ||
| + | Pentru acest proiect am implementat următoarele biblioteci proprii: | ||
| + | * adc - pentru citirea și transformarea în procente a nivelului bateriei și a nivelului de umiditate din sol | ||
| + | * wifi - pentru a transmite informații către pagina web și pentru a controla automat pompa | ||
| + | * timers - pentru gestionarea timpului cu precizie de microsecunde și configurarea timerului hardware | ||
| + | * display - pentru afișarea telemetriei pe ecranul OLED | ||
| + | * ultrasonic_sensor - pentru a măsura distanța de la senzor la apă și a o transforma în procent de umplere a rezervorului | ||
| + | |||
| + | Biblioteci externe: | ||
| + | * FreeRTOS - pentru crearea task-urilor și comunicarea directă cu schedulerul sistemului de operare | ||
| + | * esp_adc - pentru calibrarea citirilor și asigurarea izolării hardware în procesul de citire a pinilor analogici | ||
| + | * soc - pentru accesul direct la regiștrii interni ai microcontrolerului | ||
| + | * esp_wifi - pentru inițializarea și configurarea driverului nativ Wi-Fi | ||
| + | * esp_mac - pentru gestionarea adresei MAC în cadrul stivei de rețea | ||
| + | * esp_http_server - pentru găzduirea serverului HTTP | ||
| + | * nvs_flash - pentru gestionarea memoriei non-volatile, obligatorie pentru stocarea datelor de configurare ale stivei Wi-Fi | ||
| + | * i2c_master - pentru configurarea magistralei I2C și gestionarea conexiunii cu ecranul | ||
| + | |||
| + | === Functionalitati === | ||
| + | Sistemul are următoarele funcționalități: | ||
| + | * monitorizează nivelul apei din rezervor cu ajutorul unui senzor ultrasonic | ||
| + | * monitorizează nivelul umidității din sol | ||
| + | * monitorizează nivelul de alimentare al bateriei pentru a urmări autonomia sistemului | ||
| + | * transmite prin Wi-Fi toate informațiile menționate mai sus către o pagină web locală, actualizată automat | ||
| + | * transmite prin I2C telemetria către un ecran OLED pentru afișarea directă și locală a datelor | ||
| + | * itmplementează protecție la funcționarea pe uscat, împiedicând activarea pompei dacă în rezervor nu se află suficientă apă | ||
| + | * controlează automat pompa în funcție de umiditate: pornește udarea când nivelul scade sub un prag critic stabilit și o oprește automat în momentul în care solul atinge pragul țintă de umiditate | ||
| + | |||
| + | Funcționalitățile din laborator sunt: | ||
| + | * GPIO | ||
| + | * I2C | ||
| + | * ADC | ||
| + | * întreruperi | ||
| + | * timere | ||
| + | |||
| + | === Design === | ||
| + | **Citirea valorilor analogice** | ||
| + | |||
| + | Am optat pentru utilizarea exclusivă a unității ADC1 evitând ADC2 deoarece acesta intră în conflict hardware cu modulul Wi-Fi. Pentru a asigura acuratețea, am implementat o fază de warm-up (primele 5 eșantioane de la boot sunt ignorate) și un filtru software pentru atenuarea zgomotului de citire. | ||
| + | |||
| + | **Serverul HTTP** | ||
| + | |||
| + | Serverul rulează asincron. Pentru a decupla rețeaua de citirea directă a senzorilor, modulele nu comunică direct; serverul citește datele dintr-o zonă de memorie cache, actualizată periodic de bucla principală. Pagina HTML are implementat un tag de auto-refresh la fiecare 2 secunde pentru actualizarea automată a metricilor în browser. | ||
| + | |||
| + | **Automatizarea pompei** | ||
| + | |||
| + | Logica de udare rulează într-un task independent, complet separat de serverul HTTP. Această decizie garantează că plantele sunt udate chiar și în absența unei conexiuni Wi-Fi sau a unui utilizator activ pe site. Algoritmul verifică starea la fiecare 200ms și pornește pompa doar dacă solul rămâne uscat(sub pragul critic) timp de minimum 2 secunde continuu, prevenind declanșările false. | ||
| + | |||
| + | **Sistem manual** | ||
| + | |||
| + | Pe lângă modul autonom, interfața web permite controlul manual. În momentul în care utilizatorul trimite o comandă manuală prin HTTP, automatizarea este dezactivată prin activarea unui flag, oferind control total utilizatorului până la oprirea manuală a acesteia. | ||
| + | |||
| + | **Sistem de siguranta** | ||
| + | |||
| + | Ca măsură critică de siguranță hardware, atât algoritmul automat, cât și comanda manuală sunt suprascrise și blocate instant dacă nivelul din rezervorul de apă scade sub 10%. Aceasta previne funcționarea pompei în gol și arderea ei. | ||
| + | |||
| + | **Timer** | ||
| + | |||
| + | Senzorul ultrasonic și funcțiile de delay necesită precizie mililitară. Am configurat direct din regiștri Timerul 0 cu un divizor hardware de 80. Astfel, frecvența de bază a procesorului este împărțită pentru a obține o rezoluție de fix 1MHz, ceea ce înseamnă exact o microsecundă per tick. | ||
| + | |||
| + | **Main** | ||
| + | |||
| + | În el se află bucla principală. La fiecare 2 secunde, aceasta apelează eșantionarea senzorilor, trimite datele către cache-ul HTTP și reîmprospătează ecranul OLED. La finalul fiecărui ciclu, task-ul cedează controlul schedulerului FreeRTOS prin vTaskDelay pentru a permite altor procese de fundal(precum Wi-Fi-ul) să ruleze stabil. | ||
| + | |||
| + | === Github Repo === | ||
| + | [[https://github.com/dogeanuMA28/sistem_de_irigare_pm/tree/main]] | ||
| + | |||
| + | === Video testare === | ||
| + | [[https://www.youtube.com/shorts/QqSstJF_evk]] | ||