WPROWADZENIE
Fotorezystor jest to element półprzewodnikowy, światłoczuły. Jego rezystancja ulega zmianie w zależności od ilości padającego światła.
Poprzez oświetlanie fotorezystora następuje zwiększenie przepływającego prądu, czyli zmniejszenie rezystancji.
Fotorezystor jest wykorzystywany do:
- pomiaru temperatury przez pomiar natężenia promieniowania,
- ostrzegania w systemach pomiarowych,.
- wykrywanie zanieczyszczeń w rzekach bądź zbiornikach wodnych,
- detekcja strat ciepła w budynkach.
Potencjometr - jest to regulowany rezystor. Posiada trzy wyprowadzenia, które odpowiadają wyprowadzeniom dzielnika napięcia. Jedno podłączamy do zasilania, drugi (środkowy) jest wyprowadzeniem wartości, trzeci pin podłączamy do masy.
Działanie potencjometru oparte jest na działaniu dzielnika napięcia. Stosuje się go do regulacji napięcia bądź prądu w urządzeniach elektrycznych.
ADC - Przetwornik analogowo cyfrowy (ang. Analog to Digital Converter) - jest to układ pozwalający na zmianę sygnału analogowego na cyfrowy. Co pozwala na przetwarznie wartości analogowych w urządzeniach elektronicznych. Sygnał analogowy zostaje uproszczony do postaci dyskretnej. Przetwarzanie składa się z trzech etapów czyli: próbkowanie, kwantowanie oraz kodowanie.
W Arduino Uno Rev3 zastosowano przetwonik 10-bitowy, który jest połączony z multiplekserem. Wobec tego mamy możliwość korzystania z jednego przetwornika posiadającego 6 kanałów od 0 do 5.
Przetwornik ADC jest 10 bitowy co pozwala na odczytanie wartości z zakresu od 0 do 1023, czyli 1024 kombinacje.
Pomiar napięcia poprzez ADC trwa w Arduino 0,0001 s. Więc pomiary dokonywane są w bardzo krótkim czasie. Pozwala to na wykonanie maksymalnie 10 tys pomiarów w ciągu sekundy.
Wejścia w Arduino mają tolerancję z zakresu od 0 do 5V. Podłączenie innego napięcia może spowodować nieodwracalne uszkodzenie płytki.
PRZYKŁAD 1 - ADC, potencjometr
Po inicjalizacji podstawowych parametrów w funkcji setup następuje zainicjalizowanie transmisji portem szeregowym. W funkcji loop zostaje odczytana i wyświetlona wartość z potencjometru.
Otrzymane wartości mieszczą się w zakresie od 0 do 1023.
const int PotPin = 0; //Deklaracja pinu int Potencjometr; //Zmienna na wartość void setup() { Serial.begin(9600); //Rozpoczęcie transmiji } void loop() { Potencjometr = analogRead(PotPin); //Odczytanie wartości //Wpisanie do zmiennej Serial.println(Potencjometr); //Wyświetlenie wartości delay(100); }
PRZYKŁAD 2 - fotorezystor
W celu odczytania wartości przetworzonej przez ADC wykonano przedstawiony poniżej program. Po inicjalizacji w pętli głównej następuje rozpoczęcie transmisji po porcie szeregowym (UART), z ustawioną prędkością transmisji wynoszącą 9600 b/s. Można także ustawić drugi parametr, który będzie odpowiedzialny za wielkość ramki. Jest on parametrem dodatkowym, w przypadku nie wybrania żadnego parametru automatycznie wpisywana jest wartość 8N1 (osiem bitów danych, brak kontroli parzystości, jeden bit stopu)
int PinRezys = 0; //Przypisanie zmiennej pin int Rezys; //Zmienna przechowująca wartość void setup() { Serial.begin(9600); //Rozpoczęcie transmisji //przez port szeregowy } void loop() { Rezys = analogRead(PinRezys); //Odczytanie wartości Serial.println(Rezys); //Wyświetlenie delay(1000); //Opóźnienie }
Odczytano następujące wartości minimalne oraz maksymalne dla fotorezystora: Min - 348 (normalnie); Max - 978 (latarka);
PRZYKŁAD 3 - fotorezystor, diody
Kontrolowanie pojedynczej diody w zależności od wartości otrzymanej z fotorezystora. Wartość odczytana z wejścia analogowego jest wpisywana do zmiennej, następnie następuje jej mapowanie, czyli zmiana przedziału (od 0 do 255). Kolejna funkcja constrain przetwarza tą wartość i wpisuje ją do tej samej zmiennej. W ostatnim kroku następuje zapalenie bądź zgaszenie diody.
Na rysunku 3.1. pokazałem sposób podłączenia samego fotorezystora bez diod, Sposób podłączenia diod przedstawiłem w [2].
Rys. 3.1. Podłączenie fotorezystora
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const int DiodePin1 = 2; //Dioda const int PinRezys = 0; //Przypisanie zmiennej pin const int Min = 348; const int Max = 977; int Rezys; //Zmienna przechowująca wartość void setup() { pinMode(DiodePin1, OUTPUT); //Ustawienie pinu jako wyjście } void loop() { Rezys = analogRead(PinRezys); //Odczytanie wartości Rezys = map(Rezys, Min, Max, 0, 255); //Mapowanie otrzymanej //wartości od 0 do 255 Rezys = constrain(Rezys, 0, 255); //Przetworzenie wartości analogWrite(DiodePin1, Rezys); //Zapalenie (255) lub zgaszenie (0) }
W tym przykładzie wykorzystam wartości z przykładu 2. Do Arduino podłącze 10 diod, które użyje do dynamicznego zapalania kolejnej z nich w miarę zwiększania się wartości otrzymanej z fotorezystora.
Zamiast fotorezystora można podłączyć także potencjometr.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Diody podłączone są do pinów od 2 do 11 const int DiodePin1 = 2; const int DiodePin2 = 3; const int DiodePin3 = 4; const int DiodePin4 = 5; const int DiodePin5 = 6; const int DiodePin6 = 7; const int DiodePin7 = 8; const int DiodePin8 = 9; const int DiodePin9 = 10; const int DiodePin10 = 11; const int PinRezys = 0; //Przypisanie zmiennej pin const int Min = 348; const int Max = 977; int PinDiode = 2; int Rezys; //Zmienna przechowująca wartość void ResetDiodes(void); void RunDiodes(void); void setup() { pinMode(DiodePin1, OUTPUT); //Ustawienie pinu jako wyjście pinMode(DiodePin2, OUTPUT); pinMode(DiodePin3, OUTPUT); pinMode(DiodePin4, OUTPUT); pinMode(DiodePin5, OUTPUT); pinMode(DiodePin6, OUTPUT); pinMode(DiodePin7, OUTPUT); pinMode(DiodePin8, OUTPUT); pinMode(DiodePin9, OUTPUT); pinMode(DiodePin10, OUTPUT); Serial.begin(9600); } void loop() { ResetDiodes(); Rezys = analogRead(PinRezys); //Odczytanie wartości Rezys = map(Rezys, Min, Max, 0, 255); //Mapowanie otrzymanej //wartości od 0 do 255 Rezys = constrain(Rezys, 0, 255); //Przetworzenie wartości Serial.println(Rezys); //Wyświetlenie wartości RunDiodes(); //Wejście do funkcji delay(200); //Opóźnienie } void ResetDiodes() { for(PinDiode=11;PinDiode>=2;PinDiode--) { digitalWrite(PinDiode, LOW); } PinDiode = 2; } void RunDiodes() { if(Rezys <= 254) { digitalWrite(DiodePin10, HIGH); } if(Rezys <= 225) { digitalWrite(DiodePin9, HIGH); } if(Rezys <= 200) { digitalWrite(DiodePin8, HIGH); } if(Rezys <= 175) { digitalWrite(DiodePin7, HIGH); } if(Rezys <= 150) { digitalWrite(DiodePin6, HIGH); } if(Rezys <= 125) { digitalWrite(DiodePin5, HIGH); } if(Rezys <= 100) { digitalWrite(DiodePin4, HIGH); } if(Rezys <= 75) { digitalWrite(DiodePin3, HIGH); } if(Rezys <= 50) { digitalWrite(DiodePin2, HIGH); } if(Rezys <= 25) { digitalWrite(DiodePin1, HIGH); } }