Zpracovávám data z MQTT…

V minulém článku jsem nastínil postup sběru dat ze snímačů (použil jsem tagy BigClown). Data hezky tečou do MQTT a já je mohu sledovat, ale to se mi moc nehodí. Já totiž v první řadě potřebuju sledovat, jak mi klesá napětí na baterii.

  • Možnost číslo 1 – pustit si nějakého démona, co bude logovat napětí a někam mi to zapisovat. Moc se mi nelíbila. Je to moc práce a málo užitku. Určitě by se našla nějaká
  • Možnost číslo 2 – tedy taková, kde použiju už něco existujícího.

Fajn, tak co se nabízí? Třeba Thingspeak. Má to jednoduché API, kam lze posílat data, a jednoduchý dashboard, kde lze vytvořit grafy pro různé hodnoty. Nevýhoda: nemá to MQTT. Takže je potřeba něco mezi.

Naprostou náhodou jsem objevil věc, co se jmenuje Node-RED. Běží to na Node.js, a je to takový vizuální editor toku dat. Doleva si dáte MQTT, pak to nějak zpracujete, pak to pošlete ven. Jednoduché jak trojky vidle.

bc0

Hezké je, že na vstupu může být spousta různých věcí, od MQTT přes HTTP a TCP až po sériový port. Na výstupu totéž. Nebo soubor. Nebo ještě něco jiného. Třeba Twitter. Nebo něco vlastního – kupříkladu ten Thingspeak.

Já čtu data ze tří MQTT topiců, preparuju si z nich pouze číslo, pak tři zprávy (teplota, osvětlení a baterie) skládám do jedné, v ní dělám nějaké drobné úpravy a volám API Thingspeak. Všechno bylo velmi intuitivní a nastavené během půl hodiny.

Navíc se to všechno dá programovat v JavaScriptu a můžete si udělat vlastní konektory a funkce.

Složité komponenty si můžete rozdělit do „subflows“ – já mám takhle celé zařízení zapouzdřené do subflow „ESPclown“. V něm se skládají data ze tří senzorů:

bc2

A každý senzor se skládá z konektoru na MQTT a zpracování payloadu:

bc3

A výsledek? Hezký:

 

Rubriky: Hardware, IoT | Štítky: , , , | 7 komentáře

ESP8266 + MQTT

Trošku jsem si zaexperimentoval s ESP8266. Abych byl přesný, tak s kitem WeMos D1 mini, což je takové miniArduino – jen USB převodník a procesor. V roli procesoru tam je modul ESP-12E.

Nejprve jsem laboroval s microPythonem i s JavaScriptem, a nakonec jsem sáhnul k Arduino IDE, které na téhle desce funguje bez problémů.

Jako senzory jsem použil I2C tagy BigClown. Jejich výhoda je, že jsou malé a obsahují senzor s potřebnou „bižuterií“. V mém případě jsem použil luxmetr (se snímačem OPT3001) a teploměr (TMP112).

Chvilku jsem řešil připojení I2C <> WeMos <> ESP8266, ale pak jsem to zvládl. I2C se totiž používá na pinech GPIO 4 a 5, které jsou mapovány na vývody D2 a D1. Udělal jsem si k tomu takovou tabulku.

Jenže pak JavaScript nehodlal z I2C číst. MicroPython totéž. Nevím proč, pravděpodobně nějaké quirks, nebo jsem k čidlům přistupoval úplně blbě… Když už jsem podléhal beznaději, zkusil jsem výše zmíněné Arduino, a vše fungovalo. Hodně pomohla knihovna pro OPT3001. O pár momentů později už mi lezly po sériové lince údaje z měření…

Pak jsem přihodil i ten teploměr, taky přes knihovnu.

No a protože je tam ESP, tedy wifina „zdarma“, tak logický další krok bylo připojit se a data někam posílat. Použil jsem skvělý WiFi Manager, aby to bylo přenositelné a aby v kódu nestrašilo heslo k mojí wifi. No a k tomu už jen MQTT client library.

Na serveru jsem spustil Mosquitto. V Debianích repozitářích byla zas nějaká stará verze, takže jsem na to šel takto:

  1. wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
  2. sudo apt-key add mosquitto-repo.gpg.key
  3. cd /etc/apt/sources.list.d/
  4. sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list
  5. apt-get updateapt-get install mosquitto mosquitto-clients

Přidal jsem acl (Access Control List) podle tohoto vzoru a pustil jsem i MQTT over Websockets.

A bylo.

Jako poslední jsem udělal drobnou úpravu, při které modul změří, pošle data, a pak se uvede do deep sleep módu. Aby fungovalo probuzení, musel jsem propojit vstup RESET a GPIO16 (na WeMos D1 Mini je to pin D0). Na tomto výstupu totiž po uplynutí zadané doby přijde „budíček“. Chci použít Li-Ion baterii a zkusit, jak dlouho to bude takto fungovat. Zatím to napájím z powerbanky, a tam zatím úbytek napětí nepozoruju.

20160822_135317_HDR
Ten žlutý vodič je zmiňované propojení RESETu, dokud tam nezapájím propojku 🙂
Ještě jsem dobastlil Li-Ion baterii 3.7V a modul na dobíjení přes MikroUSB
Ještě jsem dobastlil Li-Ion baterii 3.7V a modul na dobíjení přes MikroUSB

