You are on page 1of 19

Arduino vremenska

stanica
Namjena ovog sklopa je isitavanje vrijednosti temperature,
vlage zraka te vremena sa LCD ekrana na ureaju.

Ureaj je sastavljen od nekoliko komponenti koje u detaljno
obraditi u nastavku.

Koristi senzore DHT11 za temperaturu i vlagu zraka te RTC
ureaj DS1307.

Jedna od bitnijih karakteristika ovog ureaja je
funckionalnost praenja vremena bez potrebe za napajanje
cijelog Arduino ureaja, ve uz koritenje RTC (Real Time
Clock) sklopa on uz svoje vlastito napajanje kroz bateriju
(3,7V Li-Ion Button cell) funkcionira bez gubitaka tonosti i
potrebe za sinkronizacijom.
Temperaturu i vlagu zraka isitavamo iz DHT11 senzora
tonosti +-5%RH, +-2C sa spektrom oitanja od 20-90%RH,
0-50C (RH - Relative Humidity).
Sve komponente povezane su sa Arduino Mega-2560
ureajem uz pomo shield ploice za nadogradnju s
repliciranjem izvoda uz koju ne gubimo mogunost daljnje
nadogradnje ili izmjena u sklopu.
I
Openito o Arduinu i
mikrokontrolerima

Mikrokontroleri openito
Mikrokontroleri su programabilni elektroniki ureaji koji u sebi sadre jezgru procesora,
memoriju i I/O mogunosti. Tipino imaju malu koliinu radne memorije ugraenu u ip.
Zbog jednostavnosti programiranja i skromnih zahtjeva napajanja i radnog okruenja imaju
irok spektar uporabe. esto ih nalazimo u industriji u sklopu automatskog kontroliranja
raznih ureaja, u industriji automobila, ASIC ureajima i sl.
ATMEL AVR openito
ATMEL AVR je serija ATMEL-ovih 8-bit i 32-bit mikrokontrolera koje sreemo na Arduino
ploicama.
Arduino ureaj koji u ja koristiti za ovaj projekt ima integriran ATMEGA2560 kontroler koji
nudi visoki nivo integracije (On-Chip memorija, SRAM, interni EEPROM, SPI, USB, interni
ili eksterni oscilator, I/O pinove), napredne analogne mogunosti poput ADC i DAC,
regulaciju napona izlaza, ugraeni temperaturni senzor.
ATMega2560 koristi Atmelovu picoPower tehnologiju koja nudi vrlo nisku potronju
elektrine energije i mogunost sleep-modea stoga ga lako moemo koristiti u uvijetima gdje
smo ogranieni s potronjom elektrine energije poput napajanja putem baterije ili integriranja
u neki postojei ureaj. Kako koristi vrlo malo elektrine energije tako ne stvara niti mnogo
topline tokom rada.
ATMega2560-16AU radi na taktu od 16MHz, sadri 256 kilobajta flash memorije i ima
mogunost od 86 I/O pinova. Radi na temperaturi od -40C do 85C te se napaja sa naponom
od 4.5V do 5.5V.
Komunikacija Arduino ploice s PC-om
Arduino za razliku od mnogih drugih mikrokontrolera ima integrirani bootloader na samoj
ploi to nam nudi mogunost jednostavnog spajanja Arduino ploice sa raunalom putem
USB porta.
Arduino hardver se programira kroz integrirano razvojno okruenje programirano u Java
jeziku koje sadri compiler, debug i upload/download koda na ip.
II
Komponente unutar sklopa,
njihove karakteristike te
funckija istih unutar sklopa.




U ovom poglavlju opisat u pojedinano
komponente i senzore unutar sklopa; njihovu namjenu,
karakteristike te njihove komponente.

Hardverski dio sklopa sastoji se od senzora koji
nam kroz odreene protokole alju informacije u
mikroprocesor, mikroprocesor za dalje procesiranje
informacija dobivenih od strane senzora te LCD 16x2
ekrana za ispis vrijednosti senzora.
II.1
DS1307 64x8 I2C Serial Real Time Clock

