Operácie

Multifunkčná lampa: Rozdiel medzi revíziami

Z SensorWiki

(Opis projektu)
 
(42 medziľahlých úprav od jedného ďalšieho používateľa nie je zobrazených)
Riadok 1: Riadok 1:
 
{|
 
{|
|Autor:      || '''Meno Priezvisko'''  
+
|Autor:      || '''Peter Zbín'''  
 
|-
 
|-
 
|Študijný odbor:  || Aplikovaná informatika || 3. Bc.  ('''2019''')  
 
|Študijný odbor:  || Aplikovaná informatika || 3. Bc.  ('''2019''')  
Riadok 8: Riadok 8:
  
 
'''Čo'''  
 
'''Č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.
 
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?'''  
 
'''Prečo?'''  
  
# Prečo práve tento projekt, aký má zmysel, komu bude osožný...  
+
# 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.  
# Druhy '''riadok'''
+
# Taktiež som chcel vytvoriť užitočnú vec, ktorá by mi i po dizajnovej stránke pasovala do mojej izby.
  
 
'''Ako ?'''
 
'''Ako ?'''
Riadok 19: Riadok 20:
 
Sem príde podrobný návod na výrobu.
 
Sem príde podrobný návod na výrobu.
  
* Popisat proces premeny napadu na hmotny (funkcny) produkt
+
'''Potrebné súčiastky a nástroje - krabica'''
* Vyspecifikovat potrebny material (uprednostnujeme vlastnych alebo existujucich komponentov, v pripade potreby vieme pomoct)<BR> vystupom bude zhmotneny napad a aj navod - krok za krokom pre reprodukciu produktu
+
 
 +
# 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ť
  
  
 
[http://www.example.com link title]
 
[http://www.example.com link title]
  
[[Súbor:MojObrazok2.jpg|center|300px]]
+
[[Súbor:rezanieLampy.jpg|300px]][[Súbor:LampaRozobrata1.JPG|300px]] [[Súbor:LampaRozobrata2.JPG|300px]]
  
[[Médiá:MojZdrojak.c]]
+
[[Médiá:U8glib.rar]], [[Médiá:DHTLib.rar]], [[Médiá:lampaKod.ino]], [[Médiá:lampaKrabica.rar]]
  
  
 
'''Použité zdroje:'''  
 
'''Použité zdroje:'''  
  
* Zoznam použitej literatúry, vrátane katalógových údajov (datasheet), internetových odkazov a pod.
+
* '''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/
  
 
__TOC__
 
__TOC__
Riadok 38: Riadok 86:
 
== Analýza ==
 
== Analýza ==
  
V tejto časti popíšete ako idete daný problém riešiť. Uvediete sem aj všetky potrebné technické údaje,
+
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.
ktoré sú potrebné na úspešné vyriešenie projektu. Napríklad:
 
 
 
* popis komunikačnej zbernice (i2c, 1-wire, RS-232 a pod.)
 
* obrázok zapojenia vývodov použitej súčiastky
 
* odkaz na katalógový list
 
* priebehy dôležitých signálov
 
* este jedna polozka
 
  
 +
* 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 ==
 
== Popis riešenia ==
  
Sem opíšete ako konkrétne ste problém vyriešili. Začnite popisom pripojenia k procesoru
+
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.
(nezabudnite na schému zapojenia!) a zdôraznite ktoré jeho periférie ste pritom využili.  
 
  
 
'''Schéma zapojenia snímača'''
 
'''Schéma zapojenia snímača'''
[[Súbor:Zapojenie.png]]
+
[[Súbor:obvodicek.jpg|center|400px]]
 +
 
  
[[Súbor:Example.jpg]]
+
=== Algoritmus a program ===
  
Pozn.: Názov obrázku musí byť jedinečný, uvedomte si, že Obr1.jpg už pred vami skúsilo
+
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'''.
nahrať už aspoň 10 študentov.  
 
  
[[Súbor:MojObrazok.jpg|center|250px]]
+
* 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
  
=== Algoritmus a program ===
 
  
Uveďte stručný popis algoritmu, v akom jazyku a verzii vývojového prostredia ste ho vytvorili.
 
Je vhodné nakresliť aspoň hrubú štruktúru programu napríklad vo forme vývojového diagramu.
 
Rozsiahly program pre lepšiu prehľadnosť rozdeľte do viacerých súborov.
 
  
 
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 74: Riadok 117:
 
/* A nezabudnite zdroják hojne komentovať  */
 
/* A nezabudnite zdroják hojne komentovať  */
  
int main(void) {
+
#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{
 
      
 
      
     printf("Hello, World!\n");   
+
     u8g.firstPage();   
     return(0);   
+
do {
 +
     drawHumidity();
 +
  } while( u8g.nextPage() );
 +
   
 +
   
 +
    }
 +
 
 +
 +
   
 +
 +
 
 
}
 
}
 
</source>
 
</source>
  
Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!
 
  
Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá:Pip.c|main.c]]
+
 
 +
Zdrojový kód: [[Médiá:lampaKod.ino]]
  
 
[[Médiá:MojProgram.c|program.c]]
 
[[Médiá:MojProgram.c|program.c]]
  
 +
=== Výsledok ===
  
=== 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'''
  
Nezabudnite zdokumentovať výsledok vašej práce. Určite sem patria fotografie, video
+
* 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 zhodnotenie ako ste spokojní s výsledkom,
+
* 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.
  
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
 
  
  
 
[[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?

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

  1. platňa bukovej preglejky
  2. lepidlo na drevo


Hardvér

  1. Arduino UNO
  2. Relé modul, pracovné napätie 5V
  3. Vidlica do zásuvky
  4. Zdroj - Input 240 V AC - Output 5V DC
  5. Senzor teploty a vlhkosti DHT11
  6. 2x tlačítko
  7. OLED display 1.3 s kontrolerom SH1106
  8. vhodná mala objimka na žiarovku, E14 pätica
  9. 2x svorkovnica pre 3 káble
  10. káble
  11. 2x rezistor 10k
  12. 6 M3 skrutiek a 6 matíc
  13. malá led žiarovka, E14,rozmer 80x45 mm alebo menšia

Softvér

  1. softvér na technické kreslenie (napr. Autodesk Fusion 360)
  2. Corel - práca s laserom, úprava na vhodný formát pre laser
  3. Arduino IDE


Iné nástroje

  1. pilník
  2. breadboard
  3. spájkovačka
  4. multimeter
  5. vŕtačka + vrták 2.6
  6. skrutkovače

Postup výroby

  1. nakresliť si vhodnú krabicu, prípadne si ju vygenerovať
  2. zložiť krabicu
  3. zapojiť si komponenty, podľa schémy najskôr pomocou breadboard, potom pospájkovať
  4. naprogramovať si Arduino- naimportovať knižnice <dht.h>, <u8glib.h> a odtestovať funkčnosť, napríklad pomocou Serial Monitor
  5. komponenty rozmiestniť, navŕtať diery, namontovať na krabicu pomocou M3 skrutiek
  6. nalepiť tlačidlá a display
  7. odskúšať funkčnosť


link title

RezanieLampy.jpgLampaRozobrata1.JPG LampaRozobrata2.JPG

Médiá:U8glib.rar, Médiá:DHTLib.rar, Médiá:lampaKod.ino, Médiá:lampaKrabica.rar


Použité zdroje:

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

Obvodicek.jpg


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

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.

LampaHotova2.JPG LampaHotova1.jpg

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.