This shows you the differences between two versions of the page.
|
pm:prj2025:avaduva:andrei.iacob1009 [2025/05/29 15:26] andrei.iacob1009 [Software Design] |
pm:prj2025:avaduva:andrei.iacob1009 [2025/05/29 15:32] (current) andrei.iacob1009 [Software Design] |
||
|---|---|---|---|
| Line 332: | Line 332: | ||
| 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() { | + | void loop() { |
| - | //Check temperature, humidity, and soil humidity once a minute. | + | //Check temperature, humidity, and soil humidity once a minute. |
| - | if(counter == 1) { | + | if(counter == 1) { |
| - | checkBME280(); | + | checkBME280(); |
| - | checkWater(); | + | checkWater(); |
| - | checkMoisture(); | + | checkMoisture(); |
| - | } else { | + | } else { |
| - | checkWater(); | + | checkWater(); |
| - | } | + | } |
| - | delay(1000); //10sec = 10000 | + | delay(10000); //10sec = 10000 |
| - | counter++; | + | counter++; |
| - | if(counter >= 6) { | + | if(counter >= 6) { |
| - | counter = 0; | + | 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 == | ||