En una de las entradas que tengo en mi blog en Channel 9 publiqué un reto de cómo controlar a un led RGB por medio de tres potenciómetros, uno para cada color del led.
Bueno, pues después de más de un mes creo que es buena idea publicar la respuesta así que vamos por partes. Primero el circuito, la configuración no es lo más complejo del mundo. Aquí tienes un diagrama de Fritzing para que lo puedas ver más claro.
La mejor opción para el potenciómetro es conseguir tres de 52K, estos permiten una graduación en la intensidad del led muy agradable.
No me meteré a profundidad en el funcionamiento del potenciómetro, lo que nos interesa es saber que con el nivel de graduación en la intensidad de la energía que el potenciómetro puede regular podremos regular la intensidad de cada una de los tres diferentes colores del LED.
Para poder hacerlo, tienes el siguiente código.
const int redControl = A0; const int greenControl = A1; const int blueControl = A2; const int redLed = 4; const int greenLed = 5; const int blueLed = 6; int redLedBright = 0; int greenLedBright = 0; int blueLedBright = 0; int redPotenciometerValue = 0; int greenPotenciometerValue = 0; int bluePotenciometerValue = 0; void setup() { pinMode(redControl, INPUT); pinMode(greenControl, INPUT); pinMode(blueControl, INPUT); pinMode(redLed, OUTPUT); pinMode(greenLed, OUTPUT); pinMode(blueLed, OUTPUT); Serial.begin(9600); } void loop() { redPotenciometerValue = analogRead(redControl); greenPotenciometerValue = analogRead(greenControl); bluePotenciometerValue = analogRead(blueControl); redLedBright = map(redPotenciometerValue, 0, 1023, 0, 255); greenLedBright = map(greenPotenciometerValue, 0, 1023, 0, 255); blueLedBright = map(bluePotenciometerValue, 0, 1023, 0, 255); analogWrite(redLed, redLedBright); analogWrite(greenLed, greenLedBright); analogWrite(blueLed, blueLedBright); Serial.print("Red potenciometer = "); Serial.print(redPotenciometerValue); Serial.print(" Red bright = "); Serial.print(redLedBright); Serial.print("| Green potenciometer = "); Serial.print(greenPotenciometerValue); Serial.print(" Green bright = "); Serial.print(greenLedBright); Serial.print("| Blue potenciometer = "); Serial.print(bluePotenciometerValue); Serial.print(" Blue bright = "); Serial.println(redLedBright); delay(100); } |
Los pasos que cada una de las funciones realizará son fáciles de seguir:
1.-Leemos el valor que cada una de las entradas análogas recibe gracias al potenciómetro
2.-Utilizar la función map, esta función sirve para convertir un rango de valores a otro diferente, en este caso el potenciómetro puede ir de 0 a 1023, el de los LED va de 0 a 255 y es por eso que es necesario “mapear” los valores.
3.- Con la función AnalogWrite puedes asignar el nuevo valor obtenido a partir de la función anterior al led adecuado
4.- Todas las líneas escritas con la función Serial.print solo servirán para darnos cuenta de que el valor está funcionando de la forma esperada.
Hasta aquí el código funciona de la manera esperada pero es definitivo que necesitamos refactorizar mucho código debido a lo repetitivo de todo esto. Gran parte de la función loop se puede extraer en un método externo.
void ConvertPotenciometerToLed(int potenciometerOrigin, int potenciometerValue, int ledBright, int ledType) { potenciometerValue = analogRead(potenciometerOrigin); ledBright = map(potenciometerValue, 0, 1023, 0, 255); analogWrite(ledType, ledBright); } |
Con esto, el código final puede quedar de la siguiente manera.
const int redControl = A0; const int greenControl = A1; const int blueControl = A2; const int redLed = 4; const int greenLed = 5; const int blueLed = 6; int redLedBright = 0; int greenLedBright = 0; int blueLedBright = 0; int redPotenciometerValue = 0; int greenPotenciometerValue = 0; int bluePotenciometerValue = 0; void setup() { pinMode(redControl, INPUT); pinMode(greenControl, INPUT); pinMode(blueControl, INPUT); pinMode(redLed, OUTPUT); pinMode(greenLed, OUTPUT); pinMode(blueLed, OUTPUT); } void loop() { ConvertPotenciometerToLed(redControl, redPotenciometerValue, redLedBright, redLed); ConvertPotenciometerToLed(greenControl, greenPotenciometerValue, greenLedBright, greenLed); ConvertPotenciometerToLed(blueControl, bluePotenciometerValue, blueLedBright, blueLed); delay(100); } void ConvertPotenciometerToLed(int potenciometerOrigin, int potenciometerValue, int ledBright, int ledType) { potenciometerValue = analogRead(potenciometerOrigin); ledBright = map(potenciometerValue, 0, 1023, 0, 255); analogWrite(ledType, ledBright); } |
Más cómodo ¿no crees? Si quieres descargar el proyecto de este ejemplo, puedes hacerlo aquí.