Hola!
Tengo un pequeño problema al trabajar con millis() en lugar de "delay"
Los datos son los siguientes:
Arduino UNO
Sensor de distancia hc-sr04
Protoboard con 3 leds(rojo,amarillo,verde)
Según un rango de distancias se enciende un led, el problema es que cuando lo hago con millis(), muchas veces se queda encendido(o encendidos)el led, (creo que depende el estado en el que se encuentra cuando lee la distancia) y otras parpadea el led rojo cada segundo
Les paso el código a ver si alguien me puede decir dónde está el fallo.
Muchas gracias
Este es el código sin Delay
#define ECHO 11 // Pin para recibir el pulso de eco
#define TRIGGER 12 // Pin para enviar el pulso de disparo
unsigned int tiempo;
int distancia=0;
int corto=30; // Declara variable argumeto entero
int medio=80;// Declara variable argumento entero
int largo=120; // Declara variagle argumento entero
long antes=0;//anterior actualización de tiempo
int rojo=7;
int pinR=LOW;
int amarillo=6;
int pinA=LOW;
int verde=5;
int pinV=LOW;
void setup() {
pinMode(ECHO, INPUT);
pinMode(TRIGGER, OUTPUT);
pinMode(zumb,OUTPUT);
pinMode(5,OUTPUT); // Led verde
pinMode(6,OUTPUT); // led amarillo
pinMode(7,OUTPUT); // led rojo
}
void loop(){
digitalWrite(TRIGGER, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER, LOW);
// Calcula la distancia midiendo el tiempo del estado alto del pin ECHO
tiempo = pulseIn(ECHO, HIGH);
// La velocidad del sonido es de 340m/s o 29 microsegundos por centimetro
distancia= tiempo/58;
//manda la distancia al monitor serie
// monitoriza();
unsigned long ahora=millis();//tiempo actual
if(distancia<=10){// relación de distancia tiempo corto
if (ahora-antes>corto){
antes=ahora;
if(pinR==LOW)
pinR=HIGH;
else
pinR=LOW;
digitalWrite(rojo,pinR);
}
}
else if(distancia>=10&&distancia<=30){// relación de distancia tiempo medio
if (ahora-antes>medio){
antes=ahora;
if(pinA==LOW)
pinA=HIGH;
else
pinA=LOW;
digitalWrite(amarillo,pinA);
}
}
else if(distancia>=30&&distancia<=45){// relación de distancia tiempo largo
if (ahora-antes>largo){
antes=ahora;
if(pinV==LOW)
pinV=HIGH;
else
pinV=LOW;
digitalWrite(verde,pinV);
}
}
}
y este es el código original con Delay, que funciona perfecto
#define ECHO 11 // Pin para recibir el pulso de eco
#define TRIGGER 12 // Pin para enviar el pulso de disparo
unsigned int tiempo;
int distancia=0;
int corto=30; // Declara variable argumeto entero
int medio=80;// Declara variable argumento entero
int largo=120; // Declara variagle argumento entero
void setup() {
pinMode(ECHO, INPUT);
pinMode(TRIGGER, OUTPUT);
pinMode(zumb,OUTPUT);
pinMode(5,OUTPUT); // Led verde
pinMode(6,OUTPUT); // led amarillo
pinMode(7,OUTPUT); // led rojo
}
void loop(){
digitalWrite(TRIGGER, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER, LOW);
// Calcula la distancia midiendo el tiempo del estado alto del pin ECHO
tiempo = pulseIn(ECHO, HIGH);
// La velocidad del sonido es de 340m/s o 29 microsegundos por centimetro
distancia= tiempo/58;
//manda la distancia al monitor serie
if(distancia<=10){// relación de distancia pito corto
digitalWrite(7,HIGH); // enciende led rojo
delay(corto); // zumbido corto nueva lectura
digitalWrite(7,LOW);// apaga led rojo
delay(corto);
}
else if(distancia>=10&&distancia<=30){// relación de distancia pito medio
digitalWrite(6,HIGH);// enciende led amarillo
delay(medio); // espera hasta nueva lectura
digitalWrite(6,LOW);// apaga led amarillo
delay(medio);
}
else if(distancia>=30&&distancia<=45){// relación de distancia pito largo
digitalWrite(5,HIGH);// enciende led verde
delay(largo); // espera hasta nueva lectura
digitalWrite(5,LOW);// apaga led verde
delay(largo);
}
}