Sistem de irigare - Zanficu Madalina 333CA

Introducere

Proiectul asigura plantei tale un nivel propice de umiditate.

Acest sistem de irigare minimalist vine în sprijinul plantelor de interior uitate de proprietarii plecați în vacanță. Planta se va bucura de un mediu propice dezvoltării iar tu vei sta fără griji fiind notificat constant de starea plantei tale.

În caz ca esti acasa, vei putea putea vedea nivelul de umiditate pe un ecran LCD și te vei putea bucura de o animatie pe o matrice led în timp ce planta este udata cu ajutorul unei pompe.

Descriere generală

În mod normal plantele trebuie udate în funcție categorie: iubitoare de apa sau rezistente la seceta.
Pentru a simplifica procesul de măsurare a nivelului de umiditate, Arudino va lua măsurători de la senzorul de umiditate într-o perioada standard de 1 ora. Daca nivelul de umditiate este sub o valoare de threshold, Arduino va comanda pompa de apa pentru a uda planta.

Nivelul de umiditate este afișat pe ecranuL LCD folosind interfata seriala I2C. Matricea de led-uri va afisa o animatie. De fiecare data cand planta este udata, cu ajutorul modului ESP32 si a protocoalelor USART și HTTP, se vor trimite notificari pe telefonul proprietarului.

Pentru alimentarea pacutei Arudino voi folosi o baterie de 9V si un stabilizator de tensiune pentru a regla tensiunea la 5V.

Arduino Uno - 1

Hardware Design

Componente hardware:

  • Arduino Uno
  • NodeMcu IoT Wireless cu Wifi ESP8266
  • Ecran LCD 2 x 16
  • Matrice LED 16 x 16
  • Pompa de apa
  • Baterie 9 V
  • Solid State Relay
  • Stabilizator de tensiune
  • Senzor de umiditate
  • Modul convertor nivel logic

Software Design

Arduino Uno

Biblioteci folosite:

  • LiquidCrystal_I2C.h → LCD display
  • FastLED.h → Matrice led-uri

1. Timer

Sistemul de irigare are la bază un timer ce numără până la 3600 de secunde (1h), pentru a putea verifica în mod constant nivelul de umiditate al solului.

Am folosit Timerul 1 de pe Arduino în modul de funcționare CTC cu un prescaler de 1024. Tinand cont de acesti parametrii, timer-ul meu va declanșa o întrerupere atunci când controlul TCNT0 va ajunge la valoarea maxima de pe 16 biti, si imi va contoriza practic mai puțin de 4 secunde. Pentru a putea număra pana la 3600 de secunde am nevoie de 860 astfel de numarari. Astfel îmi incrementez variabila timer_counter, iar cand aceasta va ajunge la numărul de overflows necesare, variabila check_plant este setata pe true pentru a face verificările necesare.

ISR(TIMER1_COMPA_vect) {
 
  timer_counter++;
  if (timer_counter == overflows) {
    check_plant = true;
    timer_counter = 0;
  }
}
 
void timer_setup() {
  // Dezactivează întreruperile la nivel global
  cli();
 
  // Setează Timer1 pentru modul de funcționare CTC
  TCCR1A = 0;                       
 
  // Setează prescaler la 1024
  TCCR1B = (1 << WGM12) | (1 << CS12) | (1 << CS10);
 
  // Setează valoarea OCR1A la valoarea maxima posibila pe 16 biti 
  OCR1A = 65535;
 
  // Activare întrerupere TIMER1_COMPA
  TIMSK1 |= (1 << OCIE1A);
 
  // Activare întreruperi la nivel global
  sei();
}

2. Logica de actionare a pompei

In functia principala - loop, toate acțiunile de verificare a plantei sunt declansate de variabila check_plant. Astfel se citește valoarea de la senzorul de umiditate, si in functie de aceasta, arduino comanda releul setand valoarea HIGH pe pinul aferent.

if (check_plant == true) {
 
    // Se citește valoarea de pe senzor (valoare intre 0 - 1024)
    soil_moisture = analogRead(sensor_read);
 
    // Se calculează procentul de umiditate în logica inversa
    humidity_level = map(soil_moisture, 1024, 0, 0, 100);
 
    check_plant = false;
    show_on_lcd(humidity_level);
    command_relay(humidity_level);
    communication_ESP(humidity_level);
 }

Releul este un intermediar intre Arduino si pompa deoarece Arduino nu poate oferi un amperaj suficient de mare pentru a comanda pompa (100-200mA), astfel releul va conduce acest amperaj catre pompa direct din baterie.

void command_relay(int humidity_level) {
  int threshold = 80;
 
  if (humidity_level < threshold) {
    digitalWrite(relay_write, HIGH);
    delay(3000);
    digitalWrite(relay_write, LOW);
  }
}

3. Afișarea pe LCD, comunicarea cu ESP8266

Pentru afișarea datelor pe ecranul LCD, folosesc cunoștințe din laboratorul 6 - I2C iar pentru comunicarea cu modului ESP8266 utilizez comunicarea seriala din laboratorul 1 - USART.

void communication_ESP(int humidity_level) {
  Serial.println(String(humidity_level));
}

4. Matrice de LED-uri

Pentru realizarea unei animatii pe matricea de led-uri, mi-am creat un header matrix_animation.h si am folosit bibiloteca FastLED pentru setarea led-urilor.

Pentru a crea o tranziție placuta am folosit 15 matrici stocate in memoria Flash, motivul fiind spațiul insuficient. În programul principal realizez set-up matricei și apelez funcția matrix_animation.

ESP 8266

Biblioteci folosite:

  • ESP8266WiFi.h → Conectivitate la internet
  • ESP8266HTTPClient.h → WEB request

Conexiunea la internet este stabilita in funcția de set-up a programului principal.

void WiFi_connection() {
    const char *ssid = "";
    const char *password = "";
 
    WiFi.begin(ssid, password);
 
    // Metoda blocanta pentru conectare la internet
    while(WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
 
    // Se aprinde LED ul verde la conectare
    digitalWrite(RED, LOW);
    digitalWrite(GREEN, HIGH);
 
    Serial.println("WiFi Connected!");
}

În funcția principala se așteaptă un mesaj pe portul serial de la Arduino Uno.

Cand modulul ESP8266 a primit mesajul, este apelată funcția send_notification în care se construiește un request WEB de tipul POST către serverul de IFTTT. Serverul trimite notificarea în aplicația din telefon.

Rezultate Obţinute

Asamblare circuit

Notificare

Concluzii

Mi-a placut sa lucrez la proiect si sunt multumita de rezultatul final. Am reusit sa stric o placuta Arduino dar din fericire am avut timp sa gasesc alta in timp util ^_^

Cu siguranta o sa folosesc proiectul pe viitor, insa voi face cateva modificari pe partea de contorizarea a timpului si voi adauga un modul RTC. Acest proiect este un punct de start, si cred ca as putea duce acest proiect la un alt nivel avand deja cateva idei de improvements pe partea de user-experience.

Download

Jurnal

13 aprilie - alegerea proiectului

24 aprilie - achizitionarea pieselor

3 mai - crearea paginii de documentatie

17 mai - milestone hardware

25 mai - milestone software

28 mai - finalizare pagină documentație

Bibliografie/Resurse

pm/prj2023/adarmaz/irrigationsystem.txt · Last modified: 2023/05/30 14:27 by madalina.zanficu
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