PS – poznámka víceméně pro mne…

MQTT a LetsEncrypt:

Rubriky: Hardware, Software | Štítky: , , , , | 1 komentář

Jak dál s workshopem Arduino 101?

Arduino 101 je workshop, který jsme se Štěpánem Bechynským připravili a úspěšně s ním jezdili po republice. Prošlo jím asi 400 lidí, kteří si minimálně zkusili, že elektronika není nic tajemného a magického a že „blikat ledkou“ zvládnou taky. Přišli o bezdůvodný strach a udělali nejtěžší krok k elektronice – totiž ten první.

Se Štěpánem jsme celou koncepci přes rok ladili a vylepšovali. Výsledkem našich debat bylo, mimo jiné, i to, že jsme se rozhodli navrhnout vlastní výukový shield. Jeho výroby se ujal CZ.NIC, a už máme v ruce první předprodukční kousky.

20160817_134818_HDR
EDUSHIELD (díky CZ.NIC)

Logicky jsme si kladli otázku: Co dál? Představa, že budeme dál objíždět republiku o víkendech a ukazovat lidem, jak si hrát s Arduinem, naráží na mnoho problémů, jmenovitě čas a síly. Ale zase by byla škoda potenciál nevyužít – zájem je stále obrovský. Nakonec jsme dospěli k následujícímu: Vyškolíme školitele!

14037726_10154355278422954_25623615_o
Zájem o Arduino workshop je pořád obrovský

Zcela vážně. Napadlo nás, že najdeme třeba deset, patnáct, dvacet lidí, kteří mají zájem a chuť Arduino učit. Těm dáme k dispozici výukové materiály a veškeré know-how, co jsme díky Arduino 101 získali. Měli byste zájem?

Obchodní model je velmi jednoduchý: Budete mít k dispozici výukové shieldy od CZ.NIC. Můžete je nakoupit, a třeba prodávat frekventantům vašich workshopů. Nebo uděláte workshopy placené a Arduino + shield budou v ceně. Od nás získáte metodické materiály a určitou podporu. To, jestli budete vy provozovat workshopy neziskově, nebo ziskově, jestli s nimi budete objíždět republiku, nebo zakotvíte u vás ve městě, jestli je budete dělat pravidelně, nebo „podle zájmu“, to už je na vás.

Pokud máte chuť něco takového dělat, ozvěte se nám. Dle zájmu bychom připravili nějakou akci „train the trainer“, zhruba v září / říjnu. Lektor by měl umět pracovat s elektronikou a musí umět programovat.

Rubriky: Hardware | 2 komentáře

Levný kit se STM32F103C8 (plus Arduino)

Před časem jsem zahlédl pár velmi levných kitů s procesorem STM32F103C8 (zvané též BluePill). Vlastně jen procesor na desce se spoustou vývodů, k tomu jedna LEDka, tlačítko a stabilizátor napájení 3.3V, a to za naprosto směšnou cenu. Vzal jsem jich rovnou pytel, a k nim přihodil i čínskou kopii ST-Link v.2

Přišlo to, já to zapojil přes ST-Link, přeložil jsem program v C, a po nějakém tom laborování jsem ho nahrál do jednočipu. LEDka neblikala, protože – nevím proč, asi proto, že u ARMu neumím nastavit port na blikání nebo tak něco. 🙂

Čínský „ST-Link v2“ je taky podivnost sama. Nějak to fungovalo, ale jinak to jako spíš bolelo. Valná část utilit hlásí, že žádný ST-Link nevidí, a tak.

STM32 Minimum - Page 1

Což mě trochu hnětlo, protože jsem se zrovna na tuhle desku těšil. Použitý procesor STM32F103C8 má jádro ARM Cortex M3, 64 kB FLASH, 20 kB SRAM a spoustu dalších hezkých vlastností, třeba spoustu periferií. Navíc na desce je téměř „holý“, kromě PC13 není zabraný žádný pin, je připojený (mikro)USB konektor, takže máte hodně velkou volnost.

Hledal jsem tedy další možnost, jak tuto desku programovat, a našel jsem.

Dvojice pinheaderů jsou totiž vývody BOOT0 a BOOT1, a vy si pomocí jumperů nadefinujete, jaké jsou na těchto vstupech hodnoty. Pokud bude BOOT0 roven 1 a BOOT1 roven 0, ocitne se po RESETu čip v boot loader módu, v němž je možné naprogramovat jej pomocí UART1 – tedy signály TX1 (PA9) a RX1 (PA10).

Pak tedy stačí už jen připojit USB-to-UART převodník (třeba oblíbený CH340, Prolific PL2303 nebo CP1202 – pozor! Musí umět 3.3V!) a stisknout tlačítko RESET.

A k samotnému programování jsem použil Arduino IDE. Použil jsem 1.6.8, a měl jsem problémy (cesty apod.), ale po updatu na 1.6.9 vše funguje bez problémů.

Klíčem k úspěchu je knihovna Arduino_STM32. Stáhněte si ji a nahrajte do složky „hardware“ v Arduinu (viz Instalace). Po restartu Arduino IDE se v Manažeru desek objeví nové možnosti. Zvolil jsem desku „Generic STM32F103C series“, variantu „C8, 20kRAM, 64k Flash“ a jako nahrávací metodu Serial (experimetoval jsem i se STLink, ale výsledek nebyl nijak pěkný).

