Stap 3: Schrijven van de Code
Een nieuwe schets maken met behulp van de Arduino IDE .
Voorafgaand aan de Setup-functie, declareert u variabelen voor de analoge pin verbonden met de photoresistor en de digitale pin verbonden aan de LED.
//Photoresistor Pinint analogPin = 0; // LED Pin int ledPin = 9;
Voor deze firmware hoeft u niet om iets te plaatsen in de installatiemethode. Normaal gesproken zou u de digitale pen declareren als OUTPUT met behulp van de functie pinMode(), echter we gaan worden met behulp van de analogWrite()-functie, waarvoor de pin te worden verklaard als een uitgang niet.
In de loop-functie zal u beginnen met de lezing in het lichtniveau van de fotoweerstand met behulp van dezelfde code uit de vorige les.
void loop() { // put your main code here, to run repeatedly: // read the raw data coming in on analog pin 0: int lightLevel = analogRead(analogPin); }
Vervolgens zal u de binnenkomende lichtniveau converteren naar het juiste bereik voor de LED. Hiervoor gebruikt u twee nieuwe functies - map() en constrain().
De functie van de kaart heeft vijf Invoerargumenten - de waarde, een lage waarde en een hoge waarde van het huidige bereik, en een lage waarde en een hoge waarde voor het doelbereik.
int val = map(value, fromLow, fromHigh, toLow, toHigh);
Dit alles opnieuw een waarde uit een bereik naar de equivalente waarde in een ander bereik hebt toegewezen. Bijvoorbeeld, de kaart (25, 0, 50, 0, 100) 50 zou terugkeren (50 is het equivalent in de 0-100 tot 25 binnen het bereik van 0-50). In deze les brengt u in de lightLevel kaart (een 0-1023 bereik) naar een PWM bereik (0-255). Een andere manier van accompishing zou hetzelfde doel in dit geval de lightLevel waarde delen door 4 (0-255 is op vierde van 0-1023), maar als je dat deed, je zou niet krijgen om te leren van de map() functie. Bovendien, omdat u niet dat uw nachtlampje wilt te zijn op, bij sommige licht (bijvoorbeeld weinig licht) zal u wilt wijzigen van het bereik van de lightLevel. Bijvoorbeeld, in mijn kantoor de waarde lightLevel is ongeveer 340 wanneer de lichten op (het is niet een zeer heldere kantoor). Ik wil dit behandelen alsof er genoeg licht dat de LED niet moet worden verlicht, dus ik niet de LED brandt ben als de lichten ingeschakeld zijn. Om dit te doen, kaart ik het bereik van de lightLevel als 350-1023.
void loop() { // put your main code here, to run repeatedly: // read the raw data coming in on analog pin 0: int lightLevel = analogRead(analogPin); // re-map the value from the analog pin to a smaller range // Experiment with the right fromLow level based on your environment int brightness = map(lightLevel, 350, 1023, 0, 255); }
U zult moeten experimenteren met dit te vinden van het beste bereik te gebruiken (herinner me, kunt u de seriële monitor in de vorige les vindt u de onbewerkte waarde vanuit de fotoweerstand).
Het bereik van de lightLevel met behulp van een lage waarde die hoger is dan een waarde die u zou kunnen worden invoeren in kaart te brengen kan resulteren in een negatief getal (bijvoorbeeld in mijn voorbeeld, de lightLevel zou 340 hoewel ik het lage einde van het bereik bij 350 geïdentificeerd). U kunt de constrain() functie gebruiken om te beschermen tegen het instellen van helderheid op een negatief getal.
De constrain()-functie neemt in drie Invoerargumenten - de waarde, een lage waarde en een hoge waarde.
int val = constrain(value, lowValue, highValue);
Als de waarde tussen de lowValue en de highValue is, zal wordt de waarde worden geretourneerd. Als de waarde lager is zal de lowValue, dan lowValue worden teruggegeven. Als de waarde hoger is dan highValue, zal dan highValue worden teruggegeven.
Met behulp van de functie van de constrain() u ervoor u zorgen kunt niet op een slechte waarde helderheid ingesteld. Nu dat je de waarde van een goede helderheid kunt u de functie analogWrite() om in te stellen van de PWM voor de LED-pin. Een helderheidswaarde van 0 is een taakcyclus van 0% (uit) en een helderheidswaarde van 127 is een taakcyclus van 50%, enz.
void loop() { // put your main code here, to run repeatedly: // read the raw data coming in on analog pin 0: int lightLevel = analogRead(analogPin); // re-map the value from the analog pin to a smaller range // Experiment with the right fromLow level based on your environment int brightness = map(lightLevel, 350, 1023, 0, 255); // use constrain to avoid negative numbers and/or numbers above the high range brightness = constrain(brightness, 0, 255); // use analogWrite to send PWM data (a square wave) analogWrite(ledPin, brightness); }