estoy armando un codigo que mueva 2 servos con un sensor de ultrasonido el problema es que necesito que al acercar la mano a 20cm o menos (en este caso) empiece a contar por ejemplo 5 segundos y ahi ejecute el movimiento de los servos, el problema viene a que cuenta igualmente el tiempo aunque no tenga la mano en el sensor
adjunto el codigo
#include <Servo.h>
#include <Ultrasonic.h>
Ultrasonic ultrasonic(3,4); // (Trig PIN,Echo PIN)
Servo miniservo1;
Servo miniservo2;
int led=7;
int distancia;
unsigned long tiempo1 = 0;
unsigned long tiempo2 = 0;
unsigned long tiempoSegundos = 0;
void setup(){
miniservo1.attach(10);
miniservo2.attach(11);
// coloca el servo en su posición central
miniservo1.write(90);
miniservo2.write(90);
pinMode(led, OUTPUT);// determinamos que nuestra variable led será de salida
tiempo1 = millis();
}
void loop(){
tiempo2 = millis();
distancia = ultrasonic.Ranging(CM); //Lectura sensor de ultrasonidos
if(distancia <= 20 && (tiempo2 > (tiempo1+5000))){ //si la distancia es menor de 20...
tiempo1 = millis(); //Actualiza el tiempo actual
tiempoSegundos = tiempo1/5000;
//movemos el servo en una dirección
miniservo1.write(180);
miniservo2.write(0);
digitalWrite(led, HIGH); // enciende el LED (HIGH)
delay(500);
}else{ //si no hay nada, siguen en la posición inicial
miniservo1.write(90);
miniservo2.write(90);
digitalWrite(led, LOW); // apagamos el LED (LOW)
}
delay(500);
}
Moderador:
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>
El hecho que te responda no invalida que debas EDITAR tu código.
Prueba estas modificaciones a ver si se comportan mejor.
#include <Servo.h>
#include <Ultrasonic.h>
Ultrasonic ultrasonic(3,4); // (Trig PIN,Echo PIN)
Servo miniservo1;
Servo miniservo2;
int led=7;
int distancia;
unsigned long tiempo1 = 0;
unsigned long tiempo2 = 0;
unsigned long tiempoSegundos = 0;
bool flag = true;
void setup(){
miniservo1.attach(10);
miniservo2.attach(11);
// coloca el servo en su posición central
miniservo1.write(90);
miniservo2.write(90);
pinMode(led, OUTPUT);// determinamos que nuestra variable led será de salida
tiempo1 = millis();
}
void loop(){
distancia = ultrasonic.Ranging(CM); //Lectura sensor de ultrasonidos
if (distancia <= 20) {
if (flag) {
tiempo1= millis();
flag = false;
}
if (millis() - tiempo1 >= 5000UL) { //si la distancia es menor de 20...
tiempo1 = millis(); //Actualiza el tiempo actual
//tiempoSegundos = tiempo1/5000;
//movemos el servo en una dirección
miniservo1.write(180);
miniservo2.write(0);
digitalWrite(led, HIGH); // enciende el LED (HIGH)
}
} else { //si no hay nada, siguen en la posición inicial
miniservo1.write(90);
miniservo2.write(90);
digitalWrite(led, LOW); // apagamos el LED (LOW)
flag = true;
}
delay(500);
}
Si usas millis() no uses delay() eso es básico.
delay() detiene tu código y millis() solo lo deja pasar. Son dos cosas completamente opuestas.
Hola Surbyte, en primer lugar muchisimas gracias con el codigo, es exactamente lo que necesitaba, perdon por poner mal el codigo, no sabia como ponerlo de manera correcta, ya lo arreglo, nuevamente muchas gracias