Pojďme programovat elektroniku

Programování elektroniky: Autonomní závlahový systém pro redakční kytky. Už žádné chcíplé kaktusy

  • Také se vám nechtějí zalévat pokojové kytky?
  • Automatický zavlažovač postavíte za pár stovek
  • Ten náš bude používat i Wi-Fi

Na rovinu, možná v redakci rozumíme počítačům, ale jestli jsme v něčem totální dřeva, pak je to poctivé pěstování kancelářské květeny. Když náš exkolega David Polesný před lety přinesl na pracoviště dva vzrostlé kaktusy, první změnil barvu a shnil, no a ten druhý z květináče málem utekl. Doslova...

Drtivá většina ostatních sukulentů v baráku uschla a zůstalo jen pár vycvičených odvážlivců včetně květináče s aromatickým rýmovníkem, který nám tu na památku zanechal další exkolega Vláďa Kluska.

Nebohý rýmovník je tedy jedním z posledních živých mohykánů v redakci a my uděláme vše pro to, aby tu s námi zůstal ještě několik dlouhých let.

db71c4e0-087b-4e2c-83bc-ff4e35767a6c
Nepatříme zrovna k nejlepším kancelářským botanikům

Autonomní zavlažovač květináče s Wi-Fi

Ale jak na to? Pravděpodobnost, že jej budeme pečlivě a správně zalévat, se – ruku na srdce – limitně blíží nule, a tak na pomoc raději povoláme chumel drátků, výkonných čipů a aktuátorů. Dnes si postavíme jednoduchý prototyp zavlažovacího systému.  

Podívejte se na video, co jsme si zbastlili:

Mozkem bude opět deska ESP32-LPKit

Základem bude stejně jako v předchozím dílu, ve kterém jsme stavěli zadní blikačku na kolo s Bluetooth Low Energy, česká úsporná prototypovací deska ESP32-LPKit s Wi-Fi mikrokontrolerem Espressif ESP32.

Jak už jsme si řekli minule, deska je vyzbrojená nabíjecím obvodem, konektorem pro připojení jednočlánkového lithiového akumulátoru a měničem HT7833, který vyrobí stabilní napětí 3,3 V a až 500 mA elektrického proudu pro samotný mikrokontroler a připojené periferie.

243939c1-330e-4ce3-83c9-3f6912bf6dc6
Zapojení obvodu s deskou ESP32-LPKit, čidlem půdní vlhkosti a tranzistorovým spínačem čerpadla na nepájivém poli

Dvoujádrový procesor ESP32 si sice může zvláště při startu a připojování k Wi-Fi skokově říci až o stovky miliampérů elektrického proudu, stále by nám ale mělo zůstat dostatek šťávy i pro vše ostatní. Pro jednoduchost příkladu proto k 3,3V zdroji na desce připojíme i motor čerpadla.

Vodní čerpadlo

Měnič ho v klidu utáhne, bude to totiž ten nejmenší prcek na trhu. Drátek.cz jej nabízí za 37 korun, já jej ale už dříve nakoupil na AliExpressu zhruba za dvojnásobek s USB konektorem a do košíku tehdy přihodil i vhodnou hadičku s vnitřním průměrem 6 mm.

8b7db9de-2000-4e5a-824a-1f8a5ec363a5
Maličké čerpadlo za pár desetikorun

Čerpadlo nasává vodu ve spodní částí a vytlačuje ji do výstupní trubičky, na kterou připevníme hadičku. Pokud nebude muset čerpadlo překonávat téměř žádné převýšení, roztočíme jej klidně i s jednou jedinou 1,5V tužkovou baterií AA!

Při našem testu ale muselo čerpadlo vytlačit vodu zhruba do výšky 25-30 centimetrů přes hranu akvária, které simulovalo středně velký květináč. V tomto režimu spolehlivě fungovalo zhruba od napětí 2,5 V. Tabulka níže pak ukazuje, co prcek dokázal při dalších hodnotách a s využitím stolního DC zdroje.

Napětí (V) Proud (A) Příkon (W) Výška sloupce (cm) Doba napouštění 0,5 l (s)
2 0,16 0,32 10-20 -
3 0,26 0,78 50 24
4 0,35 1,40 90 15
5 0,45 2,25 100 12

Tabulka: Schopnosti čerpadla pod různým napětím. Doba napouštění 0,5l nádoby včetně času potřebného k natažení vody do zhruba 1 m dlouhé trubičky

