This is an old revision of the document!


Automatic Plant Watering System

Autor: Belibova Daniela

Grupa: 333CD

Îndrumător: Ionuț Oțelea

Introducere

  • Ce face: Proiectul este un sistem automat de udare pentru plante care monitorizează nivelul de umiditate al solului și udă plantele atunci când solul este uscat. De asemenea, verifică nivelul apei din găleată și oferă informații despre temperatura și umiditatea din cameră.
  • Scopul: Scopul proiectului este de a facilita îngrijirea plantelor prin automatizarea procesului de udare. Astfel, se asigură că plantele primesc cantitatea potrivită de apă atunci când au nevoie, fără a necesita intervenția constantă a unei persoane.
  • Ideea de la care am pornit: Ideea proiectului a apărut din dorința de a simplifica procesul de udare a plantelor pentru cei care sunt ocupați sau absenți de acasă pentru perioade lungi de timp. Am vrut să creeez un sistem care să poată avea grijă de plante în mod automat, asigurând astfel sănătatea și bunăstarea lor.
  • De ce cred că este util: Consider că proiectul este util pentru că ajută la menținerea plantelor în stare bună, fără a necesita o intervenție constantă din partea proprietarului. Acest lucru este benefic pentru persoanele ocupate sau care nu au experiență în grădinărit. În plus, sistemul poate contribui la economisirea de apă, asigurând că plantele sunt udate doar atunci când este necesar.

Descriere generală

Componente:

  1. Senzor de Umiditate a Solului: Măsoară nivelul de umiditate din sol.
  2. Pompă de Apă: Folosită pentru a furniza apă plantelor.
  3. Modul Releu: Controlează pornirea/oprirea pompei de apă, acționat de Arduino.
  4. Speaker Piezo: Emite un semnal sonor pentru a anunța că udarea este completă.
  5. Senzor Ultrasonic: Măsoară distanța până la nivelul apei din găleată.
  6. LED Rosu: Se aprinde dacă nivelul apei din găleată este < 2 cm
  7. Arduino UNO: Controlerul central al sistemului, procesează datele de la senzori și controlează acțiunile componentelor.
  8. LCD (16×2): Afișază temperatura, umiditatea în cameră și starea umiditatea solului.
  9. Senzor BME280: Măsoară temperatura și umiditatea din încăpere.

Interacțiunea componentelor:

  1. Măsurarea și Controlul Umidității Solului:
    • Senzorul de umiditate a solului măsoară constant umiditatea solului și trimite aceste date către Arduino.
    • Când nivelul de umiditate scade sub un prag predefinit, Arduino activează pompa de apă prin intermediul modulului releu pentru a uda planta.
    • Speaker-ul piezo emite un semnal sonor pentru a anunța că udarea este completă.
  2. Monitorizarea Nivelului de Apă din Găleată:
    • Senzorul ultrasonic măsoară constant distanța până la nivelul apei din găleată și trimite aceste date către Arduino.
    • Când nivelul apei scade sub o anumită valoare (aproximativ 2 cm), Arduino aprinde LED-ul albastru pentru a avertiza că găleata este aproape goală.
  3. Afișarea Datelor pe Ecran LCD:
    • Arduino colectează datele de la senzorul BME280 și de la senzorul de umiditate al solului.
    • Aceste date sunt apoi afișate pe ecranul LCD pentru a furniza utilizatorului informații despre condițiile de mediu în care se află planta.

Arduino acționează ca centru de control, procesând datele de la senzori și luând decizii în funcție de acestea. Prin intermediul interacțiunii între componente, sistemul oferă o soluție automată și inteligentă pentru udarea și monitorizarea plantelor, asigurându-le un mediu de creștere adecvat și reducând intervenția umană necesară pentru îngrijirea lor.

Hardware Design

Lista de piese

  1. Arduino UNO
  2. Modul Releu 5V
  3. HC-SR04 Ultrasonic Sensor
  4. Breadboard
  5. BMP280 Barometric Pressure Sensor Module
  6. LCD 16×2
  7. Piezo Buzzer
  8. Red Led
  9. Resistor
  10. Modul Convertor nivel logic I2C bidirectional 8 Biti TXS0108E
  11. Modul cu senzor umiditate sol
  12. Water Pump
  13. Battery 9V

