Problem Set #6: Alarm Clock

Ciele

  • Naučiť sa pracovať s prototypovacou doskou Arduino.
  • Naučiť sa tvoriť projekty pre Arduino modulárne.
  • Naučiť sa pracovať s viacerými typmi elektronických prvkov.
  • Naučiť sa organizovať svoj kód a výsledný projekt ako konečno-stavový automat.
  • Naučiť sa pracovať s pamäťou EEPROM.

Budík

Zadanie

Vašou úlohou je vytvoriť implementáciu budíka pomocou prototypovacej dosky Arduino. * Budík bude pracovať ako stavový stroj a bude musieť spĺňať túto základnú funkcionalitu:

  • Budík bude vedieť zobrazovať aktuálny čas a dátum.
  • Budík bude vedieť zobrazovať teplotu a vlhkosť prostredia.
  • Pomocou tlačidiel na budíku bude možné nastaviť aktuálny čas aj dátum, pričom nastavený čas a dátum musia byť obnovené aj po odpojení dosky od napájania.
  • Pomocou tlačidiel na budíku bude možné nastaviť čas budenia, pričom nastavený čas musí zostať zapamätaný aj po odpojení dosky od napájania.
  • Budenie realizujte pomocou bzučiaka.

Vybavenie

Pre potreby vytvorenia budíka budete potrebovať:

  • 1x Arduino UNO
  • 1x breadboard
  • 1x display s I2C moduom
  • 4x tlačidlá
  • 1x RGB diódu alebo príslušný počet LED diód
  • 1x RTC modul
  • 1x senzor DHT11
  • prepojovacie káble (vrátane USB kabla)
  • sadu odporov

Vývojové prostredie PlatformIO

PlatformIO: Uvítacia obrazovka

Ako vývojové prostredie pre prácu na tomto projekte použite PlatformIO. PlatformIO je profesionálne a veľmi populárne vývojové prostredie na programovanie mikrokontrolérov. Je distribuované ako rozširujúci modul pre vývojové prostredie Visual Studio Code.

Konfigurácia a preklad projektu

Konfigurácia projektu, ktorý je vytvorený pomocou nástroja PlatformIO sa nachádza v súbore platformio.ini. V prípade potreby si ho upravte podľa svojich potrieb. Konkrétne vás budú zaujímať tieto vlastnosti projektu:

  • board - v prípade, že používate inú dosku ako Arduino UNO
  • lib_deps - zoznam knižníc pre váš projekt
  • build_flags - príznaky prekladača

Schéma zapojenia

Na obrázku nižšie sa nachádza schéma celého zapojenia. V tomto prípade je veľmi dôležité, aby vaše pripojené vstupy aj výstupy zodpovedali uvedeným PIN-om.

Alarm Clock - Schéma zapojenia

Zoznam modulov riešenia

Konfigurácia projektu

Konfigurácia pinov a ďalších nastavení, ktoré pre projekt potrebujete, sa nachádza v súbore config.h. Upravte a doplňte si ho podľa vašich potrieb. Odporúčam však zachovať označenie zapojenia jednotlivých komponentov tak, ako sú v tomto súbore uvedené.

Modul LCD

Tento modul sa týka vášho LCD displeja. Jeho funkcionalita závisí od typu vášho LCD displeja. Jednotlivé funkcie a ich zoznam sa nachádza v hlavičkovom súbore lcd_wrapper.h.

Dôležitou je funkcia lcd_init(), ktorá slúži na inicializovanie displeja. Túto funkciu volajte na začiatku pri inicializácii budíka. Pokiaľ si použitie vašej knižnice vyžaduje aj nejakú globálnu premennú, vytvorte, resp. príslušné volanie zapíšte do súboru lcd_wrapper.cpp, pretože celá práca a všetky volania displeja sa budú nachádzať len v tomto súbore (module).

Modul RTC

Tento modul sa týka funkcionality modulu reálneho času. Zoznam funkcií, ktoré je potrebné v tomto module implementovať, sa nachádza v hlavičkovom súbore rtc_wrapper.h.

Funkcia rtc_init() slúži na inicializáciu RTC modulu. V závislosti od toho, s akým modulom a akou knižnicou budete pracovať, budete pravdepodobne potrebovať inicializovať objekt RTC modulu ako globálnu premennú. Túto premennú vytvorte len v tomto module.

