Multifunkčná lampa: Rozdiel medzi revíziami
Z SensorWiki
(→Popis riešenia) |
|||
(19 medziľahlých úprav od jedného ďalšieho používateľa nie je zobrazených) | |||
Riadok 1: | Riadok 1: | ||
{| | {| | ||
− | |Autor: || ''' | + | |Autor: || '''Peter Zbín''' |
|- | |- | ||
|Študijný odbor: || Aplikovaná informatika || 3. Bc. ('''2019''') | |Študijný odbor: || Aplikovaná informatika || 3. Bc. ('''2019''') | ||
Riadok 72: | Riadok 72: | ||
[http://www.example.com link title] | [http://www.example.com link title] | ||
− | [[Súbor: | + | [[Súbor:rezanieLampy.jpg|300px]][[Súbor:LampaRozobrata1.JPG|300px]] [[Súbor:LampaRozobrata2.JPG|300px]] |
[[Médiá:U8glib.rar]], [[Médiá:DHTLib.rar]], [[Médiá:lampaKod.ino]], [[Médiá:lampaKrabica.rar]] | [[Médiá:U8glib.rar]], [[Médiá:DHTLib.rar]], [[Médiá:lampaKod.ino]], [[Médiá:lampaKrabica.rar]] | ||
Riadok 95: | Riadok 95: | ||
== Popis riešenia == | == Popis riešenia == | ||
− | + | Na schéme nižsie môžete vidiet spôsob zapojenia súčiastok. Využívam zdroj, ktorý konvertuje 240 V na 5V, ktoré sú vhodné na napájanie Arduina. Na napájanie je vhodné využiť jeden z 5V pinov arduina, na mojom klone je ich viac ako na arduine, takže zobrazenie je ilustračné. Tlačidlá dávajú signál na ovládanie relé a prehadzujú veličiny zobrazené na displayi. | |
− | |||
'''Schéma zapojenia snímača''' | '''Schéma zapojenia snímača''' | ||
− | [[Súbor:obvodicek.jpg | + | [[Súbor:obvodicek.jpg|center|400px]] |
+ | === Algoritmus a program === | ||
− | + | Vytvoril som jednoduchý program v jazyku C, vo vývojovom protredí Arduino ide. Kód je rozdelený do jednoduchých funkcii. Použité knižnice sa nachádzajú v sekcii '''Postup výroby'''. | |
− | |||
− | + | * na začiatku sa vo funkcii setup nastaví stav relé na HIGH, resp vypnuté. Nastavia sa piny na preddefinované hodnoty. | |
+ | *modeButtonSetup(); -> funkcia na prácu s tlacidlom, ktoré ovláda zobrazovanie | ||
+ | *relaySetup() -> funkcia na ovládanie relé pomocou svojho tlačidla | ||
+ | *drawTemperature() a drawHumidity() -> používajú premenné, v ktorých sú zaznamenané veličiny a vykresľujú ich na display | ||
− | |||
− | |||
− | |||
− | |||
Vyberte podstatné časti zdrojového kódu, použite na to prostredie ''source'': | Vyberte podstatné časti zdrojového kódu, použite na to prostredie ''source'': | ||
Riadok 119: | Riadok 117: | ||
/* A nezabudnite zdroják hojne komentovať */ | /* A nezabudnite zdroják hojne komentovať */ | ||
− | int | + | #include <dht.h> |
+ | |||
+ | |||
+ | #include "U8glib.h" // kniznica pre OLED display | ||
+ | |||
+ | ///////////////////////////PREMENNE///////////////////////////////////////// | ||
+ | int currentStateMode = HIGH; | ||
+ | int previousStateMode = LOW; | ||
+ | int modeButtonReading; | ||
+ | int modePin = 3; | ||
+ | long time = 0; | ||
+ | long debounce = 100; | ||
+ | |||
+ | |||
+ | int relayButtonPin = 4; | ||
+ | int relayPin = 5; | ||
+ | int currentStateRelay = HIGH; | ||
+ | int previousStateRelay = LOW; | ||
+ | int relayButtonReading; | ||
+ | |||
+ | int flameSensorPin = 0; | ||
+ | int buzzerPin = 7; | ||
+ | int flameSensorReading; | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | int temperature=0; | ||
+ | int hum=0; | ||
+ | |||
+ | #define DHTPIN 2 | ||
+ | dht myDHT; | ||
+ | ////////////////////////////////////////////////////////////////////////////////////// | ||
+ | |||
+ | U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); //volim ovladac SH1106 | ||
+ | |||
+ | |||
+ | ///////////////////////////////Obrazok teplomera - bitmap///////////////////////////// | ||
+ | static unsigned char temp[] U8G_PROGMEM = { | ||
+ | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
+ | 0x00, 0x00, 0x00, 0x03, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x81, 0xFC, 0x00, 0x00, | ||
+ | 0x00, 0x00, 0x00, 0x07, 0xC3, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC6, 0x03, 0x00, 0x00, | ||
+ | 0x00, 0x00, 0x00, 0x0F, 0xC4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x01, 0x00, 0x00, | ||
+ | 0x00, 0x00, 0x00, 0x01, 0x0C, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x80, 0x00, | ||
+ | 0x00, 0x30, 0x00, 0x00, 0x0C, 0x01, 0x83, 0xFF, 0x00, 0x3E, 0x00, 0x00, 0x0C, 0x01, 0x80, 0x00, | ||
+ | 0x00, 0x3F, 0x00, 0x00, 0x0C, 0x01, 0x80, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0xFC, 0x71, 0x80, 0x00, | ||
+ | 0x00, 0x3E, 0x00, 0xF8, 0x7C, 0x71, 0x80, 0x00, 0x00, 0x1E, 0x03, 0x80, 0x0C, 0x71, 0x83, 0xE0, | ||
+ | 0x00, 0x08, 0x0E, 0x00, 0x0C, 0x71, 0x83, 0xE0, 0x00, 0x00, 0x18, 0x00, 0x0C, 0x71, 0x80, 0x00, | ||
+ | 0x00, 0x00, 0x30, 0x00, 0x0C, 0x71, 0x80, 0x00, 0x00, 0x00, 0x60, 0x00, 0x0C, 0x71, 0x80, 0x00, | ||
+ | 0x00, 0x00, 0xC0, 0x00, 0x0C, 0x71, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x71, 0x83, 0xFF, | ||
+ | 0x00, 0x01, 0x00, 0x00, 0x0C, 0x71, 0x83, 0xFF, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00, | ||
+ | 0x00, 0x02, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00, | ||
+ | 0x00, 0x06, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x71, 0x83, 0xE0, | ||
+ | 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00, | ||
+ | 0x1E, 0x0C, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00, 0x7F, 0x0C, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00, | ||
+ | 0x7F, 0x0C, 0x00, 0x00, 0x0C, 0x71, 0x83, 0xFF, 0x1E, 0x0C, 0x00, 0x00, 0x0C, 0x71, 0x83, 0xFF, | ||
+ | 0x06, 0x0C, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00, | ||
+ | 0x00, 0x04, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00, | ||
+ | 0x00, 0x06, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00, 0x00, 0x02, 0x00, 0x00, 0x18, 0x70, 0xC0, 0x00, | ||
+ | 0x00, 0x03, 0x00, 0x00, 0x30, 0x70, 0x60, 0x00, 0x00, 0x01, 0x00, 0x00, 0x60, 0x70, 0x30, 0x00, | ||
+ | 0x00, 0x01, 0x80, 0x00, 0xC0, 0x1C, 0x18, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x80, 0x1E, 0x08, 0x00, | ||
+ | 0x00, 0x00, 0x60, 0x01, 0x00, 0x1F, 0x0C, 0x00, 0x00, 0x00, 0x30, 0x01, 0x00, 0x1F, 0x84, 0x00, | ||
+ | 0x00, 0x00, 0x18, 0x03, 0x00, 0x7F, 0xC6, 0x00, 0x00, 0x08, 0x0E, 0x03, 0x00, 0xFF, 0xC6, 0x00, | ||
+ | 0x00, 0x1E, 0x03, 0x82, 0x00, 0xFF, 0xC6, 0x00, 0x00, 0x3E, 0x00, 0xFE, 0x01, 0xFF, 0xC6, 0x00, | ||
+ | 0x00, 0x3F, 0x00, 0x3F, 0x01, 0xFF, 0xC6, 0x00, 0x00, 0x3F, 0x00, 0x03, 0x1F, 0xFF, 0xC6, 0x00, | ||
+ | 0x00, 0x3E, 0x00, 0x03, 0x1F, 0xFF, 0x84, 0x00, 0x00, 0x30, 0x00, 0x01, 0x0F, 0xFF, 0x84, 0x00, | ||
+ | 0x00, 0x00, 0x00, 0x01, 0x87, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xFE, 0x18, 0x00, | ||
+ | 0x00, 0x00, 0x00, 0x07, 0xC0, 0xF8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x30, 0x00, | ||
+ | 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCC, 0x01, 0x80, 0x00, | ||
+ | 0x00, 0x00, 0x00, 0x03, 0x87, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x78, 0x00, 0x00, | ||
+ | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | ||
+ | |||
+ | }; | ||
+ | |||
+ | |||
+ | void modeButtonSetup(void){ //funkcia pre tlacitko -> vypnutie, zapnutie po kliknuti | ||
+ | |||
+ | modeButtonReading = digitalRead(modePin); | ||
+ | |||
+ | if(modeButtonReading == HIGH && previousStateMode == LOW && millis() - time > debounce){ | ||
+ | |||
+ | if(currentStateMode == HIGH){ | ||
+ | currentStateMode = LOW; | ||
+ | } | ||
+ | else currentStateMode = HIGH; | ||
+ | time = millis(); | ||
+ | } | ||
+ | |||
+ | previousStateMode = modeButtonReading; | ||
+ | |||
+ | } | ||
+ | |||
+ | void relaySetup(){ | ||
+ | |||
+ | relayButtonReading = digitalRead(relayButtonPin); | ||
+ | |||
+ | if(relayButtonReading == LOW && previousStateRelay == HIGH&& millis() - time > debounce){ //ovladanie rele, podobne ako pri klasickom tlacidle | ||
+ | |||
+ | if(currentStateRelay == HIGH){ | ||
+ | currentStateRelay = LOW; | ||
+ | } | ||
+ | else currentStateRelay = HIGH; | ||
+ | time = millis(); | ||
+ | } | ||
+ | |||
+ | |||
+ | digitalWrite(relayPin,currentStateRelay); | ||
+ | previousStateRelay = relayButtonReading; | ||
− | + | } | |
− | + | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ///////////////////////// vykreslovanie teploty///////// | ||
+ | void drawTemperature(void) | ||
+ | { | ||
+ | u8g.drawBitmapP( 0, 0, 8, 64, temp);////////for drawing bitmap of size 64*64 and location is x=0,y=0 | ||
+ | |||
+ | char s[2] = " "; | ||
+ | u8g.setFont(u8g_font_fur35n); // font | ||
+ | u8g.setPrintPos(67, 50); //nastavenie pozicie, kam vypisat teplotu | ||
+ | u8g.println(temperature); //vypis teploty | ||
+ | u8g.setFont(u8g_font_osr18); | ||
+ | s[0] = 176; //znak stupen(kruzok) | ||
+ | u8g.drawStr(116, 28, s); //vypis stupna | ||
+ | } | ||
+ | |||
+ | /////////////////vykreslovanie vlhkosti/////////////////////// | ||
+ | void drawHumidity(void) | ||
+ | { | ||
+ | u8g.setFont(u8g_font_fub17); | ||
+ | u8g.setFontRefHeightExtendedText(); | ||
+ | u8g.setDefaultForegroundColor(); | ||
+ | u8g.setFontPosTop(); | ||
+ | u8g.drawStr(4, 0, "Vlhk. %"); | ||
+ | u8g.drawFrame(4, 40, 122, 24); | ||
+ | |||
+ | u8g.drawBox(8, 44, (114 * hum / 100), 16); //obdlznik, ktory znazornuje percenta pomocou zaplnenia bielou | ||
+ | |||
+ | // | ||
+ | if (hum > 99) | ||
+ | { | ||
+ | u8g.setPrintPos(90, 15); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | u8g.setPrintPos(100, 15); | ||
+ | } | ||
+ | |||
+ | u8g.print(hum); | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | void setup(void) | ||
+ | { | ||
+ | |||
+ | Serial.begin(9600); | ||
+ | pinMode(modePin,INPUT); | ||
+ | pinMode(relayButtonPin, INPUT); | ||
+ | pinMode(relayPin, OUTPUT); | ||
+ | pinMode(buzzerPin, OUTPUT); | ||
+ | |||
+ | digitalWrite(relayPin,HIGH); //na zaciatku je rele nezopnute, cize HIGH | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | void loop(void) { | ||
+ | |||
+ | relaySetup(); | ||
+ | delay(1000); //delay na nacitanie hodnot zo senzora | ||
+ | |||
+ | int readData = myDHT.read11(DHTPIN); | ||
+ | |||
+ | temperature = myDHT.temperature; | ||
+ | hum = myDHT.humidity; | ||
+ | |||
+ | |||
+ | modeButtonSetup(); | ||
+ | |||
+ | |||
+ | |||
+ | ///////////////////////////////zobrazovanie////////////////// | ||
+ | |||
+ | |||
+ | if(currentStateMode == HIGH){ | ||
+ | |||
+ | u8g.firstPage(); | ||
+ | do { | ||
+ | drawTemperature(); | ||
+ | } while( u8g.nextPage() ); | ||
+ | |||
+ | } | ||
+ | else{ | ||
+ | |||
+ | u8g.firstPage(); | ||
+ | do { | ||
+ | drawHumidity(); | ||
+ | } while( u8g.nextPage() ); | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
} | } | ||
</source> | </source> | ||
− | |||
− | Zdrojový kód: [[Médiá: | + | |
+ | Zdrojový kód: [[Médiá:lampaKod.ino]] | ||
[[Médiá:MojProgram.c|program.c]] | [[Médiá:MojProgram.c|program.c]] | ||
+ | === Výsledok === | ||
+ | |||
+ | S výsledkom svojej práce som spokojný, najmä s tým nehmatateľným, čiže s rozšírením svojich schopností. Naučil som sa mnoho nových vecí, ktoré určite využijem v budúcnosti. Lampa splnila moje požiadavky, ktoré som si položil na začiatku, aby bola aspoň trochu "smart", spĺňala svoj účel a bola pekná aj z estetického hľadiska. | ||
+ | |||
+ | [[Súbor:LampaHotova2.JPG|250px|250px]] [[Súbor:LampaHotova1.jpg|250px]] | ||
− | + | '''Návrhy na zlepšenie''' | |
− | + | * zväčšenie krabice, pretože dané komponenty sú v nej príliš natesno. Taktiež by mala byť vyššia aby sa tam zmestila aj väčšia žiarovka. | |
− | a | + | * pridanie viacerých senzorov, napr. zaznamenávanie CO2. |
+ | * zaťaženie lampy a pridanie gumových prúžkov na spodok aby sa tlačidlá lepšie stláčali a lampa "neutekala" po stole. | ||
− | |||
[[Category:DTV2019]] | [[Category:DTV2019]] |
Aktuálna revízia z 06:43, 13. jún 2019
Autor: | Peter Zbín | |
Študijný odbor: | Aplikovaná informatika | 3. Bc. (2019) |
Opis projektu
Čo
Témou môjho projektu je multifunkčná lampa využívajúca OLED display, na ktorom je zobrazená teplota a vlhkosť. Lampa je riadená mikropočítačom Arduino UNO R3.
Prečo?
- Tento projekt som si vybral kvôli tomu, že som sa chcel naučiť pracovať s Arduinom a elektronikou, keďže som nemal príležitosť vo väčšej miere pracovať s touto technológiou. Zaujímalo ma hlavne použitie senzorov, práca s nameranými veličinami a ich reprezentácia na výstup.
- Taktiež som chcel vytvoriť užitočnú vec, ktorá by mi i po dizajnovej stránke pasovala do mojej izby.
Ako ?
Sem príde podrobný návod na výrobu.
Potrebné súčiastky a nástroje - krabica
- platňa bukovej preglejky
- lepidlo na drevo
Hardvér
- Arduino UNO
- Relé modul, pracovné napätie 5V
- Vidlica do zásuvky
- Zdroj - Input 240 V AC - Output 5V DC
- Senzor teploty a vlhkosti DHT11
- 2x tlačítko
- OLED display 1.3 s kontrolerom SH1106
- vhodná mala objimka na žiarovku, E14 pätica
- 2x svorkovnica pre 3 káble
- káble
- 2x rezistor 10k
- 6 M3 skrutiek a 6 matíc
- malá led žiarovka, E14,rozmer 80x45 mm alebo menšia
Softvér
- softvér na technické kreslenie (napr. Autodesk Fusion 360)
- Corel - práca s laserom, úprava na vhodný formát pre laser
- Arduino IDE
Iné nástroje
- pilník
- breadboard
- spájkovačka
- multimeter
- vŕtačka + vrták 2.6
- skrutkovače
Postup výroby
- nakresliť si vhodnú krabicu, prípadne si ju vygenerovať
- zložiť krabicu
- zapojiť si komponenty, podľa schémy najskôr pomocou breadboard, potom pospájkovať
- naprogramovať si Arduino- naimportovať knižnice <dht.h>, <u8glib.h> a odtestovať funkčnosť, napríklad pomocou Serial Monitor
- komponenty rozmiestniť, navŕtať diery, namontovať na krabicu pomocou M3 skrutiek
- nalepiť tlačidlá a display
- odskúšať funkčnosť
Médiá:U8glib.rar, Médiá:DHTLib.rar, Médiá:lampaKod.ino, Médiá:lampaKrabica.rar
Použité zdroje:
- Tutoriál na programovanie displaya a DHT11 senzora: https://makersportal.com/blog/2018/9/3/arduino-i2c-oled-display-temperature-and-humidity
- Zapojenie relé: http://www.circuitbasics.com/setting-up-a-5v-relay-on-the-arduino/
Analýza
Pri analýze pred začatím môjho projektu som dohľadal vhodné súčiastky na môj výrobok. Zapojenie a výber súčiastok som konzultoval s človekom, ktorý má určité skúsenosti v danej problematike.
- použil som IIC zbernicu pre komunikáciu s displayom. Dôvod použitia bola redukcia použitia pinov v Arduine, preto bola IIC uprednostnená pred SPI.
- na použitie v interiéri plne postačuje senzor DHT11 s rozsahom 0 - 50 stupňov. Rozsah vlhkosti je 20 - 90 % s odchýľkou 4%. Alternatívou je drahší DHT22, ktorý meria od -40 do 100 stupňov a vlhkosť na celej škále.
- použil som 1.3" OLED display, pretože má dobrú čitatelnosť z rôznych uhlov a pekné farby. Použil som lacnejšiu verziu s kontrolerom SH1106.
- na lampu je vhodné použiť led žiarovku, ktorá sa menej zahrieva oproti obyčajnej, lampa je z dreva.
Popis riešenia
Na schéme nižsie môžete vidiet spôsob zapojenia súčiastok. Využívam zdroj, ktorý konvertuje 240 V na 5V, ktoré sú vhodné na napájanie Arduina. Na napájanie je vhodné využiť jeden z 5V pinov arduina, na mojom klone je ich viac ako na arduine, takže zobrazenie je ilustračné. Tlačidlá dávajú signál na ovládanie relé a prehadzujú veličiny zobrazené na displayi.
Schéma zapojenia snímača
Algoritmus a program
Vytvoril som jednoduchý program v jazyku C, vo vývojovom protredí Arduino ide. Kód je rozdelený do jednoduchých funkcii. Použité knižnice sa nachádzajú v sekcii Postup výroby.
- na začiatku sa vo funkcii setup nastaví stav relé na HIGH, resp vypnuté. Nastavia sa piny na preddefinované hodnoty.
- modeButtonSetup(); -> funkcia na prácu s tlacidlom, ktoré ovláda zobrazovanie
- relaySetup() -> funkcia na ovládanie relé pomocou svojho tlačidla
- drawTemperature() a drawHumidity() -> používajú premenné, v ktorých sú zaznamenané veličiny a vykresľujú ich na display
Vyberte podstatné časti zdrojového kódu, použite na to prostredie source:
/* A nezabudnite zdroják hojne komentovať */
#include <dht.h>
#include "U8glib.h" // kniznica pre OLED display
///////////////////////////PREMENNE/////////////////////////////////////////
int currentStateMode = HIGH;
int previousStateMode = LOW;
int modeButtonReading;
int modePin = 3;
long time = 0;
long debounce = 100;
int relayButtonPin = 4;
int relayPin = 5;
int currentStateRelay = HIGH;
int previousStateRelay = LOW;
int relayButtonReading;
int flameSensorPin = 0;
int buzzerPin = 7;
int flameSensorReading;
int temperature=0;
int hum=0;
#define DHTPIN 2
dht myDHT;
//////////////////////////////////////////////////////////////////////////////////////
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); //volim ovladac SH1106
///////////////////////////////Obrazok teplomera - bitmap/////////////////////////////
static unsigned char temp[] U8G_PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x03, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x81, 0xFC, 0x00, 0x00,
0x00, 0x00, 0x00, 0x07, 0xC3, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC6, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x0F, 0xC4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x0C, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x80, 0x00,
0x00, 0x30, 0x00, 0x00, 0x0C, 0x01, 0x83, 0xFF, 0x00, 0x3E, 0x00, 0x00, 0x0C, 0x01, 0x80, 0x00,
0x00, 0x3F, 0x00, 0x00, 0x0C, 0x01, 0x80, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0xFC, 0x71, 0x80, 0x00,
0x00, 0x3E, 0x00, 0xF8, 0x7C, 0x71, 0x80, 0x00, 0x00, 0x1E, 0x03, 0x80, 0x0C, 0x71, 0x83, 0xE0,
0x00, 0x08, 0x0E, 0x00, 0x0C, 0x71, 0x83, 0xE0, 0x00, 0x00, 0x18, 0x00, 0x0C, 0x71, 0x80, 0x00,
0x00, 0x00, 0x30, 0x00, 0x0C, 0x71, 0x80, 0x00, 0x00, 0x00, 0x60, 0x00, 0x0C, 0x71, 0x80, 0x00,
0x00, 0x00, 0xC0, 0x00, 0x0C, 0x71, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x0C, 0x71, 0x83, 0xFF,
0x00, 0x01, 0x00, 0x00, 0x0C, 0x71, 0x83, 0xFF, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00,
0x00, 0x02, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00,
0x00, 0x06, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x71, 0x83, 0xE0,
0x00, 0x0C, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00,
0x1E, 0x0C, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00, 0x7F, 0x0C, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00,
0x7F, 0x0C, 0x00, 0x00, 0x0C, 0x71, 0x83, 0xFF, 0x1E, 0x0C, 0x00, 0x00, 0x0C, 0x71, 0x83, 0xFF,
0x06, 0x0C, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00,
0x00, 0x04, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00,
0x00, 0x06, 0x00, 0x00, 0x0C, 0x71, 0x80, 0x00, 0x00, 0x02, 0x00, 0x00, 0x18, 0x70, 0xC0, 0x00,
0x00, 0x03, 0x00, 0x00, 0x30, 0x70, 0x60, 0x00, 0x00, 0x01, 0x00, 0x00, 0x60, 0x70, 0x30, 0x00,
0x00, 0x01, 0x80, 0x00, 0xC0, 0x1C, 0x18, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x80, 0x1E, 0x08, 0x00,
0x00, 0x00, 0x60, 0x01, 0x00, 0x1F, 0x0C, 0x00, 0x00, 0x00, 0x30, 0x01, 0x00, 0x1F, 0x84, 0x00,
0x00, 0x00, 0x18, 0x03, 0x00, 0x7F, 0xC6, 0x00, 0x00, 0x08, 0x0E, 0x03, 0x00, 0xFF, 0xC6, 0x00,
0x00, 0x1E, 0x03, 0x82, 0x00, 0xFF, 0xC6, 0x00, 0x00, 0x3E, 0x00, 0xFE, 0x01, 0xFF, 0xC6, 0x00,
0x00, 0x3F, 0x00, 0x3F, 0x01, 0xFF, 0xC6, 0x00, 0x00, 0x3F, 0x00, 0x03, 0x1F, 0xFF, 0xC6, 0x00,
0x00, 0x3E, 0x00, 0x03, 0x1F, 0xFF, 0x84, 0x00, 0x00, 0x30, 0x00, 0x01, 0x0F, 0xFF, 0x84, 0x00,
0x00, 0x00, 0x00, 0x01, 0x87, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0xFE, 0x18, 0x00,
0x00, 0x00, 0x00, 0x07, 0xC0, 0xF8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x30, 0x00,
0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCC, 0x01, 0x80, 0x00,
0x00, 0x00, 0x00, 0x03, 0x87, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x78, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
void modeButtonSetup(void){ //funkcia pre tlacitko -> vypnutie, zapnutie po kliknuti
modeButtonReading = digitalRead(modePin);
if(modeButtonReading == HIGH && previousStateMode == LOW && millis() - time > debounce){
if(currentStateMode == HIGH){
currentStateMode = LOW;
}
else currentStateMode = HIGH;
time = millis();
}
previousStateMode = modeButtonReading;
}
void relaySetup(){
relayButtonReading = digitalRead(relayButtonPin);
if(relayButtonReading == LOW && previousStateRelay == HIGH&& millis() - time > debounce){ //ovladanie rele, podobne ako pri klasickom tlacidle
if(currentStateRelay == HIGH){
currentStateRelay = LOW;
}
else currentStateRelay = HIGH;
time = millis();
}
digitalWrite(relayPin,currentStateRelay);
previousStateRelay = relayButtonReading;
}
///////////////////////// vykreslovanie teploty/////////
void drawTemperature(void)
{
u8g.drawBitmapP( 0, 0, 8, 64, temp);////////for drawing bitmap of size 64*64 and location is x=0,y=0
char s[2] = " ";
u8g.setFont(u8g_font_fur35n); // font
u8g.setPrintPos(67, 50); //nastavenie pozicie, kam vypisat teplotu
u8g.println(temperature); //vypis teploty
u8g.setFont(u8g_font_osr18);
s[0] = 176; //znak stupen(kruzok)
u8g.drawStr(116, 28, s); //vypis stupna
}
/////////////////vykreslovanie vlhkosti///////////////////////
void drawHumidity(void)
{
u8g.setFont(u8g_font_fub17);
u8g.setFontRefHeightExtendedText();
u8g.setDefaultForegroundColor();
u8g.setFontPosTop();
u8g.drawStr(4, 0, "Vlhk. %");
u8g.drawFrame(4, 40, 122, 24);
u8g.drawBox(8, 44, (114 * hum / 100), 16); //obdlznik, ktory znazornuje percenta pomocou zaplnenia bielou
//
if (hum > 99)
{
u8g.setPrintPos(90, 15);
}
else
{
u8g.setPrintPos(100, 15);
}
u8g.print(hum);
}
void setup(void)
{
Serial.begin(9600);
pinMode(modePin,INPUT);
pinMode(relayButtonPin, INPUT);
pinMode(relayPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
digitalWrite(relayPin,HIGH); //na zaciatku je rele nezopnute, cize HIGH
}
void loop(void) {
relaySetup();
delay(1000); //delay na nacitanie hodnot zo senzora
int readData = myDHT.read11(DHTPIN);
temperature = myDHT.temperature;
hum = myDHT.humidity;
modeButtonSetup();
///////////////////////////////zobrazovanie//////////////////
if(currentStateMode == HIGH){
u8g.firstPage();
do {
drawTemperature();
} while( u8g.nextPage() );
}
else{
u8g.firstPage();
do {
drawHumidity();
} while( u8g.nextPage() );
}
}
Zdrojový kód: Médiá:lampaKod.ino
Výsledok
S výsledkom svojej práce som spokojný, najmä s tým nehmatateľným, čiže s rozšírením svojich schopností. Naučil som sa mnoho nových vecí, ktoré určite využijem v budúcnosti. Lampa splnila moje požiadavky, ktoré som si položil na začiatku, aby bola aspoň trochu "smart", spĺňala svoj účel a bola pekná aj z estetického hľadiska.
Návrhy na zlepšenie
- zväčšenie krabice, pretože dané komponenty sú v nej príliš natesno. Taktiež by mala byť vyššia aby sa tam zmestila aj väčšia žiarovka.
- pridanie viacerých senzorov, napr. zaznamenávanie CO2.
- zaťaženie lampy a pridanie gumových prúžkov na spodok aby sa tlačidlá lepšie stláčali a lampa "neutekala" po stole.