První přeložený sketch byl tento:

Překlad je o něco delší než ten pro Arduino. Důležité je nezapomenout na přehození BOOT0 na hodnotu 1 a stisknutí RESET před nahráním. Pokud chcete, aby při příštím spuštění už boot nenabíhal, hoďte switch zpátky na 0.

Další tipy: Sunspot STM32 Arduino, Arduino goes STM32

Rubriky: Hardware | Štítky: , , | 7 komentáře

ATtiny a Arduino

V EduShieldu jsem použil pro řízení displeje jednočip ATtiny2313. Je to vlastně legendární AT90S2313, ale s novějším jádrem a novými periferiemi. Původně jsem sice chtěl použít jiný typ, ale ten nebyl dostupný. Inu co už, použil jsem tento.

Otázka ale byla: Jak tu Atinu (familiární označení, jistě to říkáte taky…) naprogramovat. A protože jde o shield pro Arduino, nabízelo se naprosto jednoduché řešení, totiž využít Arduino jako programátor.

Dokonce na to mají i tutoriály – Arduino as ISP. Stačí k tomu pár propojovacích drátů a jeden kondenzátor (ten tam neukazují, ale je zapojený mezi RESET a zem na Arduinu).

pinoutattiny2313

Propojení je prosté:

Arduino ATTiny
digital 10 pin 1 (RESET)
digital 11 pin 17 (MOSI)
digital 12 pin 18 (MISO)
digital 13 pin 19 (SCK)
GND pin 10
5V pin 20

Nejprve ale nahrajte do Arduina sketch „ArduinoISP“. Najdete ho mezi Examples.

Jako druhý krok připojte elektrolyt ~10µF mezi zem a RESET na Arduinu (záporným pólem k zemi, logicky).

Teď můžete vesele připojit ATTiny2313 a programovat.

No jo, to se řekne – programovat. Ale čím?

Já jsem si řekl, že bude kůl a vůbec užitečné, když firmware bude taky sketch pro Arduino. A jak jsem řekl, tak jsem i udělal. K tomu, aby to celé fungovalo, ale musíte do Arduina přidat podporu pro ATtiny. Já použil tuto, ale chtělo to trošku laborovat s cestami v souboru boards. Ony se totiž mezi verzí 1.5 a aktuální 1.6 změnily, a tak byl překlad spíš festival chyb než radostná událost. Ale nakonec se podařilo.

Vybral jsem příklad „blink“, přeložil ho pro desku „ATtiny2313@1MHz“, vybral jsem programátor „Arduino as ISP“ a tradá – vše fungovalo.

Trošku trápení bylo s I2C v roli „slave“, ale nakonec po chvilce bastlení s přerušením začala Atina přijímat povely a reagovala na ně. Standardní knihovna Wire totiž moc nešlape, tak jsem zvolil TinyWireS.

(Netestoval jsem Arduino Tiny Core od Spencera Konde, vypadá zajímavě).

S touto sestavou tedy trvalo vytvoření firmware pro EduShield jedno odpoledne. Naprogramování pak vyžaduje jen šest drátů, kondenzátor a pět minut práce.

Rubriky: Hardware | Štítky: , | Napsat komentář

Komprese GPS

U minulého článku jsem zmínil, že jsem přemýšlel nad tím, jak přenést souřadnice pomocí krátké zprávy Sigfox (12 bajtů). Jaké jsou možnosti?

GPS obecně udává dvě souřadnice (výšku tentokrát zanedbáme), a to zeměpisnou šířku (latitude) a délku (longitude). Šířka se udává ve stupních 0 až 90, kde 0 je rovník, 90 je pól. Další informace je, zda se jedná o severní nebo jižní polokouli. U délky se hodnoty udávají ve stupních v rozsahu 0 až 180, kde 0 je Greenwich, na východ od něj je východní polokoule, na západ západní. Kompletní adresa tedy vypadá třeba takto: 15E 50N.

Jenže celý stupeň je hodně velká oblast. Pro představu – tohle je prostor mezi 15 a 16 stupňem východní délky a 49 a 50 stupněm severní šířky:

screenshot-mapy.cz 2016-07-19 12-56-47

Tedy flák země. Proto se stupně dále dělí na minuty, vteřiny, a ty se přenášejí v desetinné podobě. Jenže minuty a vteřiny používají šedesátkové dělení, což je u počítačů nepraktické, proto se často používá desetinné dělení stupňů. Například 49.2244914N, 13.2719244E.

Z vlastností reálných čísel vyplývá, že přidáváním dalších míst za desetinnou tečku zpřesňujeme polohu.Pokud snížíme počet číslic, sníží se přesnost souřadnice, respektive zvětší se označená plocha na zemském povrchu. Pozice je tedy „ztrátově kompresována“ už tím, že jde o reálná čísla.

Pokud bych přenášel čísla v desítkové ASCII podobě, vyšlo by mi šest znaků na každou souřadnici. „49.22413.271“ – tedy přesnost na tisíciny stupně, je nedostatečná. Pro představu:

screenshot-mapy.cz 2016-07-19 13-22-25

