Pojďme programovat elektroniku

Programování elektroniky: Měříme laserem hladinu vody v nádržce pro rýmovník

  • Pokračujeme ve stavbě zavlažovacího systému pro redakční rýmovník
  • Má čidlo půdní vlhkosti i čerpadlo a je připojený k internetu
  • Ale ještě nám chybí detektor vody v zalévací nádrži

Posledních několik týdnů stavíme automatický zavlažovací systém pro náš redakční rýmovník, který nám tu zanechal exkolega Vláďa Kluska. Naše zalévací morálka je totiž mírně řečeno tristní a v průběhu let nám v baráku uschly dokonce i kaktusy.

Květináč je umístěný na schodišti, kde chybí jakýkoliv běžný zdroj elektřiny, a tak celý automat pohání maličký jednočlánkový lithiový akumulátor, dobíjecí solární panel a Wi-Fi mikrokontroler ESP32, který se jednou za hodinu probudí z hlubokého spánku, pomocí kapacitního čidla změří nasycení půdy v květináči vodou, no a pokud klesne pod kritickou mez (60 %), skrze tranzistorový spínač aktivuje na 5 sekund drobné čerpadlo.

Stavíme autonomní rýmovník

Toto vše jsme si ukázali v prvním dílu, v tom druhém jsme posílali aktuální stav skrze Wi-Fi na českou službu TMEP, která kreslí grafy a údaje ukládá do vlastní databáze, no a dnes do hry zapojíme laser.

Video: Měříme vodu v nádobě pomocí laserového dálkoměru

Dálkoměr upozorní na prázdnou nádobu

Cože? K čemu laser? Nevzhledné hromadě drátků na schodišti totiž chybí ještě jedna klíčová věc. Čerpadlo pochopitelně není připojené k vodovodu, ale zavlažovací kapalinu nasává z plastové nádoby s objemem zhruba 800 ml.

To není mnoho, a jelikož nasycení květináče vodou klesne pod 60 % během podzimních zakaboněných dnů pouze 1× týdně, reálně hrozí, že na celý automat zapomeneme a nádobu nedolejeme.

9be85828-439b-457c-80eb-91c8f064d7d6
Laciný asijský modul s dálkoměrem VL53L0X

Potřebujeme tedy nějaké co možná nejjednodušší řešení, které bude měřit objem vody v nádobě, respektive výšku hladiny. Postará se o to právě droboučký, energeticky úsporný a laciný modul s IR laserovým dálkoměrem VL53L0X od STMicroelectronics.

Titěrný dálkoměr za padesát kaček

Čip velikosti zrnka rýže najdete na nepřeberném množství prototypovacích modulů, které seženete na AliExpressu a jemu podobných zhruba od 50 korun.

Občas to nemusí být originál, ale nějaký pochybný klon, našemu měření nicméně bude stačit v podstatě cokoliv, kde se s přesností dostaneme alespoň na 1 cm.

Pokud nechcete prohloupit, kupte čidlo na některém z českých e-shopů pro kutily, kde cena začíná okolo 150 korun

Druhou, a ještě levnější možností by mohlo být ultrazvukové čidlo vzdálenosti HC-SR04, které nechybí snad v žádné kutilské dílně, kvůli výrazně větším rozměrům by nám ale překáželo a zároveň má už poměrně široký snímací kužel, zvukové vlny by se proto mohly namísto od hladiny odrážet od stěn nádoby.

Do třetice se nabízí ještě jedna poměrně neinvazivní metoda. Množství vody v nádobě bychom mohli měřit pomocí modulu s tlakovým snímačem za pár kaček a s 3-5V napájením. Hydrostatický tlak bude odpovídat výšce vodního sloupce, který bude tlačit na snímač na dně. Jak bude voda v nádobě ubývat, bude se snižovat i tlak.

Plovák z 3D tiskárny poslouží jako terč

Ať už ultrazvukový, nebo laserový snímač pracuje na principu ToF (Time of Flight). Vzdálenost tedy měří jako polovinu doby, po kterou letí sled pulzů zvuku nebo světla k překážce a zpět do detektoru. Má to ale jeden háček.

