SOLUCIONADO: Adaptando un codigo para controlar un led RGB con dos botones

Hola Amigos de la Comunidad:

En esta ocasiòn estoy necesitando una guìa para realizar un còdigo que me permita controlar un led RGB con dos botones o push-button, de la siguiente forma:

Al presionar repetidamente el Boton 1, se debe escoger entre los tres colores del led, rojo, verde, azul…de manera que…:

pulso 1—>Rojo
pulso 2—>Verde
pulso 3—>Azul
pulso 4—>Rojo
pulso 5—>Verde

Luego, con el auxilio del Boton 2, poder variar la intensidad del ùltimo color que quedò seleccionado con el boton 1. Mientras se tenga apretado el Boton 2, se va incrementando de 1 en 1 hasta 255, el valor de la intensidad de ese color.

En el Asunto puse la palabra ADAPTANDO, pues yo tengo realizado un pequeño còdigo que me funciona bien y hace lo mismo, solo que los datos son introducidos por el monitor serial, de manera que el usuario debe introducir la intensidad del rojo, la intensidad del verde y la intensidad del azul, en valores entre 0 y 255 separados por comas “,”

Es lo màs parecido a lo que ahora me piden, pues buscando en Google y aquì en el foro, solo encuentro tratamiento de botones para acceder a menùs con displays LCD, con librerìas y todo, que no me parece sea este el caso.

Le dejo acontinuaciòn el còdigo que me funciona con la introducciòn manual (monitor serial) de las intensidades de cada color.

Si alguien tiene idea de como afrontar este ejercicio y me puede dar una mano, les estoy desde ya agradecido.

Muchas gracias y buen trabajo!
Juan Carlos

/*---------------------------------------------------
   Pràctica 11, Ejercicio 1: LED RGB con colores a partir del monitor serial
  --------------------------------------------------
   Programa que genera diversas tonalidades de colores en
   un led RGB.
   Las diferentes tonalidades del color son introducidas por el usuario
   a travès del monitor serial, con un formato como sigue:
   "cantidad de rojo, cantidad de verde, cantidad de azul", que 
   seràn valores de 0-255 separados por comas
*/

//-----------------------------------------------------
//Declarar puertos de entrada y salida, variables, etc.
//-----------------------------------------------------

int ledRojo = 9;    // declaro que el pin rojo es el 9
int ledVerde = 10;  // declaro que el pin verde es el 10
int ledAzul = 11;   // declaro que el pin azul es el 11


//------------------------------------
//Funciòn principal o de configuraciòn
//------------------------------------

void setup()
{
  pinMode (ledRojo, OUTPUT);   // inicializo el pin rojo como salida
  pinMode (ledVerde, OUTPUT);  // inicializo el pin verde como salida
  pinMode (ledAzul, OUTPUT);   // inicializo el pin azul como salida
  Serial.begin (9699);         // inicializo comnicaciòn serial
  Serial.println("Hola: Escribe los valores entre 0 y 255 para cada color R,V,A separados por una coma");
}

//--------------------
//Funciòn cìclica
//--------------------

void loop()
{
  if (Serial.available() > 0)
  {
    int rojo = Serial.parseInt();     //guardo el primer valor leìdo en "rojo"
    int verde = Serial.parseInt();    //guardo el 2do. valor leìdo en "verde"
    int azul = Serial.parseInt();     //guardo el 3er. valor leìdo en "azul"
    analogWrite(ledRojo, rojo);      // escritura del valor del led Rojo
    analogWrite(ledVerde, verde);    // escritura del valor del led Verde
    analogWrite(ledAzul, azul);      // escritura del valor del led Azul
    Serial.print("rojo=");
    Serial.println(rojo);            // escribo el valor de rojo para verlo
    Serial.print("verde=");
    Serial.println(verde);            // escribo el valor de verde para verlo
    Serial.print("azul=");
    Serial.println(azul);            // escribo el valor de azul para verlo
  
  }
}

// Fin del programa