Ušetřím jedno místo, když vypustím desetinnou tečku. Ale v takovém případě už musím vycházet z toho, že část před ní bude mít fixní počet číslic. Pokud chci třeba operovat na území České republiky, nemám problém. Ale pro obecnou kompresi GPS se to příliš nehodí: délka může mít rozsah 0 až 180, tedy 1 až 3 číslice, navíc potřebuju zakódovat kvadranty severní / jižní, západní / východní.

Na dvojnásobek mohu přesnost zvednout, pokud použiju BCD. Do jednoho bajtu se pak vejdou dvě číslice, a díky tomu, že mám nevyužité kódy A-F, mohu jimi zakódovat desetinnou tečku i kvadrant. Dostanu se tak na velmi vysoké rozlišení.

Jenže jaksi sami cítíte, že taková komprese není příliš efektivní. Je tam spousta „volného prostoru“.

Další možnost je pracovat s reálnými čísly ve tvaru „floating point“, nebo „fixed point“, osekanými na určitý počet bitů v mantise. Do toho se mi ale moc nechtělo.

Druhý nápad, se kterým jsem pracoval, vyšel z toho, že si určím jižní a západní polokouli jako zápornou (-180..+180, resp. -90..+90) a posunu soustavu souřadnou tak, aby byla v rozmezí <[0,0] – [360,180]>. Tento rozsah pak rozdělím na menší obdélníky. Jejich počet bude určovat jednak přesnost, ale i požadovaný počet bitů informace. Jako dostačující přesnost mi připadá pěti- či šestibajtová (20 či 24 bitů per souřadnice). Pokud rozdělíme plochu na šestnáctimiliontiny (1/16777216, 24 bitů), dostáváme obdélník o délce 0.0000214 stupně a šířce 0.0000107 stupně. To je vzdálenost několika kroků:

screenshot-mapy.cz 2016-07-19 13-38-09

V případě nutnosti přidám sedmý bajt a přesnost bude v každém směru 16x větší.

Když tu ukazuju hrubé odhady toho, kolik je jedna desetitisícina stupně, tak platí zhruba pro naše území. Z vlastností zeměpisných souřadnic vyplývá, že vzdálenost jednoho stupně délky na rovníku je mnohem vyšší než u nás, a i tady je mnohem vyšší než třeba na severu Švédska, a v bezprostřední blízkosti pólu klesá až k nule. Toho by se dalo využít, a v případě, že neděláte aplikaci pro polárníky, tak by jistě šlo zeměpisnou délku pro šířky blízké pólům „decimovat“ – snížit jim přesnost v bitech, a tak ušetřit, při relativně malé degradaci přesnosti.

No a konečně poslední možnost, se kterou jsem pracoval, je umělé snížení rozsahu GPS souřadnic, pokud je jasné, že přenášená hodnota z těchto souřadnic nevystoupí. Pro Českou republiku můžeme zvolit hrubý „obdélník opsaný“, omezený mezi 12. a 19. stupeň východní délky a 49. až 51. stupeň severní šířky. Tady je problém, protože malá část našeho území spadá až nad 51. stupeň:

screenshot-mapy.cz 2016-07-19 13-46-40

Pokud chcete vědět úplně přesně, tak vězte, že obdélník opsaný má souřadnice [48.5519972N, 12.0906633E] – [51.0556997N, 18.8591456E]. Pokud republiku pokryjete sítí 65536 x 65536 obdélníků, tedy 16 x 16 bitů, získáte dostatečnou přesnost pro velké množství aplikací ve čtyřech bajtech. První souřadnici by šlo degradovat, protože republika je orientována směrem východ – západ, a dal by se tak ušetřit bit či dva.

Na podobných principech pracují i další metody „komprese zeměpisných souřadnic“. Naleznete jistě i sofistikovanější metody. Já přemýšlel pouze nad těmi, které bych dokázal, doufejme, bez větších obtíží implementovat v Arduinu.

Rubriky: Jen tak, Software | Štítky: | 6 komentáře

Hrátky se Sigfoxem

Minule jsem si hrál s deskou SmartEverything (SME) a Sigfoxem – nechal jsem si posílat informace o teplotě, tlaku a vlhkosti. Teď mě napadlo, že si zkusím, jak je na tom GPS.

Nainstalovat si příklad „zjisti pozici z GPS a napiš mi ji“ je triviální. Ale to se mi moc nechtělo, já chtěl něco onačejšího. Vzal jsem tedy pozici z GPS a posílal jsem ji přes Sigfox na server. Jako že takový sledovač GPS (Gde Právě Su), a zároveň trošku tester technologie Sigfox.

Přemýšlel jsem, jak posílat inteligentně souřadnice ve zprávách, co mají maximálně 12 bajtů. Napadlo mě omezování rozsahu, konverze float na bajty, a už už jsem psal union, a pak mě napadlo, že se podívám, jestli už to někdo neřešil… No jasně že řešil.

Takže jsem použil hotové řešení, upravil jsem posílání tak, aby odesílal zprávu každou minutu, ChytréVšechno jsem dal do auta na nabíječku a vyrazil jsem. Na serveru jsem si předem připravil úplně jednoduché logování poslaných dat.

Jel jsem odpoledne po českých dálnicích v intervalu <2;0>. Tedy jako že po D2, pak po D1 a nakonec po D0. SME vesele poblikával a posílal data, na serveru se vše shromažďovalo, a já teď sednul a celé jsem to hodil do mapy.

