Arduino udă ghivecele cu flori

Se dau: o problemă cotidiană foarte des întâlnită și o mulțime de soluții parțiale ce nu rezolvă niciodată problema propriu-zisă. Cam așa se poate rezuma problema implementării unui sistem bazat pe placa de dezvoltare Arduino Uno ce permite automatizarea procesului de udare a ghivecelor cu flori. Majoritatea exemplelor existente permit măsurarea umidității din sol dar nu implementează și partea de acționare propriu-zisă mulțumindu-se să ”te tragă de mânecă” când trebuie să uzi florile sau să-ți trimită un email de atenționare. Proiectul de față își propune să implementeze o soluție completă (achiziție plus acționare) ajutând astfel pe oricine să-și permită să uite să ude florile fără a le pune în pericol.

Componentele utilizate de sistem sunt foarte comune facilitând astfel implementarea la un cost rezonabil: placă de dezvoltare Arduino Uno, shield drivere de motoare L298, senzor umiditate sol, pompă de apă micro și ecran LCD Nokia (opțional).

23

Shield-ul de motoare L298 este utilizat deobicei în construcția platformelor robotice telecomandate (a se vedea seria de roboți FlexyBot) dar se poate utiliza și în cazul nostru – pompa de apă nu este altceva decât un motor de curent continuu. Se poate utiliza și un releu pentru comanda pompei dar se pierde capabilitatea de control al turației (debitului). Shield-ul este capabil să comande două motoare, sistemul propus folosește o singură ieșire de comandă dar permite o extindere simplă ulterioară.

Conectarea pompei de apă la shield se va face pe canalul Motor2 având grijă la pinul marcat cu bulină roșie al pompei. Shield-ul va fi utilizat cu jumper-ul de alimentare comună pus, astfel vom putea alimenta și placa de dezvoltare și pompa de la un singur alimentator de 9V conectat la placa de dezvoltare (mufa de alimentare a plăcii de dezvoltare).

4

Dacă se respectă conectarea indicată sensul de udare al pompei va fi următorul:5

Pentru conectarea pompei de apă la un recipient cu apă (pompa nu este proiectată să fie conectată la o sursă de apă cu presiune proprie!!!) și la ghivecele cu flori ce urmează a fi udate se poate folosi tub de silicon cu diametrul interior de 3mm (sunt utilizate de obicei la acvarii). În plus se pot utiliza diverși conectori specifici pentru a realiza o instalație care să permită udarea mai multor ghivece simultan:

6

7

Este recomandat ca recipientul (rezervorul) de apă să nu fie mai jos ca sistemul de udare pentru a nu forța pompa să ridice apa.

Senzorul de umiditate sol (pinul SIG) se va conecta la placa de dezvoltare (prin intermediul shield-ului) la pinul analogic A0. Pinul de alimentare al senzorului se va conecta la pinul A2, senzorul va fi alimentat doar când se va efectua citirea. Alimentarea continuă a senzorului poate duce la deterioarea rapidă a acestuia din cauza efectului de electroliză. Ieșirea senzorului nu este calibrată, nu putem calcula precis cantitatea de apă din sol pe baza acestui senzor. Citirile sunt afectate destul de mult și de tipul de sol din ghiveciul cu flori. Având în vedere că citirile analogice se alfă în plaja 0 – 1023 vom stabili un prag sub care vom considera că ghiveciul are nevoie de apă (pragul stabilit în program va fi 500).

8

Este recomandată parcurgerea următorului material pentru a înțelege mai bine funcționarea senzorului de umiditate a solului: Soil Moisture Sensor Hookup Guide.

Ecranul LCD va permite urmărirea funcționării sistemului dar sistemul poate îndeplini sarcina stabilită și fără conectarea acestuia. Ecranul grafic LCD Nokia funcționează la 3.3V, conectarea linilor la pinii Arduino de 5V scade durata de viață a afișajului. Este recomandată adăugarea unui circuit de translatare a nivelurilor logice, a se vedea și materialul: Graphic LCD Hookup Guide.

Conexiunile necesare afișajului LCD sunt următoarele:

