Ujjgyakorlatok Arduino alapon

Automata öntözés

Ha végre itt a nyár, és meleg az idő... megyünk nyaralni. Igen ám, de a virágokat ki fogja locsolni ez idő alatt? Első megoldás: a szomszéd néni, ha van, és jó viszonyban vagyunk vele. Ez nem mindig áll fenn.
A másik, egyszerű, szinte barkácsmentes megoldás egy időzítő kapcsolóórára rábízzuk, hogy naponta 1x 1 percre kapcsoljon be egy kis szivattyút, ami elárasztja a növényeket. Ez is jó megoldás, ha az 1 perc nem túl hosszú. Viszont mi van, ha már úgyis van egy Arduino, kiegészítve egy talajnedvesség-érzékelővel? Ez esetben csak akkor öntözünk, ha arra valóban szükség van. Az érzékelőnél nem kell ördöngös dologra gondolni: 2 fém pálca meg egy ellenállás. Persze létezik szebb kivitelben, egy 2-ágú NYÁK-lap, rajta elenyésző számú elektronikai alkatrésszel.

talajnedvesség-érzékelő hátoldala

az érzékelő előlről

A lényeg, hogy a talaj ellenállását/vezetőképességét méri, ami első közelítésben arányos annak nedvességtartalmával. Most ne vegyünk ide speciális eseteket, amikor nem, vagy nem minden tartományban arányos, mert akkor vagy nem kell öntözni a növényt, vagy folyamatos vízellátás van, legrosszabb esetben a növényünk már rég halott.

Az érzékelő jel ágát egy analóg bemenetre kell kötni. Az analóg bemenet 10 bites A/D konverterre van kötve, ez azt jelenti, hogy 0-1023 közötti értéket fog kiadni, ha kiolvassuk. Itt se árt a megjelenítés. Mivel nem lehet abszolút értelemben kimondani, hogy egy növény számára mi számít nedvesnek, vagy száraznak, ezért az öntözés indítószintjét kénytelenek vagyunk empirikus úton meghatározni. Jegyezzük fel, hogy mennyit ír ki a mérőprogram locsolás előtt, és mennyit nedves földnél. Ebből meg lehet határozni, hogy milyen érték alatt kell elindítani a szivattyút.

Hirdetés

Szivattyú: szállítandó vízmennyiségtől függ. Egy pálmaházban jó nagy kell, de egy lakásba elég egy 12 Voltos pici membránszivattyú, amit az eBay-en 10 dollár körül osztogatnak. Tehát ennek kell 12 V egyenfeszültségű áramforrás, és valami, ami bekapcsolja: egy relé. Ez szintén néhány dolláros tétel. Mivel az Arduino 5 voltot tud kiadni, ezért érdemes olyat választani, aminek a vezérléséhez ilyen feszültség kell.

Ezután már mehet is az építés:
- talajnedvesség-érzékelő: 3 vezetéke az 5 V, GND és pl. az A3 bemenetre
- relé 3 vezetéke az 5 V, GND és pl. a D2 kimenetre
- szivattyú egyik vezetéke a 12 voltos áramforrás (adapter, tápegység) egyik pólusához, a másik a relé középső érintkezőjéhez. A 12 V másik ága az alapesetben nyitott oldalra megy a relébe, mikor az jelet kap, zárja az áramkört, a szivattyú működik, vizet szállít.
- opcionálisan, vagy visszajelzésként az LCD az A4-A5 kimeneten, ami az I2C kimenete iniciálás után.

A program

#include <LiquidCrystal_I2C.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(0x20,20,4); // set the LCD address to 0x20 for a 16 chars and 2 line display
int sensorpin = A3;
int sensorval = 0;
//int relax = 0;
int dry = 700;

void setup() {
lcd.init();
lcd.backlight();
Wire.begin();
delay(1000);
pinMode(2, OUTPUT);

}

void loop()
{
lcd.setCursor(0, 0);

sensorval=analogRead(sensorpin);

lcd.print(sensorval);
if(sensorval < dry){
digitalWrite(2, LOW);
for(int x = 30; x > 0; x--){ //30 másodperces öntözés
lcd.clear();
lcd.print("Rem to off: ");
lcd.print(x);
delay(1000);
}
digitalWrite(2, HIGH);
for(int relax = 1800; relax > 0; relax--){ //minimális várakozás 2 öntözés között
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Rem to chk: "); //ennyi van még hátra a köv. öntözés-ellenőrzésig
lcd.print(relax);
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(sensorval);
delay(1000);
}
}
delay(1000);
lcd.clear();
}

A pont, ahol öntözni kell, empirikusan meghatározandó. Ehhez a program:

#include <LiquidCrystal_I2C.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(0x20,20,4); // set the LCD address to 0x20 for a 20 chars and 4 line display
int sensorpin = A3;
int sensorval = 0;

void setup() {
lcd.init();
lcd.backlight();
Wire.begin();
delay(1000);
}

void loop()
{
lcd.setCursor(0, 0);

sensorval=analogRead(sensorpin);

lcd.print(sensorval);
delay(1000);
lcd.clear();
}

Tehát ezt a kiírást nézegetjük, ezeket az értékeket jegyezzük fel, hogy mikor kell majd öntözni.

A vezérlés igen egyszerű: időnként kiolvassuk, hogy mennyi az A3 bemenet értéke, ha ez a korábban megállapított szint alá esik, akkor rövid időre bekapcsoljuk a szivattyút. Különösen, ha alulról öntözünk, ezután érdemes egy nagyobb szünetet hagyni, hogy a közeg felszívja a vizet, így az érzékelő tudjon arról, hogy öntözve lett.

- - -

Első körben ennyi. A programok kb. 0 programozói tudással készültek, egy programozó bizonyára sokkal szebben, elegánsabban, takarékosabban meg tudná írni. Nekem csak az kellett, hogy működjön.

További ötleteket, javaslatokat, építő kritikát szívesen veszek. Előreláthatólag a következő projektben adatrögzítés is lesz (EEPROM és SD).

Azóta történt