//
// USOS DE SERIAL (monitor)
// LED RGB ANODO/CATODO
//
int pinACR = 11, pinACG = 10, pinACB = 9;
int pinCCR = 6, pinCCG = 5, pinCCB = 3;
int ledPlaca = 13, pinPotRed = A0, pinPotGreen = A1, pinPotBlue = A2;
int valPotRed, valPotGreen, valPotBlue;
// Variables para funcionalidades
boolean bPotenciometro = true, bAleatorio = false, bMostrarVariables = false;
String strComando;
void setup() {
// Serial se usa para comunicacion, se la velocidad e transmision baudios
// Es posible utilizar un programa hecho en otro lenguaje para monitorear
// los datos que envia el arduino por el puerto
Serial.begin(115200);
Serial.println("Abajo de este mensaje aparece una barra donde se pueden escribir. Pruebe digitar 'AY' y presione enter.");
pinMode(ledPlaca, OUTPUT);
pinMode(pinACR, OUTPUT);
pinMode(pinACG, OUTPUT);
pinMode(pinACB, OUTPUT);
pinMode(pinCCR, OUTPUT);
pinMode(pinCCG, OUTPUT);
pinMode(pinCCB, OUTPUT);
pinMode(pinPotRed, INPUT);
pinMode(pinPotGreen, INPUT);
pinMode(pinPotBlue, INPUT);
}
void loop() {
// Verifica si hay datos para leer, se pueden leer enviar hastas 64 bytes
// (depende de la placa) cada vez, si se envian mas, lo mas probables es
// que se pierdan. Si recibe una comunicacion se procesa, esto permite comunicar
// con un programa en la PC por ejemplo. Podemos abrir otros Serial para
// comunicacion desde otras aplicaciones como C o Python
// Si detecta datos en el buffer de comunicacion...
//if (Serial.available() > 0){}
//
// Abre una termina para que el usuario digite, esto relentiza
// muchisimo los procesos.
// !!! POR ALGUNA RAZON ME ESTA METIENDOD UN CR AL FINAL SIEMPRE !!!
// CR = Retorno de Carro, caracter especial de fin de linea, es invisible
strComando = Serial.readString();
if (strComando.length() > 0) {
// Pasar a mayusculas
strComando.toUpperCase();
// Quitamos el CR adicional
if (int(strComando[strComando.length() -1]) == 10) {
strComando = strComando.substring(0, strComando.length() -1);
}
// Cantidad de bytes que soporta el buffer
// String(Serial.availableForWrite();
/*
Vamos a agregar un par de comandos (DEBEN SER MAYUSCULAS sin espacios):
AY = Ayuda
MV = Mostrar variables
PO = Usar potenciometros
CA = Colores Aleatorios, ya no se usan los potenciometros
*/
if (strComando == "AY") {
Serial.println("Lista de comandos");
Serial.println("AY: muestra la lista de comandos");
Serial.println("MV: mostrar/ocultar variables");
Serial.println("PO: usar potenciometros en los LEDs");
Serial.println("CA: Los leds ahora se iluminan con numeros al azar");
}
if (strComando == "MV") {
// Si ya estaba activo, lo desactiva
bMostrarVariables = not bMostrarVariables;
if (bMostrarVariables) { Serial.println("ACK, mostrando variables."); }
else { Serial.println("ACK, ocultando variables."); };
}
if (strComando == "PO") {
Serial.println("ACK, cambiando a potenciometros.");
bPotenciometro = true;
bAleatorio = false;
};
if (strComando == "CA"){
Serial.println("ACK, cambiando a patron aleatorio.");
bPotenciometro = false;
bAleatorio = true;
};
}
if (bPotenciometro){
valPotRed = analogRead(pinPotRed);
valPotGreen = analogRead(pinPotGreen);
valPotBlue = analogRead(pinPotBlue);
//
// map es una funcion que permite calcular un numero correspondiente
// al mismo en porcentaje en otro rango
analogWrite(pinCCR, map(valPotRed, 0, 1023, 0, 255));
analogWrite(pinCCG, map(valPotGreen, 0, 1023, 0, 255));
analogWrite(pinCCB, map(valPotBlue, 0, 1023, 0, 255));
analogWrite(pinACR, map(valPotRed, 0, 1023, 0, 255));
analogWrite(pinACG, map(valPotGreen, 0, 1023, 0, 255));
analogWrite(pinACB, map(valPotBlue, 0, 1023, 0, 255));
};
if (bAleatorio) {
valPotRed = random(256); // calcula un numero aleatorio entre 0 y 255
valPotGreen = random(256); // es posible tambien usar random(0, 256)
valPotBlue = random(256);
analogWrite(pinCCR, valPotRed);
analogWrite(pinCCG, valPotGreen);
analogWrite(pinCCB, valPotBlue);
analogWrite(pinACR, valPotRed);
analogWrite(pinACG, valPotGreen);
analogWrite(pinACB, valPotBlue);
};
if (bMostrarVariables) {
Serial.println("Potenciometro: " + String(bPotenciometro) + ", Aleatorio: "
+ String(bAleatorio) + " Rojo: " + String(valPotRed) + " Verde: " + String(valPotGreen)
+ " Azul: " + String(valPotBlue) );
}
if (digitalRead(ledPlaca) == HIGH) digitalWrite(ledPlaca, LOW);
else digitalWrite(ledPlaca, HIGH);
}
Catodo comun a tierra, funcionamiento más intuitivo
Anodo comun a 5V, invierte el funcionamiento, es menos intuitivo, las combinaciones de colores se invierten