Ovaj sklop nam slui za praenje vremena te ispis istog kroz serijsku komunikaciju.
Ima mogunost praenja sekundi, minuta, sata, datuma, mjeseca, dana u mjesecu te godine uz
kompenzaciju prijestupnih godina do 2100.
Vrijednosti ispisuje kroz I2C serijski protokol uz koritenje binarno kodiranih decimalnih
znamenki (BCD) za izraavanje vrijednosti, kroz programski dio te vrijednosti moemo lako
pretvoriti u tekst za sluaj mjeseca ili dana u tjednu.
Funkcionira u 24-satnom ili 12-satnom modu uz naznaku AM/PM.
DS1307 napaja se zavisno o stanju cijelog sklopa; ako Arduino ureaj funkcionira i ima svoje
napajanje kroz USB, bateriju, sl. tada on napajanje vri kroz Arduino, dok u sluaju nestanka
napajanja unutar sklopa automatski prebacuje napajanje na svoju internu bateriju bez gubitka
tonosti ili prestanka rada.
Ispravno radi na temperaturama od -40C do +85C te podrava vanjsko napajanje od 5V.
Kako se napaja kroz bateriju napona 3,7V ima integriranu funkciju detekcije prazne baterije
kroz oitanje Vbat = 3.0V ; to je definirano kao Power-Fail Voltage i tada se sklop vie
nee napajati kroz svoju internu bateriju u sluaju nestanka vanjskog napajanja sklopa.
Sam DS1307 ne optereuje bateriju mnogo, tipino crpi struju od 5nA a maksimalno 50nA to
osigurava dug vijek baterije bez potrebe za zamjenom.
DS1307 komunicira s Arduinom kroz dva izvoda serijskog protokola.
Izvode SDA i SCL spajamo na odgovarajue pinove na Arduino ureaju koji mogu varirati od
modela do modela.
Frekvencija SCL je maksimalno 100kHz te DS1307 optereuje I2C liniju s 10pF kapacitetom.
Sklop koristi eksterni 3,768kHz kvarcni oscilator te ne zahtjeva spajanje niti jedne eksterne
komponente poput otpornika ili kondenzatora.

II.2
DHT11 Serial senzor vlage i temperature zraka


DHT11 je sklop senzora sa zadaom mjerenja temperature te relativne vlage zraka u
spektru od 0-50C uz tonost +-2C te mjerenje vlage zraka u spektru od 20-90%RH uz
tonost od +-5%RH.
Sastoji se od dva odvojena senzora; komponentom baziranom na otporu za mjerenje vlage
zraka te NTC komponentom za mjerenje temperature zraka.
Ima mogunost mjerenja temperature u spektru od 0-50C uz tonost +-2C te mjerenje vlage
zraka u spektru od 20-90%RH uz tonost od +-5%RH.
Vrijeme za koje moe oitati vrijednosti te ih ispisati je minimalno 6 sekundi, zato pri
pokretanju ureaja vidimo kratak delay u ispisu u odnosu na RTC koji svoje vrijednosti
odmah ispie kroz Arduino na LCD ekran.
Period mjerenja vrijednosti iznosi 1 sekundu.
DHT11 napajamo vanjskim izvorom napajanja od 3-5.5V te je preporuljivo dodati 100nF
kondenzator za glaenje; no uz napajanje iz Arduina to nije potrebno kako on ve ukljuuje
filter napona na ploici.
Ne optereuje napajanje drastino s obzirom da mu je potrebna struja od 0,5mA u stanju
mjerenja vrijednosti te 100uA u stanju mirovanja.
Spajamo ga koristei One Wire protokol koji ukljuuje samo jedan serial izvod spojen na
arduino.
Cjeloviti prijenos oitanih vrijednosti iznosi 40bitova.

II.3
Serial Alphanumeric LCD 16x2 display


Serijski LCD ekran omoguava nam ispis te oitanje izmjerenih vrijednosti sa senzora.
Sastoji se od LCD panela i pozadinskog osvjetljenja u mnotvu varijanti, u ovom projektu
koristim zeleno pozadinsko osvjetljenje.
LCD ima ukupno 15 pinova no u ovom sluaju zahtijeva spajanje samo zadnja 4
komunikacijska pina na Arduino gde prvih 4 ostaju neiskoriteni a ostatak slui za napajanje
samog panela, pozadinskog osvjetljenja te reguliranje kontrasta LCD-a.
Serijska komunikacija alfanumerikog LCD-a s Arduinom vri se preko 4 data linije
D4, D5, D6 i D7 te preko E (enable) i RS (Register Select) pinova, no o tome e mo vie u
programskom poglavlju.
LCD napajamo preko napajanja Arduino ploice (5V, DC) te zahtjeva posebno napajanje
panela i pozadinskog osvjetljenja, dok izvod za kontrast spajamo uz otpornik ili
potenciometar sa masom (GND).
Slijede slike sklopa, izvoda i korisne tablice:



