19

Arduino Maturalni Rad

Embed Size (px)

DESCRIPTION

Arduino vremenska stanica

Citation preview

Page 1: Arduino Maturalni Rad
Page 2: Arduino Maturalni Rad

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.

Page 3: Arduino Maturalni Rad

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.

Page 4: Arduino Maturalni Rad

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.

Page 5: Arduino Maturalni Rad

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.

Page 6: Arduino Maturalni Rad

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.

Page 7: Arduino Maturalni Rad

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:

Page 8: Arduino Maturalni Rad
Page 9: Arduino Maturalni Rad

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);

Page 10: Arduino Maturalni Rad

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.

Page 11: Arduino Maturalni Rad

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.

Page 12: Arduino Maturalni Rad

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.

Page 13: Arduino Maturalni Rad

III.3

Shema sklopa

Page 14: Arduino Maturalni Rad

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.

Page 15: Arduino Maturalni Rad

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.

Page 16: Arduino Maturalni Rad

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);

Page 17: Arduino Maturalni Rad

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. }

Page 18: Arduino Maturalni Rad

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. }

Page 19: Arduino Maturalni Rad

IV.2

Opis programskog koda projekta

„Arduino vremenska stanica“