Jelikož budeme napájet čerpadlo napětím 3,3 V, bude odebírat zhruba 280 mA elektrického proudu. A jakým způsobem jej budeme spínat? Vystačíme si s tranzistorovým spínačem z minulého dílu, ve kterém jsme stejným způsobem pouštěli na povel šťávu do pětice paralelně zapojených 5mm LED cyklistické blikačky.

Čerpadlo je umístěné v seříznuté nádobě po octu. Adaptér a držák čerpadla jsme vyrobili na 3D tiskárně. Model najdete na Tinkercadu 

Obvod čerpadla bude spínat tranzistor 2N2222

Do hry tedy zapojíme opět naprosto konfekční bipolární NPN tranzistor 2N2222 v obalu TO-92, který nechybí v žádné sadě pro kutily. Funkci tranzistoru jsme si vysvětlili už minule, takže jen rychlá rekapitulace. Základní součástka polovodičového světa má tři vodiče: bázi, kolektor a emitor.

a9ab7d5c-76c4-4c0e-8e00-22b61104bc12
Schéma zapojení konfekčního bipolárního NPN tranzistoru 2N2222. Volím jej hlavně z toho důvodu, že nechybí snad v žádné sadě pro začínající kutily

V našem zapojení bude báze sloužit podobně jako stavidla na hrázi rybníku. Když je vytáhneme úplně nahoru, obvodem mezi kolektorem a emitorem začne protékat nejvyšší možný proud. No, a když je zavřeme, hráz se utěsní a mezi kolektorem a emitorem neproteče ani jeden miliampér.

7d63acb5-6679-4317-8d78-aace4725d25f
Zapojení obvodu čerpadla a desky ESP32-LPKit

Výšku zdvihu pomyslných stavidel určuje velikost elektrického odporu rezistoru připojeného mezi bázi a ovládacím pinem na řídící desce, na kterém budeme nastavovat vysoký (3,3 V), nebo naopak nízký (0 V) logický stav.

Když jsem zvolil rezistor s odporem 220 ohmů, proud klesl zhruba na 260 mA. Při 1 000 ohmech to bylo 240 mA a konečně s rezistorem o odporu 2 200 ohmů zhruba 210 mA. Vše samozřejmě ovlivňují i elektrické charakteristiky kabeláže a nepájivého prototypovacího pole, ve kterém jsou všechny součástky zapíchnuté.

V každém případě, ani tyto rezistory se standardními hodnotami nechybějí v žádné sadě odporů pro kutily a já nakonec použil poslední hodnotu 2k2.

Podobné odpory by neměly ublížit jak samotnému maličkému tranzistoru 2N2222, který si poradí s proudem mezi kolektorem a emitorem zhruba do 500-600 mA, no a zároveň se bohatě vejdeme do onoho 500mA limitu elektrického stabilizátoru na desce ESP32-LPKit.

0c8d3e78-7eb5-4d01-9690-7e89b6eee527
Před kompilací a nahráním našeho firmwaru snížíme v Arduinu takt čipu ESP32 na 80 MHz. Stále to stačí na Wi-Fi komunikaci, citelně ale klesne odběr elektrického proudu

Zbyde dostatek šťávy i pro samotný čip ESP32, jehož výkon pro jistotu snížíme na 80 MHz, a ke všemu budeme spouštět energetické operace výhradně sériově jednu po druhé. Nikdy tedy nenastane případ, že by se v jeden okamžik točil elektromotorek čerpadla a čip ESP32 by byl připojený k Wi-Fi.

Snímač půdní vlhkosti

Spínač slaboučkého čerpadla bychom tedy měli, ještě ale musíme nějakým způsobem zjistit, jestli je vůbec potřeba pouštět do květináče s rýmovníkem nějakou vodu. Jistě, mohli bychom drobné zalévání naplánovat třeba jednou za 24 hodin, ale rýmovník je na schodišti a praží na něj polední slunce, takže bude mít jinou žízeň v lednu a jinou uprostřed tropického července.

c688587b-2902-4365-a646-54a14026af29f629ac1c-bd21-4f02-8856-c0e0bbf16fad
Kapacitní snímač půdní vlhkosti a jeho časovací obvod s čipem TL555J

