• 5C/7

Lyssensor (LDR)

Guide: Få lyssensoren til at virke

Du skal bruge følgende:

  • Kredsløb fra opgave 5B
  • Lydsensor (LDR)

Beskrivelse af Lyssensor (LDR)

Lyssensoren er ligesom knappen en sensor. Den store forskel med lyssensoren, er at det er en analog sensor, som kan give varieret input til picoen. I lyssensorens tilfælde er input’et afhængigt af styrken af det lys der rammer den. Knappen derimod er en digital sensor, som kun har to forskellige tilstande den kan skiftes imellem, nemlig tændt og slukket, høj eller lav, 0 eller 1.

LDR står for Light Dependent Resistor, hvilket på dansk betyder lysafhængig modstand. Det vil sige den ændrer modstand afhængigt af, hvor kraftigt lys der rammer den. Til at læse analoge signaler (spændinger) har picoen ADC0 (GP26), ADC1 (GP27) og ADC2 (GP28), som konverterer en analog værdi til et digitalt tal (A/D konvertering). Picoen har en 16bit A/D-konverter. Det vil sige at de spændinger vi giver den (mellem 0 og
3,3V) på enten ADC0, ADC1 eller ADC2 bliver konverteret til et tal mellem 0 og 65.535. 0V = 0 og 3,3V = 65.535. For at man kan omsætte modstandsændringen fra LDR-modstanden til en spændingsændring som kan læses af picoen bruger vi en spændingsdeler, hvor vi sætter LDR-modstanden i serie med en fast modstand på 10K.

Prøv at bygge dette kredsløb:

Skriv følgende program i Thonny og prøv det:

Komponenten længst til højre er LDR-modstanden. Vi beholder lysdioden på boardet fra step 5B, så vi kan bruge den igen lige om lidt.

import machine
import utime
ldr = machine.ADC(26)
while True:
	print(ldr.read_u16())
	utime.sleep(1)

Beskrivelse af koden 

  • Vi sætter en ny variabel, LDR til at være et ADC input på GP26 – altså ADC0 med ldr = machine.ADC(26)

  • Derefter printer vi i et while-loop den konverterede værdi vi læser fra LDR-sensoren med print(ldr.read_u16()), hvor u16 fortæller picoen, at det er en 16-bit værdi vi læser.

  • Derefter holder vi en pause på 1 sekund med utime.sleep(1) inden loopet starter forfra

Opgave A: Prøv at dække for LDR-sensoren, så det bliver helt mørkt. Hvilken værdi kan du få den ned på i Thonny?

Opgave B: Prøv også at lyse på LDR-modstanden. Hvilken værdi kan du få den op på?

Skriv følgende program i Thonny og prøv det:

Nu kan vi prøve at styre LED’en med LDR-sensoren, sådan at jo mørkere det bliver, jo mere skruer vi ned for LED’en.

import machine
import utime
ldr = machine.ADC(26)
led = machine.PWM(machine.Pin(4))
led.freq(1000)
while True:
	ldr_value = ldr.read_u16()
	print(ldr_value)
	led.duty_u16(ldr_value)
	utime.sleep(0.25)

Beskrivelse af koden 

  • Først sætter vi ligesom før en variabel op til ldr, og derefter sætter vi en variabel op til led’en med led = machine.PWM(machine.Pin(4)).
  • Derefter tændes og slukkes Led’en: led.freq(1000) så hurtigt at øjet ikke kan nå at opfange det.
  • I while-loopet læses ldr værdien.
  • Derefter printes værdien.
  • Dernæst sættes led’ens duty cycle til at være lig med ldr’ens værdi.
  • Hvorefter en pause finder sted.

Beskrivelse af PMW-funktionen

PWM funktionen betyder at vi sætter GP4 Pin’en op til at kunne bruge Pulsbreddemodulation (Pulse Width Modulation eller forkortet PWM) til at skrue op og ned for lysstyrken på led’en. I praksis tænder og slukker man bare for led’en så hurtigt at øjet ikke kan opfange det – led.freq(1000) – nemlig 1000 gange i sekundet, og så justerer man på hvor lang tid led’en er tændt ift hvor lang tid den er slukket (Duty Cycle). Når led’en har en Duty Cycle på 50% er den tændt og slukket lige lang tid, og derfor ser det ud som om den lyser med halv styrke. Hvis Duty Cycle er 75% er led’en tændt 75% af tiden og slukket de sidste 25% – så ser det ud som om den lyser ved næsten fuld styrke.

Tænkeopgave: Hvis man nu skulle have led’en til at lyse kraftigere og kraftigere jo mørkere det bliver, hvad skal man så gøre? 

Svaret: se nedenstående kodeeksempel

Skriv følgende program i Thonny og prøv det:

import machine
import utime
ldr = machine.ADC(26)
led = machine.PWM(machine.Pin(4))
led.freq(1000)
while True:
	ldr_value = ldr.read_u16()
	#print(ldr_value)
	led.duty_u16(65535-ldr_value)
	utime.sleep(0.02)

Beskrivelse af koden 

  • Her har vi trukket ldr_value fra den størst mulige værdi den kan have, nemlig 65535 – led.duty_u16(65535-ldr_value) for at få den til skrue ned for lyset, jo kraftigere lyset er på LDR-sensoren.
  • Derudover har vi sat pausen ned – utime.sleep(0.02) og kommenteret print-linjen ud med # – #print(ldr_value). # bruges i Python til at fortælle at en linje ikke skal tages med, når programmet kører. Man kan både bruge det til at lave små stykker tekst der beskriver ens kode, eller man kan bruge det til at slå programlinjer fra, så de ikke tages med, når programmet kører.