Co bod, to zachycená zpráva. Na serveru se ukládaly kromě pozice i informace o RSSI a SNR – najdete je v infoboxech. Barva bodu odpovídá hodnotě RSSI.

Co z mapy vyčteme? Především dvě věci:

  • Pokrytí je už poměrně slušné
  • Při rychlostech nad 110 km/h zprávy nepřicházejí.

Podle toho, co mi říkali lidé ze SimpleCell, je Sigfox bohužel velmi citlivý na úhlovou rychlost vůči přijímači. Pokud se útlum způsobený tímto efektem potká s útlumem v důsledku vlastností okolního terénu, a navíc se vysílá z auta, může signál poklesnout pod použitelnou mez.

V experimentech budu pokračovat a SME s sebou asi budu vozit pravidelně.

Rubriky: Hardware | Štítky: , , | 7 komentáře

Soutěž v programování mikrořadičů

O víkendu proběhlo celorepublikové kolo soutěže mládeže v programování. Se Štěpánem Bechynským jsme byli porotci kategorie „mikrořadiče“.

Účastníci dostali Arduino a výukový kit, který používáne na workshopu Arduino101. Na vypracování úlohy měli čtyři hodiny… Chcete s nimi zmřit síly?

Zadání úlohy pro celostátní kolo kategorie mikrořadiče

Univerzální hlídač lednice

Nové lednice mají velmi často zabudovaný teploměr, takže víte, jestli fungují správně, a když necháte dveře dlouho otevřené, tak začnou pískat. Co ale udělat s lednicí, která takto vybavená není? To je úkol pro Univerzální hlídač lednice (UHL). Vaším úkolem je takovéto zařízení vytvořit. Hardware dostanete připravený a vaším úkolem bude vše naprogramovat.

Funkce UHL je následující: 1. Pokud je lednice otevřená déle než 30 vteřin, tak začne UHL přerušovaně (5 Hz) pískat. Otevření lednice detekujte pomocí fotorezistoru.

2. Při otevření lednice zobrazuje UHL teplotu ve stupních Celsia nebo Fahrenheita, podle toho, co si uživatel naposled zvolil, viz bod 3. Teplota je zaokrouhlena na celé číslo a za teplotou se na displeji zobrazí jednotky, tedy znak C nebo F.

3. Pokud je lednice zavřena, tak se na displeji nic nezobrazuje, aby se šetřila energie.

4. Tlačítkem Menu UHL přepíná mezi zobrazením teploty ve stupních Celsia, Fahrenheita.

5. UHL ukládá maximální a minimální naměřenou teplotu. Tyto hodnoty zůstanou uloženy, i když UHL přijde o napájení, např. při výměně baterie.

6. Ke každému extrému se zároveň uloží i datum a čas. Nezapomeňte proto správně nastavit hodiny.

7. Pomocí tlačítka Up zobrazí UHL maximální naměřenou teplotu a po 10 vteřinách se vrátí na naposled zvolené zobrazení, viz funkce č. 2.

8. Pomocí tlačítka Down zobrazí UHL minimální naměřenou teplotu a po 10 vteřinách se vrátí na naposled zvolené zobrazení, viz funkce č. 2.

9. UHL umí hlídat překročení mezních hodnot teploty. Při překročení minimální nebo maximální teploty se rozblikají všechny LED a na displeji začne blikat hodnota teploty, která je mimo rozsah. Frekvence blikání diod je 10 Hz, frekvence blikání displeje je 1 Hz. Nastavení minimální a maximální teploty se provádí přes sériovou linku. Tyto hodnoty se uchovávají i při odpojení napájení.

10. Po připojení UHL k počítači si mohu některé informace zobrazit nebo nastavit pomocí následujících příkazů přes sériovou linku:

 

Příkaz (nezáleží na velikosti písmen) Funkce Ukázka výstupu
Maxc Maximální hodnota ve °C 2016-01-14 10:32:14 10C
Maxf Maximální hodnota ve °F 2016-01-14 10:32:14 50F
Minc Minimální hodnota ve °C 2016-01-14 12:02:14 7C
Minf Minimální hodnota ve °F 2016-01-14 12:02:14 44F
Delete Smaže uložené informace OK nebo ERROR
Allc Zobrazí minimální a maximální teplotu ve °C 2016-01-14 12:02:14 7C
2016-01-14 10:32:14 10C
Allf Zobrazí minimální a maximální teplotu ve °F 2016-01-14 12:02:14 44F
2016-01-14 10:32:14 50F
Setlimitmaxc <hodnota> Nastaví poplach při překročení maximální teploty OK nebo ERROR
Setlimitminc <hodnota> Nastaví poplach při překročení minumální teploty OK nebo ERROR
Deletelimitmaxc Vypne hlídání maximální teploty OK nebo ERROR
Deletelimitminc Vypne hlídání minimální teploty OK nebo ERROR

11. Pokud uživatel provede neplatnou operaci, třeba zadá nesmyslnou hodnotu, tak se na displeji objeví text ERROR, který bude po dobu 10 vteřin po displeji rolovat, a zároveň se pošle chybové hlášení po sériové lince. Pak se UHL vrátí do režimu zobrazení teploty.

Pravidla

1. Pokud něčemu nerozumíte, tak se ihned zeptejte.