Schema Hardware

Schema Electrica

Software Design

Descrierea codului aplicaţiei (firmware)

Mediu de dezvoltare Codul aplicației este dezvoltat folosind platforma Arduino IDE, care oferă un mediu integrat pentru scrierea, compilarea și încărcarea codului pe microcontrolerele Arduino. Platforma Arduino IDE este bine adaptată pentru dezvoltarea rapidă a prototipurilor și simplifică procesul de programare prin furnizarea unei biblioteci extinse și a unui mediu de dezvoltare ușor de utilizat.

Hardware utilizat Proiectul folosește o placă Arduino Uno, care este bine potrivită pentru acest tip de aplicație datorită numărului suficient de pini de intrare/ieșire digitală și analogică, precum și datorită suportului larg din partea comunității și a documentației extinse disponibile.

Librării şi surse 3rd-party Codul folosește următoarele librării externe:

  • Wire.h: pentru comunicarea I2C între microcontroler și diverse module.
  • LiquidCrystal_I2C.h: pentru controlul unui ecran LCD prin protocolul I2C.
  • Adafruit_BMP280.h: pentru interfațarea cu senzorul BMP280, utilizat pentru măsurarea temperaturii și presiunii atmosferice.

Algoritmi şi structuri implementate

  • Măsurarea nivelului apei: folosind un senzor ultrasonic pentru a determina distanța până la suprafața apei dintr-un rezervor.
  • Măsurarea umidității solului: folosind un senzor de umiditate pentru a citi nivelul de umiditate din sol.
  • Afișarea informațiilor: utilizând un ecran LCD pentru a afișa temperatura, presiunea și umiditatea solului.
  • Controlul unui releu: pentru a activa un sistem de irigare atunci când umiditatea solului scade sub un anumit prag.
  • Avertizare sonoră: folosind un buzzer pentru a emite un semnal sonor după completarea procesului de irigare.

