Table of Contents

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

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

Îmbunătățiri viitoare

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

https://github.com/ioanastefan2806/SmartPot/tree/main

Galerie Foto