2. Musí se použít jen dodaný jednotný hardware.

3. Smí se použít Standard Libraries, které jsou dostupné v čisté instalaci Arduino IDE viz. https://www.arduino.cc/en/Reference/Libraries.

4. Smí se použít knihovna TM1636 pro ovládání displeje, kterou dodá pořadatel. (Odstranili jsme znaky A-F, abychom si ověřili, že soutěžící chápou cizí kód  dokážou ho upravit)

5. Knihovny se mohou libovolně upravovat.

6. Můžete vytvořit vlastní knihovnu.

7. Jiné knihovny jsou zakázané.

8. Zdrojový kód musí být pečlivě okomentován, aby bylo zřejmé, že mu autor rozumí. I když vydělíte dvě čísla, tak musíte do komentáře napsat proč je dělíte.

9. Zdrojové kódy aplikace, včetně knihoven, uložte na plochu do adresáře, jehož jméno bude vaše startovní číslo. Adresář je třeba si vytvořit.

10. V případě stejného počtu bodů rozhoduje čas odevzdání úlohy. (Kdo dřív přijde, ten dřív mele. First come, first serve.)

Co máte k dispozici

1. Schéma zapojení použitého shieldu.

2. Seznam použitých součástek.

3. Katalogový list hodin reálného času.

4. Knihovnu TM1636.

5. Katalogový list použitého termistoru.

6. Vzorec pro přepočet °C na °F.

t[C°]= 5/9.(t[F°]−32)

7. Vzorec pro výpočet teploty.

t [°C] – výsledná teplota

r [Ω] – odpor termistoru

B – konstanta z katalogového listu

t[°C]=1 / (log(r[Ω] / 10000) / (B+1) / 298.15)−273.15


Tak co, troufnete si?

Soutěžící (12-19 let) se s tím popasovali všelijak. Dva byli výrazně lepší než zbytek, vítěz dokone používal i DDRD a PORTD, nastavil si přerušení,…

Na druhé straně konstrukce:

byla velmi neotřelá a ukazovala, že autor možná udělá líp, když se bude věnovat jiným aktivitám 😉

Troufnete si vy? Alespoň koncept…

Rubriky: Software | Štítky: , , , | 4 komentáře

O objektu, struktuře a gotu

A taky o globální proměnné.

Programátoři se od pradávna dělili na Opravdové Programátory a Pojídače koláčů. Tenhle sloupek Eda Posta je tak notoricky známý, že ho ani nebudu připomínat, a místo toho rovnou řeknu, co mám na srdci…

Totiž já už to psal, ale klidně to připomenu: Učte se programovat mikrokontroléry, naučte se assembler aspoň jednoho procesoru, a uvidíte, jak vám věci začnou dávat smysl.

Uvědomil jsem si to, když mi jeden velmi zkušený programátor ukazoval svůj kód pro Arduino a divil se, že se mu to nevejde do paměti. Koukám do kódu, a ten byl – přátelé! – ten byl nádherný! Srdce každého učitele programování by nad tím zaplesalo. Nahoře měl konstruktor a destruktor, pod tím ty struktury, správně přetypované malloc()…

Polknul jsem.

„Co? Mám chybu v tom pointerovém typecastu? To snad ne…“

Povídám: „Co to tady tím mallocem tvoříš?“

Prý že nějaké úložiště dat… V hlavní smyčce se volají dvě funkce, první nějak sebere data, vytvoří tuhle strukturu, předá ji druhé, ta je zpracuje a strukturu zase zruší. Napsal bych objekt, ale nemělo to metody. Tady by asi ten učitel povytáhnul obočí.

Funkce, která data zpracovávala, měla taky nějaké lokální proměnné. Ještě že nepoužil rekurzi, pak by bylo neštěstí hotové.

Dal jsem mu stručnou nalejvárnu. Naštěstí šlo o chápavého a velmi liberálního programátora. Kdyby byl rigidní, tak mě ještě dneska škrtí a křičí, že globální proměnná neexistuje a GOTO je ďábel!

Pojďme si to trošku nahodit na koleje. Pokud jste programátor bankovních systémů v Javě, pokud děláte weby nebo pokud programujete, cojávím, matematické algoritmy v … čemkoli, zkrátka pokud programujete cokoli s výjimkou low level systémů, tak si opravdu vystačíte s objektovým / objektově orientovaným přístupem, ti drsnější z vás se naučí funkcionální, a neberte to teď nijak zle: vystačíte si s tím a budete v tom klidně dobří. Ale nepouštějte se, probůh, do low level, protože tam jsou lvi a temnota a zmatení a jistoty přestávají platit.

Trošku to připomíná situaci člověka, který je zvyklý na newtonovskou mechaniku, a najednou je postaven před teorii relativity. Všechno je jinak a sčítání rychlostí není sčítání a tak. Jenže platí, a to si zapište červenou tužkou hned vedle tabulky ASCII kódů, že v normálním životě si většina lidí vystačí s newtonovskou mechanikou, a kdo by při výpočtu doby dojezdu z Prahy do Brna autem po D1 montoval relativistické vzorce, dopočítal by se téhož, ale působil by značně nepatřičně. Tam stačí obyčejné „vzdálenost lomeno rychlost“. Teda – na D1 je to potřeba ještě vynásobit imaginární jednotkou i, protože D1 se řídí vlastními zákony a žádný vzorec nikdy nezohlední počet bílých Transitů, Felicií jedoucích 110 v levém pruhu, vymletý pravý pruh od Humpolce po Jihlavu ani Slováků v audinách tak temných, že mají zatemněné i přední sklo, ale – rozumíme si, ne?

