Acest proiect este un Sistem Inteligent de Monitorizare și Udare Automată a Plantelor, conceput pentru a automatiza îngrijirea plantelor prin monitorizarea condițiilor de mediu și activarea unei pompe de apă atunci când este necesar. Este potrivit pentru utilizare în interior sau în sere de dimensiuni mici.
Proiectul integrează senzori pentru a măsura umiditatea solului și, opțional (în extinderi viitoare), temperatura și nivelul de lumină, toate fiind procesate de un microcontroler compatibil cu Arduino Uno. În funcție de valorile obținute, sistemul poate activa o pompă de apă, aprinde un modul LED sau afișa date pe un ecran.
Se activează pompa și LED-ul dacă solul este prea uscat:
if (moistureLevel < threshold) { digitalWrite(pumpPin, HIGH); digitalWrite(ledPin, HIGH); } else { digitalWrite(pumpPin, LOW); digitalWrite(ledPin, LOW); }
Componentă | Specificații sumare | Link de achiziție |
---|---|---|
ATmega328P | Microcontroler pe 8 biți, frecvență de până la 20 MHz, 32 KB memorie flash, 2 KB SRAM, 23 pini I/O, compatibil cu Arduino Uno | link_aTMega |
Breadboard 400 puncte | Dimensiuni: 8.5 x 5.5 x 0.85cm; Diametru fir necesar: 0.8mm. | link_breadboard |
Mini pompă submersibilă 5V USB | Lungime cablu 1 metru cu mufă DC; Debit 16l/min; Consum curent 300 mA – 1 A; Rezistență internă 2.7 ohmi; P 9W; | link_pompa |
Senzor umiditate sol | Tensiune de alimentare: 3.3V sau 5V DC; Dimensiune modul: 3 x 1.5 cm; Dimensiune senzor: 6 x 2 cm; | senzor_sol |
Senzor nivel apa | Tensiune de operare: 3-5V DC; Curent de operare: >20mA; Temperatura de operare: 10 - 30°C; Dimensiuni: 62 x 20 x 8 mm; | big_link |
Cabluri jumper | M-M, pentru conectare rapidă | link_cabluri_optimus |
Rezistențe diverse | 220Ω, 10kΩ, etc., pentru circuite de bază | link_rezistori |
Modul semafor LED | roșu, verde, albastru | modul_link |
Tranzistor | NPN | link_tranzistor |
Dioda | 1N4007 | link_dioda |
Modul WiFi ESP8266 ESP-01 Negru | Tensiune de alimentare: 3.3V; Curent consumat: 70mA - 300mApk; Comunicație UART la 115200 bps; Curent consumat în modul power down: <10uA; | modul_wifi_esp_01 |
Documentația completă pentru modulul ESP-01 poate fi găsită aici: ESP-01 Datasheet și Specificații
Caracteristici principale:
Modulul wireless ESP-01 integrează cipul ESP8266, un microcontroler puternic cu funcționalitate WiFi, care permite comunicarea prin rețea fără fir. Pentru a-l folosi împreună cu o placă Arduino, se utilizează conexiunea serială UART, la o viteză de transmisie de 115200 bps (baudrate).
Modulul dispune de 1 MB memorie flash pentru stocarea programelor și a datelor, precum și de doi pini GPIO (General Purpose Input/Output), care pot fi controlați similar cu pinii digitali ai plăcii Arduino. Acești pini pot fi folosiți pentru a citi sau controla senzori și actuatori în proiectele voastre.
Astfel, prin intermediul unei interfețe seriale, Arduino poate trimite și primi comenzi către modulul ESP-01 pentru a se conecta la o rețea WiFi și pentru a comunica cu alte dispozitive sau servicii cloud.
Asemenea altor module prezentate, dispozitivul funcționează la o tensiune de alimentare de 3.3 V. Aceasta poate fi furnizată în siguranță, direct de pe plăcuța Arduino. În schimb, pentru restul conexiunilor este nevoie să folosim un modul de conversie de niveluri logice, de la 5 V la 3.3 V. O posibilă modalitate de a evita utilizarea unui astfel de convertor de niveluri logice, fără a risca distrugerea modulului ESP-01 este utilizarea unei conexiuni precum cea figurată din imaginea de mai sus.
Pentru a comunica cu plăcuța Arduino pinul RX al modulului WiFi se conectează la pinul RX al plăcuței, iar pinul TX la pinul TX Arduino. Dacă nu folosiți un convertor de nivel, puteți folosi un divizor de tensiune realizat din două rezistoare: Pinul Arduino va genera o tensiune de 5 V. Pe pinul modulului WiFi vom obține:
Pentru detalii suplimentare, accesați Datasheet-ul oficial.
🔧 Prezentare generală a circuitului intern
Pompa submersibilă mini 5V cu mufa USB este o pompă mică, cu motor DC fără perii (BLDC), folosită frecvent în proiecte DIY, acvarii și sisteme mici de circulație a apei.
Componente incluse în circuit:
⚙️ Diagrama Funcțională (Simplificată)
O diagramă funcțională generalizată a unei astfel de pompe include următoarele componente:
🔄 Control și Integrare
Pentru a integra această pompă într-un proiect folosesc urmatorul mecanism de comutare: un tranzistor + rezistentele necesare pentru a controla alimentarea pompei.
🔧 Descrierea circuitului intern
Senzorul de umiditate a solului de la Optimus Digital este un senzor rezistiv, care măsoară umiditatea solului prin rezistența electrică dintre cele două sonde metalice. Circuitul intern include:
🔌 Conectarea senzorului
Senzorul are patru pini:
🔧 Cum am realizat testarea senzorului?
Am creat urmatorul circuit cu led-uri, placa compatibila arduino uno R3, fire, breadboard si am folosit un ghemotoc de vata uda pentru a testa senzorul.
Pentru mai multe informatii, verificati link-ul: YL-69-HL-69 Sensor Specifications
🔧 Specificații tehnice
Dimensiuni: 56 x 21 x 11 mm LED-uri: Roșu, Galben, Verde Dimensiune LED: 5 mm Tensiune de alimentare: 3.3V sau 5V DC Tip LED: Catod comun Intrare: Digitală Rezistori integrați: Da
🔍 Circuit intern
Fiecare LED este conectat în serie cu un rezistor de limitare a curentului. Toate LED-urile au catodul comun, ceea ce înseamnă că partea negativă a fiecărui LED este conectată la un punct comun, iar partea pozitivă este controlată individual.
Senzorul de nivel pe bază de plutitor funcționează prin închiderea unui circuit electric atunci când nivelul apei atinge o anumită înălțime, activând un contact reed magnetic. Este simplu, fiabil și ideal pentru aplicații de detectare a prezenței lichidului. Material : polipropilena Putere comutata : 10W Curent max comutat : 0.5A Temperatura de operare max : 85C
Este similiar cu cel gasit la documentatia: plutitor_En
Circuit de control al unei pompe de apă folosind un tranzistor NPN pentru a comuta curentul care alimentează pompa, pe baza semnalului digital trimis de un pin de pe Arduino. Iată cum funcționează circuitul:
Semnal de control de la Arduino: Pinul digital D7 de pe Arduino trimite un semnal HIGH (5V). Acest semnal trece printr-un rezistor de aproximativ 1kΩ, care protejează baza tranzistorului și limitează curentul care ajunge la acesta.
Comutarea tranzistorului NPN: Semnalul HIGH (5V) ajunge la baza tranzistorului NPN (2N2222). Curentul trece prin rezistor și ajunge la baza tranzistorului, ceea ce face ca tranzistorul să intre în modul de saturație (ON). Când tranzistorul este ON, colectorul (C) este conectat la emitor (E), creând astfel un traseu de curent prin pompa de apă, care este conectată la 5V.
Pornirea pompei: Deoarece tranzistorul este în modul ON, pompa de apă este conectată la GND, ceea ce permite curentului să circule prin ea și să o pornească.
Oprirea pompei: Când pinul D7 este setat pe LOW (0V), curentul nu mai ajunge la baza tranzistorului. Tranzistorul se oprește și curentul nu mai trece prin pompa de apă, astfel că aceasta se oprește.
Componente necesare: 1x tranzistor NPN
1x rezistor ~1kΩ (pentru baza tranzistorului)
1x diodă pentru a proteja pompa de efectele curentului invers, conectată invers pe terminalele pompei;
—Înlocuiri de Componente pentru Simulare—
Pentru a simula circuitul într-un mod realist, am efectuat câteva înlocuiri de componente în scopul obținerii unui comportament funcțional corespunzător. Detaliile acestor înlocuiri sunt următoarele:
În locul unui senzor de nivel de apă analogic specific, am utilizat un potențiometru pentru a simula schimbările de rezistență și, implicit, varierea nivelului apei. Acest potențiometru permite ajustarea valorii de tensiune de ieșire pentru a simula diferite niveluri de apă, de la nivel scăzut (uscat) până la nivel înalt (plin).
💡 Ce face: Potențiometrul simulează creșterea/scăderea nivelului apei. Valoarea variază de la 0 (gol) la 1023 (plin). Se poate roti butonul în timpul simulării pentru a vedea cum se schimbă valoarea în Serial Monitor.
În locul unei diode flyback dedicate, am adăugat o diode 1N4007 pentru protecția circuitului în fața tensiunilor induse de sarcini inductive. Aceasta diodă a fost plasată paralel cu sarcina inductivă pentru a proteja componentele sensibile, cum ar fi Arduino sau tranzistorii, de eventualele spike-uri de tensiune.
Pentru a simula pompa de apa am utilizat componentele de bază din Tinkercad: motor, transistor NPN, înlocuind necesitatea unui sistem fizic real.
Schematic:
Circuit:
Lista Componente:
Această secțiune explică exact ce pin de pe microcontroller este conectat la fiecare componentă, motivul alegerii și indică ce elemente sunt planificate pentru viitor.
Notă: Alegerea pinilor a ținut cont de:
* Necesitatea ADC pentru senzori (analogRead)
* Compatibilitate PWM pentru LED-uri și control tranzistor
* Pinuri hardware dedicate pentru UART și întreruperi
* Extensibilitate pentru funcții viitoare
Vizualizează conexiunile și comportamentul sistemului:
Notă: Această simulare arată conexiunile dintre:
* senzorul de umiditate,
* LED-urile de stare,
* pompa de apă,
* microcontrollerul,
* senzorul de nivel (reostat).
Proiectul integrează concepte și tehnologii abordate în cadrul mai multor laboratoare, după cum urmează:
Chiar dacă hardware-ul este simplu, logica software a fost concepută modular și include:
Aceste aspecte asigură aplicarea efectivă a cunoștințelor dobândite în cadrul laboratorului și îndeplinirea cerințelor minime de complexitate software impuse de proiect.
Functii Peronalizate
* setupTimer2ForButton()
Scop: Configurează Timer2 în mod CTC pentru a genera întreruperi la fiecare 1 ms, folosite pentru a detecta apăsarea butonului de reset.
+------------------------------+ | setupTimer2ForButton() | +------------------------------+ | - Dezactivează întreruperile| | - Setează Timer2 în mod CTC | | - OCR2A = 249 (1kHz rate) | | - Activează întreruperea | | - Activează întreruperile | +------------------------------+
* ISR(TIMER2_COMPA_vect)
Scop: Rutina de întrerupere asociată Timer2 care detectează tranziția de la HIGH la LOW a butonului pentru reset.
+--------------------------------+ | ISR(TIMER2_COMPA_vect) | +--------------------------------+ | - Citește starea butonului | | - Dacă trece de la HIGH -> LOW | | → setează `resetRequested` | | - Actualizează `lastState` | +--------------------------------+
* pumpTimeoutISR()
Scop: Rutina apelată automat de Timer1 după 10 secunde; setează flag-ul pumpTimeout pentru a opri pompa.
+---------------------------+ | pumpTimeoutISR() | +---------------------------+ | - Setează pumpTimeout = 1 | +---------------------------+
* checkPumpTimeout()
Scop: Verifică dacă pompa trebuie oprită din cauza expirării temporizatorului.
+------------------------------+ | checkPumpTimeout() | +------------------------------+ | IF pumpTimeout && pumpOn: | | → Oprește pompa | | → Resetare flaguri/timer | +------------------------------+
* lockPump()
Scop: Oprește și „blochează” pompa atunci când nivelul de apă este scăzut pentru prea mult timp.
+---------------------------+ | lockPump() | +---------------------------+ | - Oprește pompa | | - Setează pumpLocked | | - Resetează timerul | +---------------------------+
* unlockPump()
Scop: Resetează blocarea pompei, permițându-i să fie pornită din nou.
+---------------------------+ | unlockPump() | +---------------------------+ | - Resetează toate flagurile | | - Oprește timerul | +---------------------------+
* connectToWiFi()
Scop: Trimite comenzi AT către modulul ESP pentru a-l conecta la rețeaua WiFi.
+--------------------------------+ | connectToWiFi() | +--------------------------------+ | - Trimite AT+RST | | - Setează modul pe CWMODE=1 | | - Trimite AT+CWJAP cu SSID | | - Așteaptă conectarea | +--------------------------------+
* sendToThingSpeak(int soilValue, int waterLevel)
Scop: Trimite datele de la senzor către ThingSpeak folosind o comandă HTTP GET.
+------------------------------------------------+ | sendToThingSpeak(soilValue, waterLevel) | +------------------------------------------------+ | - Trimite AT+CIPSTART (TCP către ThingSpeak) | | - Construiește string GET cu cheie API | | - Trimite dimensiunea mesajului | | - Trimite datele (field1, field2) | | - Închide conexiunea cu AT+CIPCLOSE | +------------------------------------------------+
* loop() (parțial personalizat) Scop: Conține o structură modulară care:
Pentru testarea hardware-ului cu un software simplu s-a utilizat platforma Tinkercad Circuits pentru simularea inițială a circuitului, permițând testarea logicii de control într-un mediu vizual interactiv.
Urmatoare imagine reflecta logica simpla pe care am folosit-o pentru a simula circuitul.
Ulterior, implementarea firmware-ului s-a realizat în Arduino IDE, un mediu de dezvoltare open-source destinat programării microcontrolerelor compatibile cu platforma Arduino. Acesta a oferit facilități de scriere, compilare și upload al codului către placă, precum și un monitor serial pentru debug și testare.
Testare mai avansata - inainte de optimizari si de aplicarea cunostintelor despre protocoalele invatate in laboratoare. Fisierul cu codul pentru aceasta testare se gaseste la: .\PlantCareSystem\Software\TestingPurpose\sketch_may15a ( in commit-urile mai vechi).
Aceasta este schema de baza de la care am plecat si peste care am implementat primul soft dupa care am testat:
START | V Citeste valoarea senzorului de umiditate (ADC - A1) | V Afiseaza valoarea in Serial Monitor (UART) | V Comparare cu praguri: |-- [Valoare > dryThreshold (uscat)] --> LED rosu ON, LED verde OFF | Activare pompa (D7 HIGH) | Afisare status pompa (UART) | Asteapta 3 secunde | Dezactivare pompa (D7 LOW) | |-- [Valoare < wetThreshold (umed)] --> LED verde ON, LED rosu OFF | Asigura pompa oprita (D7 LOW) | |-- [Alt caz] -----------------------> Toate LED-urile OFF Asigura pompa oprita (D7 LOW) | V Asteapta 2 secunde si repeta
Aceasta este schema de baza a soft-ului complet, dupa care am realizat implementarea finala:
START | V Inițializări: - Pini: LED-uri, pompă, senzor, plutitor, buton reset - UART și SoftwareSerial pentru ESP - Timer1 (10s) pentru oprirea pompei - Timer2 pentru citirea butonului de reset (cu ISR) - Conectare la WiFi prin ESP | V LOOP: | V Dacă au trecut 2 secunde: | +--> Citește valoare umiditate sol (A1) | +--> Afișează în UART (opțional) | +--> Comparare valoare: | | | |-- [valoare > dryThreshold]: | | - LED roșu ON (intensitate proporțională cu uscăciunea) | | - LED verde OFF | | - Dacă pompa e oprită și nu e blocată: | | - Pornește pompa (D7 HIGH) | | - Pornește Timer1 pentru 10s | | | |-- [valoare < wetThreshold]: | | - LED verde ON | | - LED roșu OFF | | - Verifică dacă Timer1 a expirat (checkPumpTimeout) | | | |-- [între praguri]: | - LED-uri cu intensitate intermediară | - Verifică dacă Timer1 a expirat | +--> Verificare nivel apă (plutitor - D2): | |-- [float HIGH (nivel OK)]: | - Nu face nimic special | |-- [float LOW (nivel scăzut)]: - LED galben ON - Pornește timer de 30s dacă nu e deja pornit - Dacă au trecut 30s: - Dezactivează pompa - Oprește Timer1 (blochează pompa) | +--> Trimitere date către ThingSpeak: - Soil moisture + nivel apă | +--> Verificare buton reset (prin ISR): - Dacă a fost apăsat: - Resetează blocarea pompei - Oprește LED galben | V REPETĂ LOOP
Laborator 1 – UART
Laborator 2 – Întreruperi
Laborator 3 – Timere și PWM
Laborator 4 – ADC
Extinderi Posibile
1. TimerOne.h
2. AVR IO și Interrupts
3. SoftwareSerial
4. Definirea pinilor
Configuratia actuala a pinilor:
Pin | Funcție / Descriere |
---|---|
2 | Intrare digitală pentru senzorul plutitor (floatPin) |
3 | LED galben (yellowLED) - PWM - legat la Timer2 (OC2B) |
4 | Buton reset (resetButtonPin) |
5 | LED verde (greenLED) - PWM |
6 | LED roșu (redLED) - PWM |
7 | Control pompa (switchPin) |
10 | TX SoftwareSerial (ESP WiFi) - pin asociat Timer1 (OC1B) |
11 | RX SoftwareSerial (ESP WiFi) - pin asociat Timer2 (OC2A) |
A1 (analog) | Intrare analogică pentru senzorul de umiditate sol (soilSensorPin) |
Notă:
Notes
Recommended pins for other I/O or SoftwareSerial
Aplicația are ca scop automatizarea controlului unei pompe de apă, în funcție de nivelul detectat de un senzor de umiditate. Logica principală implică:
Structura firmware-ului este organizată în jurul funcțiilor `setup()` și `loop()`, caracteristice platformei Arduino, cu separarea clară a inițializărilor față de logica repetitivă de rulare.
Actualizare: S-a adăugat suport complet pentru controlul pompei cu temporizări precise folosind Timer1, detecția butonului reset prin Timer2 configurat la nivel de registri (fără bibliotecă), precum și comunicarea Wi-Fi prin modulul ESP cu trimiterea datelor către ThingSpeak. Aceste modificări extind funcționalitatea inițială și îmbunătățesc robustetea sistemului.
În urma implementării proiectului, s-a reușit automatizarea cu succes a sistemului de irigare, conform cerințelor stabilite. Pompa este controlată automat în funcție de valorile obținute de la senzorul de umiditate și de la senzorul de nivel al apei (simulat cu un potențiometru). Funcțiile de siguranță, precum oprirea temporizată a pompei și blocarea în caz de nivel scăzut al apei, au fost implementate cu succes. De asemenea, s-a realizat transmiterea datelor către platforma ThingSpeak prin conexiune Wi-Fi și s-a integrat un buton de deblocare a pompei, gestionat prin întrerupere.
Toate funcționalitățile propuse au fost testate și validate în mediu de simulare, demonstrând stabilitatea și eficiența soluției.
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.