Table of Contents

Smart Greenhouse

Student: Ciobanu Daria
Grupa: 332CC

Proiectul constă în realizarea unei mini-sere inteligente cu un sistem automat de irigare și ventilație determinat de factorii de mediu (umiditatea solului, respectiv temperatură), precum și alte două funcționalități extra care facilitează dezvoltarea armonioasă a plantelor. Sera va avea un ecran pe care se va afișa starea curentă a plantelor, dar și un buton pentru pornirea unei melodii ce stimulează creșterea florilor.

Introducere

Dacă te-ai găsit în situația să nu îti amintești când ai udat ultima dată plantele din casă sau, oricât ai încercat să ai grijă de o floare, aceasta tot nu pare că se simte bine în habitatul ei, o seră inteligentă este ceea ce îți trebuie. Sera utilizează un senzor de umiditate pentru a evalua când trebuie udat solul, declanșând ulterior pompa de apă ce facilitează hidratarea plantelor. Există și un senzor de temperatură care pornește un mic ventilator în interiorul serei pentru a răcori atmosfera. Pentru a face plantele și mai fericite am adăugat un difuzor ce pornește o melodie din muzica clasică, aceasta având un efect benefic asupra creșterii lor. Toți acești factori contribuie la starea de sănatate a plantelor, care va fi prezentată pe un display în exteriorul serei.

Descriere generală

Hardware Design

Lista pieselor:

Schema electrică:

Software Design

Mediu de dezvoltare: Arduino IDE

Biblioteci folosite:

  1. <LiquidCrystal_I2C.h>
    • biblioteca folosită pentru comunicarea cu ecranul LCD prin intermediul I2C
  2. <Wire.h>
    • biblioteca folosită pentru a scrie pe LCD
  3. <dht.h>
    • biblioteca folosită pentru comunicarea cu senzorul de temperatură
  4. “pitches.h”
    • biblioteca în care am inclus notele muzicale
  5. <TimeLib.h>
    • biblioteca folosită pentru afișarea timpului

Descrierea codului

  1. setup()
    • Am inițializat componentele hardware utilizând pinii aleși
    • Am configurat o intrerupere folosind functia attachInterrupt() având ca parametru pinul butonului ce va declanșa melodia
  2. loop()
    • Citesc valorile primite de la senzorul de umiditate a solului(pinul A0) și senzorul de temperatură pentru a determina parametrii in funcție de care se vor declanșa funcțiile serei
    • Am printat aceste valori în interfața serială pentru a urmări mai ușor schimbările de mediu
int value = analogRead(A0);
Serial.println(value);
int chk = DHT.read11(DHT11_PIN);
Serial.print("Temperature = ");
Serial.println(DHT.temperature);
Serial.print("Humidity = ");
Serial.println(DHT.humidity);
delay(1000);
if(DHT.temperature > 20) {
  digitalWrite(FAN_PIN, HIGH);
} else {
  digitalWrite(FAN_PIN, LOW);
}
// 1. Pamantul e prea umed pentru starea optima a plantei
if(value < 300) {
  digitalWrite(WATER_PIN, LOW);
  lcd.setCursor(0, 0);
  lcd.print("Too much water!!!");
  lcd.setCursor(0, 1);
  lcd.print("I'm drowning...");
}
// 2. Conditii optime pentru dezvoltarea plantelor
else if (value > 300 && value < 850) {
  digitalWrite(WATER_PIN, LOW);
  lcd.setCursor(0, 0);
  lcd.print("I'm happy <3    ");
  lcd.setCursor(0, 1);
  lcd.print("Perfect soil   ");
} else {
// 3. Pamant uscat - se porneste pompa de apa pentru a uda plantele
  digitalWrite(WATER_PIN, HIGH);
  lcd.setCursor(0, 0);
  lcd.print("Drinking water...");
  lcd.setCursor(0, 1);
  lcd.print("Pretty dry here :( ");
  // 4. Pamantul este foarte uscat, deci pompa nu mai functioneaza 
  // => nu exista apa in rezervor: se va porni o alarma in acest caz
  if(value > 1010) {
    for (int thisNote = 0; thisNote < notes2; thisNote = thisNote + 2) {
    // alarm for extreme soil dryness
    // ...
    }
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Refill the tank!!!");
  }
}

if (interruptCount > 0) {

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Cool music :) ");
  lcd.setCursor(0, 1);
  lcd.print("Shake it off  ");
  playMusic();
  interruptCount = 0; 
}

și am afișat pe LCD timpul trecut de la pornirea sistemului serei

const unsigned long interval = 86400000;
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
  previousMillis = currentMillis; 
  digitalClockDisplay();
  delay(1000);
  lcd.setCursor(0, 1);
  lcd.print("Music o'clock   ");
  playMusic();
}
void digitalClockDisplay() {
  lcd.clear();
  lcd.setCursor(0, 0);
  printDigits(hour());
  lcd.print(":");
  printDigits(minute());
  lcd.print(":");
  printDigits(second());
}

Rezultate Obţinute

Concluzii

Realizarea acestui proiect mi-a oferit o înțelegere mai profundă a materiei și a aspectelor practice ale acesteia, în special cele legate de interconectarea și utilizarea componentelor hardware. Astfel, am reușit să creez un produs funcțional și util, îmbinând ideea proiectului cu pasiunea mea pentru plante. În timpul procesului, am întâmpinat mici probleme, cum ar fi sincronizarea LCD-ului cu informațiile primite de la senzor, dar și implementarea întreruperilor, unde am fost nevoită să adaug un delay pentru a elimina efectul de debouncing. Am depasit provocarile intampinate si am obținut o implementare eficientă și un produs fizic pe care îl voi utiliza cu bucurie pe viitor.

Download

Jurnal

Bibliografie/Resurse

Resurse Software

Resurse Hardware

Export to PDF