If con 2 condiciones

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.

1 Like

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