Společně s čerpadlem jsem proto objednal i laciné čidlo půdní vlhkosti. Je jich plný Aliexpress i tuzemské e-shopy pro kutily a k nám do redakce nakonec dorazila plochá destička s názvem Capacitive Soil Moisture Sensor V2.0 z Aliexpressu za 42 korun včetně poštovného. Bez zdlouhavého čekání jej prakticky za identickou cenu nabízí i český Drátek.cz.

Většina podobných laciných čidel používá buď odporovou, nebo kapacitní techniku detekce množství vláhy v půdě. V prvém případě se měří, kolik elektrické energie proteče mezi dvěma elektrodami zapíchnutými do květináče, no a v tom druhém zase elektrická kapacita půdy a rychlost nabíjení kondenzátoru.

Přečtěte si, jak fungují odporové a kapacitní snímače vláhy v půdě (1, 2)

Čím více vody v půdě bude, tím více energie proteče mezi elektrodami a tím rychleji se i nabije kondenzátor. No, a čím bude vláhy méně, tím to bude pomalejší. Měřící obvod pak míru vláhy vyjádří zpravidla analogově napětím na výstupním signálním vodiči.

12bitový převodník

Mikrokontroler ESP32 je vybavený 12bitovým A/D převodníkem, který proto vyjádří vstupní napětí z rozsahu 0-3,3V digitální hodnotou v rozsahu 0 -4095.

Když jsem čidlo připojil k 3,3V napájení a:

  • Ponořil jej do vody, A/D převodník vrátil hodnotu 1 060
  • Důkladně jej osušil, A/D převodník vrátil hodnotu 3 060

Z těchto krajních hodnot, které se samozřejmě mohou lišit případ od případu, můžeme pozorováním určit hodnotu, kdy už bude nitro květináče dostatečně suché, abychom spustili čerpadlo. Já se pro úvodní experiment rozhodl pro střední hodnotu tohoto rozsahu, tedy 2 060. Pokud na A/D převodníku přečteme vyšší hodnotu, spustíme na 5 sekund čerpadlo.

ef88b3f4-7eec-440a-af49-025d3ae3872e
Různé situace vynesené do grafického plotru prostředí Arduino

I zde platí, že potřebný čas odpovídá konkrétnímu způsobu instalace a výšce, kterou musí čerpadlo překonat. V mém případě tedy první 2 sekundy čerpadlo protlačovalo kapalinu hadičkou a aktivně zavlažovalo až 3 následující sekundy. Při 3,3 V a 210 mA ale mělo dostatečný tah k tomu, aby se do květináče dostalo tak akorát potřebné vody.

Snímač napájí GPIO

Jelikož bude zavlažovací systém na schodišti, kde chybí zdroj elektřiny, o šťávu se postará jednočlánkový lithiový akumulátor a případně nějaký malý solární panel s regulovaným 5V USB výstupem, který připojím do nabíjecího USB konektoru na desce.

Z toho důvodu musí být firmware i celé zapojení dostatečně úsporné. Motor čerpadla se spustí jen občas a na 5 sekund, řídící čip ESP32 budeme přepínat v době nečinnosti do hlubokého spánku s odběrem v řádu několika málo mikroampérů, ale co to čidlo vlhkosti půdy?

Když jsem jej připojil k multimetru, změřil, že při napětí 3,3V odebírá konstantně 4 mA elektrického proudu. To je na baterii příliš, ale zároveň je to dostatečně málo k tomu, abychom jako napájení mohli použit přímo některý z obecných pinů GPIO na čipu ESP32, pro které nejsou 4 miliampéry žádnou překážkou. Třeba GPIO 25 jako v našem případě.

Když tedy třeba jednou za hodinu probudíme hlavní procesor, ten nastaví na GPIO 25 vysoký stav a do čidla začne téci elektrický proud. Chvíli počkáme, aby se jeho obvod stabilizoval, no a poté provedeme několik čtení po sobě, ze kterých kvůli případnému šumu spočítáme aritmetický průměr.

Poté nastavíme na GPIO 25 opět nízký stav a obvod čidla vlhkosti půdy odpojíme od elektřiny.

Ještě pošli údaje někam na web a usni

Jakmile firmware změří intenzitu sucha, respektive vlhkosti v půdě a případně spustí čerpadlo, pokusí se připojit k Wi-Fi a skrze HTTP odešle změřený údaj na můj testovací webový server. Kdykoliv pak navštívím adresu https://oracle-ams.kloboukuv.cloud/kvetinac, uvidím prostý výpis s časovými značkami posledních měření a zjištěnými hodnotami. Modrá, nebo naopak oranžová barva pomůže s odhadem, jestli je půda v květináči suchá, nebo vlhká.