Las práctica suelen hacerse para sacar la mejor creatividad de uno futuro buen programador. No pierdas tiempo buscando la solución en GOOGLE porque no la encontrarás. Ademas como la buscas?

Lo mejor es encarar tu problema por partes e ir resolviendo estas tareas paso a paso.

Si aprendes a desarmar lo que te piden en tareas menores, al final podras tener hecho tu trabajo en menos tiempo del que perdiste buscandolo.

Viendo tu código me doy cuenta que estas lejos del objetivo mas simple

Presiono un pulsador y voy cambiando de color.
Porque no te enfocas primero en eso

Cómo haces para hacer que un led RGB de el color que tu quieres?
Dijiste que presionas
pulso 1--->Rojo
pulso 2--->Verde
pulso 3--->Azul
pulso 4--->Rojo
pulso 5--->Verde

asi que resuelve eso primero.
Yo no veo en esta parte cambio de intensidad asi que analogWrite nada tiene que hacer en esta tarea inicial.

Luego pasaremos al boton 2 que SI cambiará la intensidad.

Exactamente como dices Surbyte:

Pero es que yo coincido contigo en que el còdigo que puse no tiene nada que ver, aunque haga "lo mismo" a travès del monitor serial.

El nuevo còdigo que debo hacer es eso mismo con sòlo dos botones:

Boton 1 para seleccionar el color
Boton 2 para establecer la intensidad.

Y es, presisamente en esa primera secuencia:

pulso 1--->Rojo
pulso 2--->Verde
pulso 3--->Azul
pulso 4--->Rojo
pulso 5--->Verde

donde estoy trabado, es decir "en cero"..., no me viene nada a la mente para encarar este primer paso: còmo hago para que cuando llegue al color azul... con la 4ta presiòn del botòn me dè otra vez Rojo....????

Entièndanme que no quiero que me hagan el còdigo, sino que me den una guìa a seguir para resolverlo, aunque el còdigo que publiquèa antes no me sirva y tenga que iniciar uno nuevo....vaya el empujoncito inicial...

Gracias otra vez,
Juan Carlos

Bueno te sigo guiando. Tiene un led asi

Tal que usas

int ledRojo = 9;    // declaro que el pin rojo es el 9
int ledVerde = 10;  // declaro que el pin verde es el 10
int ledAzul = 11;   // declaro que el pin azul es el 11

Entonces si tu presionas un botón y quieres que cambie escalonadamente de Rojo -> Verde -> Azul y repites
necesitas que tu pulsador incremente un contador
Y que ese contador en cada valor reaccione a una salida
0 -> Rojo
1 -> Verde
2 -> Azul

y repites
eso lo haces asi

const byte pinBoton1  = 2;      // Es el pin donde tengo un pulsador 
const byte ledRojo    = 9;      // declaro que el pin rojo es el 9
const byte ledVerde   = 10;     // declaro que el pin verde es el 10
const byte ledAzul    = 11;     // declaro que el pin azul es el 11

byte estado = 0;                // sera mi contador y lo defino como byte porque no me pasaré de 255 
bool valor, valorAnt = false;   // dos variables bool que me dirán como he presionado la tecla

void setup() {
 // solo agrego lo nuevo, tu repite lo que has puesto
  pinMode(pinBoton1, INPUT);    // defino a 2 como entrada
  pinMode(ledRojo, OUTPUT);     // inicializo el pin rojo como salida
  pinMode(ledVerde, OUTPUT);    // inicializo el pin verde como salida
  pinMode(ledAzul, OUTPUT);     // inicializo el pin azul como salida
  Serial.begin (9600);          // inicializo comnicaciòn serial

}

