I denna lektion skall vi lära oss hur en fotoresistor (fotomotstånd, LDR eller CdS) fungerar. En fotoresistor ändrar resistans beroende på hur mycket ljus den utsätts för. Resistansen i en fotoresistor minskar när ljuset på den ökar. Den fotoresistor vi använder i vår lektion hittar du här i webshopen eller i vårt “Add On Kit” för Arduino Starterkit (säljs inte längre, men denna sensor ingår i vårt andra starterkit). Enligt databladet ger den minst 1Mohm vid 0 Lux (dvs. totalt mörker) och cirka 8-20Kohm vid 10 Lux (vid 25°C). Genom att göra en enkel spänningsdelare med 2 resistanser (en fast resistans och fotoresistorn) så kan vi mäta spänningen och på så vis få ut ett värde beroende på hur mycket ljus sensorn utsätts för.
En spänningsdelare är i princip som en potentiometer, där man har två resistanser, en upp till matningsspänningen (i vårt fall 5VDC) och en till GND (0VDC), då får man ut en variabel spänning mellan 0-5VDC. Men i stället för att variera resistansen i potentiometern sätter vi en fast resistor på 10Kohm till GND och sedan låter vi fotoresistorn LDR vara den variabla delen upp till 5VDC.
Formlen för en spänningsdelare är Vout = Vin * R2 / (R1 + R2). Vi sätter den fasta resistorn på 10Kohm som R2 och fotoresistorn som R1 och med hjälp utav informationen i databladet på fotoresistorn så får vi dessa två fall:
Vid 0 Lux: Vout = 5V * 10Kohm / (10Kohm + 1Mohm) = 0.05V
Vid 10 Lux: Vout = 5V * 10Kohm / (10Kohm + 8Kohm) = 2.78V
Det vill säga, ju ljusare det är desto högre spänning får vi. Om sensorn skulle gå i princip ner till 0 ohm, skulle spänningen bli 5VDC, riktigt ner till noll går den aldrig.
Vårt enkla program är ett litet demo på hur ett “skymningsrelä” skulle kunna fungera, dvs. vi vill tända en lysdiod om det blir mörkt (justerbar gräns i programmet) och sedan vill vi släcka den när det blir ljusare igen. För att inte lysdioden skall blinka när vi är vid ett visst värde så har vi lagt in ett fönster (hysteres) där vi inte gör något, så för att släcka den måste vi gå under ett värde och för att tända den igen måste vi gå mycket över det värde vi hade för att släcka den.
Källkoden till vårt projekt kan laddas ner här och är enkelt uppbyggt.
void setup() { // Set I/O 13 (on board LED) to output pinMode(13, OUTPUT); // Initiate serial port at 9600baud Serial.begin(9600); }
Precis som i lektionen med temperaturgivaren (TMP36) kommer vi här att använda serieporten som en ren “debugport” där vi får ut information. i setup() initierar vi upp I/O 13 som är den lysdiod som sitter på kortet som utgång samt initierar upp serieporten med 9600baud.
void loop() { int rawAnalogValue;
I loop() behöver vi en heltalsvariabel för att lagra det analoga värdet från en spänningsdelare.
rawAnalogValue = analogRead(0);
Läs av analogvärdet på A0 och spara det i heltalsvariabeln.
Serial.print("Raw: "); Serial.print(rawAnalogValue); if (rawAnalogValue > 600) { // Check if it is light, if so turn off LED Serial.print(" OFF"); digitalWrite(13, LOW); } else if (rawAnalogValue < 400) { // Check if it is dark, if so turn on LED Serial.print(" ON"); digitalWrite(13, HIGH); } else { // This is in between light and dark, a do nothing "window" Serial.print(" ?"); } Serial.println(""); // Notice this is a println(), so we make a new line delay(100); // Wait 0.1s
Skriv ut det analoga värdet via den seriella monitorn, så vi kan se hur det ändras beroende på hur ljust/mörkt det är. Här gör vi även några tester för att se om värdet överstiger en gräns (ljust), då skall lysdioden släckas eller om det understiger en annan gräns (mörkt), då skall lysdioden tändas. Om värdet är där i mellan (hysteres eller fönster) så skall vi inte göra något, detta fönster kan justeras i koden så att inte lysdioden står och blinkar vid ett visst ljus/mörker. Slutligen väntar vi 1/10s innan vi gör om allt igen. Notera att vi skriver ut lite debug-information i varje test, så vi även där i seriemonitorn kan se vad som händer. Det är alltid bra att använda serieporten för denna typ av information, så vi lätt kan hitta eventuella fel i programmet. Försök alltid att hålla texten så kort och informativt som möjligt. Vi använder 9600baud, det är det samma som 9600 bitar/sekund och som tumregel blir det då 960 tecken/sekund och eftersom vi har en fördröjning på 0.1s så blir det att vi kan pressa ut ca 96-100 tecken på denna tiden, annars är det risk för att tecken skrivs över eller försvinner.