This shows you the differences between two versions of the page.
pm:prj2025:avaduva:andrei.iacob1009 [2025/05/27 11:07] andrei.iacob1009 [Rezultate Obţinute] |
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 377: | Line 493: | ||
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. | 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 ===== |