Differences

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

Link to this comparison view

pm:prj2024:iotelea:daniela.belibov [2024/05/19 14:36]
daniela.belibov [Hardware Design]
pm:prj2024:iotelea:daniela.belibov [2024/05/27 12:09] (current)
daniela.belibov [Automatic Plant Watering System]
Line 1: Line 1:
 ====== Automatic Plant Watering System ====== ====== Automatic Plant Watering System ======
  
-**Autor:** Belibova Daniela+**Autor:** Belibova Daniela ​{{ :​pm:​prj2024:​iotelea:​st_small_507x507-pad_600x600_f8f8f8.jpg?​100&​right|}}
  
 **Grupa:** 333CD **Grupa:** 333CD
 +
 +**Îndrumător:​** Ionuț Oțelea
 +
 +
 +
 +
 +
 ===== Introducere ===== ===== Introducere =====
  
Line 65: Line 72:
  
 {{:​pm:​prj2024:​iotelea:​watering_system_scheme.png?​800|}} {{:​pm:​prj2024:​iotelea:​watering_system_scheme.png?​800|}}
 +{{:​pm:​prj2024:​iotelea:​dd94b566-6ff7-4862-bb31-760f7f7ba476.jpeg?​800|}}
  
  
-{{:​pm:​prj2024:​iotelea:​57cc5b95-e31e-4b82-bf07-d62b799d323c.jpeg?​200|}} 
- 
-<note tip> 
-Aici puneţi tot ce ţine de hardware design: 
-  * listă de piese 
-  * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri,​ e.g. http://​www.captain.at/​electronic-atmega16-mmc-schematic.png) 
-  * diagrame de semnal ​ 
-  * rezultatele simulării 
-</​note>​ 
  
 ===== Software Design ===== ===== 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.
 +
 +<code cpp> 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"​);​
 +} </​code>​
 +
 +  * //​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.
 +<code cpp> 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);
 +    }
 +  }
 +} </​code>​
 +  * //​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)
 +<code cpp> 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(" ​  "​);​
 +} </​code>​
 +  * //​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.
 +<code cpp> void watering() {
 +  digitalWrite(relay,​ LOW);
 +  delay(3000);​
 +  digitalWrite(relay,​ HIGH);
 +  delay(1000);​
 +  completeWatering();​
 + 
 +  counter++;
 +} </​code>​
 +  * //​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.
 +<code cpp> 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);​
 + 
 +} </​code>​
 +
 +    ​
 +
 +**Explicarea calibrării elementelor de senzoristică**
 +Calibrarea senzorilor a fost realizată prin compararea citirilor senzorilor cu măsurători de referință și ajustarea codului pentru a corecta orice abateri. De exemplu, senzorul de umiditate a solului a fost calibrat prin măsurători în diferite condiții de umiditate (uscat, moderat, umed) și ajustarea pragului de declanșare a pompei de apă.
 +
 +**Optimizări realizate**
 +Optimizările au fost realizate prin ajustarea frecvenței de citire a senzorilor pentru a reduce consumul de energie și a preveni supraîncălzirea componentelor. De asemenea, logica de control a fost optimizată pentru a asigura răspunsuri rapide și eficiente la schimbările de condiții detectate de senzori.
  
  
-<note tip> 
-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 
-</​note>​ 
  
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
-<note tip> +{{:​pm:​prj2024:​iotelea:​automatic.gif?400|}}
-Care au fost rezultatele obţinute în urma realizării proiectului vostru. +
-</​note>​+
  
 +
 +Sistemul automat de udare a plantelor funcționează exact cum am planificat. La fiecare secundă, verifică umiditatea solului, presiunea și temperatura aerului și afișează valorile pe LCD. Udă planta când solul este prea uscat și pornește buzzerul după udare. LED-ul se aprinde când nivelul apei este scăzut și se stinge când apa este completată. Toate aspectele funcționează conform așteptărilor,​ demonstrând eficiența și utilitatea sistemului.
 ===== Concluzii ===== ===== Concluzii =====
  
-===== Download =====+Sistemul automat de udare a plantelor pe care l-am realizat este extrem de util pentru întreținerea eficientă a plantelor, asigurându-le necesarul de apă fără a necesita intervenție constantă. ​
  
