Control con pulsadores

A partir de este código, el cual enciende progresivamente cada parte del RGB, mediante un pulsador. ¿Se podría a cambiar a que cada vez que pulsemos un pulsador, vaya incrementándose la intensidad pero ño progresivamente?


int Ledrojo = 6;
int Ledverde = 5;
int Ledazul = 4;
int Pulsrojo = 8;
int Pulsverde = 9;
int Pulsazul = 10;
int Puls0 = 11;
int rojo = 0;
int azul = 0;
int verde = 0;
void setup()
{
  pinMode(Ledrojo, OUTPUT);

  pinMode(Ledverde, OUTPUT);

  pinMode(Ledazul, OUTPUT);  

  pinMode(Pulsrojo, INPUT_PULLUP);

  pinMode(Pulsverde, INPUT_PULLUP);

  pinMode(Pulsazul, INPUT_PULLUP);

}
void loop()
{
  if (digitalRead(Pulsrojo) == LOW)
  {
  rojo ++;
  if (rojo > 255) rojo = 0;
  }

  if (digitalRead(Pulsverde) == LOW)
  {
  verde ++;
  if (verde > 255) verde = 0;
  }

  if (digitalRead(Pulsazul) == LOW)
  {
  azul ++;
  if (azul > 255) azul = 0;
  }
  analogWrite(Ledrojo, rojo);
  analogWrite(Ledverde, verde);
  analogWrite(Ledazul, azul);  
  delay(50);
 

}


Hola no entiendo lo de no progresivamente, ¿ De golpe, de cero al maximo?. Por ejemplo para el canal rojo donde tienes

if (digitalRead(Pulsrojo) == LOW)
  {
  rojo ++;
  if (rojo > 255) rojo = 0;
  }

cambialo por

if (digitalRead(Pulsrojo) == LOW) {
  if (rojo = 255) {
    rojo = 0;
  }
  else {
    rojo = 255;
  }

Aunque no se si es eso lo que querias.

No, sería que por ejemplo la primera vez que lo pulses pase de 0 a 25, la segunda de 25 a 50. Así progresivamente hasta que al pasarse de 255, se ponga 0 y vuelvas a empezar.

Mas facil lo pones, cambia solo el valor que sumas sin tocar nada mas, por ejemplo para el rojo

rojo = rojo + 25;

Solo una cosita,
Si esperas que los valores estén entre 0 y 255 mejor utilizar una variable tipo "byte".
Así además te ahorras los "if" dado que si vale 255 y le sumas uno, vuelve a cero.

byte rojo = 0;
...
 if (digitalRead(Pulsrojo) == LOW) rojo ++;  

o tal y como lo tienes puedes añadir un "and" 255 en los analogWrite y te olvidas de los 3 "if":

analogWrite(Ledrojo, rojo & 0xff);

Saludos.

Ok, muchas gracias por la mejora

Pero esto no haría que pasara de 0 a 25, de 25 a 50. Así progresivamente hasta que al llegar a 255 pase a 0.


int Ledrojo = 6;
int Ledverde = 5;
int Ledazul = 4;
int Pulsrojo = 8;
int Pulsverde = 9;
int Pulsazul = 10;
int Pulsrojo2 = 11;
int Pulsverde2 = 12;
int Pulsazul2 = 13;
int rojo = 0;
int azul = 0;
int verde = 0;
void setup()
{
  pinMode(Ledrojo, OUTPUT);

  pinMode(Ledverde, OUTPUT);

  pinMode(Ledazul, OUTPUT);  

  pinMode(Pulsrojo, INPUT_PULLUP);

  pinMode(Pulsverde, INPUT_PULLUP);

  pinMode(Pulsazul, INPUT_PULLUP);

  pinMode(Pulsrojo2, INPUT_PULLUP);

  pinMode(Pulsverde2, INPUT_PULLUP);

  pinMode(Pulsazul2, INPUT_PULLUP);
}
void loop()
{
  if (digitalRead(Pulsrojo) == LOW)
  {
  rojo ++;
  if (rojo > 255) rojo = rojo + 50;
  }

  if (digitalRead(Pulsverde) == LOW)
  {
  verde ++;
  if (verde > 255) verde = verde + 50;
  }

  if (digitalRead(Pulsazul) == LOW)
  {
  azul ++;
  if (azul > 255) azul = azul + 50;
  }
  
  if (digitalRead(Pulsrojo2) == LOW)
  {
  rojo --;
  if (rojo > 255) rojo = rojo + 50;
  }
  
  if (digitalRead(Pulsverde2) == LOW)
  {
  verde --;
  if (verde > 255) verde = verde + 50;
  }
  
  if (digitalRead(Pulsazul2) == LOW)
  {
  azul --;
  if (azul > 255) azul = azul + 50;
  }
  analogWrite(Ledrojo, rojo);
  analogWrite(Ledverde, verde);
  analogWrite(Ledazul, azul);  
  delay(50);

}

Ahora he intentado, que cada vez que pulse uno de los tres primeros pulsadores se sume 50, pero cada vez que se pulse uno de los tres últimos se reste. Tengo el problema que cada vez que llego a 0 y vuelvo a restar, se pone automáticamente en el máximo y no funciona.

@Pastormald0nad0 es difícil saber exáctamente lo que quieres,
¿Quieres que al pulsar un botón suba la intensidad 25 pero que no suba más hasta que no vuelvas a pulsar el pulsador? es decir ¿obligar a pulsar varias veces para que suba la intensidad?
entonces tienes que hacer esto:

   int rojo=0;
   const int intensidad=25;
...
  if (digitalRead(Pulsrojo) == LOW) //se ha oprimido el pulsador rojo de subir intensidad?
  {
      rojo=rojo+intensidad;   //subir intensidad
      if (rojo>255) rojo=255;  //que no supere los 255
      analogWrite(Ledrojo, rojo); //poner la intensidad del led
     while (digitalRead(Pulsrojo)==LOW) ; //esperar a que el pulsador se suelte 
  }
  if (digitalRead(Pulsrojo2) == LOW) //se ha oprimido el pulsador rojo de bajar intensidad?
  {
      rojo=rojo-intensidad;   //bajar intensidad
      if (rojo<0) rojo=0;  //que no sea menor que cero
      analogWrite(Ledrojo, rojo); //poner la intensidad del led
      while (digitalRead(Pulsrojo2)==LOW) ; //esperar a que el pulsador se suelte 
  }

Algo así sería.
Saludos

Así es, muchas gracias.

O si quiere no tener que andar pulsando repetidamente tambien podria hacer esto otro.

int rojo;
const int intensidad = 25;
const int velocidad = 250; // velocidad de aumento/descenso automatico si no se suelta el pulsador

while (digitalRead(Pulsrojo) == LOW) { //esperar a que el pulsador se pulse o suelte// mientras esta pulsado aumenta dinamicamente segun velocidad
  rojo = rojo + intensidad; //subir intensidad
  if (rojo > 255) rojo = 255; //que no supere los 255
  analogWrite(Ledrojo, rojo); //poner la intensidad del led
  delay (velocidad);
}
while (digitalRead(Pulsrojo2) == LOW) { //esperar a que el pulsador se pulse o suelte// mientras esta pulsado disminulle dinamicamente segun velocidad
  rojo = rojo - intensidad; //bajar intensidad
  if (rojo < 0) rojo = 0; //que no baje de los 0
  analogWrite(Ledrojo, rojo); //poner la intensidad del led
  delay (velocidad);
}

Buscaba tener que estar pulsando repetidamente, muchas gracias por esa mejora

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.