void loop() {
  bool valor = digitalRead(pinBoton1);   // leo pin 2

  if (valor && valorAnt) {               // si presioné incremento estado
       estado = (estado + 1)%3;          // con cada presion incremento estado en 1, 
                                         // pero si supero 3, cambia a 0
                                         // % es módulo 0%3 = 0 1%3 = 1 2%3 = 2 3%3 = 0 y repito
  }
  switch (estado) {
      case 0: rojo  = 255;
              verde = 0;
              azul  = 0;
              break;
      case 1: rojo  = 0;
              verde = 255;
              azul  = 0;
              break;
      case 2: rojo  = 0;
              verde = 0;
              azul  = 255;
              break;
  }
  analogWrite(ledRojo,  rojo); // Rojo encendido
  analogWrite(ledVerde, verde); // Verde apagado
  analogWrite(ledAzul,  azul); // Azul apagado
}

Esta es la primera parte

Muchas gracias Surbyte:

Voy a probar lo que me dices, creo entender esa primera parte. Luego como dices, enfrentaremos la segunda.

De màs està decirte que ya tienes tu Karma…

Otra vez gracias y buen trabajo!

La segunda parte quiero que vayas pensandola y dando ideas.
Mira como se hizo la primera.
Observa como se actúa sobre el pulsador y que va incrementando un contador solo que para tu casó.. ese contador lo restringimos a 0..1..2

Que pasaría si lo extiendes 0.. 255 con el otro pulsador? Tendrías algo que controlaría el brillo.

Bien, por ahi va la cosa, piensalo y a ver que surge.

Ahora el detalle es que tu pulsador 2 debe ajustar el brillo SOLO del LED que este activo no los demás.

Entonces deberías manejar 3 contadores y según cual este activo incrementarlo con el pulsador 2.

Ya te he tirado una buena guía.

Exprime las neuronas!!

Hola a todos los colegas:

Hace un par de dìas que no les daba noticias del ejercicio que estaba tratando de resolver, pero es que estaba estudiando un poco el fin de semana, para tratar de implementar las sugerencias de Surbyte,pero no me atrevìa todavìa a desarrollarlas. Sin embargo un amigo me sugiriò una idea que viò en el sitio “BricoGeek”, que consistìa en agregar un botòn màs al circuìto, de manera que tenìa el botòn para seleccionar el color y otros dos botones uno para “aumentar” la intensidad y otro para “disminuir”.

Como no me costaba nada y ademàs me gusta màs que la soluciòn que proponìa el ejercicio que estoy realizando, ya que con un solo botòn habìa que “dar la vuelta completa” de 0 a 254 0 de 254 a 0 para determinar un valor, esto se resolvìa con la introducciòn de un nuevo botòn, con esto puedo subir o bajar la intensidad de cada color a partir del valor previamente seleccionado.

El còdigo se puede simplificar y mejorar, sobre todo en la parte de la comunicaciòn serial, lo cual harè en la primera oportunidad, pero como funciona y me gusta como lo hace, aquì se los dejo, no sin antes agradecerles por el tiempo que se tomaron en leer el post y sobre todo agradecer a Surbyte con sus siempre precisas y puntuales sugerencias.

Muchas gracias

//-----------------------------------------------------
//Declarar puertos de entrada y salida, variables, etc.
//-----------------------------------------------------

int ledRojo = 3;
int ledVerde = 6;
int ledAzul = 5;        // defino los pines a utilizar para cada color

int valorRojo = 0;
int valorVerde = 0;
int valorAzul = 0;     // var. que guarda los valores a asignar a cada color

int botonSeleccion = 8;
int botonAumentar = 10;
int botonDisminuir = 9; // defino los pines usados por cada boton


//------------------------------------
//Funciòn principal o de configuraciòn
//------------------------------------

void setup()
{
  Serial.begin(9600);               // inicializo la comunicaciòn serie a 9600 baudios
  pinMode(botonSeleccion, INPUT);   // declaro el pin 8, Selecciòn, como entrada
  pinMode(botonAumentar, INPUT);    // declaro el pin 10, Aumentar, como entrada
  pinMode(botonDisminuir, INPUT);   // declaro el pin 9, Disminuir, como entrada

  analogWrite(ledRojo, 255);        // color Rojo por defecto
  // 0=Rojo, 1= Verde, 2=Azul
}

