This shows you the differences between two versions of the page.
pm:prj2025:avaduva:andrei.iacob1009 [2025/05/29 15:25] 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. | + | void loop() { |
- | if(counter == 1) { | + | //Check temperature, humidity, and soil humidity once a minute. |
- | checkBME280(); | + | if(counter == 1) { |
- | checkWater(); | + | checkBME280(); |
- | checkMoisture(); | + | checkWater(); |
- | } else { | + | checkMoisture(); |
- | checkWater(); | + | } else { |
- | } | + | checkWater(); |
- | delay(1000); //10sec = 10000 | + | } |
- | counter++; | + | delay(10000); //10sec = 10000 |
- | if(counter >= 6){ | + | counter++; |
- | counter = 0; | + | 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 | + | //moisture sensor |
- | void checkMoisture() { | + | void checkMoisture() { |
- | //Measure soil humidity | + | //Measure soil humidity |
- | int moisture = analogRead(A0); | + | int moisture = analogRead(A0); |
- | Serial.print("Moisture Sensor Value:"); | + | Serial.print("Moisture Sensor Value:"); |
- | Serial.println(moisture); | + | Serial.println(moisture); |
- | lcd.setCursor(0, 1); | + | lcd.setCursor(0, 1); |
- | lcd.print("Moisture: " + String(moisture) + " "); | + | lcd.print("Moisture: " + String(moisture) + " "); |
- | if (moisture <= 300) { | + | if (moisture <= 300) { |
- | water_count++; | + | water_count++; |
- | Serial.println(water_count); | + | //Serial.println(water_count); |
- | if(water_count == 5){//To wait for the water to go through the pot. | + | if(water_count == 5){//To wait for the water to go through the pot. |
- | watering(); | + | watering(); |
- | water_count = 0; | + | 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 == |