Zkrátka úplně stejně, jako jsou relativistické vzorce vhodné jen pro některé oblasti, tak jsou low level postupy taky vhodné převážně pro low level programování. Ale zase je dobré je znát, abyste si nepřipadali před cyklotronem a Arduinem jako mistři světa, protože umíte newtonovskou fyziku a Quicksort.

Pár základních věcí tedy zde:

Zaprvé – globální proměnné existují a jsou užitečné. Pokud se pracuje s jednou instancí něčeho (tedy jako že singleton), tak to uložte do „globální proměnné“. V praxi to dostane v RAMce, které v jednočipu není nikdy dost, tolik bajtů, kolik to skutečně zabírá, bude to na konstantní adrese, a nazdar bazar, bude to tam furt, přistupuje se k tomu jednoduše a hotovo dvacet.

Zadruhé – žádná halda. Víte vy, jak se pracuje s haldou? Jasně že víte, ale otázka zní: jak to ten procesor vlastně dělá, že tu haldu má, a že vám z ní přiděluje paměť, o kterou si řeknete? No, on si totiž vezme celou volnou paměť, co má k dispozici (a to se liší podle architektury), a udělá si v ní bloky. V zásadě si na začátku zapíše na začátek celé haldy pár servisních bajtů, typicky: toto je prázdný blok, má délku tolik a tolik. Pak uděláte malloc(), knihovna koukne do paměti, najde značku pro „prázdný blok“, z ní odpočítá požadovaný počet bajtů, a na začátek zapíše: Alokovaný blok, tolik a tolik bajtů, a za konec zapíše: Prázdný blok, tolik a tolik bajtů. Chvilku je přidělujte a rušte, nejlépe s různými a nesoudělnými délkami, a za chvilku v RAMce nebudete mít k hnutí. Prostě ne, dynamická alokace paměti je v jednočipu prostě hloupý nápad a pokud můžete, tak se jí vyhněte.

Zadvouapůlté – ukazatel. Když už máte nějakou dynamickou paměť přidělenou, tak k ní přistupujete přes ukazatel a přes index. Což tedy v praxi znamená, že buď má procesor nějaké indexové registry, a do nich si uloží hodnotu ukazatele a pak přistupuje k paměti prostřednictvím nepřímé adresy, nebo je nemá, a pak si musí pokaždé adresu dopočítat. Naštěstí je dneska mají, taky překladače umí hodně dobře optimalizovat, ale raději se na to nespoléhejte, protože i překladač může narazit na omezení, buď svoje, nebo procesoru.

Zatřetí – žádné lokální proměnné. Taková lokální proměnná, to je místo na zásobníku. Zásobník, helejte, to není nějaká abstraktní struktura ze skript „Algoritmy I – datové struktury“, ale docela zásadní součást procesoru na nízké úrovni. Když voláte podprogram (což je ve vyšších jazycích plusmínus ekvivalent „volání funkce“), tak se na zásobník, což je struktura v paměti, uloží adresa, ze které se skáče, aby se po returnu mohl procesor vrátit tam, kde byl naposledy. Na zásobník se taky ukládají věci, které si potřebujete na chvíli někam schovat. Zkrátka zásobník je velmi důležitá věc, bez ní by vám program ve strojáku fungoval naprosto nestrukturovaně. U „velkých“ procesorů to nebývá úplně takový problém, tam bývá zásobník hodně velký a s chybou „stack overflow“, která nastává ve chvíli, kdy toho na zásobník uložíte moc, se setkáte jen zřídka. Nebo ještě hůř – nesetkáte se s ní až do chvíle, než vám někdo pomocí téhle chyby nezruší systém a nenabourá se do něj. U malých procesorů to už problém je, tam není dost RAMky. Některé dokonce mají omezenou velikost (třeba 6502 měl jen 256 bajtů na zásobníku) a některé jednočipy mají hardwarově zásobník zcela mimo adresní prostor a pevně omezený například na 16 hodnot.

No, a proč o zásobníku mluvím? Protože zrovna lokální proměnné se dělají tak, že po vstupu do podprogramu (=funkce, procedury, jakkoli) se na zásobníku alokuje množství paměti, potřebné pro všechny proměnné, a pak se k nim přistupuje (zase) nepřímo. Moderní překladače to řeší tak, že se snaží alokovat pro tyto situace některé z registrů, ale zase: nejde to vždy a všude, nespoléhejte na to.

Mimochodem – když předáváte funkci parametry, víte, co se stane? Záleží na překladači, ale obecně platí, že zase uloží všechny na zásobník a zavolají podprogram. Pak je opět zahodí. Znovu: překladače optimalizují a snaží se nacpat parametry do registrů, ale když jich je moc, tak i registry dojdou.

Začtvrté – rekurze. Není to dobrý nápad, důvod vizte výš.