int pinLed = 0;                     // para que empiece por el color 0=Rojo

//--------------------
//Funciòn cìclica
//--------------------

void loop()
{
  if (digitalRead(botonSeleccion) == HIGH)
  {
    pinLed++;                        // paso a otro color

    if (pinLed > 2)                  // para no pasarme de vuelta (0,1,2,0,1...
    {
      pinLed = 0;                    // ....vuelvo a empezar del 0=Rojo
    }
    analogWrite(ledRojo, 0);
    analogWrite(ledVerde, 0);
    analogWrite(ledAzul, 0); // apago todos los led ya que luego se mostrarà solo el led seleccionado

    while (digitalRead(botonSeleccion) == HIGH) {} // espero a que suelte el boton
    {
      delay(10);                              // espero un poquito màs...
    }
  }

  if (digitalRead(botonAumentar) == HIGH)  // veo si debo AUMENTAR el valor
  {
    analogWrite(ledRojo, 0);
    analogWrite(ledVerde, 0);
    analogWrite(ledAzul, 0); // apago todos los led ya que luego se mostrarà solo el led seleccionado
    
    if (pinLed == 0)
    {
      Serial.println("Led ROJO");          // escribo que estoy en el led Rojo
      valorRojo+=10;                     // si està seleccionado 0, aumento valor del Rojo
      Serial.println(valorRojo);           // muestro el valor de Rojo
    }
    if (pinLed == 1)
    {
      Serial.println("Led VERDE");          // escribo que estoy en el led Verde
      valorVerde+=10;                     // si està seleccionado 1, aumento valor del Verde
      Serial.println(valorVerde);           // muestro el valor de Verde
    }
    if (pinLed == 2)
    {
      Serial.println("Led AZUL");          // escribo que estoy en el led Azul
      valorAzul+=10;                     // si està seleccionado 2, aumento valor del Azul
      Serial.println(valorAzul);           // muestro el valor de Azul
    }

    delay (1000);
  }

  if (digitalRead(botonDisminuir) == HIGH)  // veo si debo DISMINUIR el valor
  {
    analogWrite(ledRojo, 0);
    analogWrite(ledVerde, 0);
    analogWrite(ledAzul, 0); // apago todos los led ya que luego se mostrarà solo el led seleccionado
    
    if (pinLed == 0)
    {
      Serial.println("Led ROJO");          // escribo que estoy en el led Rojo
      valorRojo-=10;                     // si està seleccionado 0, disminuyo valor del Rojo
      Serial.println(valorRojo);           // muestro el valor de Rojo
    }
    if (pinLed == 1)
    {
      Serial.println("Led VERDE");          // escribo que estoy en el led Verde
      valorVerde-=10;                     // si està seleccionado 1, disminuyo valor del Verde
      Serial.println(valorVerde);           // muestro el valor de Verde
    }
    if (pinLed == 2)
    {
      Serial.println("Led AZUL");          // escribo que estoy en el led Azul
      valorAzul-=10;                     // si està seleccionado 2, disminuyo valor del Azul
      Serial.println(valorAzul);           // muestro el valor de Azul
    }
    delay (1000);
  }
  
  if (valorRojo > 254) {
    valorRojo = 254;
  }
  if (valorRojo < 0) {
    valorRojo = 0;
  }

  if (valorVerde > 254) {
    valorVerde = 254;
  }
  if (valorVerde < 0) {
    valorVerde = 0;
  }

  if (valorAzul > 254) {
    valorAzul = 254;
  }
  if (valorAzul < 0) {
    valorAzul = 0;        // esto es para no pasarme al dar la vuelta en
                          // el valor de salida de 0 a 254
  }


  analogWrite (ledRojo, valorRojo);
  analogWrite (ledVerde, valorVerde);
  analogWrite (ledAzul, valorAzul); // Actualizo el valor de los colores seleccionados
  
}



// Fin del programa
// JCPG