Programiranje novih znakova za ispis na LCDu vri se unutar koda uploadanog na Arduino
ureaj.
Za sve LCD display ureaje sa Hitachi HD44780 driverom programiranje novih znakova vri
se na sljedei nain: ...
Kako je svako polje za prikaz znaka podjeljeno na 8 horizontalnih linija i 5 vertikalnih
stupova od kojih svaki pixel moe imati stanje 1 ili 0 poto je ovo monokromatski LCD;
u kodu definiramo stanje pixela sa:

byte customChar[8] = { 0bXXXXX, ... };

Gdje svaki X u kodu znai stanje pixela 1 ili 0 (zacrnjen ili prazan).
Ovdje je primjer koda generiranog s lcdchargen alatom koji moemo nai na
omerk.github.io/lcdchargen

byte customChar[8] = {
0b11111,
0b10001,
0b10001,
0b10001,
0b10001,
0b10001,
0b10001,
0b11111
};

Ubacivanjem ovog koda u na postojei kod stvorit e mo novi znak u obliku pravokutnika.
No nismo gotovi sa ubacivanjem znaka jo, moramo taj znak ubaciti na LCD pomou
lcd.createChar(0, customChar);


III
Spajanje komponenata i
senzora s Arduinom.



U ovom poglavlju opisat u naine spajanja komponenti
s Arduino kontrolerom, ulaze i izlaze na koje spajamo
pojedine komponente te komunikacijske protokle istih.

III.1
Spajanje senzora na I/O pinove

III.1.1 DHT11 spoj i komunikacija
Komunikacija DHT11 senzora s Arduinom vri se kroz One Wire protokol koristei
jednu liniju serijske komunikacije kroz koju u razlicitim vremenskim intervalima prolaze
informacije o trenutnoj temperaturi zraka i relativnoj vlazi.
Potpun prijenos oitanja s DHT11 iznosi 40bita te se informacije alju u formatu: 8bit
RH integer data -> 8bit RH decimal data -> 8bit Temp integer data -> 8bit Temp decimal data
+ 8bit checksum.
Provjera prijenosa vri se kroz checksum koji bi trebao biti zadnjih 8 bitova od prve 4
vrijednosti prijenosa (RH integer, RH decimal, T integer, T decimal)

III.1.2 DS1307 spoj i komunikacija
DS1307 RTC s Arduinom komunicira preko I2C serijskog protokola koristei dvije
linije za komunikaciju, SDA i SCL koje spajamo na odgovarajuce pinove te namjene na
Arduino ureaju.
U sluaju Arduino MEGA2560 ploice SDA i SCL spajamo na pinove broj 20 i 21, no
na drugim ploicama ne mora biti tako.


III.2
Komunikacija preko I2C sabirnice


Za komunikaciju izmeu komponenti unutar sklopa (senzori, LCD i sl.) koristimo neku od
serijskih sabirnica.
Serijska komunikacija izmeu komponentu omoguava prijenos jednog bita u datom trenutku
te se bitovi serijski prenose do odredita.
Postoji mnotvo sabirnica no spomenuti emo samo I2C sabirnicu jer u ovom projektu samo
nju koristimo (DS1307).

I2C je sabirnica razvijena od tvrtke Philips Semiconductors za potrebe unutar tvrtke, no
standard je kasnije objavljen i slobodan je za koritenje bez licence.
I2C je sinkrona, serijska sabirnica koju emo u ovom projektu koristiti za komunikaciju RTC
i DHT11 senzora s Arduino ploicom.
I2C suelje nalazimo kod mikrokontrolera, LCD ureaja, EEPROM memorija i ostalih
memorija.
Komponente se na I2C sabirnicu spajaju izravno bez potrebe dodavanja drugih komponenti.
Broj komponenata spojenih na sabirnicu ogranien je samo graninim kapacitetom po liniji
to iznosi 400pF.
Komunikacija I2C sabirnicom vri se kroz dvije linije.
SDA Serial Data, kojom se nose podatci
SCL Serial Clock, kojom se nosi takt
Brzine prijenosa podataka unutar sabirnice ovise o nainu rada:
Low speed mode 10kbps
Standard mode 100kbps
Fast mode 400kbps
High-speed mode 3072kbps

Svaka komponenta unutar I2C sabirnice moe biti master ili slave.
Master kontrolira SCL liniju te zapoinje komunikaciju davanjem takta na sabirnici.
Na sabirnicu je mogue prikljuiti vie master i slave ureaja, no kada jedan master zapone
komunikaciju tada on kontrolira SCL liniju te niti jedan drugi master ne smije zapoinjati
komunikaciju.

