SmartPot – Ghiveci Inteligent Autonom

Introducere

Proiect realizat de: Ioana Ștefan, 332CA

SmartPot este un sistem embedded inteligent destinat îngrăjirii automate a plantelor de interior. Dispozitivul este capabil să monitorizeze umiditatea solului, să detecteze sursa principală de lumină, să rotească ghiveciul spre acea direcție și să ude planta doar atunci când este necesar. Informațiile despre stare sunt afișate pe un ecran LCD I2C, iar sistemul oferă feedback sonor și vizual prin buzzer și LED-uri. În plus, utilizatorul poate controla manual sistemul prin intermediul unei interfețe web WiFi. Proiectul aplică în mod direct concepte fundamentale din disciplinele de programare și modelare (PM), precum: ADC, PWM, I2C, UART, control motoare, ISR și design de sisteme reactive.

Obiective

  • Automatizarea udării unei plante în funcție de umiditatea solului
  • Orientarea ghiveciului către sursa principală de lumină pentru maximizarea fotosintezei
  • Implementarea unui sistem de avertizare pentru nivel scăzut al apei din rezervor
  • Afișarea stării sistemului pe un ecran LCD
  • Crearea unei interfețe web intuitive pentru comenzi manuale
  • Testarea unei versiuni avansate de cod cu ISR și funcționalitate radio (FM TX)

Descriere generală

  • Modul senzori: LDR stânga/dreapta, senzor umiditate, senzor nivel apă
  • Modul decizie logică: ESP32, cod bazat pe praguri
  • Modul actuatori: motor stepper, pompă controlată prin releu
  • Modul semnalizare: LED roșu, LED verde, buzzer
  • Modul interfață utilizator: LCD I2C, server web ESP32

Pseudocod funcționare SmartPot

INCEPUT
  // Configurare inițială
  INITIALIZEAZĂ:
    Senzor_umiditate_sol ← pin analogic 32
    Pompa ← pin digital 4
    Senzor_nivel_apa ← pin digital 33
    Buzzer ← pin digital 16
    LED_rosu ← pin digital 15
    LED_verde ← pin digital 2
    LDR_stanga ← pin analogic 12
    LDR_dreapta ← pin analogic 13
    Motor_pas_cu_pas ← pini 14,27,26,25
    LCD ← adresă I2C 0x27
    Server_WiFi ← port 80

  // Variabile globale
  mod_manual ← FALS
  udare_manuală ← FALS
  directie_rotatie ← 0
  timp_start_pompa ← 0
  MAX_TIMP_UDARE ← 10000 // 10 secunde

  // Conectare WiFi
  INCARCĂ_SETĂRI_WIFI("NUME_REȚEA", "PAROLA")
  AFIȘEAZĂ_LCD("Conectare WiFi...")
  CÂT_TIMP (STARE_WIFI() ≠ CONECTAT) AȘTEPTĂ(500)
  AFIȘEAZĂ_LCD("IP: " + GET_IP())

  // Configurare server web
  CONFIGUREAZĂ_RUTE_SERVER:
    RUTA("/") → afiseaza_pagina_control
    RUTA("/water") → gestioneaza_udare
    RUTA("/rotate") → gestioneaza_rotatie

  // Buclă principală
  CÂT_TIMP (ADEVĂRAT) EXECUTĂ:
    GESTIONEAZĂ_CERERI_SERVER()

    DACĂ (mod_manual = FALS) ATUNCI:
      // Mod automat
      umiditate ← CITESTE_ANALOGIC(Senzor_umiditate_sol)
      nivel_apa ← CITESTE_DIGITAL(Senzor_nivel_apa)

      DACĂ (umiditate > 2500 ȘI nivel_apa = Înalt) ATUNCI:
        ACTIVEAZĂ_POMPA(ADEVĂRAT)
      ALTFEL:
        ACTIVEAZĂ_POMPA(FALS)

      diferenta_lumina ← CITESTE_ANALOGIC(LDR_dreapta) - CITESTE_ANALOGIC(LDR_stanga)
      DACĂ (ABS(diferenta_lumina) > 100) ATUNCI:
        ROTEȘTE_MOTOR(diferenta_lumina > 0 ? DREAPTA : STÂNGA)

    ALTFEL:
      // Mod manual
      ACTIVEAZĂ_POMPA(udare_manuală)
      ROTEȘTE_MOTOR(directie_rotatie * 50)

      DACĂ (udare_manuală ȘI (TIMP_CURENT() - timp_start_pompa > MAX_TIMP_UDARE)) ATUNCI:
        udare_manuală ← FALS
        ACTIVEAZĂ_POMPA(FALS)

    VERIFICĂ_NIVEL_APĂ()
    ACTUALIZEAZĂ_AFIȘAJ()
    AȘTEPTĂ(100 ms)

