Kurs Arduino cz4


KURS
Obsługa modułu LED
W  Elektronice Praktycznej Dodatkowe materiały
na CD/FTP
5/2011 opisaliśmy moduł
LED dla popularnego zestawu
Arduino. W tym artykule
pokażemy sposoby wyświetlania
znaków oraz obsługi elementów,
z których składa się ten moduł:
dwóch przycisków, zegara RTC
PCF8583, generatora piezo,
czujnika temperatury DS18B20
oraz fotorezystorowego czujnika
światła.
Åšrodowisko programistyczne Ardu-
ino zawiera gotowe funkcje obsługi zegara
PCF8583 oraz termometru DS18B20, co po
zaimplementowaniu obsługi wyświetlacza
LED pozwala na szybkie, samodzielne zbu-
Dodatkowe materiały na CD/FTP:
dowanie funkcjonalnego zegara z termome-
ftp://ep.com.pl, user: 16732, pass: 630v2nfb
trem lub obu tych przyrządów niezależnie.
Na listingu 1 pokazano przykładowy
Listing 1. Przykład programu obsługującego moduł AVTduino LED
program testowy dla modułu AVTduino
LED. Po krótkiej demonstracji tj. wyświetle- #include  TimerOne.h //biblioteka obslugi timera
#include //biblioteka i2c
niu znaków  0   9 jest wyświetlany czas
#include //biblioteka RTC
#include //biblioteka 1Wire
odczytany z zegara RTC i migocze kropka
dziesiętna, sygnalizując w ten sposób pracę
OneWire ds(A3); // konfigurowanie 1Wire
byte present = 0;
zegara. Po naciśnięciu przycisku S1 jest wy-
byte data[12];
świetlana temperatura otoczenia zmierzona byte addr[8];
int wart_analog;
za pomocÄ… czujnika DS18B20 z interfejsem
int HighByte, LowByte, SignBit, temp, Fract, TReading, Tc_100;
PCF8583 p (0xA0); //konfigurowanie RTC
1-Wire. Po naciśnięciu przycisku S2 jest wy-
const int Buzzer = 13; //aliasy
świetlana data odczytana z wewnętrznego
const int DP = 12;
const int SW1 = A1;
kalendarza układu RTC. Po zaciemnieniu
const int SW2 = A2;
const int sens_sw = A0;
fotorezystora jest włączany generator piezo.
int groundPins[8] = {0, 1, 2, 3, 4, 5, 6, 7}; //wiersze LED
Nie jest to być może użyteczna funkcja, ale
int digitPins[4] = { 8, 9, 10, 11}; //kolumny LED
int wys=0;
służy ona jedynie do demonstracji sposobu
int digit[4]; //tablica znakow dla wyswietlacza LED
odczytu napięcia z czujnika światła. int kr[4]; //tablica przechowujaca znak kropki
byte temp_sec;
Do obsługi programowej układów i ko-
byte wsk_sek=1;
int number[13][7] = { //tablica znakow dla LED
munikacji za pomocÄ… I2C (zegar RTC) oraz
{0,0,0,0,0,0,1}, //zero
1-Wire (termometr) zastosowano funkcje
{1,0,0,1,1,1,1}, //jeden
{0,0,1,0,0,1,0}, //dwa
dostępne w bibliotekach. Środowisko widzi
{0,0,0,0,1,1,0}, //trzy
je po skopiowaniu do podkatalogu Library {1,0,0,1,1,0,0}, //cztery
{0,1,0,0,1,0,0}, //piec
oprogramowania Arduino IDE. SÄ… to OneWi-
{0,1,0,0,0,0,0}, //szesc
{0,0,0,1,1,1,1}, //siedem
re i PCF8583 (dostępne na stronie domowej
{0,0,0,0,0,0,0}, //osiem
Arduino oraz w materiałach dodatkowych).
{0,0,0,0,1,0,0}, //dziewiec
{1,1,1,1,1,1,1}, //wylaczenie LED
Do obsługi wyświetlacza modułu AVTduino
{0,0,1,1,1,0,0}, //znak stopnia
LED brak gotowej biblioteki  tę należy wy- {0,1,1,0,0,0,1} //znak C
};
konać samodzielnie lub wykorzystać opisane
void setup() //procedura konfigurujaca
dalej rozwiÄ…zanie.
{
Wyświetlacz jest multipleksowany. Jego Timer1.initialize(100); //inicjalizacja timera 1
Timer1.attachInterrupt(int_wys); //uruchomienie przerwania
obsługa odbywa się w przerwaniu genero-
for(int i=0; i < 8; i++) //wyjscia obslugi wierszy LED
{
wanym przez Timer1 co 100 ms. Do gene-
pinMode(groundPins[i], OUTPUT);
rowania samych przerwań zastosowano bi- digitalWrite(groundPins[i], HIGH);
}
bliotekę Timerone (dostępna w materiałach
pinMode(Buzzer, OUTPUT); //konfigurowanie linii piezo
digitalWrite(Buzzer, HIGH);
dodatkowych).
pinMode(DP, OUTPUT); //konfigurowanie dwukropka
Na początku programu głównego in-
digitalWrite(DP, HIGH);
strukcja OneWire ustala liniÄ™ komunikacyjnÄ…
90 ELEKTRONIKA PRAKTYCZNA 7/2011
Obsługa modułu LED
interfejsu 1-Wire, którą w tym przypadku
Listing 1. Przykład programu obsługującego moduł AVTduino LED
for(int i=0; i < 4; i++) //konfigurowanie kolumn LED
jest linia A3. Instrukcja PCF8583 pcf(0xA0)
{
z biblioteki PCF8583 umożliwia zapisanie
pinMode(digitPins[i], OUTPUT);
digitalWrite(digitPins[i], HIGH);
adresu układu RTC, który ma wartość 0xA0.
}
p.hour = 14; //inicjalizacja RTC
Tablica groundPins[8] zawiera linie wierszy
p.minute = 30;
wyświetlacza, natomiast tablica digitPins[4]
p.second = 0;
p.year = 2011;
linie kolumn wyświetlacza LED. Do tablicy
p.month = 4;
p.day = 1; digit[] będą zapisywane wartości wyświet-
p.set_time();
lane na wyświetlaczu LED w taki sposób,
pinMode(SW1, INPUT); //linie przyciskow
pinMode(SW2, INPUT);
że każdemu wyświetlaczowi odpowiada
digitalWrite(SW1, HIGH); //zalaczenie pull-up
pojedynczy element tablicy digit[]. Tablica
digitalWrite(SW2, HIGH);
analogReference(DEFAULT); //nastawy A/C
kr[] jest używana do obsługi kropek wybra-
}
nego wyświetlacza LED. Zapis do tej tablicy
wartości  1 powoduje zapalenie się kropki
//funkcja przerwania, w ktorej jest obslugiwany LED
void int_wys() {
danego wyświetlacza, a  0 jej zgaszenie.
for(int i=0; i < 4; i++)
{ W tablicy numer[] zapisano wyświetlane na
digitalWrite(digitPins[i], HIGH); //wylaczenie LED
LED znaki, czyli cyfry od  0 do  9 . Zapi-
}
for(int g=0; g < 7; g++) //LED=znak z digit
sanie liczby  10 powoduje wyłączenie wy-
{
świetlacza,  11 wyświetlenie znaku stopnia,
digitalWrite(groundPins[g], number[digit[wys]][g]);
};
natomiast  12 powoduje wyświetlenie litery
digitalWrite(groundPins[7], !(kr[wys])); //kropka
digitalWrite(digitPins[wys], LOW); //wlaczenie wyswietlacza  C . Tablice znaków można dowolnie rozbu-
wys++; //zwiekszenie wartosci wys
dować o własne znaki.
if (wys>4) wys=0; //jesli był obslugiwany 4 wyswietlacz
//to przejscie do 1
W procedurze setup instrukcja Timer1.
};
initialize(100) konfiguruje Timer1 w taki
void loop() //petla glowna programu
sposób, aby zgłaszał przerwanie co 100 ms.
{
digitalWrite(DP, LOW); //wlaczenie LED
Natomiast instrukcja Timer1.attachInterrup-
kr[0]=HIGH;
t(int_wys) konfiguruje nazwę wywoływanej
kr[1]=HIGH;
kr[2]=HIGH;
procedury podczas przerwania. Co 100 ms
kr[3]=HIGH;
for(int k=0; k < 10; k++) //wyswietlenie  0 do  9 będzie wykonywana procedura int_wys ob-
{
sługująca wyświetlacz LED.
digit[0] = k;
digit[1] = k;
Procedura obsługi przerwania w pierw-
digit[2] = k;
szej kolejności wyłącza wyświetlacz na danej
digit[3] = k;
delay(200); //opoznienie 200ms
pozycji, wystawia na port mikrokontrolera
};
wartość odczytaną z tablicy digit[], a następ-
digitalWrite(DP, HIGH); //wylaczenie LED
nie załącza ten wyświetlacz. Przy kolejnym
kr[0]=LOW;
kr[1]=LOW;
wywołaniu przerwania jest obsługiwany ko-
kr[2]=LOW;
kr[3]=LOW; lejny wyświetlacz LED. W procedurze prze-
digit[0] = 10;
rwania jest także włączana kropka wyświet-
digit[1] = 10;
digit[2] = 10;
lacza w zależności od wartości zapisanych
digit[3] = 10;
w tablicy kr[].
delay(2000);
while(1) //petla programu
Na pozycję aktualnie obsługiwanego
{
p.get_time(); //odczyt RTC wyświetlacza wskazuje zawartość zmiennej
digit[3]= p.minute%10; //wyswietlenie minut
wys. Po obsłudze ostatniego jest ona zero-
digit[2] = p.minute / 10;
digit[1]= p.hour%10; //wyswietlenie godzin
wana i następuje obsługa pierwszego wy-
digit[0] = p.hour / 10;
świetlacza. Obsługa wyświetlaczy LED jest
if (temp_sec!=p.second) //miganie dwukropka 1s
wykonywana tak szybko, że dla obserwato-
{
temp_sec=p.second; //zapisanie wartosci sekund
ra będzie widoczne jednoczesne świecenie
//wlaczenie lub wylaczenie dwukropka
wszystkich cyfr LED.
if (wsk_sek==1)
digitalWrite(DP, HIGH);
Instrukcje p.hour = 14, p.minute = 30,
else digitalWrite(DP, LOW);
wsk_sek = !wsk_sek; //zmiana stanu zmiennej p.second = 0, p.year = 2011, p.month = 4
}
oraz p.day = 1 ustawiają domyślne warto-
if (digitalRead(SW1) == LOW) { //Wcisniety S1?
ści czasu w układzie zegara RTC. Ich zapis
digit[0] = 10; //wylaczenie LED
do układu RTC powoduje instrukcja p.set_
digit[1] = 10;
digit[2] = 10;
time(), natomiast odczyt następuje z użyciem
digit[3] = 10;
digitalWrite(DP, HIGH);
instrukcji p.get_time(). Opis komend obsługi
while(digitalRead(SW1) == LOW)
zegara RTC można znalezć w dokumentacji
{
getTemp(); //odczyt temperatury
biblioteki PCF8583.
digit[1]= temp%10; //wyswietlenie temperatury
digit[0] = temp / 10; W dalszej części procedury nastaw są
digit[2] = 11; //wyswietlenie °
konfigurowane te linie mikrokontrolera, do
digit[3] = 12; //wyswietlenie C
delay(500); //opoznienie 500 ms
których dołączono przyciski. Są one ustala-
}
ne jako wejściowe z włączonymi rezystorami
}
if (digitalRead(SW2) == LOW) { //czy nacisniety S2?
podciągającymi. W pętli głównej programu
digit[0] = 10; //wylaczenie LED
digit[1] = 10; loop jest włączany za pomocą instrukcji digi-
digit[2] = 10;
talWrite(DP, LOW) dwukropek DP dołączony
digit[3] = 10;
do linii 12 systemu Arduino (wartość LOW
ELEKTRONIKA PRAKTYCZNA 7/2011 91
KURS
włącza dwukropek, a HIGH wyłącza). Kolej-
Listing 1. Przykład programu obsługującego moduł AVTduino LED
digitalWrite(DP, HIGH);
ne instrukcje włączają kropki wyświetlaczy.
while(digitalRead(SW2) == LOW) //jesli S2 nacisniety
W tym przypadku wpisanie wartości HIGH
{
digit[3]= p.day%10; //wyswietlenie dnia miesiaca
włącza kropkę, a LOW ją wyłącza.
digit[2] = p.day / 10;
digit[1]= p.month%10; //wyswietlenie miesiaca
W pętli FOR co 200 ms zapisywane są
digit[0] = p.month / 10;
do wszystkich wyświetlaczy cyfry od  0 do
kr[1]=HIGH; //wlaczenie kropki 2. LED
delay(500); //opoznienie 500 ms
 9 (wartość zmiennej k). Po zakończeniu się
}
pętli FOR wyświetlacz jest wyłączany (wyłą- kr[1]=LOW; //wylaczenie kropki
}
czane są kropki, znak DP oraz dzięki zapi-
//wlaczenie lub wylaczenie buzzera
if ((wart_analog = analogRead(A0))<80)
saniu liczby 10 do tablicy digit[] wszystkie
digitalWrite(Buzzer, LOW);
wyświetlacze) na 2 s. Następnie w nieskoń- else digitalWrite(Buzzer, HIGH);
}
czonej pętli while za pomocą instrukcji p.get_
}
time() jest pobierana z układu RTC godzina
void getTemp() { //odczytu temperatury DS18B20
oraz data, które są zapisywane do zmiennych
int foo, bar, i; //definicje zmiennych
ds.reset(); //zerowanie 1-Wire
p.hour, p.minute, p.second, p.year, p.month
ds.write(0xCC,1); //start pomiaru temperatury
oraz p.day. Za pomocÄ… instrukcji digit[3]= ds.write(0x44,1);
present = ds.reset(); //odczyt temperatury
p.minute%10 oraz digit[2] = p.minute / 10 do
ds.write(0xCC,1);
dwóch ostatnich wyświetlaczy są zapisywa- ds.write(0xBE);
for ( i = 0; i < 9; i++) {
ne wartości minut (dziesiątki oraz jednost-
data[i] = ds.read();
}
ki), natomiast za pomocÄ… instrukcji digit[1]=
LowByte = data[0]; // obliczenie temperatury
p.hour%10 oraz digit[0] = p.hour / 10 do HighByte = data[1]; //wynik do temp
TReading = (HighByte << 8) + LowByte;
dwóch pierwszych wyświetlaczy zapisywa-
SignBit = TReading & 0x8000; //obliczenie znaku temperatury
if (SignBit) {
na jest godzina. W warunku if (temp_sec!=p.
TReading = -TReading;
second) jest obsługiwany dwukropek wy- }
Tc_100 = (6 * TReading) + TReading / 4;
świetlacza. Odczytana wartość sekund jest
temp = Tc_100 / 100;
porównywana z poprzednią wartością zapi- Fract = Tc_100 % 100;
if (Fract > 49) {
saną w zmiennej temp_sec. Jeśli jest różna, to
if (SignBit) {
--temp;
jest zmieniany stan dwukropka. Zmiana jest
}
uzależniona od stanu zmiennej wsk_sek, któ- else {
++temp;
rej wartość zmienia się co 1 s. Jeśli zmienna
}
}
ma wartość  0 , to na  1 , jeśli  1 , to  0 . Tak
}
sterowany dwukropek wyświetlacza będzie
migał z częstotliwością 1 Hz.
Za pomocą instrukcji if (digitalRead(SW1) Kolejną instrukcje procedury obliczają tężenia oświetlenia. Wartość z czujnika światła
== LOW) jest sprawdzany stan przycisku odczytana temperaturÄ™ w stopniach Celsju- jest odczytywana przez przetwornik A/C mi-
S1. Jeśli został on naciśniety (o czym świad- sza i zapisują ją do zmiennej temp. Dokładny krokontrolera. Im większy jest poziom jasności,
czy poziom niski), wykonywane są instruk- algorytm obsługi układu DS18B20 oraz spo- tym większa wartość napięcia zmierzona przez
cje wyłączające wyświetlacz LED. Następnie sobu obliczenia temperatury na podstawie przetwornik. Z użyciem instrukcji warunkowej
instrukcja while(digitalRead(SW1) == LOW) odczytanych danych można znalezć w spe- if ((wart_analog = analogRead(A0))<80) mikro-
sprawdza, czy nadal jest naciśniety przycisk cyfikacji termometru DS18B20. kontroler sprawdza, czy reprezentacja liczbowa
S1. Jeśli tak, to jest wykonywana procedura Odczytana temperatura jest wyświetlana napięcia odczytanego z czujnika jest mniejsza
getTemp(), w której następuje odczyt tem- na dwóch pierwszych wyświetlaczach z wy- od 80. Jeśli tak, to za pomocą instrukcji digi-
peratury z czujnika DS18B20 (za pomocą korzystaniem instrukcji digit[1]= temp%10 talWrite(Buzzer, LOW) jest włączany brzęczyk
funkcji dostępnych w bibliotece OneWire). oraz digit[0] = temp / 10. Na trzecim wy- piezo. Należy zauważyć, że analogRead() to
Jako pierwsze procedura getTemp() wyko- świetlaczu, za pomocą instrukcji digit[2] funkcja, nie zmienna. Jej parametrem jest nu-
nuje zerowanie magistrali 1-Wire za pomocą = 11, jest wyświetlany znak stopnia, a na mer wejścia analogowego.
instrukcji ds.reset(). W dalszej kolejności, czwartym znak  C . Pomiar temperatury jest
zgodnie ze specyfikacją układu DS18B20, są wykonywany z opóznieniem 500 ms wpro- Podsumowanie
wykonywane instrukcje s.write(0xCC,1) oraz wadzonym przez komendę delay(500). Dzięki użytecznym komponentom: wy-
ds.write(0x44,1) inicjujące pomiar tempera- Kolejne instrukcje dotyczą obsługi przyci- świetlaczowi, kilku przyciskom, zegarowi RTC
tury. Kompletna procedura odczytu tempera- sku S2, po naciśnięciu którego na wyświetlaczu i czujnikom, będzie to moim zdaniem jeden
tury wygląda następująco: zostanie wyświetlona data odczytana z układu z najbardziej popularnych i najczęściej używa-
ds.reset() zegara RTC. Dodatkowo, na drugim wyświetla- nych modułów. Z jego wykorzystaniem można
ds.write(0xCC,1); czu za pomocą instrukcji kr[1]=HIGH zostanie w łatwy sposób wykonać czytelny wyświetlacz
ds.write(0xBE); zaświecona kropka dziesiętna. zegara czy termometru z jasności świecenia re-
for ( i = 0; i < 9; i++) { Dalsze instrukcje programu dotyczÄ… ob- gulowanÄ… za pomocÄ… fotorezystora.
data[i] = ds.read(); sługi rezystorowego czujnika światła, którego Marcin Wiązania
} rezystancja zmniejsza siÄ™ wraz ze wzrostem na- marcin.wiazania@ep.com.pl
http://ep.com.pl
92 ELEKTRONIKA PRAKTYCZNA 7/2011


Wyszukiwarka

Podobne podstrony:
Kurs Arduino 2 Oprogramowanie Arduino IDE(1)
Kurs Arduino cz3
Kurs Arduino cz6
Kurs Arduino cz5
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