Descriere pe scurt a fiecărei funcții

  • setup(): În funcția setup(), sunt realizate toate inițializările necesare pentru a pregăti sistemul pentru funcționare. Se configurează comunicarea serială pentru debug și afișarea mesajelor pe ecranul LCD. De asemenea, se inițializează comunicația cu senzorul BMP280 și se verifică dacă este conectat corect. Pinii pentru senzorul ultrasonic, LED și releu sunt setați ca ieșire.
  • loop(): Funcția loop() rulează în mod continuu și coordonează funcționarea sistemului. Prin intermediul variabilei counter, se verifică datele de la senzori la intervale regulate. În acest caz, funcțiile sunt apelate o dată la fiecare secundă pentru a verifica datele de la senzori.
  • checkBMP280(): Această funcție este responsabilă pentru citirea datelor de la senzorul BMP280 și afișarea lor pe ecranul LCD și în consola serială. Ea utilizează metodele readTemperature() și readPressure() pentru a citi temperatura și presiunea de la senzor, apoi afișează aceste valori pe ecranul LCD și le trimite în serial monitor pentru debug.
 void checkBMP280() {
  float temperature = bmp.readTemperature();
  float pressure = bmp.readPressure() / 100.0F;
 
  Serial.print("Temperature: ");
  Serial.print(temperature);
  Serial.println(" °C");
 
  Serial.print("Pressure: ");
  Serial.print(pressure);
  Serial.println(" hPa");
 
  lcd.setCursor(0, 0);
  lcd.print(temperature);
  lcd.print("C ");
  lcd.print(pressure);
  lcd.print("hPa");
} 
  • checkWater(): Funcția checkWater() verifică nivelul apei folosind senzorul ultrasonic și controlează LED-ul în funcție de distanța măsurată. Ea utilizează senzorul ultrasonic pentru a determina distanța până la suprafața apei din rezervor. Dacă distanța măsurată este mai mare de 4 cm, LED-ul este aprins, indicând că nivelul apei este suficient. În caz contrar, LED-ul este stins.
 void checkWater() {
  digitalWrite(Trig, LOW);
  delayMicroseconds(1);
  digitalWrite(Trig, HIGH);
  delayMicroseconds(11);
  digitalWrite(Trig, LOW);
  Duration = pulseIn(Echo, HIGH);
 
  if (Duration > 0) {
    Distance = (Duration / 2.0);
    Distance = Distance*340*100/1000000;
 
    Serial.print("Distance: ");
    Serial.print(Distance);
    Serial.println(" cm");
 
     if (Distance > 4) {
      digitalWrite(led, HIGH);
    } else {
      digitalWrite(led, LOW);
    }
  }
} 
  • checkMoisture(): Această funcție măsoară umiditatea solului folosind senzorul de umiditate și acționează sistemul de irigare dacă umiditatea este sub un anumit prag. Ea citește valorile analogice de la senzorul de umiditate a solului și, dacă umiditatea este sub 300, adaugă un contor pentru a gestiona intervalul de udare și declanșează funcția de irigare atunci când contorul ajunge la 3. (contorul oferă posibilitatea sa nu se ude prea des planta)
 void checkMoisture() {
  int moisture = analogRead(A0);
 
  if(moisture <= 300) {
    water_count++;
    if(water_count == 3) {
      watering();
      water_count = 0;
    }
  }
 
  Serial.print("Moisture Sensor Value: ");
  Serial.println(moisture);
 
  lcd.setCursor(0, 1);
  lcd.print("Moisture: ");
  lcd.print(moisture);
  lcd.print("   ");
} 
  • watering(): Funcția watering() controlează activarea releului pentru a începe procesul de irigare. Ea activează pompa de irigare pentru un interval de timp specificat, schimbând starea pinului asociat releului.
 void watering() {
  digitalWrite(relay, LOW);
  delay(3000);
  digitalWrite(relay, HIGH);
  delay(1000);
  completeWatering();
 
  counter++;
} 
  • completeWatering(): Această funcție furnizează un semnal sonor și afișează un mesaj pe LCD pentru a indica că procesul de irigare s-a încheiat. Ea afișează un mesaj de mulțumire și un emoticon pe LCD, apoi emite un semnal sonor pentru a anunța finalizarea irigării. De asemenea, afișează pe LCD valorile actuale ale umidității solului după irigare.
 void completeWatering() {
  lcd.setCursor(0, 0);
  lcd.print("  Thank You!  ");
  lcd.setCursor(0, 1);
  lcd.print("  (^0^)/  ");
 
  tone(PIN, DO, BEAT); // C
  delay(BEAT);
  tone(PIN, RE, BEAT); // D
  delay(BEAT);
  tone(PIN, MI, 1200); // E
  delay(BEAT);
  delay(BEAT);
  delay(BEAT);
  tone(PIN, RE, BEAT); // D
  delay(BEAT);
  tone(PIN, DO, BEAT); // C
  delay(BEAT);
  delay(BEAT);
  tone(PIN, DO, BEAT); // C
  delay(BEAT);
  tone(PIN, RE, BEAT); // D
  delay(BEAT);
  tone(PIN, MI, BEAT); // E
  delay(BEAT);
  tone(PIN, RE, BEAT); // D
  delay(BEAT);
  tone(PIN, DO, BEAT); // C
  delay(BEAT);
  tone(PIN, RE, 1200); // D
  delay(BEAT);
  delay(BEAT);
  delay(4400);
 
  lcd.setCursor(0, 0);
  lcd.print("                  ");
  lcd.setCursor(0, 1);
  lcd.print("                  ");
 
  int moisture = analogRead(A0);
  lcd.setCursor(0, 1);
  lcd.print("Moisture: ");
  lcd.print(moisture);
 
} 

Descrierea codului aplicaţiei (firmware):

  • mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR)
  • librării şi surse 3rd-party (e.g. Procyon AVRlib)
  • algoritmi şi structuri pe care plănuiţi să le implementaţi
  • (etapa 3) surse şi funcţii implementate

Rezultate Obţinute

Care au fost rezultatele obţinute în urma realizării proiectului vostru.

Concluzii

Download

O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).

Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.

Jurnal

Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF

pm/prj2024/iotelea/daniela.belibov.1716373803.txt.gz · Last modified: 2024/05/22 13:30 by daniela.belibov
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