SFÂRȘIT

// Funcții auxiliare
FUNCȚIE VERIFICĂ_NIVEL_APĂ():
  nivel_scazut ← CITESTE_DIGITAL(Senzor_nivel_apa) = SCĂZUT
  DACĂ (nivel_scazut) ATUNCI:
    ACTIVEAZĂ_BUZZER(ADEVĂRAT)
    SETEAZĂ_LED(LED_rosu, INTERMITENT)
    SETEAZĂ_LED(LED_verde, FALS)
    OPREȘTE_POMPA()
  ALTFEL:
    ACTIVEAZĂ_BUZZER(FALS)
    SETEAZĂ_LED(LED_rosu, FALS)
    SETEAZĂ_LED(LED_verde, mod_manual ? FALS : ADEVĂRAT)

FUNCȚIE ACTUALIZEAZĂ_AFIȘAJ():
  SCRIE_LCD("Umid: " + MAPEAZĂ(umiditate, 0,4095,0,100) + "%")
  SCRIE_LCD_LINIA_2(mod_manual ? "MANUAL" : "AUTO " + (nivel_apa ? "OK" : "LOW"))

// Handlere web
FUNCȚIE afiseaza_pagina_control():
  GENEREAZĂ_HTML cu butoane pentru control manual

FUNCȚIE gestioneaza_udare(parametri):
  mod_manual ← ADEVĂRAT
  udare_manuală ← (parametri.enable = 1)
  timp_start_pompa ← TIMP_CURENT()

FUNCȚIE gestioneaza_rotatie(parametri):
  mod_manual ← ADEVĂRAT
  directie_rotatie ← parametri.dir

Hardware Design

Listă completă componente:

Componentă Cantitate Observații
ESP32 DevKit v1 1 Microcontroler central
LCD 1602 I2C 1 Afișaj stare sistem
Senzor umiditate capacitiv 1 Alimentare la 3.3V, ieșire analogică
LDR + rezistențe 10kΩ 2 + 2 Pentru detectare lumină
Senzor nivel apă (digital) 1 Contact simplu
Releu 5V 1 Comută pompa pe 5V extern
Pompiță 5V + furtun 1 Alimentare 4xAA
Motor stepper 28BYJ-48 1 Rotire controlată
Driver ULN2003 1 Control motor
LED roșu + verde 1 + 1 Feedback stare rezervor
Buzzer activ 1 Semnal sonor la eroare
Breadboard + fire - Pentru conexiuni

Software Design

Structura logică extinsă:

- `setup()`:

  1. configurare pini I/O
  2. inițializare LCD
  3. conectare WiFi
  4. configurare rute HTTP pentru control manual

- `loop()`:

  1. Mod automat:
    1. citire umiditate sol → decide udare
    2. citire diferență LDR → decide rotire
  2. Mod manual:
    1. udare temporizată maxim 10s
    2. rotire controlată din web
  3. nivel apă scăzut → alarmă, LED, oprire pompă
  4. actualizare ecran LCD

Rezultate obținute

  • Sistem stabil cu timp de reacție bun sub 100ms
  • Afișaj LCD actualizat în timp real
  • Detecție lumină eficientă chiar și în iluminat artificial
  • Udare declanșată doar la nevoie, prevenind supraudarea
  • Alarmă sonoră vizibilă (buzzer + LED intermitent) pentru rezervor gol
  • Interfață web compatibilă mobil/desktop

Îmbunătățiri viitoare

  • Adăugarea unui senzor DHT22 pentru temperatură și umiditate aer
  • Înlocuirea buzzerului activ cu unul pasiv + PWM pentru semnal diferențiat
  • Adăugare modul ESP-NOW pentru comunicație cu alți senzori smart garden
  • Stocare date în EEPROM sau SD card pentru analiză istorică

Bibliografie/Resurse

Concepte aplicate din laboratoarele PM

Laborator PM Aplicație concretă
————–————————————————–
Lab 1 USART - debug prin port serial
Lab 2 Timere software, debounce, delay
Lab 3 PWM motor, LED-uri, buzzer control
Lab 4 ADC cu LDR și senzor umiditate
Lab 5 I2C - interfață LCD + eventual RTC

GitHub Repo

Galerie Foto

pm/prj2025/eradu/ioana.stefan2806.txt · Last modified: 2025/05/26 00:13 by ioana.stefan2806
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