Lees omgevingslicht met een LDR
Het eerste dat u moet weten, is dat een LDR (Light Dependent Resistor, ook wel bekend alsFoto brederstandof lichtgevoelige weerstand) is in feite een weerstand die reageert op omgevingslicht. Naarmate er meer licht van de LDR wordt gezien, neemt de weerstand af. Naarmate er minder licht is, neemt de weerstand weer toe.
LDR's bestaan al heel lang (ik speelde als kind met LDR's) en ze zijn best goedkoop. Bovendien zijn ze zeer betrouwbaar en gemakkelijk te vinden.
Het aansluiten van een LDR zou normaal gesproken gebeuren via een analoge pin op een Arduino. Maar het lezen van analoge pinnen is soms erg traag, dus we hebben ook besproken hoe je de LDR aansluit op een digitale pin op Arduino.
Lichtmeting en een LDR
Onthoud dat een LDR licht waarneemt en er erg goed in is, maar dat het niet echt een goed hulpmiddel is om licht nauwkeurig te meten.
LDR naar een analoge Arduino-pin
Dit is de meest voor de hand liggende benadering: aangezien een LDR varieert in weerstand, kan hij u daarom een reeks waarden geven.
Bij deze opbouw neemt de afleeswaarde toe met toenemende lichtinval; er zijn ook circuits waar precies het tegenovergestelde gebeurt.
We gebruiken een klein circuit waarbij het verminderen van de weerstand van een LDR ervoor zorgt dat er meer "stroom" naar de Arduino-pin stroomt. Hierdoor leest de Arduino een hogere waarde. "Current" staat met opzet tussen haakjes omdat dat niet de juiste term is.
De analoge pin levert een waarde tussen 0 en 1023. De ingebouwde ADC (analoog naar digitaal converter) van de Arduino doet dit allemaal voor je.
Wat we nodig hebben:
- arduino(Ik heb een Uno gebruikt, onthoud dat klonen de laatste tijd lastig kan zijn.)
- USB-kabelom de arduino op de computer aan te sluiten
- Arduino-IDE(gratis downloads)
- eenLDR(¡duh!)
- eenweerstand van 100kΩ(bruin-zwart-geel, of zie onzeweerstand rekenmachine)
- 3onderwerpen
- een kleineSteckbrett
De configuratie is vrij eenvoudig:
In woorden:
verbind de+5Vvan arduino1 twee LDR-dennen(een LDR is niet linkgevoelig).
verbind deeen andere LDR-pinontmoetingA0(een Arduino analoge pin)neeeen van de pennenweerstand van 100kΩ.
verbind denog een pin van 100KΩ WeerstandontmoetingTempo(aarde) van de Arduino.
Schema(Klaar metFritsen):
LDR naar een analoge Arduino-pin
klembord(ook gemaakt metFritsen):
LDR naar een analoge Arduino-pin
De Arduino-schets is eenvoudig en stuurt gegevens naar de seriële poort, zodat we kunnen zien wat er aan de hand is.
1
2
3
4
5
6
7
8
9
10
11
12
13#define LDRpin A0 // Pin waar we de LDR en de weerstand verbinden
E Tmoed LDR= 0; // resultaat van het lezen van de analoge pin
Leegmeubilair() {
Serieel.Begin(9600); // Definieer de seriële poort voor communicatie
}LeegAmar() {
moed LDR=analoge uitlezing(LDR-pin); // lees de LDR-waarde
Serieel.afdrukken(moed LDR); // Stuur de waarde naar de seriële poort
vertraging(100); // Wacht even
}
Sluit nu de Arduino aan op de computer met behulp van de USB-kabel.
Start nu de Arduino IDE en zorg ervoor dat u het juiste Arduino-model en de juiste seriële poort hebt ingesteld.
Ga voor het Arduino-model naar "Hulpmiddel”„planken”„arduino een' (als u een Arduino Uno gebruikt), en ga voor de seriële poort naar 'Hulpmiddel”„porto”„/dev/cu.usbmodem1411 (Arduino Uno)(Dit is op mijn Mac, het kan een beetje anders zijn op je Mac of pc.)
Kopieer de schets hierboven naar de IDE-editor, waarbij u de bestaande code vervangt of een nieuwe schets start ("kantoor uur”„nieuw"). Dan klikken "op rijden"wat de" knopB"Knopf.
Arduino-software - Handige snelkoppelingen
Start dan de seriële monitor via "Hulpmiddel”„monitor serieel' zodat we uitvoer kunnen zien die er als volgt uitziet:
...
949
945
943
917
838
837
832
796
748
709
706
704
692
689
698...
In mijn situatie schommelt de waarde tussen 917 en 950 zonder iets te doen, maar zodra ik mijn hand over de LDR (light dimmer) beweging beweeg, zien we dat de waarde zelfs onder de 800 zakt.
Speel hier een beetje mee en onthoud dat de waarden voor jou anders zullen zijn, afhankelijk van het omgevingslicht.
LDR een un-pin digitale Arduino
Nu we een LDR in actie hebben gezien op een analoge pin, is het tijd om te zien wat het doet op een digitale pin.
Merk op dat, in tegenstelling tot een analoge pin, een digitale pin als reactie alleen 1 of 0 (nul) retourneert!
Deze waardes zijn bijvoorbeeld handig als je bijvoorbeeld iets aan of uit wilt zetten. als het te donker wordt: doe het licht aan.
Het lijkt erop dat de Arduino een drempel van 2,2 volt heeft waar hij wisselt tussen nul en 1. Merk op dat het lezen van een digitale pin aanzienlijk sneller gaat dan het lezen van een analoge pin, wat in bepaalde gevallen erg handig is.
Dus laten we proberen wat het doet...
Voor deze toepassing gebruiken we eenPotentiometerslijtage. We hebben dit nodig zodat we kunnen aanpassen wanneer het licht genoeg is om een 1 te produceren of donker genoeg om een nul te produceren. We willen dat dit variabel is, omdat de tafel waar we alles op zetten een andere verlichtingsomgeving kan hebben dan waar we van plan zijn ons circuit te gebruiken. Net zoals de hoeveelheid licht in mijn huis anders zal zijn dan die van jou.
We gebruiken exact dezelfde componenten als in de analoge opstelling, maar in plaats van een vaste weerstand gebruiken we een variabele weerstand (de potentiometer).
Een potentiometer heeft in principe 3 pinnen. De middelste pin is de variabele pin, de linker en rechter pin zijn in feite de "vaste" weerstand. De variabele pin maakt in wezen gebruik van de weerstand van de "vaste" weerstand tussen nulweerstand en de maximale weerstand van de "vaste" weerstand.
Misschien legt een tekening het beter uit:
Ris de "totale" weerstand. Het heeft twee pinnen:R1neeR2.
Als je de weerstand tussen deze twee pinnen wilt meten met amultimeter(R1neeR2) meet dan de maximale weerstand van de weerstandR.
Het variabele deel (v) maakt een "drain", dus als je de weerstand tussen wilt metenR1neev, dan meet je alleen dat deel van de weerstandRdit is in het middenR1neevgelegen. Meet je weerstand tussenR2neev, meet dan alleen dat deel vanRonderR2neev.
Dus als we aan de knop draaien, zal de weerstand tussen bijvoorbeeldR1neevverandering. Hoe groter de afstand tussen de twee pinnen, hoe groter de weerstand. Makkelijk, toch?
In onze opstelling hebben we maar 2 pinnen nodig, de middelste en een van de twee buitenste pinnen.
Hoe werkt een potentiometer?
Dus we hebben nodig:
- arduino(Ik heb een Uno gebruikt, onthoud dat klonen de laatste tijd lastig kan zijn.)
- USB-kabelom de arduino op de computer aan te sluiten
- Arduino-IDE(gratis downloads)
- eenLDR(¡duh!)
- een10 kΩ potentiometer
- 3onderwerpen
- een kleineSteckbrett
De configuratie is vrij eenvoudig:
In woorden:
verbind de+5Vvan arduino1 twee LDR-dennen(een LDR is niet linkgevoelig).
verbind deeen andere LDR-pinontmoetingA0(een Arduino analoge pin)neeo pino centraal doen10 kΩ potentiometer.
verbind deeen van de zijpennen van de 10KΩ PotentiometerontmoetingTempo(aarde) van de Arduino.
Schema(Klaar metFritsen):
LDR een un-pin digitale Arduino
klembord(ook gemaakt metFritsen):
LDR een un-pin digitale Arduino
De schets lijkt erg op de analoge opstellingsschets, natuurlijk hebben we deze aangepast om een digitale pin te lezen, in dit geval pin 8.
1
2
3
4
5
6
7
8
9
10
11
12
13#define LDRpin 8 // pin waar we LDR en weerstand verbinden
E Tmoed LDR= 0; // resultaat van het lezen van de analoge pin
Leegmeubilair() {
Serieel.Begin(9600); // Definieer de seriële poort voor communicatie
}LeegAmar() {
moed LDR=digitaal lezen(LDR-pin);// lees de LDR-waarde
Serieel.afdrukken(moed LDR); // Stuur de waarde naar de seriële poort
vertraging(100); // Wacht even
}
Sluit nu de Arduino aan op de computer met behulp van de USB-kabel.
Start nu de Arduino IDE en zorg ervoor dat u het juiste Arduino-model en de juiste seriële poort hebt ingesteld.
Ga voor het Arduino-model naar "Hulpmiddel”„planken”„arduino een' (als u een Arduino Uno gebruikt), en ga voor de seriële poort naar 'Hulpmiddel”„porto”„/dev/cu.usbmodem1411 (Arduino Uno)(Dit is op mijn Mac, het kan een beetje anders zijn op je Mac of pc.)
Kopieer de schets hierboven naar de IDE-editor, waarbij u de bestaande code vervangt of een nieuwe schets start ("kantoor uur”„nieuw"). Klik vervolgens nogmaals op de knop "op rijden"Knopf.
Start vervolgens de seriële monitor met "Hulpmiddel”„monitor serieelzodat we de uitvoer kunnen zien:
1
2
3
4
5
6
7
8
9
10
11
12
13
141
1
1
1
1
1
1
1
1
1
1
1
1
1
De uitvoer kan ook een aantal nullen zijn...
Draai nu langzaam aan de potentiometerknop tot je de waardes in één keer ziet veranderen, zodat 0-en 1-en worden of 1-en 0-en worden. Rijd niet te snel om de oproepen te vermijden"goed punt' vindt waar de mesh verandert van 0 naar 1 of vice versa.
als je nu"goed punt', beweeg je hand over de LDR en kijk hoe de waarde verandert. Als dit niet het geval is, moet u een beetje met de potentiometerknop spelen totdat dit wel het geval is.
Voeg een Arduino digitale pin toe aan de LDR
Nu kunnen we een AAN- en UIT-status waarnemen met de digitale pin, wat handig is als je maar 2 situaties hebt: AAN of UIT.
Met een tweede LDR kunnen we dit uitbreiden naar 3, bijv. HOOG, MIDDEN, LAAG (ervan uitgaande dat de analoge pin in uw toepassing te traag is).
Wat we in principe doen is de enkele LDR gebruiken voor bijvoorbeeld "medium" licht en de tweede voor "high light", waardoor we 3 niveaus kunnen waarnemen. Als je nu denkt: het moeten er 4 zijn, bedenk dan dat er een overlap is met bijvoorbeeld veel licht, dan heeft het automatisch ook "middelmatig" licht.
Met een potentiometer voor elke LDR kunnen we instellen hoeveel licht we AAN of UIT willen zien voor elke specifieke LDR.
We gebruiken pin 7 (in de schets) voor de tweede LDR; voel je vrij om een andere speld te gebruiken, maar vergeet de schets te matchen.
Schema(Klaar metFritsen):
2 LDR één Arduino digitale pin
klembord(Klaar metFritsen):
2 LDR één Arduino digitale pin
De relevante Arduino-schets:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
kweepeer
zestien
17
18
19
20#define LDRpin1 7 // pin waar we LDR en weerstand verbinden
#define LDRpin2 8 // pin waar we LDR en weerstand verbindenE TLDRWert1= 0; // Resultaat van digitale pinaflezing
E TLDRWert2= 0; // Resultaat van digitale pinaflezingLeegmeubilair() {
Serieel.Begin(9600); // Definieer de seriële poort voor communicatie
}LeegAmar() {
LDRWert1=digitaal lezen(LDRpin1);// lees de LDR-waarde
LDRWert2=digitaal lezen(LDRpin2);// lees de LDR-waarde
Serieel.druk op(LDRWert1); // druk de LDR1-waarde af op de seriële poort
Serieel.druk op(" "); // druk een spatie af
Serieel.afdrukken(LDRWert2); // print de LDR2-waarde op de seriële poort
vertraging(100); // Wacht even
}
Afhankelijk van de instelling van de potentiometer ziet u aanvankelijk veel "0 0", "1 0", "0 1" of "1 1".
Draai nu eerst beide potentiometers naar één kant.
Instelling "laag" niveau:
Zorg er eerst voor dat het omgevingslicht naar de positie gaat waarin u het licht als "donker" ziet, d.w.z. zijn de jaloezieën gesloten en de lichten uit?
Draai nu aan beide potentiometers totdat er niets anders dan "0 0" verschijnt: dit is onze "donkere" of "lage" stand, die we straks aanpassen.
Stel de "middelste" stand in:
Stel nu je omgevingslicht in op wat je ziet als "medium".
Draai nu slechts 1 van de potentiometers, bijvoorbeeld van LDR1, totdat "1 0" verschijnt.
(voor LDR2 zou het "0 1" zijn)
Stel het niveau "Hoog" in:
Zorg er nu voor dat het omgevingslicht mooi en helder is of waar je "luid" voor wilt gebruiken.
Draai nu aan de ANDERE potentiometer (LDR2) tot alleen “1 1” verschijnt.
Speel er een beetje mee om het idee te krijgen.
De volgende code is een aangepaste versie zodat u duidelijkere informatie kunt zien:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
kweepeer
zestien
17
18
19
20
21
22
23
24
25
26
27
28
29#define LDRpin1 7 // pin waar we LDR en weerstand verbinden
#define LDRpin2 8 // pin waar we LDR en weerstand verbindenint LDRWert1 =0;//Resultaat digitale pinaflezing
int LDRWaarde2 =0;//Resultaat digitale pinaflezingongeldige installatie() {
Serieel.begin(9600);//definieer de seriële poortProCommunicatie
}lege lus() {
LDRValue1 = digitale uitlezing(LDRpin1);// Archiefo moed doe LDR
LDRValue2 = digitale uitlezing(LDRpin2);// Archiefo moed doe LDR
Serieel.afdrukken(LDRWert1);//Drukt de LDR1-waarde af op de seriële poort
Serieel.afdrukken(" ");//een spatie afdrukken
Serieel.afdrukken(LDRWert2);//Drukt de LDR2-waarde af op de seriële poort
e((LDRWert1==1)&&(LDRWert2==1)) {
Serieel.afdrukken("-> HOE");}
anders e ((LDRWert1==1)&&(LDRWert2==0)) {
Serieel.afdrukken("-> GEMIDDELD");}
anders e ((LDRWert1==0)&&(LDRWert2==0)) {
Serieel.afdrukken("-> OMLAAG");}
Serial.println("Roeping");
vertraging(100);// Wachteen beetje
}
Een voorbeeld van de uitvoer bij het langzaam bewegen van een zaklamp naar de LDR in een donkere kamer:
1
2
3
4
5
6
7
8
9
10
11
120 0 -> LOW Verlichting
0 0 -> LOW Verlichting
0 0 -> LOW Verlichting
0 0 -> LOW Verlichting
0 0 -> LOW Verlichting
1 0 -> GEMIDDELDE verlichting
1 0 -> GEMIDDELDE verlichting
1 0 -> GEMIDDELDE verlichting
1 0 -> GEMIDDELDE verlichting
1 1 -> HOGE verlichting
1 1 -> HOGE verlichting
1 1 -> HOGE verlichting
Om zoiets in uw Boblight-project te gebruiken (niet getest!), kunt u zoiets als deze functie toevoegen.
Je merkt misschien dat ik na het vermenigvuldigen van de tweede LDR-waarde met 10, de LDR-waarden bij elkaar optel. Ik heb dit met opzet gedaan om u een idee te geven hoe u gemakkelijk waarden kunt vergelijken. De waarden kunnen in dit geval 0, 1, 10 en 11 zijn. Maar zoals eerder vermeld, is er enige overlap, dus we eindigen met de volgende mogelijke uitkomsten: { 0, 1, 11 }.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
kweepeer
zestien
17
18
19
20
21
22
23
24
25
26
27
28
29#define LDRpin1 7 // pin waar we LDR en weerstand verbinden
#define LDRpin2 8 // pin waar we LDR en weerstand verbinden...//andere code van uw project
lege lus() {
...//uw projectloophelderheid aanpassen();
...//Meer optionele projectcode
}Ongeldige helderheidsinstelling() {
int LDRWaarde =0;//Resultaat digitale pinaflezing
LDRWert = digitale uitlezing(LDRpin1);// Archiefo moed doe LDR
Valor LDR = Valor LDR +(digitaal lezen(LDRpin2)*10);//Voeg de waarde van de volgende LDR toe
e(moed LDR==0) {
//donker, dusAanpassenLED-helderheidProvoorbeeld voor50%
}
anders e(moed LDR==10 {
//gemiddeld, dusAanpassenLED-helderheidProvoorbeeld voor70%
}
anders e(moed LDR==11) {
//Stralend licht,AanpassenLED-helderheidProvoorbeeld voor100%
}
}
Gevolgtrekking
Met een LDR kunnen we licht heel goed waarnemen, en ook al is het geen 100% nauwkeurige lichtmeting, het is nog steeds een prima manier om bijvoorbeeld lampen aan te doen of te reageren op verschillen in licht.
LDR's werken met een analoge pin of een digitale pin, elk met zijn eigen kenmerken en toepassingen.
Een analoge pin zendt waardes uit tussen 0 en 1023, maar is helaas wat traag en kan daarom in bepaalde situaties (bijv. Boblight-project) niet worden gebruikt. Dus als snelheid geen groot probleem is: prima!
De benadering met een digitale pincode is veel sneller, en het toevoegen van een tweede LDR helpt om bijvoorbeeld 3 niveaus te creëren (er is een overlap zodat de 4e combinatie niet gebeurt. Dit is handig voor situaties waarin we meer vertrouwen op één aspect AAN en UIT-reactie als met 2 (of meer) LDR's de AAN/UIT-combinaties aanleiding kunnen geven tot meerdere reacties.