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.
Upozornenie
Znenie zadania je WORK IN PROGRESS. Budem sa snažiť reflektovať vaše pripomienky a poznámky. napríklad zatiaľ chýba schéma zapojenia ;)
Upozornenie
Toto zadanie je potrebné odovzdať do 2024-06-02
23:59:59. Na diskusiu používajte kanál na slack-u
#alarmclock
.
Upozornenie
Toto zadanie je určené len pre skupiny Miroslava Biňasa.
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
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 UNOlib_deps
- zoznam knižníc pre váš projektbuild_flags
- príznaky prekladača
Poznámka
Vo svojom riešení budete potrebovať pracovať a vypisovať aj hodnoty,
ktoré majú pohyblivú rádovú čiarku. A to je menší problém, pretože
Arduino SDK má kostrbatú podporu pre formátovanie reťazcov,
ktoré takúto hodnotu obsahujú (viď napr. tento
článok). Riešenie je pritom pomerne jednoduché - zapnúť
chýbajúcu podporu pre funkcie ako je napríklad
sprintf()
pri linkovaní v dobe prekladu. Táto podpora je
predvolene vypnutá, pretože nie všetky projekty ju nutne vyžadujú.
Na to, aby sme to urobili, potrebujeme zmeniť parametre prekladu na:
-Wl,-u,vfprintf -lprintf_flt -lm
Túto podporu už máte zapnutú v nastaveniach projektu v súbore
platformio.ini
v kostre
projektu.
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.
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.
Upozornenie
V závislosti od toho, aký RTC modul a akú knižnicu pre prácu s ním sa rozhodnete použiť, sa môže aktuálny čas a dátum nastaviť automaticky pri preklade projektu.
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 funkciaprintf()
v štandardnom jazyku C. Pomocou nej je možné vypísať aj premenné s pohyblivou rádovou čiarkou. Príklad použitia je nasledovný:("temperature = %.1fc, Humidity = %.1f%%\n", temp, humidity); print
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 funkciumain()
.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).
Upozornenie
Ak nemáte potrebné hardvérové komponenty, pre vypracovanie zadania použite službu Tinkercad. V tom prípade však budete obmedzení ako dostupnými komponentmi tak aj nemodulárnym prístupom k programovaniu - celý program napíšete do jedného súboru.
V tomto prípade odovzdávajte svoj projekt s nasledovnou štruktúrou:
.
├── ps6
│ └── ps6.ino
└── README
Upozornenie
Je dôležité, aby vaše súbory zachovali uvedenú štruktúru. Ak sa niektorý zo súborov síce v repozitári nachádza, ale v inom priečinku, bude to považované za chybu a takýto projekt nebude považovaný za správny! Ak sa naopak vo vašom projekte nachádzajú súbory alebo priečinky navyše, tieto nebudú považované za chybu.
Upozornenie
Pri názvoch priečinkov, súborov a obsahu súboru README
záleží na veľkosti písmen!
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.
Upozornenie
V prípade, že skúšajúci nadobudne dojem, že odovzdávanému projektu nerozumiete, nebude vaše zadanie ohodnotené. To zároveň znamená, že nezískate zápočet za predmet a to aj napriek tomu, že budete mať dostatočný počet bodov z predchádzajúcich zadaní!
Ď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
Do you know Arduino? – sprintf and floating point - o formátovaní reťazcov v Arduine SDK, ktoré obsahujú čísla s desatinnou čiarkou