-<note warning>​ +Mi-a plăcut foarte mult să lucrez la acest proiectdeoarece eu personal aș folosi ​un astfel ​de sistem pentru plantele mele. Proiectul mi-a oferit ocazia să înțeleg mult mai bine conceptele învățate la laboratoare si cursuri. În plus, a fost experiență distractivă și interesantă. 
-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 ​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 Alin331CC -> **:​pm:​prj2009:​cc:​dumitru_alin**+O posibilă îmbunătățire pentru viitor ar fi integrarea unei baterii solare pentru alimentarea sistemului, ceea ce ar face dispozitivul complet autonom și prietenos cu mediul. De asemenea s-ar putea opta pentru un senzor ​de umiditate a solului mai bun, pentru ​că uneori din cauza temperaturii apei sau altor factori nu indică umiditatea corectă, și astfel planta ar putea fi udată pentru prea multe ori
-</​note>​+===== Download =====
  
 +  * Source Code: {{:​pm:​prj2024:​iotelea:​watering_system.zip|}}
 +  * [[https://​drive.google.com/​file/​d/​1nz1m2aOi5Fr-UdrydyiAuMzQS_LLc2TP|Demo Project]]
 ===== Jurnal ===== ===== Jurnal =====
  
-<note tip> +  * 06/05/2024 - Alegerea temei proiectului si descrierea sumara 
-Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul ​proiectului. +  * 08/05/2024 - Comandarea componentelor hardware 
-</note>+  * 10/05/2024 - Crearea paginii ​proiectului ​si completarea partiala a acesteia 
 +  * 12/05/2024 - Hardware 
 +  * 22/05/2024 - Software  
 +  * 25/05/2024 - Finalizare pagina documentatie 
 + 
 + 
 + 
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
-<​note>​ +**Resurse Hardware** 
-Listă ​cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** ​şi **Resurse Hardware**. +  * [[https://​www.optimusdigital.ro/​ro/​senzori-senzori-ultrasonici/​9-senzor-ultrasonic-hc-sr04-.html?​search_query=HC-SR04+Ultrasonic+Sensor&​results=6|Ultrasonic Sensor]] 
-</note>+  * [[https://​www.optimusdigital.ro/​ro/​placi-avr/​2563-placa-de-dezvoltare-compatibila-cu-arduino-uno-atmega328p-i-ch340-si-cablu-50-cm.html?​search_query=Arduino+UNO+&​results=138|Arduino Uno]] 
 +  * [[https://​www.optimusdigital.ro/​ro/​optoelectronice-lcd-uri/​2894-lcd-cu-interfata-i2c-si-backlight-albastru.html?​search_query=1602+LCD+&​results=17|LCD 16x02]] 
 +  * [[https://​www.optimusdigital.ro/​ro/​senzori-senzori-de-presiune/​1666-modul-senzor-de-presiune-barometric-bmp280.html?​search_query=BMP280+&​results=11|BMP280 - Modul Senzor de Presiune Barometric]] 
 +  * [[https://​www.emag.ro/​modul-releu-1-canal-5v-11fo/​pd/​DPPQ6GBBM/?​ref=history-shopping_362027892_16253_2|Modul Releu]] 
 +  * [[https://​www.emag.ro/​modul-cu-senzor-umiditate-sol-cl73/​pd/​D5ZZ5JBBM/?​ref=history-shopping_362027892_16253_1|Modul cu senzor umiditate sol]] 
 + 
 +**Resurse Software** 
 +  * [[https://​www.arduino.cc/​en/​software|Arduino IDE]] 
 +      * Mediul de dezvoltare principal folosit pentru scrierea șîncărcarea codului pe placa Arduino 
 +  ​[[https://​github.com/​fdebrabander/​Arduino-LiquidCrystal-I2C-library|Biblioteca LiquidCrystal_I2C]] 
 +      ​Utilizată pentru a controla afișajul LCD prin intermediul interfeței I2C. 
 +  ​[[https://​learn.adafruit.com/​adafruit-bmp280-barometric-pressure-plus-temperature-sensor-breakout/​arduino-test|Biblioteca Adafruit BMP280]] 
 +      ​Utilizată pentru a citi datele de la senzorul BMP280 (temperatură și presiune)
 +  * [[https://​www.arduino.cc/​reference/​en/​language/​functions/​communication/​wire/​|Biblioteca Wire]] 
 +      * Necesară pentru comunicarea I2C între Arduino și diverse module (LCD, BMP280). 
  
 <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​ <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​
 +
  
pm/prj2024/iotelea/daniela.belibov.1716118611.txt.gz · Last modified: 2024/05/19 14:36 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