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.
¿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;
}
}
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()
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