Apagar motor con sensor ultrasónico cuando detecte una "x" distancia

Hola, estoy realizando un proyecto utilizando un sensor ultrasónico HC-SR04. Estoy intentando que un motor se mantenga apagado apenas detecte una distancia, en este caso la distancia es desde 0 a 10 cm. He logrado que se apague cuando detecte la distancia entre ese rango, pero si la distancia no está en ese rango, se prende nuevamente el motor. Eso no lo necesito. Necesito que se apague el motor por completo apenas detecte una distancia en ese rango. Y se vuelva a prender cuando el interruptor esté en HIGH.

int pinPulsadorM=8;
int pinMotorM=9;
int estadoPulsadorM=0;
int distancia;
int duracion;
int trig =10;
int eco =7;

void setup() {
  // put your setup code here, to run once:
pinMode(pinPulsadorM, INPUT);
pinMode(pinMotorM, OUTPUT);
pinMode(trig, OUTPUT);
pinMode(eco, INPUT);
Serial.begin(9600);

}

void loop() {
   estadoPulsadorM=digitalRead(pinPulsadorM);
   
   if (estadoPulsadorM==HIGH)
   {
    
    
    digitalWrite(trig, HIGH);
    delay(1);
    digitalWrite(trig, LOW);
    duracion = pulseIn(eco, HIGH);
    distancia = duracion/58.2;
    Serial.println(distancia);
    delay(200);
    digitalWrite(pinMotorM, HIGH);
    
   }
   if (estadoPulsadorM==LOW)  
   {
    digitalWrite(pinMotorM, LOW);
   }
   
   if(distancia <=10 && distancia>=0 && estadoPulsadorM==HIGH )
    {   
      digitalWrite(pinMotorM, LOW);
      
    }
      
   

}

Como contexto, es una montaña rusa que apaga el motor cuando el bagón llege hasta el punto maximo, a partir de ese punto, se apaga el motor para que el bagón baje por gravedad. Adjunto un boseto explicativo.

A ver como se comporta este código

unsigned long startime;
int pinPulsadorM=8;
int pinMotorM=9;
int estadoPulsadorM=0;
int distancia;
int duracion;
int trig =10;
int eco =7;

void ultrasonico() {
    digitalWrite(trig, HIGH);
    delay(1);
    digitalWrite(trig, LOW);
    duracion = pulseIn(eco, HIGH);
    distancia = duracion/58.2;
    Serial.println(distancia);
}

void setup() {
    // put your setup code here, to run once:
    pinMode(pinPulsadorM, INPUT);
    pinMode(pinMotorM, OUTPUT);
    pinMode(trig, OUTPUT);
    pinMode(eco, INPUT);
    Serial.begin(9600);
}

void loop() {

    estadoPulsadorM = digitalRead(pinPulsadorM);
    if (millis() - startime > 1000) {
        ultrasonico();
        startime = millis();
    }

    if (estadoPulsadorM==HIGH)   {
        digitalWrite(pinMotorM, HIGH);
    }
  
    if (distancia >= 0 && distancia <= 10)  {   
        digitalWrite(pinMotorM, LOW);          // apago motor
    }
}
1 Like

Puedes explicarme porfavor ¿qué hace la función millis() y por qué tomas mayor a un segundo?

Hace una medición por segundo.

Saludos

1 Like

¿Y porque un segundo? . Tendra que estar midiendo el tiempo que tarde en llegar el bagon y la unica referencia es el tiempo que esta funcionando el motor hasta que lo detecte el hc-sr04 y lo pare.
Yo el codigo lo veo asi:

int pinPulsadorM = 8;
int pinMotorM = 9;
bool  estadoMotor = false;
int distancia;
int duracion;
int trig = 10;
int eco = 7;

void setup() {
  pinMode(pinPulsadorM, INPUT);
  pinMode(pinMotorM, OUTPUT);
  pinMode(trig, OUTPUT);
  pinMode(eco, INPUT);
  Serial.begin(9600);
}

void loop() {
  if (estadoMotor == true) {
    digitalWrite(trig, HIGH);
    delay(1);
    digitalWrite(trig, LOW);
    duracion = pulseIn(eco, HIGH);
    distancia = duracion / 58.2;
    Serial.println(distancia);
    delay(200);
  }
  if (digitalRead(pinPulsadorM) == HIGH) {
    digitalWrite(pinMotorM, HIGH);
    estadoMotor = true;
  }
  if (distancia <= 10 && distancia >= 0 && estadoMotor == true ) {
    digitalWrite(pinMotorM, LOW);
    estadoMotor = false;
  }
}

Saludos.

Que lo cambie, cual es el problema.
Un segundo puede ser mucho o poco.
Si el bagón va a 1 m/seg es obviamente demasiado tiempo entre lecturas.
Si se mueve a 10cm/min por decir algo lento obviamente sobra.
Como la gente no especifica, yo tmpoco.
Si quiere que le ponga 200 en lugar de 1000 y esta en lo mismo sin bloquear con delay()

2 Likes

Puedo preguntar ¿Y por qué cada 200 mseg? :laughing:

Chiste, chiste!

Saludos

Explicaciones de millis() estan en documentación.
Aprender millis() y no morir en el intento entre otras.

Pues para evitar esa incertidumbre el ultrasonico solo funciona cuando espera un vagon.
Ademas , con todo el tiempo funcionando el ultrasonico se le va a llenar la montaña rusa de mosquitos :laughing: :laughing:

¡Y el perro agradecido hace como el monito!
:hear_no_evil:

Saludos

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.