Za páté – goto. Nebo GO TO. Zkrátka přímý skok na nějaké místo programu. Od dob strukturovaného programování je to zlo, protože to rozbíjí strukturu. Ve skutečnosti za všemi těmi for a loop a while není nic jiného než prachsprosté goto, jen zakapotované tak, že cílovou adresu skoku řeší překladač a ne chybující programátor. I známé breakcontinue jsou jen syntaktický cukřík místo goto. V assembleru se mu ale říká většinou jump (JMP, JP, JUMP) nebo branch. Je to velmi silný nástroj, takže chápu, proč ve vyšších jazycích moc nebývá, ale tam dole, tam, kde to smrdí křemíkem, se bez něj neobejdete. A stačí jedna chyba, a program vám najednou skáče, kam nemá, kde ho nikdo nečekal, a dějou se věci veliké.

Holt jednočipy, osmibity a assembler nejsou pro měkkýše… Jsou to mocné nástroje, ale nebezpečné a v rukou nezkušeného můžou napáchat obrovské škody. Ale rozhodně pomůže, když se je naučíte – i kdyby hlavním důvodem měla být ta úleva, že programujete v něčem s podstatně vyšší mírou abstrakce.

Rubriky: Jen tak, Software | Štítky: , , , | 3 komentáře

BigClown

Před pár lety, kdy jsem si redefinoval svoje profesní cíle a fantazie, tak jsem si říkal: Jaká by byla úplně ideální práce, kterou bych chtěl dělat? A uvědomil jsem si, že by mě ze všeho nejvíc bavilo:

  • Hrát si s elektronikou. Jako že mě zaujme nějaké zajímavé čidlo, tak si ho koupím, zkusím s ním něco dělat, nějaké zapojení navrhnout, vyzkoušet to, pohrát si. A pak sednout a…
  • Psát o tom, jak se s čipem pracuje, na jaké problémy jsem narazil, co se mi líbilo a co ne… Dát dohromady tipy, odpovídat lidem, které to zaujalo, pomoci s použitím a nasazením…
  • Programovat pro to – drobné utility, uživatelské rozhraní a tak. Nic velkého, žádný bankovní systém v Javě, ale spíš jen malá aplikace, drobnost, proof of concept
  • Školit to, učit, psát o elektronice…

Celé to dohromady se jaksi přirozeně točí okolo Internetu věcí, ať už to je co chce.

No a tak jsem decentně směřoval k tomu cíli. Kombinoval jsem něco jako zaměstnání, něco jako koníček, však víte sami, pokud mě sledujete.

Logicky se na mne časem začali obracet různí lidé, abych jim buď poradil, nebo řekl svůj názor na jejich „IoT technologii“. Tak jsem se dostal k Sigfoxu, k LoRaWan od Things.cz a ke spoustě dalších věcí. Jedním z týmů, který mě oslovil a žádal o zpětnou vazbu, byla parta z Jablotronu, která přišla s platformou pro domácí automatizaci, nazvanou BigClown. Na první letmý pohled jedním okem to vypadalo jako ekosystém „a la Arduino + vybrané senzory a aktuátory + koncentrátor“, ale jedna věc mě zaujala enormně, a to… Zkusíte hádat?

Když Jablotron, tak bezpečnost!

Ty jednotlivé endpointy, tedy samotné „věci“, jsou modulární. Hlavní modul („core“) je postavený na procesoru STM32L083CZ, což je Cortex M0+, s low power, s generátorem náhodných čísel a akcelerací AES128. U něj je čip ATSHA204, tedy kryptografický čip, který umožňuje bezpečné ukládání klíčů a další kryptografické lahůdky (do podrobností se hodlat nehodlám, nemám nyní na to čas…)

Takže máme „věci“ s integrovaným kryptografickým hardware, kde šifrování není možnost, ale vlastnost. Komunikace s koncentrátorem (hubem) probíhá po rádiu (v pásmu 868MHz) a je šifrovaná. Zprávy jsou technicky MQTT s JSON payloadem, serializované, komprimované a šifrované.

bigclown

V roli koncentrátoru může být jakýkoli počítač, klidně i Raspberry Pi nebo Turris Omnia (router od CZ.NIC), který se stará o další věci – příjem zpráv, odesílání, jejich zpracování, komunikaci do internetu (ostatně ani být nemusí; můžete si to připojit třeba k televizi a sledovat či řídit) a další věci. Důležitá vlastnost je tu automatická aktualizace a záplatování. Koncentrátor hraje rovněž zásadní roli při distribuci klíčů a párování se zařízením – to probíhá fyzicky přes NFC.

Idea „modulární stavebnice domácí automatizace, kde je bezpečnost nikoli přidaná hodnota, ale transparentní vlastnost“ je něco, co Michal Altair Valášek ohodnotil slovy: „Tohle jsem u IoT hledal, takovouhle stavebnici, kde je kryptografie vyřešená, ale nikde nenašel!“

A celé tohle je open source hardware a open source software, uvolněné pod licencemi MIT, CC apod. (ne, žádné GPL, naštěstí!)

No a když jsme se bavili o mém názoru na věc, tak jsem říkal, že se mi to moc líbí, že rád pomůžu a že se to blíží mé „práci snů“.

A tak jsme si plácli.

Jestli vás to zaujalo, tak si přihlašte newsletter na firemní stránce BigClown Labs, nebo pište mně.

Rubriky: Hardware, Jen tak | Štítky: , , , , , | 2 komentáře