Hlavní navigace

Arduino na 433 MHz komunikuje s bazénovým teploměrem

26. 10. 2015
Doba čtení: 7 minut

Sdílet

Článek se nezabývá přetaktováním nebohých 8bitových mikrokontrolérů, ale věnuje se bezdrátové komunikaci na radiofrekvenčním pásmu 433 MHz. Nejen mezi dvěma Arduiny, ale především s běžnou domácí elektronikou. Postavíme si společně solárním panelem napájený vysílač teploty vody v bazénu.

„Arduino na 433 MHz“ byl název mé druhé přednášky na letošních LinuxDays. Hlavní myšlenkou bylo naživo ukázat propojení Arduina s běžnou domácí dálkově ovládanou elektronikou, která využívá radiofrekvenční pásmo 433,92 MHz.

V prvním kroku jsem předvedl ovládnutí dálkově ovládaných elektrických zásuvek, kdy můžeme Arduinem jak poslouchat povely vysílané dálkovým ovladačem (takže vlastně máme šikovný osmitlačítkový dálkový ovladač čehokoliv s Arduinem), tak můžeme i sami vysílat povely spínající elektrické zásuvky. Tím získáme jednoduchý, levný, elegantní a hlavně bezpečný způsob spínání i výkonově náruživých zařízení Arduinem – a ještě navíc fungující bezdrátově na dálku.

V dalším kroku přednášky jsem hodlal předvést ovládnutí běžné domácí meteostanice, a to hned třemi způsoby: jednak můžeme poslouchat, jaké informace vysílá její venkovní bezdrátové čidlo a zachycenou teplotu a vlhkost můžeme ukládat třeba do databáze, kreslit grafy nebo podle teploty třeba ovládat spínání kotle či podle vlhkosti třeba větrání ve skleníku.

Druhý způsob využití Arduina u meteostanice je vyrobit si další (náhradní) čidlo, které vysílá teplotu a vlhkost (změřenou třeba pomocí DHT-11). Ona totiž ta originální čidla moc ráda odchází do věčných lovišť – a pak je škoda vyhodit celou meteostanici, která je pěkná a dobře funguje (a má čas řízený z Frankfurtu a měří i atmosférický tlak a předpovídá z toho vývoj počasí).

Meteostanice, kterou jsem naučil zobrazovat jakékoliv Arduinem změřené analogové veličiny místo pouhé teploty a vlhkosti.

Třetí způsob připojení Arduina k meteostanici jsem považoval za zlatý hřeb přednášky, a proto mě velmi mrzelo, když jsem to nebyl schopen předvést (z důvodu, který uvádím na přednášce a kterému byste neuvěřili – zájemci se mohou pobavit videozáznamem). I proto vznikl tento článek, který to má za úkol napravit. Tak tedy ten hřeb: na LinuxDays jsem přijel prezentovat můj nedávný nápad, že meteostanici lze v nouzi použít i jako elegantní displej pro různá udělátka s Arduinem.

Můžeme mít například dobíječku baterií v automobilu, kterou chceme na dálku monitorovat. Nebo můžeme mít třeba měřič výšky hladiny, nebo rychlosti větru, nebo vzdálenosti nějaké překážky, nebo třeba počitadlo něčeho. A to běží někde mimo obývací pokoje, ve kterých zrovna jsme a rádi bychom viděli, co se venku děje. Pak stačí danou veličinu převést do rozsahu od zhruba –300 do +600 a vyslat ji bezdrátově zakódovanou jako teplotu – a displej meteostanice ji zobrazí! Například napětí autobaterie může být zhruba mezi 10,0 a 14,6 V – takže když na displeji svítí 12,6 ℃, víme, že autobaterie právě dosáhla nominálního napětí 12,6 V. Stačí ignorovat ty jednotky stupně Celsia vedle zobrazené hodnoty, případně ignorovat i desetinnou čárku, pokud potřebujeme zobrazit něčeho stovky.