Vodní hladina není při použití obou technologií zrovna nejvhodnější překážka s dostatečnou odrazivostí (pomohl by mnohem dražší pulzní koherentní radar), a tak do nádoby umístíme nějaký plovák.

21c70aa1-f4f2-492e-883c-c32a26c7f640f02151e0-69a0-403e-938d-918f86fa5a1416a6eb81-bbd9-42be-a381-8a989e7007ad
V Tinkercadu jsme si navrhli plovák, který bude sloužit jako terčík pro laserový dálkoměr

Může to být kus tenkého polystyrenu, my jsme si ale vyrobili plovák na míru na 3D tiskárně. Je vysoký 5 milimetrů a dutý, aby si v nitru udržel dostatek vzduchu a neklesl ke dnu, no a laserový dálkoměr bude přišroubovaný v horní části nádoby a namířený k hladině.

Čerpadlo je umístěné v nádobě po octu. Plovák a držáky čerpadla a dálkoměru jsme vyrobili na 3D tiskárně. Modely najdete na Tinkercadu 

940nm infračervený laser je neškodný...

Laserové dálkoměry s krátkým dosahem jako VL53L0X mohou být maličké a energeticky extrémně nenáročné, jako zdroj světla totiž používají tištěnou technologii polovodičové laserové diody VCSEL. Infračervený paprsek je naprosto neškodný lidskému zraku a přijímací detektor zaznamená odražený pulz až ze vzdálenosti 2 metrů (byť se vzdáleností roste samozřejmě chybovost).

d0e26ae5-939a-455b-9b55-9efff4168ddf
Dálkoměr je přišroubovaný na červené destičce a míří přímo proti modrému plováku. Na displeji se zobrazuje vzdálenost v milimetrech. Funguje to!

Nové generace dálkoměru jako neméně oblíbený VL53L1X zvládnou sice až dvojnásobek a při měřící frekvenci 50 Hz, jsou ale také dražší. Nám dnes bude stačit opravdu základ.

A čip VL53L0X úsporný

Laserové dálkoměry od ST jsou nejen malé, ale také úsporné. Když nahlédnete do dokumentace čipu VL53L0X (PDF), dočtete se, že při aktivním měření spaluje průměrně 19 mA. Při nečinnosti pak odběr proudu klesne na 3-9 uA dle napětí napájení.

Odběr celého prototypovacího modulu, na kterém nechybí měnič pro napájení v rozsahu 3-5V a převodník napětí logických signálů, samozřejmě ještě o něco poskočí, naše konfigurace, která se probouzí jen jedenou za hodinu, má ale dostatek šťávy i pro mnohem větší jedlíky.

fb81e11f-8992-45e6-ab5a-a6a7a914ef90
V praxi nebudeme měřit vzdálenost nepřetržitě jako na fotografii výše, ale vždy jen jednou za hodinu před případným spuštěním čerpadla

Druhou možností je samozřejmě kompletní odpojení napájení čidla při nečinnosti a jeho sepnutí opět jen jednou za hodinu, jak to děláme u samotného kapacitního čidla vlhkosti v půdě, které při napětí 3,3V neustále spaluje okolo 4 mA (viz první díl).

Sběrnice I²C a hromada knihoven pro Arduino

Během experimentu používáme českou prototypovací desku ESP32-LPKit, která sama v hlubokém spánku spaluje pouze jednotky uA a je vybavená obvodem pro připojení a dobíjení jednočlánkového lithiového akumulátoru.

df576e2b-2880-4e15-99e5-c9cfc30d65f8
Zapojení dálkoměru k 3,3V napájení na desce ESP32-LPKit a ke sběrnici I²C

Zapojení dálkoměru k desce bude velmi jednoduché, VL53L0X totiž používá ke komunikaci sběrnici I²C a GitHub je plný knihoven pro snadné měření v Arduinu. My nakonec použili knihovnu od Adafruitu, kterou doinstalujete i z katalogu knihoven přímo ve vývojovém prostředí Arduino.

V praktické instalaci provedeme 10 měření a přepneme čidlo do úsporného režimu

VL53L0X může provést na vyžádání jedno měření, načež se přepne do úsporného vyčkávacího režimu (standby), anebo může provádět kontinuální měření (i s nastavitelnou pevnou časovou prodlevou), které ukončíme ručně.

