plik


ÿþKURS Kurs Arduino (3) Dodatkowe materiaBy na CD/FTP ObsBuga moduBu LCD W EP 4/2011 opublikowali[my opis moduBu LCD z przyciskami (AVT1615) wspóBpracujcego z pBytk Arduino oraz kompatybiln  AVTduino. W tym artykule poka|emy sposób obsBugi programowej tego moduBu oraz komponentów interfejsu u|ytkownika, które on zawiera: przycisków, potencjometru, generatora piezzo, diod LED oraz czujnika temperatury LM35. Zacznijmy od przykBadów praktycznych rozwizaD, których bdzie mo|na u|y w sa- modzielnie opracowywanych aplikacjach. Na listingu 1 zamieszczono przykBadowy Dodatkowe materiaBy na CD/FTP: program dla moduBu AVT1615. Program ten przez termometr LM35 doBczony do nó|ki ftp://ep.com.pl, user: 10925, pass: 87thc181 wy[wietla komunikat na wy[wietlaczu LCD, A1. Dziki 8-bajtowej tablicy byte st[8]={& } " poprzednie cz[ci kursu mierzy napicie na suwaku potencjometru, zdefiniowano symbol stopnia, który jest u|y- odczytuje temperatur, wy[wietla umowny wany jako jednostka temperatury. numer naci[nitego przycisku oraz za[wieca W funkcji setup() za pomoc komendy Char(0, st), której argumentami s numer umieszczon koBo niego diod LED. Dodatko- lcd.begin(16, 2) zdefiniowano rozdzielczo[ znaku (kod) oraz bajty definicji (w naszym wo, naci[nicie przycisku jest sygnalizowa- zastosowanego wy[wietlacza LCD. Pierwszy wypadku jest to tablica st[]). Komenda ana- ne dzwikiem brzczyka piezzo. parametr okre[la liczb znaków w wierszu logReference(DEFAULT) ustala napicie od- W Arduino do obsBugi moduBów wy[wie- (kolumn) a drugi liczb wierszy. Jak Batwo niesienia dla wewntrznego przetwornika tlaczy z kontrolerem HD44780 jest przezna- domy[li si, w przykBadzie zastosowano A/C mikrokontrolera na napicie zasilajce czona biblioteka LiquidCrystal (LCD) która wy[wietlacz 2×16 znaków. Do utworzenia (w tym wypadku 5 V). Przetwornik mikro- umo|liwia sterowanie moduBem wy[wietla- znaku stopnia sBu|y komenda lcd.create- kontrolera bdzie mierzyB sygnaBy analogowe cza za pomoc interfejsu z 4- lub 8-bitow szyn danych. W tabeli 1 zamieszczono ko- Tabela 1. Komendy obsBugi wy[wietlacza LCD mendy dostpne w tej bibliotece. LiquidCrystal() Definiuje piny do których zostaB doBczony LCD Niektóre z komend wymienionych w ta- begin() Definiuje rozdzielczo[ zastosowanego LCD beli 1 zastosowano w przykBadowym pro- clear() Czy[ci ekran LCD gramie z listingu 1. Jak mo|na zauwa|y, home() Ustawia kursor na pocztku ekranu LCD w programie w pierwszej kolejno[ci doBczo- setCursor() Ustawia kursor w zadanym miejscu LCD no bibliotek obsBugi LCD  LiquidCrystal.h. write() Zapisuje znak do LCD Nastpnie zadeklarowano staBe definiujce print() Zapisuje znak lub znaki do LCD wyprowadzenia, do których doBczono dio- cursor() WBcza kursor dy LED, klawisze i brzczyk piezzo. Dla lep- noCursor() WyBcza kursor szej czytelno[ci programu nadano im Batwe blink() WBcza miganie kursora do zapamitania nazwy. Numery wyprowa- noBlink() WyBcza miganie kursor dzeD s zgodnie z opisem na pBytkach Ardu- display() WBcza ekran LCD ino Uno i Avtduino LCD. Dalej, za pomoc noDisplay() WyBcza ekran LCD komendy LiquidCrystal(rs, enable, d4, d5, d6, scrollDisplayLeft() Przesuwa zawarto[ LCD w lewo d7) zgodnie ze schematem ideowym przypi- scrollDisplayRight() Przesuwa zawarto[ LCD w prawo sano wyprowadzenia, do których zostaB doB- autoscroll() Automatyczne przesuwanie zawarto[ci na LCD czony LCD. W dalszej cz[ci programu utwo- noAutoscroll() WyBczenie automatycznego przesuwania zawarto[ci na LCD rzono zmienne wykorzystywane do oblicze- leftToRight() Ustawia kierunek zapisu tekstu od prawej do lewej nia warto[ci zmierzonego napicia z suwaka rightToLeft() Ustawia kierunek zapisu tekstu od lewej do prawej potencjometru doBczonego do nó|ki A0 createChar() Umo|liwia zdefiniowanie wBasnego znaku oraz do obliczenia temperatury zmierzonej 86 ELEKTRONIKA PRAKTYCZNA 6/2011 Kurs Arduino o napiciu od 0 V do 5 V z rozdzielczo[ci Listing 1. PrzykBadowy program dla moduBu AVT11615 /* 10-bitow. Komendy pinMode() definiuj spo- PrzykBad programu do obsBugi moduBu AVT1615 z: sób pracy portów I/O mikrokontrolera. Linie, - wy[wietlaczem LCD 2x16 znaków - 4 diodami LED które steruj diodami LED oraz generatorem - 4 przyciskami - brzczykiem piezzo piezzo skonfigurowano jako wyj[cia, a linie, - czujnikiem temperatury LM35 do których doBczono przyciski jako wej[cia. */ Za pomoc funkcji digitalWrite() doBczono #include <LiquidCrystal.h> //biblioteka obsBugi LCD rezystory zasilajce pull-up, które polaryzuj wej[cia. Przyci[nicie przycisku zmienia po- const int Led1 = 13; //przypisanie aliasów do pinów portów const int Led2 = 12; ziom doBczonego wej[cia na niski. const int Led3 = 11; W funkcji loop() znajduje si program const int Led4 = 10; const int SW1 = 3; gBówny. W pierwszej kolejno[ci za pomoc const int SW2 = 2; const int SW3 = 1; komendy lcd.clear() jest czyszczony ekran const int SW4 = 0; LCD. Nastpnie, za pomoc komendy lcd.set- const int Buzzer = A5; Cursor(4, 0) kursor jest ustawiany w pierw- LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //konfigurowanie linii do których zostaB doBczony LCD szym wierszu i 5 kolumnie LCD (wspóB- rzdne numerowane s od 0). Komenda lcd. int wart_pot; //zmienna na warto[ zmierzona z potencjometru int wart_czuj; //zmienna na warto[ zmierzonej z czujnika temperatury print( Arduino ) wy[wietla od ustawionej float wart_nap; //zmienna na warto[ zmierzonego napicia pozycji kursora komunikat Arduino. Jako pa- float temperatura; //zmienna na warto[ zmierzonej temperatury rametr funkcji lcd.print() mo|na u|y staBych byte st[8] = { //tablica znaku stopnia dla wy[wietlacza LCD B00100, w cudzysBowie lub zmiennych typu: char, B01010, byte, int, long, string. Funkcja ta ma równie| B00100, B00000, drugi opcjonalny parametr, który umo|liwia B00000, B00000, formatowanie wy[wietlanych liczb. Dozwo- B00000, lone s nastpujce ich formaty: DEC (dzie- }; sitny), BIN (binarny), OCT (ósemkowy) void setup() { //funkcja inicjalizacji i HEX (szesnastkowy). Nastpnie, w pro- lcd.begin(16, 2); //konfigurowanie rozdzielczo[ci LCD lcd.createChar(0, st); //funkcja utworzenia wBasnego znaku z tablicy st gramie przykBadowym za pomoc komendy o kodzie 0 analogReference(DEFAULT); //konfigurowanie napicia odniesienia analogRead(A0) jest odczytywane napicie //dla przetwornika A/C - domy[lnie 5V zmierzone przez przetwornik A/C na wej[ciu pinMode(Led1, OUTPUT); //konfigurowanie I/O, do których s //doBczone diody LED A0. Jak pamitamy, jest to napicie z suwaka pinMode(Led2, OUTPUT); potencjometru. Dla uniknicia bBdów po- pinMode(Led3, OUTPUT); pinMode(Led4, OUTPUT); miar jest wykonywany 20 razy w ptli FOR, pinMode(Buzzer, OUTPUT); //konfigurowanie I/O, do której jest //doBczony brzczyk piezzo jego wynik jest sumowany w zmiennej wart_ pinMode(SW1, INPUT); //konfigurowanie I/O, do których s pot, a nastpnie jest obliczana [rednia aryt- //doBczone przyciski pinMode(SW2, INPUT); metyczna z wyników pomiarów. Za pomoc pinMode(SW3, INPUT); pinMode(SW4, INPUT); wyra|enia wart_nap=(5.0*wart_pot)/1024.0 digitalWrite(SW1, HIGH); //doBczenie wewntrznych rezystorów warto[ obliczonej [redniej jest zamieniana //zasilajcych digitalWrite(SW2, HIGH); na napicie. StaBa  5.0 to napicie odnie- digitalWrite(SW3, HIGH); sienia dla przetwornika, natomiast  1024 to digitalWrite(SW4, HIGH); digitalWrite(Led1, HIGH); //wyBczenie diod LED jego rozdzielczo[. Tak przeliczona warto[ digitalWrite(Led2, HIGH); digitalWrite(Led3, HIGH); zmiennej zostaje wy[wietlona w drugiej linii digitalWrite(Led4, HIGH); wy[wietlacza LCD. digitalWrite(Buzzer, HIGH); //wyBczenie brzczyka piezzo } Podobnie w dalszej cz[ci programu jest void loop() { //ptla gBówna programu wykonywany pomiar temperatury za pomo- lcd.clear(); //czyszczenie LCD c pomiaru napicia na wyj[ciu czujnika lcd.setCursor(4, 0); //ustawienie kursora w 5 kolumnie //pierwszego wiersza LM35. Zmiana temperatury o 1ºC powoduje lcd.print( Arduino ); //wy[wietlenie na LCD napisu Arduino wzrost napicia na wyj[ciu czujnika tempe- //pomiar napicia z potencjometru i dodanie wyniku do wart_pot for (int i = 0; i < 20; i++) { //ptla wykonywana 20 razy ratury o 10 mV. Aatwo wywnioskowa, |e wart_pot = wart_pot + analogRead(A0); } zmiana temperatury o 10ºC bdzie odpowia- //obliczenie [redniej arytmetycznej z 20 pomiarów daBa zmianie napicia wyj[ciowego czujnika wart_pot = wart_pot / 20; //przeliczenie odczytanej warto[ci na napicie o 100 mV. Temperatura jest odczytywana za wart_nap=(5.0*wart_pot)/1024.0; pomoc funkcji analogRead(A1) mierzcej //ustawienie kursora w pierwszej pozycji drugiego wiersza LCD lcd.setCursor(0, 1); równowa|ne jej napicie z czujnika LM35 lcd.print( U= ); //wy[wietlenie napisu U= lcd.print(wart_nap); //wy[wietlenie napicia na wej[ciu A1. Równie| w tym wypadku jest lcd.print( V ); //wy[wietlenie znaku V wykonywane 20 pomiarów, z których jest ob- for (int i = 0; i < 20; i++) { //ptla wykonywana 20 liczana [rednia arytmetyczna. Nastpnie za //pomiar napicia z czujnika temperatury i dodawanie wart_czuj wart_czuj = wart_czuj + analogRead(A1); pomoc wyra|enia temperatura=(5.0*wart_ } czuj*100)/1024.0 liczba odczytana z rejestru //obliczenie [redniej arytmetycznej z 20 pomiarów wart_czuj = wart_czuj / 20; przetwornika A/C jest zamieniana na tempe- //przeliczenie warto[ci na stopnie Celsjusza ratur. Warto[ temperatury jest wy[wietla- temperatura=(5.0*wart_czuj*100)/1024.0; //ustawienie kursora na pozycji 9 drugiego wiersza LCD lcd.setCursor(9, 1); na na wy[wietlaczu w pozycji wskazywanej lcd.print( T= ); //wy[wietlenie napisu T= lcd.print((long)temperatura); przez komend lcd.setCursor(9, 1). Komenda //wy[wietlenie warto[ci temperatury zaokrglonej do peBnych stopni lcd.write(0) powoduje wy[wietlenie po war- lcd.write(0); //wy[wietlenie znaku stopnia to[ci temperatury symbolu stopnia. ELEKTRONIKA PRAKTYCZNA 6/2011 87 KURS W dalszej cz[ci programu umieszczo- Listing 1. c.d. lcd.print( C ); //wy[wietlenie znaku C no cztery bloki podobnych instrukcji obsBu- gujcych przyciski S1...S4 z diodami oraz //sprawdzenie czy naci[nito przycisk S1 if (digitalRead(SW1) == LOW) { brzczyk piezzo. Ich dziaBanie omówimy na digitalWrite(Led1, LOW); //za[wiecenie LED1 digitalWrite(Buzzer, LOW); //wBczenie brzczyka przykBadzie instrukcji odczytujcych stan lcd.clear(); //czyszczenie LCD przycisku S1, poniewa| pozostaBe dziaBaj //ustawienie kursora w pierwszym rzdzie i drugiej kolumnie lcd. setCursor(2, 0); w ten sam sposób. lcd.print( Przycisk S1 ); //wy[wietlenie nazwy przycisku Za pomoc funkcji digitalRead(SW1) jest //oczekiwanie na zwolnienie przycisku S1 while(digitalRead(SW1) == LOW); odczytywany stan wej[cia, do którego doBczo- } else { //w przeciwnym razie digitalWrite(Led1, HIGH); //wyBczenie diody LED1 no przycisk S1. Nastpnie program sprawdza, digitalWrite(Buzzer, HIGH); //wyBczenie brzczyka czy odczytano poziom niski. Je[li tak, to naci- } [nito przycisk i zostaj wykonane instrukcje if (digitalRead(SW2) == LOW) { //sprawdzenie czy naci[nito S2 zawarte w warunku IF. Jako pierwsza jest za- digitalWrite(Led2, LOW); digitalWrite(Buzzer, LOW); [wiecana dioda LED1 za pomoc komendy di- lcd.clear(); lcd.setCursor(2, 0); gitalWrite(Led1, LOW). Kolejna instrukcja  di- lcd.print( Przycisk S2 ); gitalWrite(Buzzer, LOW)  powoduje zaBczenie while(digitalRead(SW2) == LOW); } else { brzczyka piezzo. Nastpnie jest czyszczony digitalWrite(Led2, HIGH); digitalWrite(Buzzer, HIGH); ekran LCD, pozycjonowany kursor oraz wy- } [wietlany komunikat informujcy o numerze if (digitalRead(SW3) == LOW) { //sprawdzenie czy naci[nito S3 wci[nitego przycisku. W ptli while(digital- digitalWrite(Led3, LOW); digitalWrite(Buzzer, LOW); Read(SW1) == LOW) nastpuje oczekiwanie lcd.clear(); na zwolnienie przycisku. Po jej zakoDczeniu s lcd.setCursor(2, 0); lcd.print( Przycisk S3 ); wykonane instrukcje digitalWrite(Led1, HIGH), while(digitalRead(SW3) == LOW); digitalWrite(Buzzer, HIGH) wyBczajce diod } else { digitalWrite(Led3, HIGH); LED oraz brzczyk piezzo. digitalWrite(Buzzer, HIGH); } Kolejne bloki programowe w taki sam sposób obsBuguj pozostaBe przyciski i diody if (digitalRead(SW4) == LOW) { //sprawdzenie czy naci[nito S4 digitalWrite(Led4, LOW); LED. Analogicznie, naci[nicie przycisku S2 digitalWrite(Buzzer, LOW); spowoduje za[wiecenie si LED2, S3 zapali lcd.clear(); lcd.setCursor(2, 0); LED3 itd. Na ekranie LCD bd wy[wietlane lcd.print( Przycisk S4 ); while(digitalRead(SW4) == LOW); odpowiednie komunikaty, a naci[nicie ka|- } else { dego przycisku bdzie sygnalizowane przez digitalWrite(Led4, HIGH); digitalWrite(Buzzer, HIGH); brzczyk piezzo. Program koDczy si instruk- } cj delay(300), która powoduje zwBok o cza- delay(300); //opóznienie o 300ms sie trwania 300 ms. } //koniec ptli gBównej Wicej informacji na temat komend ob- sBugujcych wy[wietlacz LCD mo|na zna- lez na stronach internetowych Arduino Przyciski, w które jest wyposa|ony zestaw W kolejnym odcinku kursu omówimy w informacjach dotyczcych zastosowania AVT1615 umo|liwiaj realizacj interfejsu podobny moduB, jednak wyposa|ony w wy- biblioteki LiquidCrystal. u|ytkownika umo|liwiajcego na przykBad [wietlacze LED. Umo|liwia on na przykBad wprowadzanie nastaw. Niewtpliwym atu- zbudowanie miernika panelowego, zegara Podsumowanie tem s równie| diody LED i brzczyk, któ- i innych urzdzeD. Jednymi z najwa|niej- ModuB LCD zapewne bdzie jednym rych mo|na u|y do sygnalizowania stanu szych cech Arduino s bowiem prostota z najcz[ciej stosowanych we wBasnych apli- budowanego przez siebie urzdzenia, sy- u|ycia i niesamowita wrcz elastyczno[ kacjach. Uniwersalny, umo|liwiajcy wy- gnalizowania alarmów itp. Mam nadziej, platformy umo|liwiajca ró|norodne jej za- [wietlanie liczb, komunikatów tekstowych, |e zaprezentowane przykBady obsBugi wyja- stosowanie. prostych ikon i pasków postpu na pewno [niaj jak mo|na u|y tych elementów we Marcin Wizania bdzie chtnie u|ywany do ró|nych zadaD. wBasnym projekcie. marcin.wiazania@ep.com.pl Oferta dla prenumeratorów Elektroniki Praktycznej Avtduino specjalnie z my[l o elektronikach-praktykach! Od numeru EP 04/2011 rozpoczli[my za darmo jedn, wybran pBytk drukowan kurs programowania mikrokontrolerów AVR moduBu rozszerzenia dla zestawu Avtduino z u|yciem bezpBatnego [rodowiska progra- (zgodne z Arduino), dla których przykBady mistycznego Arduino. Kurs bdzie si opieraB aplikacji przedstawimy w ramach kursu publi- na przykBadach przygotowanych dla pBy- kowanego na Bamach czasopisma. tek rozszerzajcych do bazy (kompatybilnej z systemem moduBów Arduino) wyposa|onej Pierwsze artykuBy kursowe o Arduino m.in. w mikrokontroler ATmega, opisanej opublikowali[my w EP 4/2011 na stronach: w EP1/2011 (odpowiednik Arduino Duemila- 96 i 98. nove, AVT-5272). Opis pierwszego moduBu rozszerzajcego Dla prenumeratorów Elektroniki Prak- do pByty bazowej Avtduino opublikowali[my tycznej przygotowali[my niespodziank: w Elektronice Praktycznej 4/2011 na stronie PBytka bazowa systemu Avtduino bdca bazowym wszystkim prenumeratorom papierowej wer- 47 (AVT-1615), kolejnego w bie|cym nume- sji miesicznika w grudniu 2011 zaoferujemy rze na stronie 55 (AVT-1616). rozwizaniem dla uczestników kursu 88 ELEKTRONIKA PRAKTYCZNA 6/2011

Wyszukiwarka

Podobne podstrony:
Kurs Arduino 2 Oprogramowanie Arduino IDE(1)
Kurs Arduino cz6
Kurs Arduino cz5
Kurs Arduino cz4
Kurs Arduino cz2
Kurs Arduino 4 Obsluga modulu LED
Kurs Arduino cz1
Kurs Arduino
Kurs Arduino 3 Obsluga modulu LCD
Kurs Arduino 5

więcej podobnych podstron