Podobně můžeme odeslat ještě další údaj od 0 do téměř 100, který se na displeji meteostanice zobrazí jako vlhkost v procentech (znak % vedle zobrazené hodnoty na displeji meteostanice opět v klidu ignorujeme). Tímto jsme získali dvouveličinový dálkový elegantní zobrazovač po investici přibližně 18 korun (cena modulů vysílače a přijímače na 433 MHz) . A to se vyplatí.

Příklad přečtení hodnoty z analogového vstupu Arduina (tedy v rozsahu 0 – 1023), převedení do rozsahu –300 až 723 a vyslání rádiem – na displeji se tedy zobrazují hodnoty v rozsahu –30,0 ℃ až 72,3 ℃, ale my víme, co to doopravdy znamená. Meteostanice také zobrazuje venkovní vlhkost – v ní je uloženo pořadové číslo měření – spíš jen pro zajímavost, vy si místo toho vložíte užitečnější údaj, který vás napadne.

#include "SensorTransmitter.h"

// inicializuje ThermoHygroTransmitter na pinu 12, s ID 0, na kanálu č.2

ThermoHygroTransmitter transmitter(12, 0, 2);

void setup() {
    pinMode(A3, INPUT_PULLUP);
}

int poradi;
void loop() {
    int svetlo = analogRead(A3);
    transmitter.sendTempHumi(svetlo - 300, poradi++);
    if (poradi > 90) poradi = 0;
    delay(20000); // 20 sekund
}

Je pravděpodobné, že nebudete mít doma právě tu meteostanici (komunikující protokolem Cresta), která funguje s knihovnou RemoteSensor (ze které pochází v příkladu použitá třída ThermoHygroTransmitter), ale nevadí. Existuje totiž projekt RFLink, který podporuje 26 různých protokolů, takže je téměř jisté, že bude podporovat i vaši meteostanici. Jen bude potřeba to z něj vypárat, protože projekt se rozrostl natolik, že se prý nevejde do malého Arduina (osobně jsem ještě nezkoušel).

Bazénový teploměr

Tolik k rekapitulaci a doplnění mé přednášky na LinuxDays, a nyní bych rád předvedl kompletní návod na stavbu vlastního čidla teploty pro bazénový teploměr. Před pěti lety jsem si koupil následující bazénový teploměr, který se sestává ze dvou částí: z bazénového měřiče a vysílače v podobě plováku (s displejem a anténkou) a základny zobrazující čas, teplotu doma a až tři venkovní teploty (tedy z bezdrátových čidel plujících v bazénu).

Základnová stanice bazénového teploměru, zvládá až tři externí čidla naráz – a hodnoty na displeji jsou reálné.

Čidlo v plováku přestalo fungovat už během druhé sezóny – prostě to uvnitř nějak zrezivělo, nebylo to dostatečně dobře izolované – osobně bych mu netipoval víc než IP33, což je pro čidlo určené do bazénu minimálně tristní. Navíc bylo občas nutno vyměňovat uvnitř monočlánek, který čidlo, displej a vysílač napájel – a tento článek byl téměř dole v té nožičce, která je celá ponořena ve vodě, a ten monočlánek se v té vodě koupal také, což mu na životnosti nepřidalo – no zkrátka nebylo to dobře vyřešeno.

Originální čidlo teploty bazénové vody – elegantní, ale málo vodotěsné.

Samotná základnová stanice ale fungovala spolehlivě dál, tak jsem k ní za dvě stokoruny dokoupil externí bezdrátové čidlo komunikující stejným protokolem a mohl tak měřit a zobrazovat alespoň venkovní teplotu vzduchu. No a když jsem pak v roce 2013 poznal Arduino, rozhodl jsem se postavit náhradní bezdrátové čidlo teploty bazénové vody.

Externí čidlo, které si kupodivu rozumí s bazénovým teploměrem (= mluví stejným protokolem).