248828c7-a3a2-40e3-894d-d6891a1df7b3
Výstup z programu níže do sériové linky. Paprsek se odráží od rovné překážky v malé vzdálenosti, a tak měření vykazují jen malou odchylku v řádu jednotek mm

Druhý přístup použijeme i my a přečteme deset po sobě jdoucích hodnot, ze kterých spočítáme aritmetický průměr, čímž ještě více shladíme případný šum. Poté čip přepneme do úsporného vyčkávacího režimu.

Zdrojový kód pro změření deseti hodnot a spočítání průměru by mohl vypadat třeba takto:

// Knihovna pro dalkomer VL53L0X
// https://github.com/adafruit/Adafruit_VL53L0X
#include <Adafruit_VL53L0X.h>

// Objekt dalkomeru
Adafruit_VL53L0X dalkomer = Adafruit_VL53L0X();

// Hlavni funkce setup se spusti po startu
void setup() {
  // Nastartuj seriovou linku do PC rychlosti 115200 b/s
  Serial.begin(115200); delay(1000);
  Serial.print("Startuji VL53L0X: ");
  // Nastartuj dalkomer na I2C adrese 0x29 (vychozi pro VL53L0X)
  // Nakonfiguruj dalkomer na nejvyssi presnost mereni
  if (dalkomer.begin(0x29, false, &Wire, Adafruit_VL53L0X::VL53L0X_SENSE_HIGH_ACCURACY)) Serial.println("OK");
  else Serial.println("CHYBA");

  // Nastartuj kontinualni mereni vzdalenosti
  Serial.print("Startuji periodicke mereni vzdalenosti: ");
  if (dalkomer.startRangeContinuous()) {
    Serial.println("OK");
    Serial.println("Ctu 10 vysledku mereni (mm):");
    uint8_t mereni = 0;
    // Precti deset zmerenych vzdalenosti, vypis je do seriove linky
    // a spocitej artimeticky prumer
    float prumer = 0;
    while (mereni < 10) {
      if (dalkomer.isRangeComplete()) {
        uint16_t vzdalenost = dalkomer.readRange();
        // Dalkomer pracuje v rozsahu 0-2000 mm,
        // a knihovna pri vyssi vzdalenosti vraci chybove kody
        if(vzdalenost > 2000) vzdalenost = 2000;
        Serial.printf("%u mm\r\n", vzdalenost);
        prumer += vzdalenost;
        mereni++;
      }
      delay(1);
    }
    Serial.println("-------------------------------");
    Serial.printf("Prumerna vzdalenost: %.2f mm\r\n", (prumer / 10.0f));
    // Ukonci rezim kontinualniho mereni
    // Cip se prepne do vyckavaciho rezimu
    // se spotrebou v radu jednotek uA
    dalkomer.stopRangeContinuous();
  }
  else Serial.println("CHYBA");
}

// Funkce loop se spusti po dokonceni funkce setup
// a opakuje se stale dokola. My jsme ale provedli jen
// deset mereni a program fakticky skoncil
void loop() {
  ;
}

Změřenou a shlazenou vzdálenost k plováku na hladině odešleme společně s dalšími metrikami na internet (viz první díl), kde ji můžeme vykreslit do grafu, a zároveň ji porovnáme s nejnižší povolenou výškou hladiny, kdy už by čerpadlo pomalu běželo naprázdno.

Když bude v nádobě málo vody, čerpadlo se nespustí

V takovém případě elektromotor z bezpečnostních důvodů nespustíme, a jelikož jsme k desce připojili úsporný e-inkový displej, můžeme na něj vypsat prosbu, ať kolemjdoucí opět dolije nádržku s vodou.

Kdybychom chtěli být opravdu zlí, připojíme k základní desce bzučák nebo třeba MP3 modul a při nedostatku vody v nádobě aktivujeme co nejhlasitější sirénu, která nedá pokoj tak dlouho, dokud některý z kolegů nezvedne zadek a nádržku opět nenaplní vodou.

To je už ale zase jiný příběh a téma pro některý z dalších článků. 

Diskuze (13) Další článek: Elektrické letadlo Alice absolvovalo první zkušební let. Teď jej čeká boj s úředním šimlem

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