Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
2018:thermometer [2019/01/14 19:43] Ondřej Jeřábek |
2018:thermometer [2019/01/14 20:46] (aktuální) Ondřej Jeřábek [Firmware a eagle] |
||
---|---|---|---|
Řádek 40: | Řádek 40: | ||
===== Schéma zapojení ===== | ===== Schéma zapojení ===== | ||
- | V napájecí části je hned na vstupu zařazen tranzistor pro zamezení přepólování vlivem otočené knoflíkové baterie. Jelikož použitý typ CR2450 má nominální napětí 3V, není třeba dále provádět žádné úpravy a lze jej rovnou použít k napájení celého teploměru. | + | V napájecí části je hned na vstupu zařazen tranzistor pro zamezení přepólování vlivem otočené knoflíkové baterie. Jelikož použitý typ CR2450 má nominální napětí 3V, není třeba dále provádět žádné úpravy a lze jej rovnou použít k napájení celého teploměru. Zapojení ostatních periferií k mikrokontroléru je standardní dle doporučení v dokumentaci. |
- | + | ||
- | Zapojení jednotlivých periferií k mikrokontroléru je standardní. | + | |
{{ :2018:thermometer:thermometer_sch.png?400 |}} | {{ :2018:thermometer:thermometer_sch.png?400 |}} | ||
Řádek 58: | Řádek 57: | ||
====== Firmware ====== | ====== Firmware ====== | ||
Celý firmware je vyvíjen za použití volně dostupného prostředí Kinetis Design Studio určeného především pro mikrokontroléry NXP řady Kinetis. Pro usnadnění práce bylo použito Kinetis-SDK spolu s knihovnami pro ovládání E-Ink displeje a kreslení na něm. | Celý firmware je vyvíjen za použití volně dostupného prostředí Kinetis Design Studio určeného především pro mikrokontroléry NXP řady Kinetis. Pro usnadnění práce bylo použito Kinetis-SDK spolu s knihovnami pro ovládání E-Ink displeje a kreslení na něm. | ||
+ | |||
+ | Celý firmware se zdrojovými soubory je přiložen na konci této práce. Pro úspěšné buildnutí je třeba stáhnout si příslušné SDK (odkaz je na konci) a navést k němu cestu pomocí systémové proměnné KSDK-PATH v nastavení proměnného prostředí operačního systému. | ||
===== Hlavní program ===== | ===== Hlavní program ===== | ||
+ | Samotný hlavní program vypadá relativně jednoduše, avšak velkou část výpočetního času zabere výpočet obrazu zobrazovaného E-ink displejem. Na začátku při startu je prováděna inicializace pinů mikrokontroléru spolu s nastavením taktovacího kmitočtu. Následně dochází ke konfiguraci okolních periferií. Ty zatím aktuálně nevyužité, jako je bezdrátový modul, nebo flash paměť se převedou do low-power režimu. | ||
+ | Taktéž se provádí měření napětí baterie. V případě nedostatečného napětí je mikrokontrolér uspán a rozblikána červená LED. Program v tomto místě končí v nekonečné smyčce, kde čeká na její výměnu. Pokud ovšem napětí baterie dostačuje, pokračuje inicializací měřicího čidla a E-ink displeje. | ||
+ | Hlavní smyčka není úplně periodická, jak se může na první pohled zdát, ale bývá pozastavena v každém cyklu úsporným režimem, kdy mikrokontrolér přechází do spánku (viz kapitola Řízení spotřeby). Taktéž bývá průběžně prováděno měření napájecího napětí, parametrů okolního prostředí (teplota, tlak, vlhkost) a obnova dat na displeji. | ||
===== Řízení spotřeby ===== | ===== Řízení spotřeby ===== | ||
Řádek 106: | Řádek 110: | ||
</code> | </code> | ||
- | ===== Vykreslování a Ovládání ===== | + | ===== Měření parametrů čidlem BME280 ===== |
+ | Samotné měření obstarává funkce **//bmp_measure_handle()//** volaná v sekundových intervalech (pokud mikrokontrolér zrovna nespí). Měření probíhá každých 5 minut a je vyvoláno přerušením RTC Alarm v daný časový okamžik. V tento moment je nastaven příznak požadavku na měření, kdy dojde k odstartování měření na čidlu. V následující sekundě poté jsou naměřená data vyčtena a zpracována funkcí **//bmp_read_data()//**. Zpracování dat definuje dokumentace k čidlu BME280, kdy je nutné provést korekci hodnot dle kalibračních křivek uložených v čidlu. | ||
+ | |||
+ | <code cpp> | ||
+ | uint8_t bmp_read_data(int16_t * temp, uint16_t * humid, uint32_t * press) | ||
+ | { | ||
+ | uint8_t press_raw[3]; | ||
+ | uint8_t temp_raw[3]; | ||
+ | uint8_t hum_raw[2]; | ||
+ | |||
+ | static int32_t temp_c; | ||
+ | static uint32_t press_c; | ||
+ | static uint32_t hum_c; | ||
+ | |||
+ | if (bmp_is_busy()) | ||
+ | return 0; | ||
+ | |||
+ | if (bmp_read_block(BMP_press_msb, press_raw, 3)) | ||
+ | return 0; | ||
+ | |||
+ | if (bmp_read_block(BMP_temp_msb, temp_raw, 3)) | ||
+ | return 0; | ||
+ | |||
+ | if (bmp_read_block(BMP_hum_msb, hum_raw, 2)) | ||
+ | return 0; | ||
+ | |||
+ | temp_c = (int32_t)(((uint32_t)temp_raw[2] >> 4) | ((uint32_t)temp_raw[1] << 4) | ((uint32_t)temp_raw[0] << 12)); | ||
+ | press_c = ((uint32_t)press_raw[2] >> 4) | ((uint32_t)press_raw[1] << 4) | ((uint32_t)press_raw[0] << 12); | ||
+ | hum_c = (uint32_t)hum_raw[1] | ((uint32_t)hum_raw[0] << 8); | ||
+ | |||
+ | temp_c = bmp280_compensate_T_int32(temp_c); | ||
+ | press_c = bmp280_compensate_P_int64(press_c); | ||
+ | hum_c = bme280_compensate_H_int32(hum_c); | ||
+ | |||
+ | *temp = (int16_t)temp_c; | ||
+ | *press = press_c >> 8; | ||
+ | *humid = (hum_c * 100) >> 10; | ||
+ | |||
+ | return 1; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ===== Vykreslování a ovládání ===== | ||
Vykreslování veškerých obrazovek a obsluha tlačítek je definována ve zdrojovém souboru **ui.c**. Periodicky volaná funkce v hlavní smyčce **//ui_handle()//** obsluhuje reakce na stisknutá tlačítka následovaná vykreslováním daných typů obrazovek. V momentě vytváření obrazu se mění výkonový režim na Fast mode, k vůli vyšší výpočetní náročnosti. Výsledek je rovnou odesílán do E-ink displeje a po jeho kompletním odeslání se spustí překreslení. V rámci probíhající obnovy displeje se mikrokontrolér z důvodu úspory energie uspí. Probuzení zajistí přerušení od pinu busy. | Vykreslování veškerých obrazovek a obsluha tlačítek je definována ve zdrojovém souboru **ui.c**. Periodicky volaná funkce v hlavní smyčce **//ui_handle()//** obsluhuje reakce na stisknutá tlačítka následovaná vykreslováním daných typů obrazovek. V momentě vytváření obrazu se mění výkonový režim na Fast mode, k vůli vyšší výpočetní náročnosti. Výsledek je rovnou odesílán do E-ink displeje a po jeho kompletním odeslání se spustí překreslení. V rámci probíhající obnovy displeje se mikrokontrolér z důvodu úspory energie uspí. Probuzení zajistí přerušení od pinu busy. | ||
- | Funkce pro vykreslování využívají volně dostupnou knihovnu přímo od výrobce displeje Waveshare. Obsahuje několik druhů fontů s různou velikostí a funkce vykreslující geometrické tvary. Nejdůležitější částí, bez které není možno E-ink vůbec řídit je obnovovací sekvence tvořená look-up tabulkou, která musí být nahrána do displeje. Její podobu definuje výrobce a zajistí správné obnovení. Pro tento typ displeje existují dva typy tabulek. Jedna provádí částečný update, kdežto druhá aktualizuje celý displej. | + | Funkce pro vykreslování využívají volně dostupnou knihovnu přímo od výrobce displeje Waveshare. Obsahuje několik druhů fontů s různou velikostí a funkce vykreslující geometrické tvary. Nejdůležitější částí, bez které není možno E-ink vůbec řídit je obnovovací sekvence tvořená look-up tabulkou, která musí být do něj nahrána. Její podobu definuje výrobce a zajistí správné obnovení. Pro tento typ displeje existují dva typy tabulek. Jedna provádí částečný update, kdežto druhá aktualizuje celý displej. |
<code cpp> | <code cpp> | ||
Řádek 142: | Řádek 188: | ||
Navrhované zařízení je plně funkční a lze jej využívat jako plnohodnotný domácí teploměr schopný zobrazovat i detailnější informace jako vlhkost či atmosférický tlak. Z naměřených hodnot jsou průběžně vytvářeny grafy, díky kterým si lze prohlédnout změny za posledních 24 hodin. Taktéž si lze vyvolat minimální a maximální naměřené hodnoty za celou dobu provozu teploměru, případně je lze v menu vynulovat. | Navrhované zařízení je plně funkční a lze jej využívat jako plnohodnotný domácí teploměr schopný zobrazovat i detailnější informace jako vlhkost či atmosférický tlak. Z naměřených hodnot jsou průběžně vytvářeny grafy, díky kterým si lze prohlédnout změny za posledních 24 hodin. Taktéž si lze vyvolat minimální a maximální naměřené hodnoty za celou dobu provozu teploměru, případně je lze v menu vynulovat. | ||
- | Aktuální návrh je také velice úsporný na baterii, kdy v režimu nečinnosti odebírá pouze 7 μA. Měření teploty s překreslením displeje se provádí jednou za 5 minut se skokovým nárůstem spotřeby trvajícím přibližně 0,3 - 1 sekundu. Dle propočtů tedy vychází celková průměrná spotřeba na 50 µA a při použití baterie CR2450 s kapacitou 500 mAh činí výdrž přibližně 1 rok. Bohužel se v průběhu vývoje se vyskytly potíže s nedostatečným napájením na obnovu E-Ink displeje. Chyba byla prozatím vyřešena použitím tužkových baterií a bude opravena v další iteraci revizí hardwarového návrhu. | + | Aktuální návrh je také velice úsporný na baterii, kdy v režimu nečinnosti odebírá pouze 7 μA. Měření teploty s překreslením displeje se provádí jednou za 5 minut se skokovým nárůstem spotřeby trvajícím přibližně 0,3 - 1 sekundu. Dle propočtů tedy vychází celková průměrná spotřeba na 50 µA a při použití baterie CR2450 s kapacitou 500 mAh činí výdrž přibližně 1 rok. Bohužel se v průběhu vývoje vyskytly potíže s nedostatečným napájením na obnovu E-Ink displeje. Chyba byla prozatím vyřešena použitím tužkových baterií a bude opravena v další iteraci revizí hardwarového návrhu. |
Návrh lze dále v budoucnu rozšířit o venkovní teplotní čidlo, nebo přímo meteostanici, která bude svá naměřená data bezdrátově odesílat tomuto teploměru a ten se postará o jejich vyhodnocení a zobrazení. Výhodné by bylo také použít jiný bezdrátový modul, například s technologií LoRa umožňující komunikaci se vzdálenějším senzorem či připojení do LoRaWAN IoT sítě. | Návrh lze dále v budoucnu rozšířit o venkovní teplotní čidlo, nebo přímo meteostanici, která bude svá naměřená data bezdrátově odesílat tomuto teploměru a ten se postará o jejich vyhodnocení a zobrazení. Výhodné by bylo také použít jiný bezdrátový modul, například s technologií LoRa umožňující komunikaci se vzdálenějším senzorem či připojení do LoRaWAN IoT sítě. | ||
Řádek 153: | Řádek 199: | ||
{{ youtube>AyAU04ToL1Y?medium |}} | {{ youtube>AyAU04ToL1Y?medium |}} | ||
+ | |||
+ | |||
+ | ====== Firmware a schémata ====== | ||
+ | {{ :2018:thermometer:thermometer.zip |}} | ||
====== Zdroje ====== | ====== Zdroje ====== |