III.3
Shema sklopa


IV
Programski dio projekta


U ovom poglavlju priloiti u kod uploadan na Arduino
ureaj, komentirati funkcije i library-e koje sam koristio
te poneto objasniti o programiranju Arduino ureaja
openito.

IV.1
Openito o programiranju u Arduino okruenju.




Arduino ureaji programiraju se pomou Arduino IDEa na raunalima Linux, Windows ili
Mac operativnog sustava te ak i pomou Android ureaja kroz ArduinoDroid aplikaciju te
namjene.
Stuktura koda je jednostavna, imamo Setup i Loop funkcije u kojima piemo svoj kod.
void setup()
{
kod;
}

void loop()
{
kod;
}

Setup() funkciju pozivamo pri poetku
programa, u njoj definiramo pinove,
zapoinjemo serijsku komunikaciju i slino.
Setup mora biti pozvan na poetku programa
iako nemora sadravati nikakav kod.
Loop() funkcija vrti kod upisan u nju
od poetka do kraja tokom rada ureaja.
Kod uploadamo na Arduino pomou
IDEa u kojem ga piemo tako da stisnemo plavi
gumb sa strelicom u gornjem ljevom uglu
suelja.
Slika: flowchart Arduino programa.

IV.2
Programski kod projekta
Arduino vremenska stanica

1. #include <dht11.h>
2. #include <Wire.h>
3. #include <LiquidCrystal.h>
4. #include <Time.h>
5. #include <DS1307RTC.h>
6.
7.
8. //const char* zile[] =
9. const char* luni[] =
10. {"Dec", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov" };
11.
12. byte termometru[8] = // Ubaeni znak za temperaturu C
13. {
14. B00100,
15. B01010,
16. B01010,
17. B01110,
18. B01110,
19. B11111,
20. B11111,
21. B01110
22. };
23.
24. byte picatura[8] = // Ubaeni znak kapljica za oznaku vlage zraka
25. {
26. B00100,
27. B00100,
28. B01010,
29. B01010,
30. B10001,
31. B10001,
32. B10001,
33. B01110,
34. };
35.
36. LiquidCrystal lcd(11,6,10,9,8,7);
37. dht11 DHT11;
38. /*-----( Definiranje pinova, senzora, etc... )-----*/
39. #define DHT11PIN 5
40.
41. void setup()
42. {
43. Wire.begin();
44. lcd.begin(16,2);
45. lcd.clear();
46. lcd.createChar(1,termometru); // Ubacivanje novih znakova u LCD
47. lcd.createChar(2,picatura);
48.
49. Wire.beginTransmission(0x68); // Poetak I2C komunikacije sa DS1307 RTC-om
50. Wire.write(0x07);
51. Wire.write(0x10);
52. Wire.endTransmission();
53.
54. setSyncProvider(RTC.get);
55.
56.
57. void loop()
58. {
59. afisare_temperatura(); //displaying temperature
60. data_si_ora(); //displaying date and time
61. }
62. void afisare_temperatura()
63. {
64. int chk = DHT11.read(DHT11PIN);
65. lcd.setCursor(1, 1);
66. lcd.write(1);
67. lcd.setCursor(3, 1);
68. lcd.print((float)DHT11.temperature, 0);
69. lcd.setCursor(5, 1);
70. lcd.print((char)223);
71. lcd.print("C");
72.
73. lcd.setCursor(9, 1);
74. lcd.write(2);
75. lcd.setCursor(11, 1);
76. lcd.print((float)DHT11.humidity, 0);
77. lcd.print("%");
78. delay(2000);
79.
80. }
81.
82.
83. void data_si_ora()
84. {
85.
86. tmElements_t tm;
87. (RTC.read(tm));
88.
89. lcd.setCursor(0, 0);
90. afisare2cifre(tm.Hour);
91. lcd.print(":");
92. afisare2cifre(tm.Minute);
93. lcd.setCursor(7,0);
94. afisare2cifre(tm.Day);
95. lcd.print(" ");
96. lcd.print(tm.Month[luni]);
97. lcd.print(" ");
98. lcd.print(tmYearToCalendar(tm.Year)-2000);
99. }
100. void afisare2cifre(int numar) {
101. if (numar >= 0 && numar < 10) {
102. lcd.write('0');
103. }
104. lcd.print(numar);
105. }

IV.2
Opis programskog koda projekta
Arduino vremenska stanica

You might also like