Poučen z nezdaru komerčního produktu jsem oddělil čidlo ponořené do kapaliny od samotné vysílací stanice, abych nemusel tolik bojovat s vodotěsností. Na měření teploty jsem použil osvědčené digitální při výrobě kalibrované čidlo DS18B20. Bohužel jsem tehdy neměl po ruce ta prodávaná ve vodotěsném obalu, ale ukázalo se, že i „holé“ provedení v pouzdru TO-92 je možné zaizolovat horkým lepidlem z elektrické tavné pistole (známé spíš jako hot glue gun) dostatečně dobře.

Poslední slabinou starého řešení byl napájecí monočlánek, který bylo nutno po pár měsících vyměňovat. To jsem u svého bezdrátového čidla vyřešil malým solárním panelem a ještě menším akumulátorem (3,7V 1000mAh CR123A 16340 Li-Ion Rechargeable Battery). Podle mé starší amatérské analýzy koeficientu značení kapacity čínských akumulátorů mi vychází, že má skutečnou kapacitu jen asi 120 mAh, ale ono to stačí na týden provozu potmě – a pak už by mělo Slunce snad vysvitnout, není-li právě nukleární zima.

Výsledný modul mého vysílače teploty bazénové (či jiné) vody plus jeho solární panel.

Zapojení samozřejmě doplňuje inteligentní obvod pro nabíjení Li-Ion článků, který se ve formě jednoduše použitelného modulu prodává doslova za pár švestek. Solární článek dává až 6 V (na plném poledním slunci), což je právě tak hranice, kterou tento nabíjecí obvod ještě ustojí a dokáže to napětí transformovat na vhodné nabíjecí napětí pro Li-Ion článek (tj. 3,6 až 4,2 V). Samozřejmě když Slunce svítí šikmo nebo přes mraky, napětí ze solárního článku nedosáhne napětí potřebného pro nabíjení akumulátoru, ale v praxi to ničemu nevadí. Proud opačným směrem neteče (že by se akumulátor vybíjel přes nabíjecí obvod do soláru), takže žádný další prvek v obvodu nebyl potřeba.

Pohled dovnitř krabičky dává celé fotce měřítko – solární panel je menší než dlaň.

V podobně jednoduchém duchu jsem do obvodu zapojil i samotné Arduino Pro Mini (resp. jeho čínský klon). Víme, že ATMEGA328p dokáže na 16 MHz běžet už od 3,6 V, což je zrovna nominální napětí Li-Ion článku (které běžně dosahuje spíš k 4 V, plně nabitý pak má až 4,2 V). Proto stačilo přivést napětí z akumulátoru přímo na pin VCC, abych obešel vstupní regulátor napětí, který by si jinak ukousl 0,3 až 1,5 V (podle typu použitého regulátoru).

CS24_early

Umělecká koláž zachycující schéma zapojení na fotografii všech použitých modulů.

Poslední, avšak velmi důležitou úpravou zapojení nutnou pro dlouhodobý provoz z akumulátoru, bylo odborné odstranění LEDky na desce Pro Mini, která indikuje provoz (tedy svítí celou dobu, co je deska pod napětím). Tato by nám pálila vzácné miliampéry nadarmo, proto musí pryč! Použil jsem k tomu mikropáječku (a odpájel rezistor, který LEDku napájí), přestože jiní borci tuto LED běžně vylamují ostrým šroubovákem…

Skutečné zapojení v detailu, kombinace vrabčího hnízda s kouskem plošného spoje.

Příště se podíváme na to, jak jsem tiskl krabičku, dekódoval signál mrtvého čidla, optimalizoval schéma a především upravoval program tak, aby spotřeba energie Arduinem byla co nejnižší a bazénový teploměr tak vydržel měřit a vysílat, i když Slunce nevysvitne několik dní po sobě.

Byl pro vás článek přínosný?

Autor článku

Petr Stehlík vystudoval aplikovanou informatiku a pracuje jako vývojář webových aplikací a administrátor linuxových serverů. Provozuje vlastní server tvpc.cz.