Stap 7: Vervagen LEDs met AnalogWrite
Soms willen we controle van de helderheid van een LED, in dat geval kunnen we het gebruiken van een commando genaamd analogWrite(). analogWrite werkt door het draaien van een LED aan en uit zeer snel, zo snel dat onze ogen niet de flikkering doen waarnemen. Als een LED besteedt de helft van de tijd af en de helft van de tijd op, wordt dan deze half zo helder weergegeven. Deze techniek heet puls breedte modulatie (PWM), het over en in de elektronica wordt gebruikt omdat het ons toelaat te bepalen van een component in een "analoge" manier met behulp van een digital pin. Niet alle digitale pinnen op de Arduino PWM, kunnen doen als je goed op je Arduino kijkt, ziet u dat sommige van de pennen hebben een "~" ernaast (pin 3, 5, 6, 9, 10, 11), dit zijn de pinnen van de PWM ingeschakeld.Draad één van uw LED's een PWM ingeschakeld pin, gebruikte ik pin 9. Probeer de blink-schets van tevoren, maar analogWrite in plaats van de digitalWrite gebruiken om te schakelen de LED (Zie schets hieronder). analogWrite() heeft twee argumenten: het pin-nummer en het niveau van helderheid (tussen 0 en 255).
//LED Blink (half brightness) int ledPin = 9;//the Arduino pin that is connected to the LED void setup() { pinMode(ledPin, OUTPUT);// initialize the pin as an output } void loop() { analogWrite(ledPin, 255);//turn LED on at full brightness (255/255 = 1) delay(1000);// wait for 1000 milliseconds (one second) digitalWrite(ledPin, LOW);//turn LED off delay(1000);//wait one second analogWrite(ledPin, 191);//turn LED on at 3/4 brightness (191/255 ~= 0.75) delay(1000);// wait for 1000 milliseconds (one second) digitalWrite(ledPin, LOW);//turn LED off delay(1000);//wait one second analogWrite(ledPin, 127);//turn LED on at half brightness (127/255 ~= 0.5) delay(1000);// wait for 1000 milliseconds (one second) digitalWrite(ledPin, LOW);//turn LED off delay(1000);//wait one second analogWrite(ledPin, 63);//turn LED on at one quarter brightness (63/255 ~= 0.25) delay(1000);// wait for 1000 milliseconds (one second) digitalWrite(ledPin, LOW);//turn LED off delay(1000);//wait one second }
Probeer te veranderen de helderheid in de opdrachten van de analogWrite zien hoe beïnvloedt het de helderheid van uw LED.
We vervolgens schrijven de code zodat de helderheid soepel uit helemaal af op volledige helderheid opritten. We kunnen het zelfde stuk van code kopiëren:
analogWrite (ledPin, helderheid);
vertraging (5); //short vertraging
helderheid = helderheid + 1;
Over en voorbij (255 keer), helderheid verhogen door een telkens. Hier is wat dat zou eruit:
//LED Blink (half brightness) int ledPin = 9;//the Arduino pin that is connected to the LED void setup() { pinMode(ledPin, OUTPUT);// initialize the pin as an output } void loop() { int brightness = 0; analogWrite(ledPin, brightness);//brightness = 0 delay(5);// short delay brightness += 1; analogWrite(ledPin, brightness);//brightness = 1 delay(5);// short delay brightness += 1; analogWrite(ledPin, brightness);//brightness = 2 delay(5);// short delay brightness += 1; analogWrite(ledPin, brightness);//brightness = 3 delay(5);// short delay brightness += 1; analogWrite(ledPin, brightness);//brightness = 4 delay(5);// short delay brightness += 1; analogWrite(ledPin, brightness);//brightness = 5 delay(5);// short delay brightness += 1; analogWrite(ledPin, brightness);//brightness = 6 delay(5);// short delay brightness += 1; //keep repeating until brightness = 255 (full brightness) }
Of we kunnen gebruiken een for-lus om de code veel beknopter. In het volgende schema heb ik twee lussen, de eerste hellingen de LED op off (0) op volledige brightness(255):
voor (int helderheid = 0; helderheid < 256; helderheid ++) {}
analogWrite(ledPin,brightness);
Delay(5);
}De tweede lus hellingen naar beneden uit volledige helderheid uitgeschakeld:
voor (int helderheid = 255; helderheid > = 0; helderheid--) {}
analogWrite(ledPin,brightness);
Delay(5);
}
(de delay(5) wordt gebruikt voor het vertragen van de fade, dus duurt het 5 * 256 = 1280ms = 1.28seconds)
In de eerste regel, gebruiken we "helderheid--" te geven de for-lus verkleint u de waarde voor helderheid met 1 telkens wanneer de lus herhaalt. Merk ook op hoe de lus wordt uitgevoerd totdat helderheid > = 0, met behulp van > = in plaats van > we het cijfer 0 in het bereik opnemen.
//LED fade int ledPin = 9;//the Arduino pin that is connected to the LED void setup() { pinMode(ledPin, OUTPUT);// initialize the pin as an output } void loop() { //ramp LED up to full brightness (0 to 255) for (int brightness=0;brightness<256;brightness++){ analogWrite(ledPin,brightness); delay(5); } delay(1000);// wait one second //ramp LED down to no brightness (255 to 0) for (int brightness=255;brightness>=0;brightness--){ analogWrite(ledPin,brightness); delay(5); } delay(1000);//wait one second }
En hier is wat het zou moeten uitzien (deze simulatie is niet zo goed, maar je krijgt het idee). Probeer het bewerken van de vertragingen om te zien hoe het beïnvloedt de snelheid van de hellingshoek.