Modul Sensors

Vo vašom riešení budete používať niekoľko senzorov. Povinnou súčasťou je senzor teploty a vlhkosti, ktorých implementáciu vytvoríte práve v tomto module.

Moduly dodané manažérom

Modul Helpers

Tento modul obsahuje pomocné funkcie, ktoré môžete pre svoj vývoj použiť.

  • funkcia print() - Funkcia pracuje podobne ako funkcia printf() v štandardnom jazyku C. Pomocou nej je možné vypísať aj premenné s pohyblivou rádovou čiarkou. Príklad použitia je nasledovný:

    print("temperature = %.1fc, Humidity = %.1f%%\n", temp, humidity);

Odovzdávanie projektu

Zadanie sa odovzdáva prostredníctvom systému na správu verzií Git na serveri git.kpi.fei.tuke.sk. Riešenie tejto úlohy odovzdáte ako súčasť vášho projektu.

Štruktúra vášho projektu bude vyzerať nasledovne:

.
├── ps6/
│   ├── include/
│   │   ├── config.h
│   │   ├── lcd_wrapper.h
│   │   ├── rtc_wrapper.h
│   │   ├── sensors.h
│   │   └── states.h
│   ├── lib/
│   │   └── helpers/
│   ├── src/
│   │   ├── lcd_wrapper.cpp
│   │   ├── main.cpp
│   │   ├── rtc_wrapper.cpp
│   │   ├── sensors.cpp
│   │   └── states.cpp
│   └── platformio.ini
└── README

kde význam súborov v priečinku ps6/ je nasledovný:

  • rtc_wrapper.cpp, rtc_wrapper.h - Zdrojový kód a hlavičkový súbor modulu pre prácu s hodinami reálneho času (RTC).

  • lcd_wrapper.cpp, lcd_wrapper.h - Zdrojový kód a hlavičkový súbor modulu pre prácu s LCD display-om.

  • sensors.cpp, sensors.h - Zdrojový kód a hlavičkový súbor modulu pre prácu s vašimi senzormi.

  • states.cpp, states.h - Implementácia vašich stavov.

  • main.cpp - Zdrojový kód bsahujúci funkciu main().

  • README - Súbor, v ktorom bude uvedené označenie vašej skupiny, ktorú navštevujete na cvičeniach v tvare:

    GROUP : A1

Ak ste opakujúci študent, uveďte v README skupinu v tvare:

GROUP : O<P>

kde <P> nahradíte písmenom paralelky, ktorá podľa rozvrhu zodpovedá vášmu študijnému programu (napr. A pre informatikov).

Kostra projektu

Z nasledujúceho odkazu si stiahnite súbor alarmclock.zip, ktorý obsahuje kostru projektu. Tento balíček obsahuje základnú štruktúru spolu s hlavičkovými súbormi pre PlatformIO.

V prostredí OS Linux môžete pre stiahnutie použiť príkaz wget v tvare:

$ wget http://0.0.0.0:4000/pvjc/2024/download/alarmclock.zip

Hodnotenie a testovanie

Toto zadanie sa bude odovzdávať a hodnotiť prezenčne! Za úspešné odovzdanie sa považuje také zadanie, ktoré bolo úspešne ohodnotené na minimálne 51%! Nestačí teda zadanie do termínu odovzdania len nahrať do systému na správu verzií Git, ale musí byť dovtedy aj ohodnotené!

Pri hodnotení sa bude hodnotiť:

  • Štruktúra vášho projektu (či sa v ňom nachádzajú všetky potrebné súbory).
  • Prítomnosť globálnych premenných vo vašom kóde.
  • Funkčnosť vašej implementácie.
  • Komunikácia s riešiteľom a jeho schopnosť reagovať na položené otázky prípadne jeho programátorské skúsenosti.

Ďalšie rozšírenia

Zvýšiť svoje hodnotenie môžete vypracovaním ďalších rozšírení pôvodného projektu. Napríklad:

  • Rozšírenie funkcionality o stopky a časovač (countdown timer).
  • Diaľkové ovládanie hodín pomocou infra prijímača a vysielača.
  • Rozšírenie funkcionality o funkciu Snooze.
  • Možnosť vypnúť budík až po priložení karty ku RFID čítačke.
  • Zobrazovať číslice na displeji cez dva riadky.

Ďalšie zdroje