J-M-L, gracias a tu sugerencia, he cambiado un poco tu diagrama de estado:
Como lo puedes ver, he aumentado el "botón 3", que directamente pasa de LED_ON a LED_OFF.
Por favor, revisa el programa si lo hice bien:
#include <OneButton.h> //https://github.com/mathertel/OneButton (doc @ http://www.mathertel.de/Arduino/OneButtonLibrary.aspx)
const int botonPin1 = 2;
const int botonPin2 = 4;
const int botonPin3 = 7;
const int ledPin = 13;
const int relayPin = 9;
OneButton boton1(botonPin1); // activo LOW con PULLUP integrado
OneButton boton2(botonPin2); // activo LOW con PULLUP integrado
OneButton boton3(botonPin3); // activo LOW con PULLUP integrado
enum : byte {LED_OFF, ESTADO_B1, ESTADO_B2, LED_ON} estado;
void apagaLed() {
digitalWrite(ledPin, LOW);
digitalWrite(relayPin, HIGH);
estado = LED_OFF;
}
void enciendeLed() {
digitalWrite(ledPin, HIGH);
digitalWrite(relayPin, LOW);
estado = LED_ON;
}
void click1() {
switch (estado) {
case LED_OFF: estado = ESTADO_B1; break;
case ESTADO_B2: apagaLed(); break;
default: break;
}
}
void click2() {
switch (estado) {
case ESTADO_B1: enciendeLed(); break;
case LED_ON: estado = ESTADO_B2; break;
default: break;
}
}
void click3() {
switch (estado) {
case LED_ON: apagaLed(); break;
default: break;
}
}
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(relayPin, OUTPUT);
boton1.attachClick(click1);
boton2.attachClick(click2);
boton3.attachClick(click3);
apagaLed();
}
void loop() {
boton1.tick();
boton2.tick();
boton3.tick();
}