49b0f7d6-28d8-4634-9487-259f8c18eb6c
Čip se připojuje k Wi-Fi, takže může na webu ukládat údaje o půdní vlhkosti 

Výše jsme si řekli, že všechny energetické úlohy budeme provádět jednu po druhé a platí to samozřejmě i o Wi-Fi. K redakční síti se proto začneme připojovat až v okamžiku, kdy skončila případná sekvence zavlažování a stejně tak je od napájení odpojení i čidlo vlhkosti půdy. Tímto softwarovým způsobem a snížením výkonu hlavního čipu na 80 MHz zajistíme rozložení čerpání energie v čase, co nejnižší zatěžování elektrického stabilizátoru a samozřejmě také snížíme riziko podpětí – brownoutu.

ea9ae3f1-872e-47d1-84c7-e747b8c16a02
Testovací výstup ze sériové linky v PC během testování. Čip periodicky usíná a po probuzení měří půdní vlhkost a spouští napájení čerpadla

V produkční verzi bychom samozřejmě mohli zapojit i nějaký ten stabilizační (super)kondenzátor, který poskytne dostatek šťávy pro motor, aniž by zatěžoval desku.

Co nám zbývá? Měření stavu baterie

Jelikož náš zavlažovací stromeček poběží na lithiový akumulátor, ještě bychom mohli pro klid v duši měřit jeho stav. Způsobů je hromada od obvodu děliče napětí po sofistikovanější a vše jsme si už ukázali před týdnem, kdy jsme se nakonec rozhodli pro čidlo MAX17043, které napětí a nabití akumulátoru změří skrze sběrnici I²C.

f3d37825-7af6-4fd7-9f9f-4121a61fc229
Akumulátorové čidlo DFR0563

Zdrojový kód

Náš velmi jednoduchý a hrubý prototyp bateriového zavlažovacího systému pro květináč funguje, jeho stabilitu ale ověří až delší testovací provoz. V každém případě, během celého dne a s prodlevou probouzení hlavního čipu každých 10 minut motorek přečerpal několik litrů vody a korektně odeslal také údaj na web.

Opět ale zopakuji, že v našem seriálu nestavíme dokonalé produkční stroje, ale co nejjednodušší prototypy, které dohromady sesmolí i naprostý začátečník. Níže jako vždy najdete komentovaný zdrojový kód celého programu pro desku ESP32-LPKit a prostředí Arduino.

Kód níže vyžaduje nainstalování podpory pro čipy ESP32 do vývojového prostředí Arduino.

#include <WiFi.h> // Knihovna pro praci s Wi-Fi
#include <HTTPClient.h> // Knihovna pro praci s HTTP komunikaci

#define PIN_VLHKOMER_VCC  25 // Cidlo vlhkosti pudy spaluje pri 3,3V 4 mA, coz GPIO bezpecne unese
#define PIN_VLHKOMER      26 // Signalni pin cidla vlhkosti pudy
#define PIN_CERPADLO      27 // Signalni pin pro tranzistorovy spinac cerpadla

// Cip ESP32 ma 12bit A/D prevodnik, ktery prevadi napeti 0-3.3V na cisleny rozsah 0-4095
// Zcela mokre cidlo vraci pri 3,3V napajeni ADC hodnotu 1060
// Zcela suche cidlo vraci pri 3,3V napajeni ADC hodnotu 3060
// Hranice sucha, kdy spustime cerpadlo, je individualni konkretnimu pripadu
// My cerpadlo spustime, pokud ADC vrati hodnotu vyssi nez MIN+MAX/2, tedy 2060 (50 %)
#define SUCHO             2060

// SSID a heslo k Wi-Fi
const char *ssid = "NazevWiFiSite";
const char *password = "HesloWiFiSite";

// Prodleva mezi probouzenim cipu
// V praxi staci cela hodina, pro ucely clanku ale 10 minut (600 sekund)
uint32_t prodlevaS = 600;


