Pulsador, LEDS y parpadeos.

Hola!
estoy intentando hacer una configuracion que veo algo compleja.
La primera idea es:
3 pulsadores, 1 Led azul y un Led rojo
Si se pulsa una vez el pulsador 1 se enciende el led azul en modo fijo
Si se pulsa una vez el pulsador 2 se enciende el led azul en parpadeo.
y el 3º pulsador seria para encender y apagar el led rojo

tengo este codigo para el 3º caso, para el Led rojo

int pulsador1 = 7;
int led = 16;
int estado= LOW;

void setup(){
pinMode(pulsador1, INPUT);
pinMode(led, OUTPUT);
digitalWrite(led, HIGH);
}
void loop(){
while(digitalRead(pulsador1)==LOW);
estado = digitalRead(led);
digitalWrite(led, !estado);
while(digitalRead(pulsador1)==HIGH);

}

pero el otro caso me parece un poco complicado de hacer, se me ha ocurrido otro caso mas facil
con 2 Pulsadores y 2 LED, uno rojo y otro azul
1º Pulsador cambiar entre Led azul encendido o parpadeando
2º Pulsador cambiar entre Led rojo encendido o apagado.
y regular el encendido completo con un interruptor directamente desde la alimentacion.

he trasteado algo con los Millis, pero no se como hacerlo todo en un mismo codigo, y hacer las "subrutinas" con los pulsadores.

algun consejo?

Buenas

el otro día tuve que hacer una práctica, pero sólo con un led. No quería usar delays, así que me busqué la vida y adapté un código que encontré por ahí a lo que yo quería.

Mira a ver si te vale este, como punto de partida. Está muy comentado, no creo que tengas problemas.

/HaCer parpadear un LED, con la secuencia deseada, sin usar delays, de tal forma que se pueda hacer otra cosa mientras el led parpadea/

const int ledPin = 8; // El LED conectado al Pind digital 8.
const int buttonPin = 9; // El botón conectado al Pind digital 9.
boolean buttonState = false; // Estado del botón. En el inicio, sin conectar.
boolean ledState = false; // Estado del led. En el inicio, apagado.
int on = 50; // Tiempo que mantendremos encendido el botón.
int off = 500; // Tiempo que mantendremos apagado el botón.
long counterTemps = 0; // Inicializo el contador de tiempo.

void setup() { // Declaramos el LED como salida y el botón como entrada
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}

void loop() {
buttonState = digitalRead(buttonPin); //Leemos el estado del botón

/* Este primer condicional evalua si apretamos el botón, si no se ha apretado, se ignora /
if (buttonState == true) { // Si hemos apretado el botón es que queremos o encender o apagar el led
if (ledState == true){ // Cuando se inicia el ciclo el banderín ledState está bajado (vale 0) por que el led está apagado, así que saltaremos hasta el else. Pero si es la segunda vez que apretamos el botón es que queremos apagarel led.
ledState = false; } // Si lo queremos apagar, bajemos el banderín para apagarlo.
else {
ledState = true; // Si teníamos el led apagado y hemos apretado el botón es por que queremos encender el led, así que subimos el banderín ledState a 1.
counterTemps = millis();} // Igualamos nuestro contador de tiempo con el reloj de arduino.
delay(200); // Esperamos un poco para dar tiempo a que el dedo se levante del pulsador. Cuando pase este tiempo, el valor de buttonState será LOW por que el dedo ya estará levantado pero ledState será 1 si queremos encender el led o 0 si lo queremos apagar.
}
/
Este segundo if evalua si queremos encender o apagar el led */
if (ledState == true) parpadea(); // Hacemos parpadear el led mientras ledState valga 1, condición que se cumplirá a partir de ahora si no volvemos a apretar el botón.
// Si ledState valiera 0, ya sea por que todavía no se ha apretado el botón o por que lo queremos apagar, el Led ya estará físicamente apagado, o bien despues del último parpadeo o bien por que todavía no se ha encendido por priera vez, así que no hace falta hacer nada.
}

void parpadea(){ // Función para hacer el parpadeo. El primer if controla si ha de ser la fase de encendido y el segundo si ha de ser la fase de apagado del parpadeo.
if (millis() < (counterTemps + on)){ // “counterTemps + on” el el tiempo que el Led está encendido, por tanto, si el reloj interno no sobrepasa el valor de “on”…
digitalWrite(ledPin, HIGH);} // Iremos encendiendo el LED mientras el reloj interno mientras no sobrepase el valor guardado en “on”.
else { // Si el reloj interno sobrepasa el valor de “on”…
if (millis() < (counterTemps + on + off)){ // pero no sobrepasa el valor de “off”…
digitalWrite(ledPin, LOW);} // Iremos apagando el LED mientras no se sobrepase el valor de “off”.
else counterTemps = millis(); // si hemos igualado el valor de “off”, igualamos el valor de nuestro contador de tiempo con el reloj interno pasa recomenzar el ciclo de parpadeo.
}
}

si que funciona, pero como pulses en el momento que este apagado el led, se queda apagado XD
pero bueno, una idea tengo para ir trasteando con el ^^
ahora solo me falta mirar si le puedo meter el otro pulsador a la vez para encender y apagar el otro LED ^^
Muchisimas Gracias!!!

no uses delay(), intenta usar millis() en todo aún si tienes que hacer el debouce.
Pero por cada debounce de 200mseg agregas un retardo.. 2 pulsadores ya son casi medio segundo.
Además con 20mseg te sobra para detectar los rebotes.

sigue sin salir :frowning:
depende de como pulse, se queda encendido o apagado
la velocidad de parpadeo es 30
al final he simplificado el circuito, y lo unico que necesitaria es cambiar entre parpadeo (30) y fijo de un LED
con un pulsador y 1 led.
me estoy volviendo loco