Upload
dnemec7923
View
361
Download
2
Embed Size (px)
DESCRIPTION
Arduino vremenska stanica
Citation preview
Arduino vremenska
stanica
Namjena ovog sklopa je isčitavanje vrijednosti temperature,
vlage zraka te vremena sa LCD ekrana na uređaju.
Uređaj je sastavljen od nekoliko komponenti koje ću detaljno
obraditi u nastavku.
Koristi senzore DHT11 za temperaturu i vlagu zraka te RTC
uređaj DS1307.
Jedna od bitnijih karakteristika ovog uređaja je
funckionalnost praćenja vremena bez potrebe za napajanje
cijelog Arduino uređaja, već uz korištenje RTC (Real Time
Clock) sklopa on uz svoje vlastito napajanje kroz bateriju
(3,7V Li-Ion „Button cell“) funkcionira bez gubitaka točnosti i
potrebe za sinkronizacijom.
Temperaturu i vlagu zraka isčitavamo iz DHT11 senzora
točnosti +-5%RH, +-2°C sa spektrom očitanja od 20-90%RH,
0-50°C (RH - Relative Humidity).
Sve komponente povezane su sa Arduino Mega-2560
uređajem uz pomoć „shield“ pločice za nadogradnju s
repliciranjem izvoda uz koju ne gubimo mogućnost daljnje
nadogradnje ili izmjena u sklopu.
I Općenito o Arduinu i
mikrokontrolerima
Mikrokontroleri općenito
Mikrokontroleri su programabilni elektronički uređaji koji u sebi sadrže jezgru procesora,
memoriju i I/O mogućnosti. Tipično imaju malu količinu radne memorije ugrađenu u čip.
Zbog jednostavnosti programiranja i skromnih zahtjeva napajanja i radnog okruženja imaju
širok spektar uporabe. Često ih nalazimo u industriji u sklopu automatskog kontroliranja
raznih uređaja, u industriji automobila, ASIC uređajima i sl.
ATMEL AVR općenito
ATMEL AVR je serija ATMEL-ovih 8-bit i 32-bit mikrokontrolera koje srećemo na Arduino
pločicama.
Arduino uređaj 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 mogućnosti poput ADC i DAC,
regulaciju napona izlaza, ugrađeni temperaturni senzor.
ATMega2560 koristi Atmelovu picoPower tehnologiju koja nudi vrlo nisku potrošnju
električne energije i mogućnost sleep-modea stoga ga lako možemo koristiti u uvijetima gdje
smo ograničeni s potrošnjom električne energije poput napajanja putem baterije ili integriranja
u neki postojeći uređaj. Kako koristi vrlo malo električne energije tako ne stvara niti mnogo
topline tokom rada.
ATMega2560-16AU radi na taktu od 16MHz, sadrži 256 kilobajta flash memorije i ima
mogućnost od 86 I/O pinova. Radi na temperaturi od -40°C do 85°C te se napaja sa naponom
od 4.5V do 5.5V.
Komunikacija Arduino pločice s PC-om
Arduino za razliku od mnogih drugih mikrokontrolera ima integrirani bootloader na samoj
ploči što nam nudi mogućnost jednostavnog spajanja Arduino pločice sa računalom putem
USB porta.
Arduino hardver se programira kroz integrirano razvojno okruženje programirano u Java
jeziku koje sadrži compiler, debug i upload/download koda na čip.
II Komponente unutar sklopa,
njihove karakteristike te
funckija istih unutar sklopa.
U ovom poglavlju opisat ću pojedinačno
komponente i senzore unutar sklopa; njihovu namjenu,
karakteristike te njihove komponente.
Hardverski dio sklopa sastoji se od senzora koji
nam kroz određene 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 služi za praćenje vremena te ispis istog kroz serijsku komunikaciju.
Ima mogućnost praćenja sekundi, minuta, sata, datuma, mjeseca, dana u mjesecu te godine uz
kompenzaciju prijestupnih godina do 2100.
Vrijednosti ispisuje kroz I2C serijski protokol uz korištenje binarno kodiranih decimalnih
znamenki (BCD) za izražavanje vrijednosti, kroz programski dio te vrijednosti možemo lako
pretvoriti u tekst za slučaj 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 uređaj funkcionira i ima svoje
napajanje kroz USB, bateriju, sl. tada on napajanje vrši kroz Arduino, dok u slučaju nestanka
napajanja unutar sklopa automatski prebacuje napajanje na svoju internu bateriju bez gubitka
točnosti ili prestanka rada.
Ispravno radi na temperaturama od -40°C do +85°C te podržava vanjsko napajanje od 5V.
Kako se napaja kroz bateriju napona 3,7V ima integriranu funkciju detekcije prazne baterije
kroz očitanje Vbat = 3.0V ; to je definirano kao „Power-Fail Voltage“ i tada se sklop više
neće napajati kroz svoju internu bateriju u slučaju nestanka vanjskog napajanja sklopa.
Sam DS1307 ne opterećuje bateriju mnogo, tipično 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 odgovarajuće pinove na Arduino uređaju koji mogu varirati od
modela do modela.
Frekvencija SCL je maksimalno 100kHz te DS1307 opterećuje 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 zadaćom mjerenja temperature te relativne vlage zraka u
spektru od 0-50°C uz točnost +-2°C te mjerenje vlage zraka u spektru od 20-90%RH uz
točnost 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 mogućnost mjerenja temperature u spektru od 0-50°C uz točnost +-2°C te mjerenje vlage
zraka u spektru od 20-90%RH uz točnost od +-5%RH.
Vrijeme za koje može očitati vrijednosti te ih ispisati je minimalno 6 sekundi, zato pri
pokretanju uređaja vidimo kratak delay u ispisu u odnosu na RTC koji svoje vrijednosti
odmah ispiše kroz Arduino na LCD ekran.
Period mjerenja vrijednosti iznosi 1 sekundu.
DHT11 napajamo vanjskim izvorom napajanja od 3-5.5V te je preporučljivo dodati 100nF
kondenzator za glađenje; no uz napajanje iz Arduina to nije potrebno kako on već uključuje
filter napona na pločici.
Ne opterećuje napajanje drastično s obzirom da mu je potrebna struja od 0,5mA u stanju
mjerenja vrijednosti te 100uA u stanju mirovanja.
Spajamo ga koristeći „One Wire“ protokol koji uključuje samo jedan serial izvod spojen na
arduino.
Cjeloviti prijenos očitanih vrijednosti iznosi 40bitova.
II.3
Serial Alphanumeric LCD 16x2 display
Serijski LCD ekran omogućava nam ispis te očitanje izmjerenih vrijednosti sa senzora.
Sastoji se od LCD panela i pozadinskog osvjetljenja u mnoštvu varijanti, u ovom projektu
koristim zeleno pozadinsko osvjetljenje.
LCD ima ukupno 15 pinova no u ovom slučaju zahtijeva spajanje samo zadnja 4
komunikacijska pina na Arduino gde prvih 4 ostaju neiskorišteni a ostatak služi za napajanje
samog panela, pozadinskog osvjetljenja te reguliranje kontrasta LCD-a.
Serijska komunikacija alfanumeričkog LCD-a s Arduinom vrši se preko 4 data linije
D4, D5, D6 i D7 te preko E (enable) i RS (Register Select) pinova, no o tome će mo više u
programskom poglavlju.
LCD napajamo preko napajanja Arduino pločice (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 vrši se unutar koda uploadanog na Arduino
uređaj.
Za sve LCD display uređaje sa Hitachi HD44780 driverom programiranje novih znakova vrši
se na sljedeći način: ...
Kako je svako polje za prikaz znaka podjeljeno na 8 horizontalnih „linija“ i 5 vertikalnih
„stupova“ od kojih svaki pixel može imati stanje 1 ili 0 pošto je ovo monokromatski LCD;
u kodu definiramo stanje pixela sa:
byte customChar[8] = { 0bXXXXX, ... };
Gdje svaki X u kodu znači stanje pixela 1 ili 0 (zacrnjen ili prazan).
Ovdje je primjer koda generiranog s „lcdchargen“ alatom koji možemo naći na
omerk.github.io/lcdchargen
byte customChar[8] = {
0b11111,
0b10001,
0b10001,
0b10001,
0b10001,
0b10001,
0b10001,
0b11111
};
„Ubacivanjem“ ovog koda u naš postojeći kod stvorit će mo novi znak u obliku pravokutnika.
No nismo gotovi sa ubacivanjem znaka još, moramo taj znak „ubaciti“ na LCD pomoću
lcd.createChar(0, customChar);
III Spajanje komponenata i
senzora s Arduinom.
U ovom poglavlju opisat ću načine 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 vrši se kroz „One Wire“ protokol koristeći
jednu liniju serijske komunikacije kroz koju u razlicitim vremenskim intervalima prolaze
informacije o trenutnoj temperaturi zraka i relativnoj vlazi.
Potpun prijenos očitanja 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 vrši 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 koristeći dvije
linije za komunikaciju, SDA i SCL koje spajamo na odgovarajuce pinove te namjene na
Arduino uređaju.
U slučaju Arduino MEGA2560 pločice SDA i SCL spajamo na pinove broj 20 i 21, no
na drugim pločicama ne mora biti tako.
III.2
Komunikacija preko I2C sabirnice
Za komunikaciju između komponenti unutar sklopa (senzori, LCD i sl.) koristimo neku od
serijskih sabirnica.
Serijska komunikacija između komponentu omogućava prijenos jednog bita u datom trenutku
te se bitovi serijski prenose do odredišta.
Postoji mnoštvo 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 korištenje bez licence.
I2C je sinkrona, serijska sabirnica koju ćemo u ovom projektu koristiti za komunikaciju RTC
i DHT11 senzora s Arduino pločicom.
I2C sučelje nalazimo kod mikrokontrolera, LCD uređaja, EEPROM memorija i ostalih
memorija.
Komponente se na I2C sabirnicu spajaju izravno bez potrebe dodavanja drugih komponenti.
Broj komponenata spojenih na sabirnicu ograničen je samo graničnim kapacitetom po liniji
što iznosi 400pF.
Komunikacija I2C sabirnicom vrši 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 načinu rada:
Low speed mode – 10kbps
Standard mode – 100kbps
Fast mode – 400kbps
High-speed mode – 3072kbps
Svaka komponenta unutar I2C sabirnice može biti master ili slave.
Master kontrolira SCL liniju te započinje komunikaciju davanjem takta na sabirnici.
Na sabirnicu je moguće priključiti više master i slave uređaja, no kada jedan master započne
komunikaciju tada on kontrolira SCL liniju te niti jedan drugi master ne smije započinjati
komunikaciju.
III.3
Shema sklopa
IV Programski dio projekta
U ovom poglavlju priložiti ću kod uploadan na Arduino
uređaj, komentirati funkcije i library-e koje sam koristio
te ponešto objasniti o programiranju Arduino uređaja
općenito.
IV.1
Općenito o programiranju u Arduino okruženju.
Arduino uređaji programiraju se pomoću Arduino IDEa na računalima Linux, Windows ili
Mac operativnog sustava te čak i pomoću Android uređaja kroz ArduinoDroid aplikaciju te
namjene.
Stuktura koda je jednostavna, imamo „Setup“ i „Loop“ funkcije u kojima pišemo svoj kod.
void setup()
{
kod;
}
void loop()
{
kod;
}
Setup() funkciju pozivamo pri početku
programa, u njoj definiramo pinove,
započinjemo serijsku komunikaciju i slično.
Setup mora biti pozvan na početku programa
iako nemora sadržavati nikakav kod.
Loop() funkcija „vrti“ kod upisan u nju
od početka do kraja tokom rada uređaja.
Kod uploadamo na Arduino pomoću
IDEa u kojem ga pišemo tako da stisnemo plavi
gumb sa strelicom u gornjem ljevom uglu
sučelja.
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] = // Ubačeni 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] = // Ubačeni 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); // Početak 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“