Differences

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

Link to this comparison view

pm:prj2025:avaduva:andrei.iacob1009 [2025/05/26 22:10]
andrei.iacob1009 [Hardware Design]
pm:prj2025:avaduva:andrei.iacob1009 [2025/05/29 15:32] (current)
andrei.iacob1009 [Software Design]
Line 294: Line 294:
   * (etapa 3) surse şi funcţii implementate   * (etapa 3) surse şi funcţii implementate
 </​note>​ </​note>​
 +
 +Mediul de dezvotare este ArduinoIDE.
  
 == Bibliotecilor folosite == == Bibliotecilor folosite ==
Line 329: 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.
  
-checkBME280() – citește temperatura,​ umiditatea și presiunea.+  //​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.
  
 +  //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ă.
  
-completeWatering() și playMelody() – oferă feedback la final.+  //​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. 
 +  //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 353: 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 363: 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 =====
pm/prj2025/avaduva/andrei.iacob1009.1748286618.txt.gz · Last modified: 2025/05/26 22:10 by andrei.iacob1009
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