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?

[sc:ebay item=“arduino uno USB“] [sc:ebay item=“arduino clock shield TM1636″]

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.

  1. 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.

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

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

  4. 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.

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

  6. 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.

  7. 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.

  8. 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í.

  9. 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:

 

</tr> </tr> </table> 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:
switch (flag) {
    case true:
        flag = false;
        break;
    case false:
        flag = true;
        break;
}
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…
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 </td> Nastaví poplach při překročení maximální teploty OK nebo ERROR
Setlimitminc </td> 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