9

  • Pinul LED al LCD-ului, prin intermediul unei rezistențe de 220ohm, se va conecta la 5V (sau un un pin PWM dacă se dorește variația intensității luminii de fundal);
  • Pinul SCLK al LCD-ului se va conecta la pinul 13 al plăcii de dezvoltare;
  • Pinu DIN (MOSI) al LCD-ului se va conecta la pinul 11 al plăcii de dezvoltare;
  • Pinul D/C la pinul 8;
  • Pinul RST la pinul 7;
  • Pinul SCE la pinul 4;
  • Pinul GND la GND;
  • Pinul Vcc la 3.3V.

Pentru a putea lucra cu LCD-ul programul va utiliza biblioteciile Adafruit GFX și Adafruit PCD8544.

#include <SPI.h>

#include <Adafruit_GFX.h>

#include <Adafruit_PCD8544.h>

Adafruit_PCD8544 display = Adafruit_PCD8544(8, 4, 7);

#define MOTOR2_PIN1 3

#define MOTOR2_PIN2 5

#define SOIL_PIN    A0

#define SOIL_VCC    A2

void setup() {

  display.begin();

  display.setContrast(50);

  delay(1000);

  display.clearDisplay();

  display.display();

  pinMode(MOTOR2_PIN1, OUTPUT);

  pinMode(MOTOR2_PIN2, OUTPUT);

  digitalWrite(MOTOR2_PIN2, LOW);

  pinMode(SOIL_VCC, OUTPUT);

  digitalWrite(SOIL_VCC, LOW); 

  delay(1000);

}

În cadrul secțiunii loop() a programului se va efectua citirea senzorului de umiditate a solului (cu activarea prealabilă a pinul A2 pentru a alimenta senzorul) și în funcție de valoarea citită (dacă valoarea citită este mai mică de 500) se pornește un ciclu de udare format din trei perioade de 1 secundă alternate cu trei perioadă de pauză de 1 secundă. Pompa este comandată la jumătatea puterii maxime (125 din 255). În funcție de dimensiunea ghiveciului sau / și de numărul de ghivece udate ciclul de udare poate fi ajustat ca durată și putere comandată pompei de apă.

unsigned long lasttime = 0;

void loop()

  int soilhumidity;

  digitalWrite(SOIL_VCC,HIGH);

  delay(1000);

  soilhumidity = analogRead(SOIL_PIN);

  digitalWrite(SOIL_VCC,LOW);

  display.clearDisplay();

  display.display();

  display.setTextSize(1);

  display.setTextColor(BLACK);

  display.setCursor(0,0);

  display.print(“Soil hum:”);

  display.println(soilhumidity);

  display.print(“Time:”);

  display.println(millis()/1000);

  if (soilhumidity<500) {

        display.println(“Status: ON”);

        display.display();

        delay(100);

        analogWrite(MOTOR2_PIN1, 125);

        delay(1000);

        analogWrite(MOTOR2_PIN1, 0);

        delay(1000);

        analogWrite(MOTOR2_PIN1, 125);

        delay(1000);

        analogWrite(MOTOR2_PIN1, 0);

        delay(1000);

        analogWrite(MOTOR2_PIN1, 125);

        delay(1000);

        analogWrite(MOTOR2_PIN1, 0);

        lasttime = millis()/1000;

  }

  else {

        display.println(“Status: OFF”);

  }

  display.print(“LastTime:”);

  display.println(lasttime);

  display.display();

  delay(100);

}

Afișajul LCD va afișa în permanență valoarea citită de la senzorul de umiditate sol, timpul în secunde de la pornirea sistemului: Time, starea sistemului de comandă (ON/OFF – udă/nu udă) și timpul la care s-a efectuat ultimul ciclu de udare: LastTime (estimat în secunde de la pornirea sistemului). Afișarea timpului poate fi rafinată prin transformarea valorii afișate în HH:MM:SS nu doar în secunde.

10

Programul a fost dezvoltat și testat utilizând Arduino IDE 1.8.1 și bibliotecile Adafruit GFX 1.1.8 și Adafruit PCD8544 1.0.0.

Sistemul prezentat poate fi îmbunătățit prin adăugarea unor elemente suplimentare de achiziție (temperatură, umiditate aer, putere lumină solară) pentru a realiza un sistem de automatizare care să țină seama de mai mulți factori în alegerea momentului optim de udare. Pentru inspirație se pot studia și următoarele proiecte: