buenos días , tengo un problema con mi código desarrolle con la información de los foros y Internet, un semáforo con maquina de estado y la función millis para que mi código detecte el pulso en cualquier tiempo en el cual le agregue un pulso de regreso (resetear el verde, regrese al primer case y empezar el tiempo de nuevo)pero me doy cuenta que no lo hace sino hasta el final del tiempo, y deseo en el tiempo completo del verde capte el pulso del botón y se reinicie el verde. espero y me entienda, saludos
const int verde1 = 4; // Semaforo 1
const int amarillo1 = 3;
const int rojo1 = 2;
const int button1 = 13; //Boton
int time=0; //Declarar el valor de la variable time (case
unsigned long previusMillis=0; // Funcion millis
unsigned long interval=1000;
int ledState=LOW;
int buttonState1=0; //Declarar el valor de la variable boton S1
int buttonState2=0; //Declarar el valor de la variable boton S2
void setup() { // Declarar los pines de salida indicadores y botones
pinMode(amarillo1, OUTPUT);
pinMode(rojo1,OUTPUT);
pinMode(verde1,OUTPUT);
pinMode(button1,INPUT);
}
void loop()
{
buttonState1 = digitalRead(button1);
unsigned long currentMillis = millis();
if ((unsigned long)(currentMillis - previusMillis) >= interval)
{
previusMillis = currentMillis;
switch(time)
{
case 1: // verde encendido 1sg
digitalWrite(verde1,HIGH);
digitalWrite(amarillo1,LOW);
digitalWrite(rojo1,LOW);
if (buttonState1 == HIGH) { //boton S1 resetea el semaforo 1
delay(100);
// turn LED on:
time = 0;
}
interval=5000;
break;
case 2:
digitalWrite(verde1,LOW);
digitalWrite(amarillo1,LOW);
digitalWrite(rojo1,LOW);
interval=1000;
if (buttonState1 == HIGH) {
delay(100);
// turn LED on:
time = 0;
}
break;
case 3:
digitalWrite(verde1,HIGH);
digitalWrite(amarillo1,LOW);
digitalWrite(rojo1,LOW);
interval=1000;
if (buttonState1 == HIGH) {
delay(100);
time = 0;
}
break;
case 4:
digitalWrite(verde1,LOW);
digitalWrite(amarillo1,HIGH);
digitalWrite(rojo1,LOW);
interval=1000;
if (buttonState1 == HIGH) {
delay(100);
time = 0;
}
break;
case 5:
digitalWrite(verde1,LOW);
digitalWrite(amarillo1,LOW);
digitalWrite(rojo1,HIGH);
interval = 1000;
break;
}
time++;
if(time>8)
time=1;
}
}
Hola
Entonces quieres que aunque esté en cualquier color al pulsar el botón, el semáforo regrese al verde? o solo si está en verde se regrese el tiempo a 0?
Veo varios errores en tu código, voy a modificarlo y te pongo con mayúsculas los comentarios para distinguirlos de los tuyos
Ah, y porque tienes un interval=1000 y luego lo cambias a 5000?
cuanto tiempo quieres que dure cada color?
const byte verde1 = 4; //4 // Semaforo 1
const byte amarillo1 =3; //3
const byte rojo1 = 2; //2
const byte button1 = 13; //13 //Boton
byte time=1; //Declarar el valor de la variable time (case
unsigned long previusMillis=0; // Funcion millis
unsigned long interval;
//AQUI TIENES LOS TIEMPO DE DURACION DE CADA LUZ
unsigned long tiempoVerde=5000, //puedes cambiarlos segun tus necesidades
tiempoAmarillo=1000,
tiempoRojo=8000;
//int ledState=LOW;
bool buttonState1=0; //Declarar el valor de la variable boton S1
//bool buttonState2=0; //Declarar el valor de la variable boton S2
void setup() { // Declarar los pines de salida indicadores y botones
pinMode(amarillo1, OUTPUT);
pinMode(rojo1,OUTPUT);
pinMode(verde1,OUTPUT);
pinMode(button1,INPUT);
}
void loop()
{
buttonState1 = digitalRead(button1);
if (buttonState1)
time=1;
//unsigned long currentMillis = millis(); ESTO ES REDUNDANTE
/// ESTO NO VA ASI: if ((unsigned long)(currentMillis - previusMillis) >= interval) lo correcto seria asi: if(millis()-previusMillis >= interval)
switch(time)
{
case 1: // verde encendido 1sg
digitalWrite(verde1,HIGH);
digitalWrite(amarillo1,LOW);
digitalWrite(rojo1,LOW);
interval=tiempoVerde;
previusMillis=millis();
time=2;
//if (buttonState1 == HIGH) { //boton S1 resetea el semaforo 1
//delay(100); NO DEBES USAR DELAY SI QUIERES QUE LAS COSAS FUNCIONEN BIEN
// turn LED on:
//time = 0; //PARA QUE PONES 0? Si no hay ningún case 0?
//}
//interval=5000; //
break;
case 2:
if(millis() -previusMillis>=interval){
digitalWrite(verde1,LOW);
digitalWrite(amarillo1,HIGH);
digitalWrite(rojo1,LOW);
time=3;
previusMillis=millis();
interval=tiempoAmarillo;
}
break;
case 3:
if(millis() -previusMillis>=interval){
digitalWrite(verde1,LOW);
digitalWrite(amarillo1,LOW);
digitalWrite(rojo1,HIGH);
time=4;
previusMillis=millis();
interval=tiempoRojo;
}
break;
case 4:
if(millis() -previusMillis>=interval)
time=1;
break;
//if (buttonState1 == HIGH) {
// delay(100); //SACA LOS DELAY DE TU VIDA... NI PARA ELIMINAR LOS REBOTES LOS USES
// turn LED on:
//time = 0;
//}
//time++;
//if(time>8) PORQUE: TIME >8? si solo llegas a case 5
//time=1;
}
}
buenos dias, gracias si tenia errores por que lo habia hecho mas extenso por que lo estoy haciendo con dos semaforos pero preferi borrarlos para que mi programacion sea mas entendible, aunque igual ya vi errores que si estaba mal, ps si RIG solo en verde deseo por que lo quiero resetear para no afectar por ejemplo en una avenida(por un control una comunicacion nrf en un futuro), gracias se lo agradezco lo probare.
gracias a los post de arduino ya estoy utilizando en vez de delay a millis, ya investigare los rebotes sin delays gracias disculpen si tuve un error en las normas (Cual fue? si las lei ja ), surbyte que tiene maquina de estados y en conjunto con millis jaj? no sea muy duro conmigo jaja, saludos a los dos gracias por sus opiniones
Con eso solo se regresara el tiempo solo cuando el semáforo esté en verde
Ahora si miras bien, no utilice ningún antirrebote, esto porque en este caso en especifico la función que realiza el botón no afectan los rebotes, inclusive sirve para que si se deja presionado el botón, la luz verde se quedara siempre encendida hasta que éste suelte
En cuanto a lo que dijo @Surbyte lo dijo como un cumplido, porque la gran mayoría que viene con problemas es por usar delay() y tu hiciste lo correcto al utilizar millis()