// Hlavni funkce setup se spusti hned po startu
void setup() {
  Serial.begin(115200); // Start seriove linky do PC pro testovani

  // Konfigurtace pinu pro ovladani cerpadla a cidla vlhkosti
  pinMode(PIN_CERPADLO, OUTPUT);
  pinMode(PIN_VLHKOMER_VCC, OUTPUT);
  pinMode(PIN_VLHKOMER, INPUT);

  // Nastavime casovac hlubokeho spanku v mikrosekundach
  esp_sleep_enable_timer_wakeup(prodlevaS * 1000000);

  // Precteme surovou hodnotu z cidla pudni vlhkosti
  uint16_t sucho = zmeritSuchoPudy();

  // Pokud je puda prilis sucha
  if (sucho > SUCHO) {
    // Spustime na 5 sekund cerpadlo
    Serial.println("Detekuji sucho a spoustim cerpadlo!");
    spustitCerpadlo(5000);
  }
  else {
    Serial.println("V norme");
  }

  // Pripojime se k  Wi-Fi
  pripojitWifi();
  Serial.print("Odesilam data na server... ");

  // Odesleme hodnotu jako HTTP GET dotaz na webovy server
  // Pokud se to nepodari, pockame 5 sekund a zkusime to znovu
  // Celkem mame tri pokusy na odeslani dat
  // Pokud nevyjde ani jeden, asi mame slabe spojeni Wi-Fi,
  // nebo se jedna o chybu na strane serveru, ktery nevraci HTTP kod 200
  bool odeslano = false;
  uint8_t chyby = 0;
  while (!odeslano && chyby < 3) {
    HTTPClient http;
    http.begin("http://oracle-ams.kloboukuv.cloud/kvetinac?data=" + String(sucho));
    int kod = http.GET();
    if (kod == HTTP_CODE_OK) {
      sprintf(dt, "%s", http.getString().c_str());
      Serial.println(dt);
      odeslano = true;
    }
    else {
      Serial.println("Chyba: " + String(kod));
      chyby++;
      delay(5000);
    }
    http.end();
  }

  // Odpojime Wi-Fi
  odpojitWifi();
  Serial.println("Prechazim do hlubokeho spanku!");
  delay(500);
  Serial.flush();

  // Aktivujeme hluboky spanek
  esp_deep_sleep_start();
}

// Nekonecna smycka loop je prazdna,
// po probuzeni se totiz cip resetuje
// a opet zacneme ve funkci setup
void loop() {
  ;
}

// Blokujici funkce pro spusteni cerpadla na stanoveny cas
void spustitCerpadlo(uint16_t dobaMs) {
  digitalWrite(PIN_CERPADLO, HIGH);
  delay(dobaMs);
  digitalWrite(PIN_CERPADLO, LOW);
}

// Blokujici funkce pro zmereni hodnoty z pudniho cidla
uint16_t zmeritSuchoPudy() {
  Serial.print("Merim sucho v kvetinaci... ");
  digitalWrite(PIN_VLHKOMER_VCC, HIGH); // Zapni napajeni cidla
  delay(2000); // Pockej 2s, aby se cidlo mohlo stabilizovat
  // Prvnich 100 vzorku z ADC po probuzeni CPU jeste zahodime,
  // protoze maji nevalnou kvalitu
  for (uint8_t i = 0; i < 100; i++) uint16_t hodnota = analogRead(PIN_VLHKOMER);
  // Z dalsich 100 vzorku uz spocitame aritmeticky prumer
  uint32_t prumer = 0;
  for (uint8_t i = 0; i < 100; i++) {
    prumer += analogRead(PIN_VLHKOMER);
  }
  prumer /= 100;
  digitalWrite(PIN_VLHKOMER_VCC, LOW); // Vypni napajeni cidla
  Serial.println(prumer);
  return (uint16_t)prumer;
}

// Blokujici funkce, ktera nas pripoji k Wi-Fi
// Pokud prihlasovani k Wi-Fi bude trvat dele nez 60 sekund,
// cip se restartuje a zacne znovu
void pripojitWifi() {
  Serial.print("Pripojuji se k Wi-Fi ");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  uint32_t zacatek = millis();
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    if ((millis() - zacatek) > 60000) {
      Serial.println(" CHYBA\r\nPrihlasuji se prilis dlouho, restartuji MCU!");
      delay(1000);
      ESP.restart();
    }
  }
  Serial.printf(" %s\r\n", WiFi.localIP().toString().c_str());
}

// Funkce pro odpojeni Wi-Fi
void odpojitWifi() {
  WiFi.mode(WIFI_OFF);
}
Diskuze (39) Další článek: Porno není pro děti. Francie chce blokovat weby, pokud nezajistí přístup jen pro dospělé

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , ,