This shows you the differences between two versions of the page.
pm:prj2025:avaduva:andrei.iacob1009 [2025/05/27 10:28] andrei.iacob1009 [Software Design] |
pm:prj2025:avaduva:andrei.iacob1009 [2025/05/29 15:32] (current) andrei.iacob1009 [Software Design] |
||
---|---|---|---|
Line 331: | Line 331: | ||
loop() – Verifică periodic datele de la senzori și acționează în consecință (udare, notificări). | loop() – Verifică periodic datele de la senzori și acționează în consecință (udare, notificări). | ||
+ | |||
+ | void loop() { | ||
+ | //Check temperature, humidity, and soil humidity once a minute. | ||
+ | if(counter == 1) { | ||
+ | checkBME280(); | ||
+ | checkWater(); | ||
+ | checkMoisture(); | ||
+ | } else { | ||
+ | checkWater(); | ||
+ | } | ||
+ | delay(10000); //10sec = 10000 | ||
+ | counter++; | ||
+ | if(counter >= 6) { | ||
+ | counter = 0; | ||
+ | } | ||
+ | } | ||
checkMoisture() – decide dacă este necesară udarea. Se contorizeaza 5 masuratori sub valoarea minima inainte de a declansa udarea efectiva. In felul asta asiguram timpul necesar pentru absorbirea uniforma a apei in sol | checkMoisture() – decide dacă este necesară udarea. Se contorizeaza 5 masuratori sub valoarea minima inainte de a declansa udarea efectiva. In felul asta asiguram timpul necesar pentru absorbirea uniforma a apei in sol | ||
+ | |||
+ | //moisture sensor | ||
+ | void checkMoisture() { | ||
+ | //Measure soil humidity | ||
+ | int moisture = analogRead(A0); | ||
+ | Serial.print("Moisture Sensor Value:"); | ||
+ | Serial.println(moisture); | ||
+ | lcd.setCursor(0, 1); | ||
+ | lcd.print("Moisture: " + String(moisture) + " "); | ||
+ | if (moisture <= 300) { | ||
+ | water_count++; | ||
+ | //Serial.println(water_count); | ||
+ | if(water_count == 5){//To wait for the water to go through the pot. | ||
+ | watering(); | ||
+ | water_count = 0; | ||
+ | } | ||
+ | } | ||
+ | } | ||
checkWater() – determină nivelul apei din rezervor. | checkWater() – determină nivelul apei din rezervor. | ||
+ | //Ultrasonic Sensor | ||
+ | void checkWater(){ | ||
+ | //Check the water level in the bucket. | ||
+ | digitalWrite(TRIG,LOW); | ||
+ | delayMicroseconds(1); | ||
+ | digitalWrite(TRIG,HIGH); | ||
+ | delayMicroseconds(11); | ||
+ | digitalWrite(TRIG,LOW); | ||
+ | duration_us = pulseIn(ECHO,HIGH); | ||
+ | if (duration_us > 0) { | ||
+ | distance = 0.017 * duration_us; | ||
+ | Serial.print(distance); | ||
+ | Serial.println(" cm"); | ||
+ | if(distance > 8.4) { | ||
+ | digitalWrite(LED, HIGH); | ||
+ | } else { | ||
+ | digitalWrite(LED, LOW); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | | ||
checkBME280() – citește temperatura, umiditatea și presiunea aerului. | checkBME280() – citește temperatura, umiditatea și presiunea aerului. | ||
+ | //BME280 | ||
+ | void checkBME280(){ | ||
+ | // Get data from BME280 sensor | ||
+ | float t = bme.readTemperature(); // C | ||
+ | float h = bme.readHumidity(); // % | ||
+ | float p = bme.readPressure() / 100.0F; // hPa | ||
+ | Serial.print("Temperature:"); | ||
+ | Serial.println(t); | ||
+ | Serial.print("Humidity:"); | ||
+ | Serial.println(h); | ||
+ | Serial.print("Pressure:"); | ||
+ | Serial.println(p); | ||
+ | Serial.println(); | ||
+ | lcd.setCursor(0, 0); | ||
+ | lcd.print(String(t)+"C "); | ||
+ | lcd.print(String(h)+"% "); | ||
+ | } | ||
+ | | ||
watering() – controlează udarea efectivă. | watering() – controlează udarea efectivă. | ||
+ | //Watering | ||
+ | void watering(){ | ||
+ | Serial.write("watering"); | ||
+ | digitalWrite(relay, HIGH); | ||
+ | delay(2000); | ||
+ | digitalWrite(relay, LOW); | ||
+ | delay(8000); | ||
+ | completeWatering(); | ||
+ | } | ||
+ | |||
completeWatering() și playMelody() – afiseaza un mesaj concomitent cu melodia si dupa determina noua valoare a umiditatii. | completeWatering() și playMelody() – afiseaza un mesaj concomitent cu melodia si dupa determina noua valoare a umiditatii. | ||
+ | //Music | ||
+ | void completeWatering() { | ||
+ | // Clear LCD and show message | ||
+ | lcd.clear(); | ||
+ | lcd.setCursor(0, 0); | ||
+ | lcd.print(" Thank you! "); | ||
+ | lcd.setCursor(0, 1); | ||
+ | lcd.print(" (^ O ^)/ "); | ||
+ | delay(1000); // Allow LCD to complete before sound starts | ||
+ | playMelody(); | ||
+ | // After melody, update sensor readings | ||
+ | lcd.clear(); | ||
+ | checkBME280(); | ||
+ | int moisture = analogRead(A0); | ||
+ | lcd.setCursor(0, 1); | ||
+ | lcd.print("Moisture: " + String(moisture)); | ||
+ | } | ||
+ | void playMelody() { | ||
+ | tone(PIN, DO, BEAT); delay(BEAT); | ||
+ | tone(PIN, RE, BEAT); delay(BEAT); | ||
+ | tone(PIN, MI, 1200); delay(BEAT); | ||
+ | delay(BEAT * 3); | ||
+ | tone(PIN, RE, BEAT); delay(BEAT); | ||
+ | tone(PIN, DO, BEAT); delay(BEAT); | ||
+ | delay(BEAT); | ||
+ | tone(PIN, DO, BEAT); delay(BEAT); | ||
+ | tone(PIN, RE, BEAT); delay(BEAT); | ||
+ | tone(PIN, MI, BEAT); delay(BEAT); | ||
+ | tone(PIN, RE, BEAT); delay(BEAT); | ||
+ | tone(PIN, DO, BEAT); delay(BEAT); | ||
+ | tone(PIN, RE, 1200); delay(BEAT); | ||
+ | delay(4400); | ||
+ | } | ||
== Validarea funcționării == | == Validarea funcționării == | ||
Line 355: | Line 471: | ||
Distanța de 8.6 cm a fost determinata prin masurarea distatei de la nivelul minim al apei care asigura functinarea pompei si pozitia senzorului ultrasonic. | Distanța de 8.6 cm a fost determinata prin masurarea distatei de la nivelul minim al apei care asigura functinarea pompei si pozitia senzorului ultrasonic. | ||
- | A fost nevoie sa conectez o rezistenta pe legatura catre ground a releului pentru a garanta ca pinul este initializat cu starea LOW pentru a evita declansarea accidentala a pompei la intializarea circuitului | + | A fost nevoie sa conectez o rezistenta pe legatura catre ground a releului pentru a garanta ca pinul este initializat cu starea LOW(releul functinoeaza cu comanda HIGH). Chiar daca in cod setez valoare pinului la LOW, pana la aceasta initializare, valoare este nedefinita, timp in care pompa este pornita accidental. |
- | **Voi adauga filmarea odata ce vine noua pompa** | ||
Line 365: | Line 481: | ||
Care au fost rezultatele obţinute în urma realizării proiectului vostru. | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | ||
</note> | </note> | ||
+ | Proiectul implementat a condus la obținerea următoarelor rezultate: | ||
+ | |||
+ | Monitorizarea condițiilor de mediu: senzorul BME280 a transmis constant valori precise pentru temperatură, umiditate relativă și presiune atmosferică, afișate în timp real pe ecranul LCD. | ||
+ | |||
+ | Detecția automată a nivelului apei: senzorul ultrasonic HC-SR04 a permis măsurarea distanței până la suprafața apei din rezervor, iar LED-ul de avertizare s-a activat în momentul în care nivelul a scăzut sub o valoare prestabilită. | ||
+ | |||
+ | Irigare automată în funcție de umiditatea solului: senzorul de umiditate a solului a monitorizat valorile analogice și a declanșat automat pornirea pompei de apă prin intermediul modulului releu, evitând udarea excesivă printr-un mecanism de contorizare (5 citiri consecutive). | ||
+ | |||
+ | Feedback vizual și sonor: la finalul udării, utilizatorul a fost notificat atât vizual prin mesaj pe LCD, cât și sonor printr-o melodie redată cu ajutorul unui buzzer piezoelectric. | ||
+ | |||
+ | Funcționare stabilă și interactivă: sistemul a funcționat fără blocaje, valorile afișate au fost coerente, iar controlul releului s-a dovedit fiabil după optimizarea logicii de inițializare. | ||
+ | |||
+ | https://youtube.com/shorts/lR0l8U7UWNU | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | Proiectul propus oferă o soluție practică și eficientă pentru monitorizarea și udarea automată a plantelor, eliminând necesitatea intervenției zilnice a utilizatorului. Integrarea senzorilor și a componentelor de afișare și control a demonstrat că un sistem autonom poate gestiona corespunzător parametri esențiali precum umiditatea solului, temperatura și nivelul apei. | ||
+ | |||
+ | Proiectul este ușor de reprodus, adaptabil și scalabil. Deși gândit inițial pentru plante de apartament, arhitectura modulară a sistemului permite extinderea sa pentru aplicații mai complexe în viitor, inclusiv integrarea în aplicații de tip IoT. | ||
+ | |||
===== Download ===== | ===== Download ===== |