Tento příspěvek vypráví o mé cestě k automatizaci kotelny s využitím staršího kotle a Arduina.
TL;DR - Protože je článek dlouhý, napsal jsem na úvod shrnutí tématu pro spěchajícího čtenáře: Rozhodl jsem se prodloužit životnost poloautomatického kotle III. emisní třídy Benekov Pelling 27 tím, že jsem postavil novou řídící jednotku použitím vývojové desky Arduino UNO R4 Wifi. Práce to nebyla jednoduchá, protože jsem si musel vyvinout nejen vlastní software, ale i postavit fyzické zařízení a to včetně tzv silové části – ano, zařízení se zapojuje do zásuvky 230V a ovládá tři silová rotační zařízení. Nakonec se zadařilo, výsledkem je modernější řídící jednotka, kterou lze ovládat i pomocí WiFi a mobilní aplikace, nabízí jemnější regulaci kotle, nebo například hlídání naplněnosti zásobníku, vede různé statistiky o spotřebě, vývoj teplot a podobně. Nic z toho původní řídící jednotka nenabízela.
Příběh začíná v roce 2008, kdy jsem do čerstvě opatřeného RD před rekonstrukcí pořizoval vytápění. Protože v obci není zaveden plyn, byl v RD nejprve vybaven vytápěním na LTO. To zde bylo už z dob hlubokého socialismu. Bývalý majitel domu však topení před prodejem RD kompletně „vykostil“, v kotelně zůstala akorát nádrž na LTO a zrezlé trubky uřezané a trčící ze zdí. Pro obnovu vytápění se nabízelo:
A protože jsem ekologická duše, vybral jsem kotel na pelety a biomasu od firmy Benekov typ Pelling 27. (jasně, v tu dobu bylo na trhu mnoho typů kotlů, nejčastěji mi byl vnucován Viadrus ale byl asi 2× dražší a zrovna to bylo v období, kdy se dotace dávaly jen na výměnu kotlů, a já to kupoval už bez kotle). Jedná se o poloautomatický kotel III. emisní třídy, ve kterém lze spalovat dřevní pelety třídy A1 nebo A2, dále pak agropelety nebo obilí. Prakticky ovšem v kotli spaluji pouze pelety třídy A1, protože cokoliv jiného nevychází ekonomicky. Nižší třídy pelet nebo agropelety mají nižší výhřevnost, ale to neznamená že by o to byly levnější.
Skok do roku 2024, kotel, jenž měl slibovanou životnost 15 let skutečně v některých aspektech dává najevo, že je na konci životnosti. Ovšem to co odchází je řídící jednotka. Čidlo teploty driftuje do záporných hodnot, kotel náhodně hází chyby Err, a v automatickém režimu se náhodně zasekává. To se projevuje tak, že kotel ukončí automatický režim a zastaví se dokud někdo nedojde do kotelny a nezmáčkne křížek „#“, čímž se činnost obnoví. Když se to stane ve 3h ráno nebo v době, kdy jsou všichni v práci, máme pak v domě zimu a kotel se musí znovu zapálit. Nehledě, že to dále zvyšuje nároky na údržbu.
Jako dočasné řešení byly nainstalované spínací hodiny které kotel jednou za hodinu restartovaly. Dále jsem se sháněl po servisu, a asi tušíte, že po 15 letech najdete málo lidí, kteří jsou ochotni se zajímat o můj problém. Většinou vám řeknou, že se na to mám vykašlat a koupit si jejich nejnovější produkt za X stovek tisíc
Původní dodavatel si nadiktoval platbu dopředu jen za to, že se někdo z jejich servisu přijede podívat. Samotný termín mi nebyl sdělen, dokud nezaplatím. Nezaplatil jsem. Človek, který zná detaily řídící jednotky je prý v ČR jen jeden, tomu jsem se nedovolal. Samotnou řídící jednotku lze sehnat na různých e-shopech, kde se prodávají náhradní díly, pouze pokud je skladem a dotyčný e-shop si neřekne částku srovnatelnou s cenou moderního notebooku. A to za předpokladu, že chyba je skutečně v řídící jednotce a ne někde jinde, ale bez návodu a schématu těžko něco zjistím (rady v oficiálním návodu jsou samozřejmě k ničemu, schéma zapojení tam nikdo nedá)
Zastavme se na chvíli u regulace a legislativy. Na začátek říkám, že nejsem právník a všechny informace mám z internetu.
V roce 2024 byl zakázán provoz kotlů na tuhá paliva bez emisní třídy a emisní třídy I a II. Zůstávají kotle emisní třídy III, které se už nesmí prodávat, nové kotle musí být emisní třídy IV a V.
Pokoušel jsem se zjistit, jak jsou jednotlivé emisní třídy definované, když už provádím úpravu řízení, abych věděl, co musí kotel splňovat. Moc jsem nepochodil. Obvyklá odpověď zněla, že emisní třídu najdu na štítku kotle. Na to mým je napsaná trojka. Později jsem objevil tabulku pro novější emisní třídy, a v té tabulce jsou uvedeny jen hodnoty pro účinnost, vypouštěné CO, prachu a dalších nečistot. Tyto hodnoty lze ovlivnit dobrým řízením, ale velkou měrou do toho zasahuje konstrukční řešení kotle. Já se budu snažit o maximální efektivitu spalování na základě informací, které lze přečíst z omezeného množství čidel.
Jak legislativa řeší zásah do kotle? Tady se dostávám na tenký led. Pryč je doba, kdy si člověk mohl kotelnu uzpůsobit k obrazu svému k dosažení nejlevnějšího provozu. Už proto, že někteří jedinci to řeší spalováním levného paliva – třeba plastových obalů. Nic z toho já provozovat nemohu ani nechci. Prvním problémem takového přístupu je násobně dražší údržba. Nasypat nepředepsané palivo do kotle znamená zanést si dopravník, spalovací prostor i kouřovody nepořádkem, které násobně prodražuje údržbu a ekonomicky to nedává smysl.
Když na štítku je uvedena trojka, tak je to trojka ne? Jak může stát vědět, jestli kotel po tak dlouhé době splňuje požadavky emisní třídy? A stát řekl: „Ale ovšem, tuhle námitku my vyřešíme, zavedeme STK kotlů“. Ale protože kotlů je hodně a nedají se přivést na jedno místo jako auta, musel by někdo oběhnout kotelny, chytře se to nechalo na servisech přidružených původním dodavatelům. Každé tři roky by měl přijet servis do kotelny a zkontrolovat technický stav a vydat o tom revizní zprávu.
Na druhou stranu, to je super, protože konečně do mé kotelny dorazí servisák, který třeba bude vědět víc, poradí mi, nebo mi požehná (nebo i pohaní) mé řešení. Nakonec nějakou revizní zprávu dostanu, ne? Prakticky to ale funguje jinak. Každé tři roky mi přijde mail s fakturou od mého původního dodavatel Jakmile ji zaplatím, obratem mi přijde další mail s PDF souborem obsahující revizní zprávu. Šaškárna co?
Netuším, zda zákonodárce měl představu, jak naplnění zákona bude probíhat prakticky, zda je tak naivní a nebo to nějaká konspirace, kdy zákon jde naproti k vysokým ziskům dodavatelských firem – už jen to, že se mi po třinácti letech najednou ozval prodejce, od kterého jsem kotel kupoval s tím, že musím něco zaplatit jemu a že on mi pak vydá revizní zprávu. Ten kdo je nakonec bitý je provozovatel kotle.
Nikde není definováno oprávněnost zásahu do zařízení. Na zařízení se může leccos rozbít, motor, čerpadlo, a zavolat servis, který nemusí být oficiální, je jedno z řešení závady. Instalatéra jsem v kotelně měl celkem 3×, přičemž první dva zapojili kotel špatně. Ten první byl přímo od samotného prodejce a když jsem zapojení reklamoval, bylo mi řečeno, že se na to podívají a už se neozvali – proto mne nemile překvapilo, když se ozvali po 13 letech s fakturou.
Součástí údržby může být výměna čerpadla, podavače, čidel, konektorů a některé díly se už neprodávají a musí se nahradit neoriginálními. Spadá do toho i náhrada řídící jednotky? Tyto otázky jsem si kladl asi dva roky, než jsem se rozhoupal k řešení.
Rozhodl jsem se o neintruzovní řešení. Do tělesa samotného kotle není třeba zasahovat. Kotel má vzadu vyvedenou svorkovnici pro připojení na jednotlivé části kotle. Jediné, co není k dispozici je hodnota teploměru. Tuto obtíž jsem se rozhodl obejít zakoupení dvou nových digitálních teploměrů – proč dvou a jaký to má pozitivní efekt napíšu dále. Nicméně vysledkem mého řešení je, že kotel zůstal netknutý, pouze jaksi běží „v ručním režimu“ který ovládá má řídící jednotka postavená na Arduinu.
Je to na hraně? Je. Ale podle revizní zprávy je to v pořádku (revizák tu nikdy nebyl)
Automatický kotel na pelety má k dispozici následující zařízení
Kromě toho mám k dispozici tyto čidla
Jako mikrořadič jsem si vybral Arduino s celou vývojovou deskou, přesněji Arduino UNO R4 Wifi s procesorem Renesas a „koprocesorem“ ESP32MINI. Rozhodl jsem se na základě zkušeností s Arduinem ještě z dob UNO na AVR a revize R4 slibovala kompatibilitu s touto deskou. Původně jsem chtěl vybrat desku Mega, protože má víc paměti, ale R4 má ještě víc paměti.
Když se ohlédnu, tak jsem mohl sáhnout i po něčem jiném. Zaujal mne například WeMos D1 R2 UNO ESP8266. Nabízí se levněji a poskytuje víceméně vše, co potřebuji, akorát 3.3V logika
Přítomnost koprocesoru, který má na starost síťové připojení slibovalo větší míru asynchronního ovládání, kdy je to právě ESP chip, který řeší síť a Renesas, který řeší řízení. Mno, byl jsem naivní, víc o tom v odstavci o problémech
Kotel má v zásadě dva hlavní režimy a několik dalších vedlejších režimů. Je zde režim automatického řízení dále režim ručního ovládání. Vedlejší režimy například zátop, režim otevřeného zásobníku nebo havarijní zastavení.
V ručním ovládání lze prostřednictvím webové aplikace ovládat všechny tři zařízení nezávisle na sobě. Toto je důležité v okamžiku třeba zátopu nebo odstavení kotle, kdy je třeba natlačit (resp. vytlačit) pelety do retorty, a při zapálení zapnout ventilátor a regulovat otáčky dle aktuálního stavu plamene.
Ruční ovládání se také aktivuje při stisku tlačítka stop (momentálně v aplikaci, plánuji fyzické tlačítko)
V automatickém režimu kotel sleduje výstupní a zpětnout teplotu a na základě těchto údajů provádí přikládání do retorty a nastavuje výkon ventilátoru.
Pokud dojde k chybě, například nepodaří se přečíst teplotu teploměru, teplota vyskočí nad povolenou maximální teplotu nebo naopak klesne pod minimální provozní teplotu, ozve se čidlo přehřátí podavače, přejde kotel do havarijního zastavení a v tomto stavu setrvá, dokud chyba trvá (například se opakuje čtení teploměru a pokud se teplota přečte v pořádku, pak se kotel vrací do předchozího režimu)
Při otevření zásobníku se kotel přepne do režimu otevřeného zásobníku kdy dojde k zastavení ventilátoru a podavače. Režim se ukončí zavřením zásobníku
Režim zátopu je automatický režim s tím, že se nekontroluje minimální teplota po dobu první hodiny od zahájení, poté pokračuje automatický režim normálně. Důvod proč se kontroluje minimální teplota je čistě kvůli odhalení nějaké havárie v kotelně aby se kotel odstavil ještě dřív, než by způsobil škodu. Teploměr se totiž může utrhnout a spadnout na zem a začne měřit teplotu v kotelně. Pokud by toto řídící jednotka vyhodnotila jako nutnost pořádně zatopit, mohl by se kotel přehřát. Navíc jsou teploměry dva, také právě jako záloha pro případ, že jeden selže.
Původní řídící jednotka používala jednoduchý systém řízení založeném na sledování teploty a zapínání řízení jako se to dělá u dvoustavového termostatu. Z toho důvodu se na zařízení nehledí jako na automatický kotel, ale spíš na „hlouplý“ kotel s automatickým přikládáním. Sama obsluha (uživatel) musí nastavit hromadů parametrů často odhadnutých „z prstu“. Pro plně automatické řízení by kotel vyžadoval víc čidel, například detekci ohně, měření teploty spalin, měření kyslíku ve spalinách (lambda sondu). Nic z toho není k dispozici, tohle je doménou vyšších tříd (a vyšších cen).
Retortové kotle také nemívají automatické zapalování. Předpokládá se, že kotel se zapálí na začátku sezóny a pak už se oheň udržuje. Oproti tomu modernější kotle umí oheň zapálit i udusit podle potřeby (podle mne je to špatná cesta, udržování ohně plně dostačuje účelu).
Původní řídící jednotka tedy funguje tak, že kotel má dva režimy, režim topení a režim útlumu. Během topení kotel opakovaně přikládá podle nastavených intervalů a fouká do spalovacího prostoru nastaveným výkonem ventilátoru. Během útlumu se vše vypíná, oheň se dusí, zůstávají jen uhlíky a v tomto stavu kotel zůstává dokud teplota neklesne
S kotlem zápolím už přes 16 let a vím, že tento způsob řízení má své problémy. Prakticky od prvních zkušeností jsem se sám sebe ptal, proč to není řešeno lépe. Tak jasně, kotel byl představen v roce 2002, a dnes se díváme na dobu před čtvrt stoletím jako na středověk a říkáme „nonononó…“ (J. Werich).
Jedna z prvních námitek byla, proč kotel neměří teplotu na vratce (roura, kterou se voda vrací do kotle). Přitom je to kritický údaj, na který mě upozornil už ten první instalater při zapojování a školení obsluhy (mě). Teplota na vratce by neměla klesnout pod 60 stupňů kvůli možné korozi (a zejména dehtování) při nižších teplotách. Legrace je, že tuto teplotu musí hlídat obsluha kotle sledováním mechanického teploměru (budík) na vratné trubce. V praxi to znamená, že pravidelně cca jednou za týden, nebo při výrazné změně počasí chodím do kotelny a měním nastavení aby vratka nebyla pod 60 stupňů. Ale zase by neměla být moc vysoko, protože pak topím zbytečně navíc. Já vím, mohu si pořídit chytrou ekvitermní regulaci, která tohle umí řešit pomocí nastavení otopných křivek v závislosti na teplotě uvnitř a venku, ale to je dalších X desítek tisíc navíc a není to univerzální řešení, má to své mouchy. Stačilo by měřit vratnou teplotu a problém je vyřešen. Pokud se pokojový termostat víc otevře (termostatická hlavice), pak je zaznamenána nižší teplota na vratce a to je signál pro kotel ke zvýšení výkonu.
Pokud kotel dodává víc výkonu, než je potřeba, topná voda se ohřeje na „cílovou teplotu“ a kotel se vypne na dobu, kdy je teplota zvýšená. Protože v kotli nehoří, dochází k ochlazování teploty vody. V návodě se člověk dočte, že by kotel neměl přecházet do režimu útlumu na dlouhou dobu. Pokud okolí retorty vychladne, pak se na retortě začnou vytvářet nápeky, černé kusy dřevěného uhlí, které se lepí na stěny retorty a zužují tak efektivní průměr a může to dojít až ke stržení bezpečnostní pojistky na podavači. Pro obsluhu to znamená dost nejisté nastavení parametrů, jejich častou revizi, zároveň jednou měsíčně vyčištění retorty použitím kladiva a dláta (šroubováku).
Při návrhu vylepšení řízení jsem právě bral v úvahu výše zmíněné problémy a proto můj program není čistou kopii původního řízení. Nová řídící jednotka má 3 režimy z toho 2 jsou profily nastavení a třetí je režim útlumu.
U obou profilů se nastavují tři parametry: doba přikládání, doba prohořívání (podavač stojí),rychlost ventilátoru. Uživatel v aplikaci nastavuje požadovaný výkon v kW a rychlost ventilátoru v procentech. Přepočet výkonu na parametry provádí sama aplikace na základě nastavené výhřevnosti a údaji o váze paliva přeneseného za daný čas. Výhřevnost u pelet je 17MJ/kg, a přenesená hmotnost se dá změřit třeba tak, že se změří čistý čas podavače, za jaký se přesune jeden 15kg pytel. Aplikace je schopna provádět toto měření za běhu.
Jednotlivé profily se přepínají podle teploty na vratce. Pokud teplota klesne pod nastavenou hodnotu (nastaveno mám na 63 stupňů), přejde řízení do plného výkonu. Pokud teplota vystoupá nad 63 stupnů, přejde řízení do sníženého výkonu. Pokud by výstupní teplota přesáhla maximální teplotu (typicky 80 stupňů), přejde řízení do režimu útlumu.
Po třech týdnech beta provozu jsem nezaznamenal přepnutí do útlumu, kotel střídavě přepíná mezi plným a sníženým výkonem. Plný výkon je nastaven na 15kW (8/33/50%), a vždy vede ke zvýšení teploty kotlové vody. Snížený výkon je nastaven na 4kW (5/100/30%) a způsobuje pomalé snížení teploty kotlové vody. Důležité je, že v žádném případě retorta nevyhasne a zaznamenal jsem nižší výskyt nápeků. Výše uvedené řízení nezpůsobilo vyšší spotřebu pelet, jak jsem se obával
Řízení kotle podle vratné teploty se mi osvědčilo.
Protože celý systém má velkou setrvačnost a nějakou dobu trvá, než se ohřátá voda vrátí zpět do kotle, zavedl jsem řízení podle extrapolace – odhad budoucího vývoje teplot. Provádí se to jednoduše pomocí lineární regrese krátké historie (asi 10 minut) vývoje teplot. Délku extrapolace lze nastavit pro oba teploměry zvlášť. Tento systém se mi osvědčil, zejména je to znát při používání TUV (rodina se koupe), kdy kotel je schopen zvýšit výkon dřív, než vratka začne klesat nebezpečně pod 60 stupňů
Z vývojové desky ovládám tři točivá zařízení (motory). Zapínání těchto zařízení mám řešeno pomocí SSR relé. Modul s dvěma rele pro menší motory (čerpadlo, ventilátor), dále samostatné relé SSR-10DA pro podavač. V tomto případě jsem si vědom, že je to trochu předimenzované, ale v původním zapojení se používá tranzistor, který spínal velké elektromagnetické relé se zhášecím obvodem. Takže proto.
Oříškem bylo řízení ventilátoru. Tam je potřeba řídit otáčky. To nejprve ukazovalo na klasické triakové řízení pomocí pulsní modulace, ale jednoduché řešení pro Arduino jsem nesehnal. Všechna řešení vyžadovaly aktivní hlídání průchodu střídavého proudu nulou (tím se aktivuje přesné časování sepnutí triaku). Problém je, že ventilátor má rozběhový/běhový kondenzátor a tam se tento způsob řízení nehodí. Jiní mi radili koupit frekvenční měnič. To je drahé řešení. Navíc se původní řízení takto neprovádělo. Všiml jsem si, že stará řídící jednotka posílá do ventilátoru delší pulsy s malou frekvencí. Nakonec se to tedy vyřešilo následovně: Protože ventilátor má obrovskou setrvačnost (je to takový setrvačník), postačí SSR relé spínaný pomocí PWM s malou frekvenci, aktuálně mám něco kolem 6.8Hz. Střída pak určuje rychlost otáček. Impuls by ale měl být aspoň tak dlouhý jako je jedna vlna 50Hz. Použil jsem SSR, která spínají při průchodu nulou a to by mělo pomoci běhovému kondenzátoru získat dostatečnou energii pro řízení fázově posunutého druhého vinutí motoru.
Cesta k tomu, jak celý cirkus správně řídit, vede přes plánovač. Procesor Renesas má, pokud vím, pouze jedno jádro, takže jakékoliv paralelní řízení musí být řešeno pomocí kooperativního multitaskingu. To je ideální prostředí pro použití C++ korutin, kdy přes co_await
může docházet k přepínání úloh. Problém je, že Arduino je dodáváno s GCC-7, které ještě korutiny neumí. Velká škoda, moc jsem se těšil. Namísto korutin jsem tedy musel sáhnout po klasické třídě Task (AbstractTask), která implementuje metodu void run()
.
// kód je určen pro jednojádrové CPU class AbstractTask { public: static constexpr TimeStampMs disabled_task = static_cast<TimeStampMs>(-1); static uint8_t _reschedule_flag ; static AbstractTask *_cur_task; virtual void run(TimeStampMs cur_time) = 0; virtual ~AbstractTask() = default; void resume_at(TimeStampMs at) { if (at != _scheduled_time) { _scheduled_time = at; if (_cur_task != this) _reschedule_flag++; } } void stop() { resume_at(disabled_task); } TimeStampMs get_scheduled_time() const { return _scheduled_time; } void resume(TimeStampMs cur_time) { _scheduled_time = disabled_task; _cur_task = this; run(cur_time); _cur_task = nullptr; } protected: TimeStampMs _scheduled_time = 0; };
Plánovač si jednotlivé úlohy řadí podle get_scheduled_time() do prioritní fronty. Pro úlohu na vrchu zavolá resume() a po tom, co úloha skončí, tak se zařadí do prioritní fronty. Předpokládá se, že úloha ve své obsluze zavolá resume_at, pokud to neudělá, pak se považuje za zastavenou.
Pokud se resume_at volá mimo aktuální úlohu, pak se aktivuje _reschedule_flag. Tento flag donutí plánovač k přegenerování prioritní fronty – zpravidla proto, že některá úloha změnila své plánování, nebo byla spuštěna.
Aktuální stav každé úlohy tak eviduji pomocí enum proměnné a zpravidla implementace run()
obsahuje velký switch/case
, jako třeba zde (asynchronní čtení teplot)
Celý program má cca 128kB kódu (z 256kB) pro procesor ARM Renesas. Celkem 16kB je alokováno pro statické proměnné (z 32kB). Kód samotné řídící jednotky má 5949 řádků, knihovny dalších 8220. To je relativně velký projekt, který se nevejde do jednoho sketch.ino souborů. Přesto abych si co nejvíc ušetřil trápení s toolchainem, napsal celou řídící jednotku jako knihovnu pro Arduino-IDE a samotný sketch kotel.ino po startu pouze zavolá vstupní bod knihovny.
//kotel.ino #include "kotel.h" void setup() { kotel::setup(); } void loop() { kotel::loop(); }
To mi umožnilo překládat program v Arduino-IDE včetně funkce uploadu na board a dokonce jsem mohl využívat i vestavěný debugger. Nicméně velká část kód se vyvíjela a ladila v simulátoru
Simulátor? Jaký? V zásadě ad-hoc. Projekt mám zároveň napsaný jako CMake projekt pro linux. Ke knihovně kotel
je připojen zavaděč (obsahuje main() ) a jednoduchý simulátor, který implementuje všechny arduino specifické operace, jako digitalWrite
, digitalRead
, objekt Serial
atd. Musel jsem implementovat simulace rozhrani WiFi
a samozřejmě rozhraní OneWire
, na které jsou napojené teploměry DS1820.
Pokud se projekt tedy zkompiluje pomoci CMake, pak je výsledkem program bin/emul, který lze spustit v linuxu, lze mu předložit krátký script jako scénář vývoje vnějších dat (teplot, čidel) a lze nastavit i rychlost simulace (protože kdo by chtěl čekat hodinu na zátop, že?)
Ač jsem původně plánoval, že použiji vestavěnou DotMatrix přímo na Arduino UNO R4, nakonec se to ukázalo jako nepraktické. Display je malý, má malé rozlišení a moc údajů se tam nevejde. Pořídil jsem tedy 32×8 LED matici. Na 4 moduly se vejdou dvě teploty, symboly představující aktuální stav řízení a ukazatel naplnění zásobníku
Výpočet naplnění zásobníku se provádí z informace o počátečním naplnění a doby běhu podavače, přičemž je známa průměrná hodnota množství dodaného paliva za časový interval. Pak lze jednoduše pouze pohledem na display zjistit jestli není čas zásobník opět naplnit (bez nutnosti otevírat zásobník)
Aby bylo možné jednotku řídit z webového prohlížeče, je součástí webová aplikace. Tato aplikace je napsána v čistém vanilla JS + HTML + CSS + nějaká vektorová grafika. Všechny části jsou pak slepeny do jednoho velkého souboru, komprimován pomocí gzip
a tento soubor uložen jako statická data ( constexpr
) přímo do binárního image. Pro ovládání tedy vyžaduje prohlížeč, který umí gzip jako content-encoding. Díky tomu je výsledný blob kratší téměř 4×. A že přenést pár kilobajtů po WiFi z ESP32 je problém si povíme dále
Pro zbývající komunikaci mezi webovou aplikací a řídící jednotkou jsem zvolil protokol WebSockets s binárními rámci. Důvodem je opět problémy s přenosem velkých dat. Aby webová aplikace byla „připojená“ k řídící jednotce, posílá pravidelně 1× za sekundu request na stav a řídící jednotka ji odpovídá svým stavem. Je to komunikace čistě request/response. Výhodou použití WebSockets je malá velikost rámců. Oproti klasickým http requestům, do kterých například chrome byl schopen nacpat 1kB hlaviček
Žádné velké zabezpečení jsem nedělal. Celá komunikace probíhá po HTTP (nezabezpečený protokol) v rámci vnitřní sítě. I tak mne trochu strašila myšlenka zejména škodolibé návštěvy, která dostane přístup do naší WiFi (na internet) a objeví adresu webové aplikace. Mohla by mít škodolibý nápad mi rozhasit nastavení kotle a třeba ho nastavit do nebezpečného stavu.
První level zabezpečení je neumožnit návštěvám přístup do intranetu. K tomu máme návštěvnickou síť. (guest network)
Další úroveň je přímo ve webové aplikaci. Jakýkoliv prohlížeč může být nebezpečný a proto přístup k ovládání je omezeno jen určitým uživatelům. A abych si nemusel vytvářet nějaké databáze hesel, zvolil jsem si jako oprávněného uživatele každého, kdo má přístup do kotelny. Ověření probíhá přes display zařízení ze kterého se musí opsat kód a tím se odemkne řízení z prohlížeče. Samotná session je pak zabezpečena HMAC hashem s tajným heslem uloženým v EEPROM řídící jednotky. Kdykoliv lze pak heslo změnit a tím všechna připojená zařízení odpojit.
Náhodná návštěva zpravidla nechodí do kotelny opisovat si kód, minimálně jí tam nepustím a nebezpečný vtípek je tak obtížnější realizovat.
Samozřejmě návštěva s notebookem a skenovacími nástroji by mohla nabourat nezabezpečenou komunikaci, ale to už se dostáváme na jinou úroveň.
Celá řídící jednotka je umístěna do rozvaděčový box s průhledným víkem a s DIN lištou. V boxu je jistič 6A, spínaný zdroj 12V / 15W, Arduino v plastovém obalu s držákem na DIN lištu, krabice pro SSR modul na DIN lištu a SSR relé s držákem na DIN lištu, řešení celkem zabírá 12 modulů. Pracovní a ochranné vodiče jsou svedeny na můstky. Z krabice jsou vyvedeny kabely ke konektorům, které se připojují na různá zařízení nejen na kotli, ale i například na teploměry, nebo na čidlo zásobníku, tak aby se jednotka dala kdykoliv odpojit. Každá dvojice konektorů je jiná, tak aby se při připojování nemohli poplést.
A teď si povíme něco o překonávání překážek během vývoje. Na začátku bývá člověk optimistický, má skvělý plán a všechno bude fajn. Na konci za sebou vidí překážkovou dráhu, kterou nakonec zdolal, i když to často znamenalo významný zásah do plánu vývoje
První a asi nejhorším problémem byl náraz na tvrdou realitu schopností open source komunity. Na jednu stranu bych asi měl být vděčný, že udržují kód zadarmo, na druhou stranu… né tak zadarmo, protože je vlastně vydavatel modulů Arduino zneužívá. Já za board zaplatil 2× 30 EUR (viz dále proč 2×) , to není málo peněz. Za to mám nějaké minimální požadavky na kvalitu kódu
A obdržel jsem mizerný kód
Důvod, proč jsem si Arduino pořizoval 2× byl ten, že první kus odešel do křemíkového nebe po mé chybě připojení pinů v kombinaci špatné implementace oficiální OneWire knihovny (která mimochodem, není oficiálně podporována na Renesas, ale to se dozvíte až ve zdrojácích)
Napřed ale malé opáčko kolem stavové logiky V/V pinů. Piny mohou být v následujících stavech
Aktivní HIGH a LOW jsou tedy považovány za výstupní režim, ostatní za vstupní. Není tedy dobrý nápad pokud člověk uzemní pin, který je nastaven na HIGH, nebo naopak připojí pin na 5V když má úroveň LOW. Častěji se tedy spíš uzemňuje, typicky čidlo při aktivaci uzemňuje na nulu, přičemž mezi pinem a napájením je velký odpor (PULL-UP). Oba problémy, tedy uzemnění HIGH nebo napojení LOW na 5V mohou poslat board do křemíkového nebe, protože je to zkrat přes aktivní součástky v mikrořadiči – a to se mi také stalo. Jenže jak to? Jak se objevil HIGH na pinu, který byl určen pro OneWire sběrnici?
Je třeba říct, že OneWire sběrnice je navržená pro řízení s otevřeným kolektorem. To znamená, že sběrnice je buď řízena LOW, nebo ve stavu Z. Na sběrnici musí být instalovan odpor cca 4k7, který v okamžiku, kdy žádné zařízení na sběrnici není připojeno, nastavuje sběrnici do slabého HIGH. To umožňuje aby víc zařízení řídílo sběrnici do LOW a výsledkem je logická operace AND všech zařízení. Takže pokud omylem územním pin s OneWire sběrnicí, tak by se nemělo nic stát, že? Že?
Jak se to vezme, originální knihovna OneWire totiž takto sběrnici neřídí. V okamžiku kdy vysílá data na sběrnici, tak ji řídí jako HIGH-LOW nikoliv jako by člověk čekal Z-LOW. Tady máte důkaz. Chyba lávky je samozřejmě v tom makru, které nikdo pro Renesas netestoval a které se přeloží takto ( digitalWrite(...,HIGH)
)
Mno, a protože se nerad rozčiluju a nerad nadávám v angličtině, stejně by to bylo jako házet perly prasatům, tak jsem krátce přispěl do místního issue trackeru (bez odezvy) a celou OneWire knihovnu přepsal k obrazu svému.
Ale chápu ty těžkosti. On je třeba problém už v rozhraní Arduina v příkazech digitalWrite
a pinMode
. Už jen to, že je to rozděleno na dvě operace, už jen to, že pinMode(pin,OUTPUT)
způsobí, že pin se přepne do output a automaticky přejde do LOW. I když potom udělám digitalWrite(pin,HIGH)
, tak už můžu mít board po smrti, na ten krátký okamžik, co jsem mohl tímto způsobem vyrobit zkrat. A jak se mohu spolehnout na to, že pinMode vždycky přepne na LOW? Co když náhodou vyjde nová verze a ta bude přepínat na HIGH?
A tím se vracíme k předchozímu odstavci „mizerná práce“ open source komunity.
Pro moje maximální bezpečí jsem všechny výstupní signály přepsal do režimu řízení PU-LOW, tedy aktivní jsou vždy v LOW a v klidovém stavu je tam pull-up rezistor. Pokud cokoliv náhodou vyzkratuju (otočím omylem konektor), tak je výsledkem akorát nefungování a chyba, ne zničený board
Měl jsem za to, že teploměry společnosti Dallas DS1820 mají nějakou rozumnou přesnost a stabilitu. V originální řídící jednotce se používá PT1000 a buď ten, nebo následně obvod na zpracování signálu, nějak driftuje, protože pokud je v kotelně 15 stupňů a kotel je studený, ukazuje kotel chybu E2, což značí chybu teploměru a já vím, že je to tím, že ukazuje záporné číslo. Stačí v kotli zatopit, chyba E2 zmizí a teploměr začne ukazovat 0, pak 1, pak 2, atd…
Jaké překvapení bylo, když v rámci vývoje a testů v obýváku u počítače v přítomnosti zimou se třesoucí manželky válíc se na gauči jsem naměřil teplotu 27 stupňů. Na pokojovém teploměru svítilo 24 stupňů. Má důvěra v DS1820 významně klesla.
Následně jsem řešil, že bych drift nějak kalibroval, ale předně bylo potřeba zjistit, jaká je skutečná teplota. Jenže co použít jako etalon (promrzlá manželka se jako etalon použít nedá). Na kotlovém tělese jsou dva teploměry, jeden je pevný a mechanický s tlakoměrem, nezasáhlo se do něj od instalace. Tam se teplota od DS1820 liší asi o stupeň dolu, ale člověk si na to musí vzít lupu, protože stupnice je malá a nahuštěna. Druhý je mechanický na vratce a dá se vyjmout a přeštelovat. Tento teploměr ukazoval o 3 stupně víc než DS1820 (měl by ukazovat méně?). K přeměření jsem použil i teploměr od syna, který si ve sklepě vaří pivo a má na to přesné teploměry. Ten ukazoval o 6 stupňů více než než DS1820 a tedy o 3 stupně víc než teploměr na vratce. Zmatek?
Nakonec jsem sáhl ještě po vaření teploměrů. Všechny jsem postupně ponořil do vroucí vody. Oba DS1820 ukázaly 99.5. Mechanický teploměr ukázal 106, ten jsem tedy přešteloval. Výsledkem je, že při teplotě 63 podle DS1820 mi mechanický teploměr ukazuje 60 stupňů. Mimochodem to je ten teploměr, na který mě tehdy instalatér při instalaci kotle upozorňoval, že nesmí ukazovat pod 60. Tak která teplota je správně?
Zatím jsem se rozhodl, že teplotní čidla nebudu softwarově kalibrovat. Ale uvidíme
Na začátek je třeba říct, že v kotelně je mizerný signál Wifi a zařízení má celkem vysoký packet loss. To by ale nebyl problém, pokud webová aplikace je k tomu přizpůsobena. Například neposílá paralelní requesty, všechny requesty jedou seriově za sebou tedy je to ve stylu ping-pong. Pokud se sejdou dva requesty, řadí se do fronty. Pokud dojde k výpadku packetu, tak se response opozdí a tím celá fronta. (ano, veškerá komunikace je async-await). Websocketové spojení má timeout 10 sekund, pak se zavírá a znovu navazuje. Mám zkušenost, že chrome je schopen držet mrtvé spojení i několik minut, než mu dojde, že je mrtvé.
Mé budoucí plány s vývojem zahrnují i pravidelné ukládání statistik a k tomu potřebuji hodiny reálného času. Po několika neúspěšných pokusech rozběhat RTC - mimochodem totálně zprasená třída, kde se autor nebyl schopen rozhodnout, zda použije linux timestamp nebo tm strukturu nebo něco třetího vlastního a tak to všechno zkombinoval dohromady, a tím způsobil, že kód narostl o 2% a stejně to nefungovalo – jsem se rozhodl, že si naprogramuju vlastního NTP klienta a čas budu odvozovat od interního timeru ( millis()
). NTP klient bude čas aktualizovat jednou za 24 hodin.
NTP klient používá UDP protokol, který implementuje WiFiUDP. I tuhle třídu jsem si nakonec přepsal, ale objevil se problém. Po navázání spojení s wifi se celý board zablokoval a po pěti sekundách ho sestřelil WDT. Pátral jsem co se děje a zjistil jsem, že to celé padá na beginPacket() pokud cílová destinace je DNS záznam (pool.ntp.org). Co by to asi mohlo být?
Je to jednoduchá hádanka. Samozřejmě, byl to gethostbyname který se volá v samotném firmware ESP32, tedy ještě mnohem hloubš, než bych mohl zasáhnout bez toho abych flashoval firmware. Existovala jediná cesta jak to vyřešit. Správně, napsat si ještě vlastního DNS klienta, který by to vyřídil asynchronně.
v obou případech radil ChatGPT
Podle datasheetu má Renesas k dispozici EEPROM o velikost 8KB. To je dost na uložení konfigurace a nějakých statistik.
Ve skutečnosti to je jinak. Renesas nemá žádnou „EEPROM“ (ve smyslu jak funguje na AVR), jde o část flash vyhrazenou pro data, kterou jde flashovat za běhu programu. Přístup k tomuto „zařízení“ je jiný, než u AVR. Už proto, že mazatelná stránka má velikost 1KB, tedy nedají se mazat jednotlivé bajty jako u AVR. To mimojiné znamená, že EEPROM má 8 nezávisle mazatelných stránek.
Pokud se podíváte do zdrojáku k EEPROM pro Renesas, zjistíte, že se jedná o emulaci EEPROM na AVR, ale celá emulace naprosto mizerně naprogramovaná. Změna jakéhokoliv bajtů v EEPROM znamená smazání a naprogramování celé stránky. Tím se drasticky snižuje životnost flash nehledě na to, že v jeden okamžik může při zápisu dojít ke ztrátě celé stránky. A to v situaci, když dojde k výpadku napájení nebo resetu zařízení v okamžiku, kdy se dokončilo mazání stránky a ještě nezačal nový zápis. Během té doby je stránka uložená v RAM. O nějakém wearlevelingu si můžeme nechat jen zdát.
Jo a tenhle oficiální tutoriál je výživný. Zvlášť když člověk ví, jak je to implementované. Proboha, hlavně podle toho neprogramujte!
A ještě jeden odkaz na blog, kde se odhaluje celý podvod
Asi nemusím říkat, že se mi tohle řešení ani náhodou nelíbilo, takže vznikla alternativní implementace, která se na EEPROM dívá jako na kruhový buffer sektorů o velikost cca 20 bajtů (22 raw). Vše se zapisuje na top bufferu a spodek bufferu se maže. Pokud ve spodku bufferu jsou důležitá data, překopírují se před tím na top. Tak by nemělo dojít ke ztrátě při zápisu pokud dojde k výpadku proudu, protože ta informace vždycky někde bude zapsaná. Bohužel to také znamená, že efektivní velikost flash je o 1 stránku menší, protože jedna stránka vždy musí zůstat prázdná, aby byla připravena přijmout sektory, které se nesmí smazat. Naštěstí tolik informací v konfiguraci nemám a tak využívám celých 8KB pro wearleveling.
Ač už mám řídící jednotku „nasazenou“ v provozu a zřejmě bude po zbytek zimní sezóny řídit kotel, tak to není ještě konec. Co tedy mám v plánu
Aktuálně se evidují jen celkové a průměrné statiky od počátku věků (od vynulování). Bylo by dobré pravidelně statistiku ukládat aby je bylo možné stáhnout do počítače k další analýze (třeba do excelu). Otázkou je samozřejmě, kam je ukládat? Nabízí se možnost ukládat je na internet, k tomu si musím zřídit nějaké úložiště (webhosting zdarma? většina cloudových úložišť si to nechají zaplatit, a nemám prostor v mikrořadiči implementovat třeba google drive).
Další možnost je teoretická, totiž firmware ESP32 obsahuje úložiště o celkové kapacitě 512kB prezentovaný jako WiFiFilesystem. Bohužel implementace na straně Renesas není dodělaná a je otázkou, jak moc dobře odladěná implementace na straně ESP32 bridge.
Opravdu vtipná je poznámka Opravím to v příštím commitu, zatím stačí vytisknout obsah souboru
na řádce 35.
Další možností je připojit k Arduino adaptér na SD karty. To ovšem znamená další knihovnu a další dráty do už tak nepřehledného vrabčího hnízda drátů v krabici.
Určitě bych chtěl nějak měřit emise a podle toho upravovat řízení. Jednou cestou je měření O2, ale zapojení lambda sondy není triviální, navíc lambda sonda vyžaduje extra zdroj na vyhřívání (je instalovaný 15W spínaný zdroj na 12V, ten by nestačil)
Další možnost, kterou chci vyzkoušet je senzor MQ-9 na měření koncentrace CO. Tento senzor však nemá provozní teploty pro umístění v kouřovodu, rozhodně by nemohl být přímo u kotle, možná někde dál. Nebo vyrobit nějakou jímku mimo kouřovod, kde by se to měřilo?
Pokud by měl někdo nápad, jak to udělat jednoduše, tak jsem jedno ucho.
Ač se celá jednotka dá ovládat z mobilní aplikace, přesto mi chybí fyzická klávesnice. Jo, jsem trochu konzervativní člověk. Stačit budou tři klávesy, které budou mít několik významů podle aktuálního režimu. V plánu mám
Klávesnici chci realizovat pomocí tří drátů, dva napájení a jeden signální. Je to řešení „one-wire“ pomocí odporového děliče. Stisknuté tlačítko se pak identifikuje změřením úrovně na analogovém vstupu A0. A je snadné sehnat trojžilový kabel na míru (v každém hobbyshopu)
Jsem na konci, děkuji za pozornost. Projekt se mi zdařilo dokončit do konce roku a to během zimní sezóny, kdy se právě topí. Celý příspěvek jsem chtěl pojmout jako vtipné sdílení kladných i negativních zkušeností. Prostě jsem si chtěl trochu postěžovat a ukojit své grafomanské potřeby. Tak snad se mi to podařilo
Tady ještě krátké video (facebook)
Kód je na githubu
Prima čtení, díky. Máte představu, kolik času jste tomu vývoji věnoval?
Hezký nový rok.
Já jsem to moc nepočítal, ale projekt existuje tak cca v říjnu, git mi začíná 26.10, ale určitě tam byly nějaké pokusy před tím. První board jsem zakoupil právě někdy koncem října.
No a většinou nějaký vývoj probíhal ve volném čase po večerech a o víkendu. Pamatuju si asi dva plné víkendy strávené čistě "mechanickými" pracem - tedy jiné, než kódění, například sestavování zapojení, tvorba krabice, příprava konektorů, nějaké pájení tam bylo. Pro mne je programování mnohem snažší, sednu k PC, zapnu, nahodím Eclipse a jedu. Ale práce s elektronikou, pájení, příprava konektorů, to chce víc času na přípravu, to byl většinou víkend. Nejsem tak mechanicky tak zručný, a některé věci jsem předělával.
Několikrát jsem čekal na poštu, v předvánočním času rozhodně neplatilo ani heslo Alzy o tom, že ráno to mám v boxu, ani Balíkovny dnes podáte ale zítra... spíš příští týden ... dodáme.
Pokud jde o vyčíslení ceny časem, hmm asi bych se dostal na cenu nového kotle :-D. Ale na druhou stranu, je třeba se na to dívat z pohledu nákladů příležitostí. No a ten náklad u volného času je nižší. Alternativou by bylo být s rodinou, hrát si s dětmi, s kočkama nebo dělat jiné vylomeniny.
Diky, to je hodne odvedene prace. To byste si na to skoro mohl otevrit zivnost :) Mozna by se nasli lidi co maji podobny problem.
Ano, zákon o pravidelných kontrolách kotlů je typicky jedním z mnoha vylobbovaných zákonů. Nikoho absolutně nezajímá ona zpráva, která se vytvoří metodou Ctrl-C Ctrl-V. Jen to musí být, aby si firmy vydělaly. Je to to samé jako třeba povinnost po deseti letech obnovovat energetický štítek budovy, i když nedošlo ke stavebním zásahům nebo nově povinnost mít kontrolu na "efektivně" nastavené vytápění. Všechno je to jen výsledek lobbingu krytý zelenými žvásty. Jediné povinné revize by měly být ty zajišťující bezpečnost (a i to by stačilo až u bytových domů, ve svém ať si majitel nese následky).
Pro tyhle situace se pouzivaji terminy "Gold plating", to je situace kdy z EU prijde nejake doporuceni a my Cesi si pak na zaklade toho doporuceni vytvorime 10x silnejsi degulaci. Druhy termin je "parazitni ekonomika", to uz neni potreba vysvetlovat.
PS: I parazitni ekonomika prispiha k HDP.
Díky za prima článek. Dělal jsem s Arduinem už hodně projektů, ale tady bych uvažoval o něčem jako RPi zero. Nemá sice přímo analogové vstupy, ale o hodně větší výkon a tudíž potenciál pro nové funkce (např. archiv by nebyl žádný problém). Druhá poznámka je k temploměrům Dalas. Já s nimi mám jen tu nejlepší zkušenost - spolehlivé a velmi přesné (mimochodem s podporou RPi v jádře).
No já s RPi nemám žádné zkušenosti. Vůbec nevím, jak je to tam RT řízením, měl jsem za to, že je to spíš linux. Asi nejkritičtější task je tam řízení otáček u ventilátoru, které dělám přes plánovač a ne přes vestavěné PWM. Vím, že nějak lze nastavit PWM na velice malou frekvenci, ale v době, když jsem to zjistil už jsem měl většinu projektu napsanou.
Ty DS18B20 teplomery jsou jednim z nejcasteji padelanych IO, takze ze to meri nesmysly neni velke prekvapeni. Viz https://github.com/cpetrich/counterfeit_DS18B20
"Teda, to muselo dát příšernou práci. Přitom taková blbost, co?" ;-)
Osobne by som toho kotla uz zbavil a radsej siel do tepelneho cerpadla + FVE na streche.
Ale treba uznat, ze sikovnost Vam nechyba ;-)
To se ale bavíme o trochu jiným rozpočtu.
Jen ze zvědavosti, jak FVE pomůže TČ? Co znám lidi okolo, tak pokud udeří větší mrazy, tak TČ musí boostovat elektrickým kotlem a FVE v tu dobu dává nulu. On výkon FVE v zimě tedy nic moc.
S tím asi lze souhlasit, ale nepřijde mi ta investice odpovídající užitku.
O FVE jsem uvažoval, ale asi později. Možná že mezitím ten kotel opravdu dojde na konec své životnosti :)
Já osobně mám v plánu pořídit jen asi 5ks jetých panelů, teoreticky jich na přístřešek a dílnu nacpu dohromady 10ks. Tomu pak jen měničem zvednout napětí a poslat do topnýho tělesa a ohřívat vodu. V zásobníku spirálu nemám (ohřev plynovým kotlem), takže to vidím na oběhový čerpadlo, 1kW ohřívač pro umyvadla a nechat to hezky točit vodu aby se to postupně prohřálo.
Technická místnost neexistuje a baterky nechci, tak se to docela nabízí využít alespoň takhle :)
Mam Panasonic Aquarea tepelne cerpadlo vzduch voda, a vubec nechapu co maji ti lide za co zminujete za problem, ze musi boostovat v zime kotlem. Bydlim v Estonsku a bez problemu jsem tim vytopil 230m2 dum i v te nejvetsi zime kdy bylo -20C az -25C. V minus dvaceti jsem mel COP porad nekde okolo 1.7 a bez problemu jsem vytopil dum na nejakych 22 stupnu, asi bych i vytopil vice, ale neni potreba. O FVE premyslim take, protoze behem leta offsetne zimni spotrebu. V zime, tedy alespon pri skoro polarnich nocich v Estonsku jsou FVE celkem k nicemu, ale FVE sezona tu jinak je cca duben az rijen. Mimochodem Estonsko je tusim treti (13 celosvetove) ve FVE Watts generated per capita v Evrope, zatimco Cesko je nekde u opacneho konce.
Problem maju taky, ze si kupili nevhodne tepelne cerpadlo na dane klimaticke podmienky. Nie kazde tepelne cerpadlo zvlada tak nizke teploty.
Nastal boom tepelnych cerpadiel, zacal to vyrabat hocikto a ludia sa tomu nerozumeju.
To je cele.
Chtěl bych poděkovat autorovi za článek, který obsahuje hodně zajímavých informací. I za formou, jakou je psán. Zcela sdílím jeho dojmy z opensource komunity a jen doufám, že takové realistické vidění povede k vyšší kvalitě.
Jedna poznámka k SimpleDNS - nebude to fungovat pro složitější odpovědi. Připsal bych to alespoň do poznámky.
Nepřemýšlel jste (třeba i s něčí pomocí) vytvořit model vaší otopné soustavy, impulzní charakteristiku a návrh odpovídajícího regulátoru?
Za 30 EUR očakávať špičkový kód v C++ dodaný k hobby hardware?
To za realistické nepovažujem. C++ je akosi nie veľmi dobré na výrobu špičkového kódu.
ta poslední věta je k nesmysl. Dobrý kód lze psát i ve fortranu, v cobolu, nebo basicu, je to relativně vztazeno k možnosti toho jazyka
největší problém c++ je hlavně to, že se nejprve učí C. tohle se bude z lidí vykostovat ještě dlouho
S tým môžem aj súhlasiť, ľudia zvyknú písať C-čko aj v Jave, pritom ide vizuálne o podobné jazyky, ale konceptuálne úplne odlišné.
Len na rozdiel od C++, taká Java je konzervatívny jazyk. Ak by som sa učil zo zastaralej učebnice, povedzme pre Javu 1.3, stále bude kód dobrý, len tam nebudú použité najnovšie vyvhytávky.
Ja píšem C-čko aj v Perle ;-), našťastie programovanie nie je základom mojej práce.
Inak ešte k tomu "v přítomnosti zimou se třesoucí manželky válíc se na gauči jsem naměřil teplotu 27 stupňů. Na pokojovém teploměru svítilo 24 stupňů." - ako že manželka sa trasie pri 24 °C? Tak to k nám nech radšej nechodí, lebo by zmrzla - v zime máme priemerne okolo 20 °C podľa čínskej meteostanice s tromi bezdrôtovými senzormi (rozptyl teplomerov cca. +- pol stupňa).
Přesně tak.
Když jsme se poznali, bydlel jsem v domě, kde byl standard 19 stupňů na spaní a ona chodila spát oblečená :-D
Víte co to znamená?
Že si chcel, aby chodila spať nahá, tak si zvyšoval teplotu, ale nepomohlo to, lebo si na to zvykla a už chodí oblečená aj pri 24? ;-)
Teraz vážne, úplne som nepochopil, k čomu sa tá otázka vzťahuje.
Kdo vytesal do kamane, že za 30 EUR není možné dostat kvalitní kód? Chcete říct, že opensource projekty nemohou být kvalitní, protože jsou zdarma?
Tržní ekonomika nic netvrdí o tom, že za 30€ není možné mít kvalitní kód.
Nic vám nepodsouvám. Jen se ptám, zda jde o jediný logický důsledek vašeho tvrzení.
Zdravím,
doplním postřehy k senzoru CO. V roce 2019 jsem si hrál s jeho předchůdcem (na identické destičce) MQ-7 a to byl totální křáp. Generátor náhodných čísel. Pokud by byl koupen z nějakého renomovaného elektronického shopu, tak bych mu možná šanci dal, ale to co číňan osazuje (osazoval) na ty moduly, tak bylo naprosto nefunkční.
Hrál jsem si s tím poměrně detailně - jako testovací laboratoř jsem měl zavařovačku se zapálenou svíčkou - koncentrace CO prudce rostla až svíčka zhasla, ale stejně rychle naměřená hodnota CO klesala. Konzultoval jsem to na HW News a ozval se mi chlapík, který mi umožnil měřit v laboratoři pro báňské záchranáře. V řízené atmosféře s přesnou koncentrací CO vyšla pravda na jevo. Modul jakmile se setká s CO, tak prudce vyletí naměřená hodnota, ale vzápětí ve stále konstatní atmosféře měřená hodnota prudce klesla až skoro na nulu.
To znamená, že vypovídací kvalita senzoru je naprostá nula. Rozhodně se podle toho nedalo nic řídit. Číňan spoléhal na to, že to běžný člověk nemá šanci zkalibrovat a odhalit.
Pokud se pokusíte koupit originální senzor (farnell/tme/digikey), možná máte šanci, ale rozhodně ne na těhlec čínských modulech.
Stejné je to i s DS18B20 - když je koupíte jako origoše, jsou kalibrované na 0,5C. Zkuste si koupit aspoň pár ať máte jako "měřidlo".
Jinak ekvitermní regulaci a řízení celého topného systému mám udělanou kolem ESP32. Když tak mohu poskytnout detaily. Jako zdroj tepla používám dřevozplynovací kotel Atmos.
Nezjišťoval jste, co se čidlo po ustálení na tu nulu dál vrací při dalším zvýšení nebo snížení koncentrace?
Ona to nejspíš bude agresivní autokalibrace. Prostě po nějaké chvíli začne považovat aktuální koncentraci za normál.
Stejný problém mají i čidla CO2 (i ty lepší jako SCD30 atd). Potřebují jednou za čas čerstvý vzduch, aby si nakalibrovaly "nulu". Jen se liší doba, po kterou udrží přesnost bez té kalibrace.
A to by šlo použít, stačilo by jen výsledek integrovat, tedy brát to číslo jako deltu za určitý čas.
To čidlo je jen senzor, úplně bez jakékoliv inteligence. Ta špička navíc neměla žádnou vazbu ke koncentraci - prostě jak se na to čidlo něco dostalo, tak vyletěla hodnota a prakticky okamžitě zase šla dolů a pokaždé jinak i při stejné koncentraci.
Mam dobru skusenost so Sensair S8. Autokalibraciu som musel vypnut, lebo pri jej prve aplikacii zacne ukazovat blbosti, ale nie je potrebna.
Na nejake problemy som narazil, ale nic co by nevyriesil power cycle alebo zmena polohy (akoby sa tam prestal vymienat vzduch a tak ukazoval nespravne vysoke hodnoty).
Nemůžu si pomoct, ale ač pár modulů od DFRobot taky mám, tak tomuto bych s přesností moc nevěřil. Nejsem schopný najít co za senzor to vlastně je, datasheet k němu, křivky přesností atd.
Mam zkusenosti s vyvojem podobnych zarizeni s ESP32. Pouzivam framework Arduino, protoze ma pohodlne knihovny, ale nemel jsem s nimi nikdy zadne vetsi potize. I s onewire teplomery mam celkem kladne zkusenosti.
Myslim si ze deskou, ktera ma jeden processor a pak wifi je resene dalsim modulem s esp32 je naprosto zbytecna komplikace. Samozrejme jsi dopredu menohl vedet, ze to krome toho vseho bude jeste silene zabugovane.
V kazdem pripade gratuluju k tomu, jak se ti to nakonec podarilo rozchodit. U takovych projektu neni 100 hodin zadna mira. Ale jak to zacne fungovat, je to velmi dobry pocit.
Diky za clanek.
1) Jako frekvenčák by se dal použít Schneider ATV310, ty se dají koupit už kolem 4 tisíc (na TME), v práci máme v provozu asi tři jako náhradu za desetiletou Yaskawu V1000 co začala v různých strojích pomalu umírat a funguje to skvěle. Samozřejmě je to asi to nejosekanější co existuje, ale řídit to externím napětím samozřejmě jde. Vybíral jsem ho i kvůli velikosti, původní Yaskawa měla dost specifickou velikost a všechny další náhrady byly větší.
2) Přesnost Dallasu může být o tom, že je to jednoduše padělek, viz https://github.com/cpetrich/counterfeit_DS18B20
Mě osobně taky překvapuje proč někteří lidi mají potřebu provozovat je nutně jen po dvou drátech, když to pak dělá o to větší problémy. Za mě radši I2C nebo proudovou smyčku. Ohledně I2C pozor, sice nemá definovanou spodní frekvenci ale SMBus ano...a hodně I2C čidel je ve skutečnosti "SMBus kompatibilní", takže se s nima musí komunikovat alespoň tou minimální SMBus rychlostí aby odpovídaly. Aneb jak jsem týden strávil programováním a nemoh přijít na to, proč mi to nefunguje.
3) Teplota vratky se dá skvěle řešit třícestným ventilem řízeným teplotou, při nižší teplotě točí vodu v kotli a při překročení začne pomalu pouštět vodu dál, tak aby na vratce pořád bylo alespoň těch 60°C. Dokonce mi nedávno kamarád říkal že to jde koupit pod názvem laddomat, i když v tom jeho se krátce po montáži zaseklo čerpadlo, takže určo lepší mít to zvlášť.
Viděl jsem to i na starých samotížných systémech, takže to není žádná novota.
4) Nešlo by alespoň zhruba extrapolovat výkon kotle pro jemnější regulaci, když už známe minimum a maximum? Tedy nastavit parametry někde uprostřed a najednou z toho máme 10kW?
5) Ta EEPROM je teda dobrej vtip, to už lepší hodit tam I2C externí EEPROM nebo FRAM :)
6) Zrovna u SSR se vyplatí to naddimenzovat, slyšel jsem že u ne zrovna důvěryhodných zdrojů je pro 10A zátěž ideální koupit klidně 25A kostku a i z ty se může zakouřit.
Ale je to super projekt a moc se mi to líbí. Já bych se asi plácnul přes kapsu a buď použil svoje oblíbený Siemens LOGO (ve fabrice jich běží asi dvě desítky bez problémů už několik let) nebo něco na ten způsob. Dá se s tím povídat přes modbus a má to i svůj web server, ač někdy to teda trvá celou věčnost než to STM32 začne odpovídat, modbus jede hned. Vnitřní zapojení se teda kreslí místo aby se psal program a má to hromady omezení, ale leccos jde obejít a vymačkat z toho opravdu šílený věci se kterýma výrobce snad ani nemoh počítat. Cena rozšuřjících modulů ale není bueno, spíš k breku.
Sestavit si to takhle od základu na nějakym osmibitu...jako proč by ne, ale programování není zrovna můj koníček a nemám moc čas se do toho znova ponořit. Rád bych to po letech zase zkusil, ale nějak to odkládám a čas plyne :( To si radši programuju roboty v práci a doma si to jen nakreslím v tom Logu. Alespoň prozatím než se dokopu něco s tím udělat.
Ať to topí! :)
Ty teploměry jsem kupoval na dratek cz, tak nevim, ale mám je po třech drátech. Vyhovovalo mi, že oproti původnímu pt1000 čtu přímo teplotu, dají se zapojit dva na jeden pin a byly levné
Já vím že vratku by šlo regulovat nějakým elektronicky řízeným třícestným ventilem ale to by znamenalo že bych tu teplotu nemohl použít jako indikaci požadavku na výkon systemu. pokud by se otevřely všechny termostaty v domě pak mi ten systém ten třícestný ventil přivře což asi nechci protože když jsou termostaty otevřené tak bych řekl že rodinným příslušníkum je zima. musel bych tam pak mít v každém pokoji nějaký vzdálený sběr dat o teplotě
teď tam mám manuální ventil nejak nastaven aby se část vracela
Proti tomu naprosto nic nemám a chválím že jedou po třech drátech. Pt100/Pt1000 je spíš standard v průmyslu, spolu s termočlánky "J" a "K", kde se počítá s rozsahem třeba do 600°C a víc.
Ono není potřeba ani elektrickým, viděl jsem u známých řešení s čistě mechanickým ventilem na tom samotížném systému. Jak přesně funguje řízení jejich Viadrusu jsem nezkoumal, můžu se někdy podívat. Hádám že prostě bude výstupní teplota nastavená na vyšší než je to minimum co se drží kvůli nízkoteplotní korozi a klapka si prostě postupně začne otevírat.
ještě k bodu 4, mně vyšlo 8kw a když je to dobře nastaveny tak to přepíná víceméně cyklicky mezi 4 a 15 a nijak moc se to neprojevuje na hoření, jen ty časy přikládáni se různě mění, jen jsem si říkal že bych dopocital průměrný výkon ventilátoru
ale tam by to spíš chtělo měřit kyslík a tím ho regulovat
a proto bych misto predrazenyho siemense pouzil neco odsud https://eshop.technoline.cz/587-programovatelna-rele-rievtech
s webserverm, modbus, primeho pripojeni pt100/1000 a programovacim software zdarma
Záleží co to člověku dovolí, neměl jsem zatím možnost vyzkoušet. Možná budu rejpat do staršího Tecomatu v práci, tak budu vědět co umí alespoň ten.
Přesně. Čtyřcestný ventil pro efektivní provoz samotného kotle, PLC pro samotné řízení. Já používám Moeller / EASY, v jedné instalaci ho tam mám dobře 15 let a nevím o něm. Novější EASY E4 umí LAN a MQTT, Amazon IoT, kdyby s tím člověk chtěl blbnout trochu víc.
Je to dražší, ale jednak stavěné na trvalý provoz, jednak standard, který je schopen oservisovat a udržovat i někdo jiný než tvůrce celého řešení. Dělat věci na koleně od nuly je zábava, ale už jsem našel lepší způsoby, jak trávit volný čas.
Navážu na předřečníka, kdysi jsem použil několikrát kombinaci Arduino mikro (Atmega328) a jako komunikační modul tehdy ESP01. Nakonec se ukázalo, že to naprostá komplikace a přešel na ESP jako hlavní CPU. I u 8266 která má jedno jádro, stíhá odbavovat jak wifi tak program bez velkých latencí. A co teprve u ESP32, která má dve jádra. Navíc má HW PWM LedC a to beží i v okamžiku kdy procesor držím v resetu. Takže pro to vaše použití by to bylo vhodnější použít nějaký modul s ESP32 - a že jich na rychlém Ali je.
Vaší cestou s předáváním dat jsem šel taky, nakonec to udělal ale standardně - modul řízení topení data sype přes MQTT protokol, který je jednoduchý, lidsky čitelný, do nadřazenénoho systému, který zároveň dělá ovládání - použil jsem Home Assistant a na grafy Grafanu. Je to velmi elegantní a přehledné a na vlastní modul to neklade prakticky žádné požadavky. (pokud bude zájem poskytnu screenshoty).
Z textu není patrné, jestli vám akumulační nádrž zůstala - vřele bych ji doporučoval, do objemu cca 1000l jste schopen uložit teplo na dalších 12 - 24hodin a případně z ní taky ohřívat TUV (třeba v létě pomocí solárů).
Kotel nechat běžet v ideálním režimu (zpátečka nad 63stupňů, teplota spalin větší jak 104 stupňů) a regulaci a vyrovnávání spotřeby realizovat odběrem tepla z akumulačky.
Nádrž nezůstala. Ta původní na mazut by se asi použít nedala, nakonec se nabídli dobrovolní hasiči v obci že to zadarmo rozrezali a odvezli do sběru (peníze ze sběrny zaplatili praci)
Novou nádrž jsem nekupoval
Mám jen největší na trhu dostupný kombinovaný ohřívač TUV z dražic , jsou to dvě bytové jednotky
Taky to tak dělám. Je-li to možné, tak MQTT. Tu zvládne i 8266 a nadřízený systém si s tím může následně pohrát, třeba i tak, že to celé přebásní a pošle v JSONu opět přes MQTT. Mám takto řešeno třeba načítání dat ze SOLAXu, čtení kurzu akcií, teplotní čidla atd... na mrňavém PC běží v dockeru MQTT server + konzumenti či tvůrci MQTT zpráv. Jeden z konzumentů je třeba SQL Lite pro ukládání dat. Programuji to v C# pro Linux.
ještě doplním, že konzumenti jsou staré mobily a tablety, na kterých běží pod Androidem MQTT Dash nebo IOT MQTT Panel. Jdou tam jak ovládací tlačítka, tak grafy a pod.
ty dallas cidla byvaji dost presna. Bud mate fake a nebo ho vycitate moc casto a neuspavate. Pokud se cte casto a bez sleepu, zahreje se vlastni spotrebou a teplota je nesmysl.
Nikde jsem se nedozvěděl co je jak často. Teplota se měří jednou za 10s. Je na sleep nějaký command?
Z Githubu z odkazované odpovědi:
Measurements were taken once every 10 seconds to avoid artifacts from self heating of sensors contained in probes (i.e. we found that reading once a second increases the temperature returned).
Dobrý deň,
v prvom rade ďakujem za pekný, dobre čitateľný, článok a podelenie sa o "domáce hranie sa na úrovni".
Čo sa týka arduina, oceňujem vhlad a zhodnotenie kvality knižníc a podobne. S toolchainom mimo javy som sa stretol serióznejšie dosť dávno. Možno naposledy na škole, keď som bežal svoj notebook, aj server, zásadne na gentoo. Nedávno som sa pustil opäť do C/C++ vôd, len kvôli "domácej automatizácii". Konkrétne RP2040. Po prečítaní datashetu som bol nadšený a čudoval sa, že nám na strednej nepovedali, ako sa vlastne mení stav pin-u. Že to je "len" zápis na nejaké pamäťové miesto/register. Že viem atomicky napríklad invertovať, alebo set-núť viacero pinov naraz. A že toto nieje riadené knižnicou, ani makrom. Že záleží na fyzickom mcu, aké sú možnosti. V prípade arduina sa teda nad abstrakciou moc nezamýšlali a postavili to ako "detskú hračku". Teda aspoň, keď sa ide do hĺbky.
Prenesiem teraz ku komercii. Mám doma HW, kde je ovládacia doska vyrobená lokálnou firmou. Seriózny biznis. Keď som sa chcel na dosku integrovať, dostal som ukážkový kód, že ako. Bol určený pre raspbery pi 2. Keď som sa pozrel na zdrojáky, bol som zhrozený. Bol tam bit-banging i2c protokolu na GPIO pinoch. Hovorím si, že však i2c podporu rpi2 má. Tak som ju použil a nefungovalo to. Prečo? No lebo podľa nastavených konštánt bola prenosová rýchlosť mimo štandardu. Tak som to skúsil upvraviť. Stále to nešlo. Tam tom to po dni skúšania vyhodnotil, že asi majú "vlastné i2c" a skončil som s venovaním sa tejto zábavke. Zvažoval som, že dosku vymením a budem si ovládanie daného HW robiť sám. Po dlhšom uvažovaní so to ale zamietol s tím, že síce ovládam iba dva akčné prvky, ale vstupov (asi 15 skalárov dokopy) a fyziky za tím je privela na naštudovanie v rozumnom čase a bez praktických skúseností v obore :/ Aktuálne zvžujem, že by som sa danému výrobcovi ozval, že by som mu to prerobil, ak by mal záujem. S podmienkou, že sw by bol opensource. Netuším ale, či by tam bola šanca na úspech. Predsalen asi v tom má nejaké know-how.
Vrámci domáceho hrania som sa zoznámil s rp2040 na doskách "rpi pico" a "rpi pico w". Toto niesú dosky s "linuxom"! To je vpodstate armové mcu s 264 kB sram a dvoma jadrami na 133 MHz. Zdá sa, že na priemyselné použitie výrobca myslel a stav GPIO pinov sa dá nastaviť aj v "boot up" čase. Viď diskusia tuná: https://forum.arduino.cc/t/default-pin-state-at-start/948059/8
Osobne (keďže mám obmedzený čas na tento typ aktivít) idem iba týmto smerom, aj keď mám doma niekoľko arduino doštičiek. Zanevrel som na tento svet pri pohľade na komplexitu toolchainu okolo. Na rpi pico som skončil na micropython-e a podľa doterajšieho experimentovania si viem pohodlne zavesiť interrupt na nábežnú hranu na GPIO a nemusím to riešiť v loop-e. Obdobne viem programovať aj PIO (programmable I/O) a napríklad spraviť si scan matrix klávesnice, viď excelentné video od tvorcu simulátoru tohoto mcu: https://www.youtube.com/watch?v=LIA9wpt7N60&list=PL_tws4AXg7auiZHZsL-qfrXoMiUONBB0U&index=6
Ohladom komentaru v kode... Aj ja som rád nechával vedlajšie veci iba okomentované s predponou "TODO", až kým som nevidel toto prirovnanie: https://www.reddit.com/r/ProgrammerHumor/comments/1115ze9/no_one_will_ever_know/?rdt=48878 (komentár je len zametenie problému pod koberec a nie jeho vyriešenie).
Long story short: Ďakujem za perfektný článok. Je to čiastočne inšpirácia na podobný projekt a hádam aj na podobný blogpost (aj keď čitateľnosťou sa chytať nebudem. To viem.)
Zrovna I2C je na RPi problém už od začátku, netuším jestli to v pětce opravili a nebo prostě dělají že to neexistuje, čtyřka tím prý ještě trpí. Článek z roku 2013:
https://www.advamation.com/knowhow/raspberrypi/rpi-i2c-bug.html
Ale týká se to jen clock stretching, což netuším jestli ta vaše deska má nebo ne
Arduino standardní knihovna vznikla dávno před rokem 2011, takže nové best practices v C++ a nové styly API tam prostě nejsou a nebudou. A vycházela ještě ze starších projektů Processing a Wiring.
Cílová skupina pro Arduino navíc nejsou profesionální embedded vývojáři. Primárně s ním začali umělci a akademici. Bez wifi (ESP přišlo až mnohem později). A i dnes je spousta kódu od bastířů, hardwerářů a lidí co napíšou co potřebují pro svůj problém (motto: scratch your own itch). Takže ten komentář "Dodělám později" není nic neobvyklého.
Už jsme na to narazili v diskuzi o Fish. Lidi nemají obecně motivaci přepisovat starý kód do nového stylu, pokud to neopraví něco zásadního. A staré styly API snadno nezměníte, protože by to rozbilo veškerý starý kód (dekádu trvající přechod Python 2 vs. 3 nám buď varováním).
Takže ano, ty vysokoúrovňové Arduino abstrakce neumí využít ten hardware naplno nebo neumožní libovolné skládání více asynchronních úloh (nebo neumí low power provoz).
Pokud jste si nikdy nevšiml, průmyslové embedded kontroléry se snaží multitaskingu vyhnout! Superloop styl s pollingem je velice obvyklý. Nikdy jste se nezamyslel nad významem Arduino základních metod setup a loop?
https://en.wikibooks.org/wiki/Embedded_Systems/Super_Loop_Architecture
Mimochodem, zrovna ten ESP wifi koprocesor polling umí, jen si ho musíte zakomponovat do smyčky sám. Arduino vysokoúrovňové API je úmyslně jednoduché (viz cílová skupina).
https://github.com/arduino/ArduinoCore-renesas/blob/main/libraries/WiFiS3/src/WiFi.cpp - je to jen práce se sériovou linkou.
Komunita jako taková pak umí napsat i kvalitní kód, třeba EtlCPP (https://www.etlcpp.com/) je implementace STL kontejnerů a algoritmů pro prostředí bez dynamické alokace.
Pro lidi více na profesionální straně spektra je tu pak třeba možnost použít PlatformIO (https://platformio.org/) a vyhnout se Arduino IDE úplně.
Takže až příště budete nadávat na API a kvalitu, zamyslete se nad tím co používáte. On je totiž rozdíl mezi hobby a průmyslovým "nářadím". Arduino tudíž ani nemůže přejít na profesionální a detalní API, protože by tím odřízlo svoji cílovou skupinu (a staré projekty).
V tom prvním máte určitě pravdu, že staré API se špatně opravuje a jediná schůdná cesta je pak přes nové alternativní API, které zase vede k nutnosti udržovat obě. A rozumím, není to jednoduché.
Taky můj rozbor digitalWrite a pinMode nebyl míněn jako kritika, ale jako určité vyjádření pochopení. Já bych si představoval něco jako pinModeEx(pin, mode), která by třeba mohla nastavit pin do libovolného z výše uvedených stavů, kdy HIGH a LOW jsou také chápány jako móde. Pak by se mi líbil systém transkačních nastavení pinů, kdy nastavím víc pinů a jednorázově to commitnu, a někdo under hood zařídí operaci atomicky. Je to rozšíření API
Namítám ale jednu věc. Arduino R4 UNO (Minima i Wifi) byly uvedeny v červnu 2023. Předpokládejme že vývoj SW probíhal rok, tedy bavíme se o programátorských standardech z roku 2022. Navíc pro překladač, který v té době už 6 let podporuje C++17. Ty programátorské styly které se tam používají byly platné před rokem 2011, to je nějaký 12 let!!!! Kritika je na místě
Bridge mezi ESP32 a Renesas je softwarové vybavení které vzniklo přímo určené pro Arduino R4, jinde se nepoužívá . Github tohoto projektu začíná 16. května 2023
https://github.com/arduino/uno-r4-wifi-usb-bridge/commit/9d2e7d71183d8a6e3e7e3511237dd7e0f2a7aa58
Takže se prosím přestaňme vymlouvat na stará API a neexistenci ESP čipů. Ten kód je z brusu nový.
Pak bych potřeboval vysvětlit ty poznámky kolem superlooup. Jestli jse z toho pochopil, že mi chybí multitasking - nic takového jsem neříkal, je rozdíl mezi "parallel a concurrency". Stejně tak když někde zmíním asynchroní přístup, nemyslím s tím multithreading. Právě asynchronní přístup umožnuje dobře navrhnout superloop. Ten jen není pevně danný, ale dynamicky provádí to, co je požadováno. Typicky mohu superloop použít pro eventové řízení. V rámci superloopu se zjistí změna stavu nějakého čidla a vygeneruje se event. Asynchronní kód pak může vypadat takto
co_await wait_pin(1, HIGH); //čekej na až bude pin 1 na HIGH
přitém co_await vrací řízení do superloopu. To je concurrency, to je asynchronní řízení. Pokud nemám co_await, mohu postaru použít callbacky, třeba
on_pin(1, HIGH, [=]{... /* dělej něco */ ...});
I to je asynchronní přístup.
Scan network by šel realizovat
WiFi.scanNetwork( [=] (auto result) {... zpracuj vysledek ...} );
S tím, že lambda callback se zavolá jakmile je scan hotový a kód mezitím dělá něco jiného. Samozřejmě se callback zavolá ze superloopu když se zjistí, že operace je dokončena.
A tím se dostávám k poolingu nad ESP. Nemáte pravdu, pooling tam nejde zapnout, nebo jen pro některé operace. Ano WiFiServer.available() tam je, stejně jako WiFiClient.available() ale to je všechno. Třeba WiFi.localIP je blokující s timeoutem až 10 sekund. WiFi.begin() je blokující, ale timeout si mohu nastavit (naštestí), WiFiClient.send() je blokující, pokud ESP zrovna loví signál a nemá kam data odeslat
Aby ten bridge byl plně asynchroní, musel by ten protokol vypadat jinak. API by muselo používat callbacky nebo korutiny (C++20), Muselo by se v superloopu volat nějaké udělátko co zjišťuje, jestli ESP už dokončil činost. V protokolu by na to musel existovat nějaká krátká zpráva, která by se na serial portu neztratila. Třeba znak. Jakmile by se ten znak objevil, ze strany Renesas by se poslal command na přečtení výsledku.
To by pak umožnilo superloopu vyvolávat asynchronní callbacky na požadované operace.
Uvažoval jsem, že bych to samozřejmě celé přepsal, ale pro koho? Kdo to ocení? Já zřejmě žádný další projekt zatím dělat nebudu.
(navíc bych musel asi přepsat i ten bridge, změnit protokol)
Doufám, že si teď rozumíme.
Renesas podpora sice je relativně nová, ale ten stejný kód (API) funguje pořád i na původní AVR Arduino Uno. A taky na dalších deskách s jinými cpu - MSP430, ESP, Tiva, STM, .. A ne všechny ty desky se chovají stejně nebo mají stejný přístup k nastavování GPIO. AVR třeba neumí open-drain a musí se emulovat. MSP a STM32 open drain umí atd.
Korutiny jsem právě na mysli neměl. Měl jsem na mysli opravdu čistý polling, kde je garantováno pořadí v jakém se veškerý kód provede, a to včetně časování.
- přečíst vstupy
- vypočítat akce (něco jako serial buffer = "wifi connecting")
- nastavit výstupy (serial write "get wifi status")
- znovu nebo čekat
Podívejte se na kód té WiFi třídy. Ta polling část se dá realizovat pomocí toho objektu modem. Jediné co to dělá je posílání a příjem dat přes sériovou linku. Takže pošlete dotaz na stav. A pollujete odpověď.
Co se nových C++17 vlastností týče.. cílová skupina pro Arduino prostě C++ korutiny nezvládá. (Popravdě, ta [=] syntaxe je hrozná, ale to je asi o zvyku). A souhlasím, že zrovna ten wifi bridge je hrozně nečitelný. A to ani nemusím komentovat C++, ono je to nečitelné i z pohledu C.
Jasně to wifi bych si přes Modem musel napsat sám a taky jsem to někde udělal, ale je to ad-hoc. Přepisovat to celý na async pooling se mi nechce, jsem už na to moc línej a nebudu to asi potřebovat
Mám za to, že za standardní knihovnu existují víceméně drop-in náhrady. Před lety se řešilo že DigitalWrite sežere snad 100 strojových cyklů aby změnil stav pinu, ale možná už to trochu osekali, netuším. Rozhodně byly alternativní knihovny co to uměly pořádně zrychlit.
Super prace.
Jen par dotazu, repo na githubu neobsahuje zadnou licenci.
Je tvuj kod tedy opensource, nebo ne?
Skoda ze readme je v CZ, takle se k tomu kodu nikdo jiny nedostane, nedozvi se o tom projektu.
Dik za připomenutí Zapomněl jsem nastavit MIT, jako mám všude . Udělám co nejdřív
Nečekal bych že někdo z ciziny bude řešit český kotel
S tím OneWire je to složitější. Při dvouvodičovém zapojení se musí po datové sběrnici napájet i zařízení a nevím, zda je to možné přes 4k7 odpor.
Obvykle přimo HWové drivery mají proudové omezení. U toho Arduina buď měkká sběrnice a všechny zařízení napájet zvlášť, ala třívodič;
nebo přimhouřit oko, zkontrolovat že není zkrat a na to domácí žvýkání ... dávat natvrdo high.
Teď si nejsem jist, ale myslím, že onewire knihovny měli nastavení, zda jednička je high, nebo pullup, ale ono těch knihoven a platforem je X.
Nezkoušel jsem, ale chatgpt tvrdil, že nabíjet vnitřní kondenzátor v parazitickém napájení lze i přes pullup odpor. Je to asi jen otázka času, jak dlouho se bude nabíjet.
Já používám třívodičové zapojení a jen využívám toho, že dva teploměry mám na jednom pinu. Uvažoval jsem, že bych další zařízení připojoval přes one-wire, ale ono jich moc není.
Něco je na SPI, něco jen na I2C, něco je na one-wire a já z toho začínám šílet :)
On je docela dobrý teploměr (SMT172) i na PWM (střída) :)
Občas je opravdu zábavné ty součástky vybírat, aby šly dohromady. Zvláště, když chcete něco s provozem na 1.8 - 3 V (nízkopříkonové zapojení na 2x AA bez regulátoru). Ale to u kotle není potřeba, tam napájení máte.
Ja vas nechapem, mam kotol Wiesmann a kludne by som ho poslal do srotu. Podla servisu co mi chodi sem skoro kazdy tyzden (v zaruke) ten vyrobca chce byt co najviac ECO ten kotol nastavil na hranicu lamba sondy pre emisie. Ked je kurim vykom cca 10-15% tak emisie to hadzu do zablokovania horaku. Potrebujem mat uplne dokonaly komin, kde na rodinnom dome po rekonstrukcii nie je mozne. Ano ked je skutocny zima (tak pod -5) tak to funguje, ale vdaka globalnemu oteplovaniu tu v BA skoro nikdy nazazijes, tak su s tym len problemy. Lutujem ze som vymenil kotol co tu bol (Mora) ziadna elektronika ale udajne fungoval 20 rokov bez poruchy (menilo sa len cerpadlo).
Tu by som to nehadzal na vyrobcu.
To vyzera, ze si si kupil(bol ti poradeny) zly/zbytocne vykonny kotol.
Sa nemozes cudovat, ze ti to blbne pri tak nizkom vykone, ked mas aj neidealny komin.
Na aky vykon ti ide kotol pri tych teplotach pod -5?
On ten benekov co mám, je taky zbytečně výkonný, má oficiálně výkon 7-25kW a já potřebuju tak 8kW. Honit ho ve sníženém výkonu na 4kW taky není tak úplně ideální. Uvidíme až přijde jaro a venkovní teploty půjdou nahoru.
Prostě lidi nekupujte si předimenzované kotle
Pěkné čtení. Trochu mi to připomnělo moji taškařici s kotlem s řídicí jednotkou Siemens a protokolem BSB (Boiler System Bus).
Arduino neznám, vím jen že existuje, proto mám dotaz - jak je to třeba s životností a odolností takového řešení proti vnějším vlivům (bouřky, přepětí atd.)?
Já kdybych něco takového tvořil, bych asi sáhnul po něčem průmyslově odolném (nějaké menší PLC, nebo nějaké lepší programovatelné relé), ale to je asi má profesionální deformace.
Nevím, ale board stojí nějaký 750Kč a jeho cena ještě bude klesat. Klony se dají sehnat levněji. Takže když to odejde, koupí se nové
Samozřejmě úžasná práce, obdivuji.
Ale mám připomínku k jinému problému než řeší ostatní. Wifi. Proč proboha neopravit wifi a místo toho ten bazmek programovat aby byl odolný na šitózní wifině? Copak to jedno AP stojí tolik? Nebo tam proboha protáhnout UTP co stojí pár korun? Zrovna u takto kritické věci jako kotel byc hto UTP čekal jak základ..
Možná autor zná lépe C než sítě, ale tohle mi přišel prostě smutný moment v tom článku se prostě smířit s tím že wifi v kotelně stojí za prd a nic s tím neudělat..
wifi je brán jako bonus není kritická na řízení a mám to napsaný i tak, že to umí jet v režimu access point, a to taky stačí - holt se mobilem přepnu na ten ap a webovku otevřu
ale proč ne, tahat kabely a kupovat další krabici s vlastním zdrojem, nebo to řešit softwarove? aktuálně mi to jede na místní wifi bez problémů , signal -88dbm a packet loss mám relativně malý
Packet loss na LANce nemá být "malý" ale naprosto čistě nulový! Jinak samozřejmě pro dobrý AP stačí poe, takže jen provrtat strop a našroubovat AP.
Ale ok každý to má jinak, takhle popsáno mi to přijde ještě šílenější. Sice to má wifi vzdálený přístup ale stejně musím do sklepa s mobilem. No to už to můžu ovládat přímo na samotném zařízení že.. A to nemluvím o tom, že samozřejmě vzdálený přístup je mezi-krok k tomu podívat se na stav třeba z práce nebo z dovolený..
Vzdálený přístup jsem nikdy nechtěl. Spíš to měla být náhrada nějakého pohodlnějšího ovládání a možnost interakce s PC, například stahování a analýzu dat (později)
Tam ani není moc co ovládat, to se jednou nastaví a jediný proč jdu podívat do aplikace je abych věděl, kolik je ještě v zásobníku a kdy to mám doplnit. Mohlo by to posílat push notifikace, ale tam je tolik komplikací (potřeba mít SSL, certifikát, závislost na google), nebo by to mohlo posílat zprávu na whatsup, signal, mail, to ještě zvážím - jistě tam nějaký internet potřebuju. Zase není potřeba rychlý internet, zpráva se může odeslat jakkoliv pomalu
Ta autorizace kódem se dělá jen jednou, do prohlížeče se uloží trvalá session. Pak lze dokonce přenést session z jednoho zařízení na druhé už bez chození do kotelny.
Opravdu nebylo cílem ovládat to z práce. To si člověk maximálně přidělává práci se zabezpečením. Nedokážu si představit, že by mi to někdo hacknul.
Tak na notifikace mohu ze světa Home assistanta jednoznačně doporučit https://pushover.net/. Poslat zprávu na mobil je pak trivka plus to umí řídit prio zprávy až po "všechny-tichý-módy-přebíjející-zprávu". Což se hodí v případě nějakých super nouzových zpráv typu "hoří", "praskla voda" apod.
Tak kotel není letící dron, takže nějaké blokující čtení teplot nebo čekání na wifi není zas takový problém.
Jinak já v domácí automatizaci už skoro nic nepíšu zas a znovu od začátku v Arduinu.
Prostě do ESP nahraju ESPeasy, připojím se na něj, naklikám jaké čidlo kam mám připojené, který výstup co má dělat a v Rules napíšu krátký prográmek, co to má vlastně dělat. Reboot a je to.
Nastavení posílám a data přijímám ( grafy atd. ) v Domoticz, ale je samozřejmě víc možností.
Myslím, že za víked by bylo funkční zařízení a mohlo by se ladit...
Jo tak bylo to hlavně proto, ze řízení otáček pwm mám přes plánovač a ne přes interrupt nebo timer, ale asi by to nejak slo, psal jsem to výše že jsem neuměl pwm s periodou 150ms. Kdyz dílčí operace trvá déle než cca 20ms, rozhodí to otáčky ventilátoru
Další zadrhelem je wdt, který se dá nastavit na max 5 sekund interval.
Jestli to umíte napsat jako sadu jednoduchých rules, tak asi ok. Váš bonus
Intenzivně se zabývám programováním zejména v jazyce C++. Vyvíjím vlastní knihovny, vzory, techniky, používám šablony, to vše proto, aby se mi usnadnil život při návrhu aplikací. Pracoval jsem jako programátor ve společnosti Seznam.cz. Nyní jsem se usadil v jednom startupu, kde vyvíjím serverové komponenty a informační systémy v C++
Přečteno 51 644×
Přečteno 24 301×
Přečteno 23 093×
Přečteno 21 399×
Přečteno 18 056×