# Problem with Sensor and If

Hey! So I recently asked about a problem with the millis() function. I hope I’m not spamming by asking something else so soon. So, the thing is I’m trying to program something for college, and I have to use a proximity sensor, a DC Motor and an LED. I have to make the sensor print the distance of an object and usign the max and minimum values it can measure, calculate the middle point of those values. With it I must:
Make the DC Motor spin in one direction if the value is higher than the middle value
Make the LED blink in a certain pattern if the value is lower than the middle value
I had written a code using delay() but found it incredibly slow, and started to use millis instead.
Now, the sensor must work at certain time intervals. It must turn on, wait 10 microseconds and then receive the signal in the EchoPin, then print and wait 1 second, turn off, wait 5 microseconds and turn on again. But the thing is, with the code I wrote the only thing that happens is it constantly prints 0.0 and the DC Motor spins endlessly.
Here’s my code:

``````int TrigPin=2;
int EchoPin=3;
int Sentido1=6;
int Sentido2=5;
int LED=12;
float t;
float x;
float TM=167.1; //Valor medio de medición, calculado con los limites del sensor
//Para poder realizar diversas acciones con temporizadores distintos, sin tener que utilizar
//delay, pues bloquea el resto de procesos mientras se lleva a cabo, usaremos
//un temporizador con la función millis(), siguiendo los ejemplos de BlinkWithoutDelay que provee Arduino,
//Expandiendolos a los usos que necesitamos
//Funcionamiento: Crearemos variables que contengan el intervalo, o el "delay" que queremos darle a la acción. Por ejemplo,
//para un delay de 1000ms, crearemos una variable intervalo=1000. Luego, crearemos una variable tiempoactual, la que se tomará
//como valor inicial 0 para indicar el inicio del programa, y usaremos la función millis(). Compararemos, utilizando millis()-tiempoactual, el tiempo transcurrido
//con el intervalo. Por ejemplo, cuando millis()==1000, millis()-tiempoactual=intervalo, y ejecutaremos una acción. Luego guardaremos el millis() actual en la variable
//tiempoactual, para así medir nuevamente en la siguiente iteración.
long intervaloled=500; //Intervalo inicial que usaremos (en ms)
long tiempoled=0; //Tiempo que el LED lleva funcionando en ms, al principio es 0
long intervalosensor=0.005; //Intervalo del sensor en ms
long tiemposensor=0; //Tiempo que el sensor lleva funcionando en ms.

void setup()
{
Serial.begin(9600); //inicia el funcionamiento de la puerta Serial
pinMode(TrigPin, OUTPUT); //Establece el Pin de la señal como de SALIDA
pinMode(EchoPin, INPUT); //Establece el Pin que recibe el eco como la ENTRADA
pinMode(Sentido1, OUTPUT);
pinMode(Sentido2, OUTPUT); //Establece los Pins del motor, Activador enciende o apaga
//el motor, Sentido1 y 2 cambian el sentido de giro
pinMode(LED, OUTPUT); //Pin del LED verde
}

void loop()
{
unsigned long diferenciatsensor=millis()-tiemposensor;
if (intervalosensor==0.005)
{if (diferenciatsensor>=intervalosensor)
{tiemposensor=millis();
digitalWrite(TrigPin, HIGH);
intervalosensor=0.01;
}
}
if (intervalosensor==0.01)
{if (diferenciatsensor>=intervalosensor)
{tiemposensor=millis();
t=pulseIn(EchoPin, HIGH); //Guarda en la variable t el tiempo que recibe el EchoPin
intervalosensor=1000;
}
}
else
{if (diferenciatsensor>=intervalosensor)
{tiemposensor=millis();
digitalWrite(TrigPin, LOW);
intervalosensor=0.005;
}
}
x=(t*0.034)/2; //Calcula la distancia según el tiempo
Serial.println(x); //Imprime la distancia en la puerta serial

unsigned long diferenciatled=millis()-tiempoled; //La función millis() nos entrega cuantos milisegundos han pasado desde
//el comienzo del programa

if (x<=TM)
{
digitalWrite(Sentido1, HIGH);
digitalWrite(Sentido2, LOW);
if (intervaloled==500)
{if (diferenciatled>=intervaloled) //Si han transcurrido tantos milisegundos entre el tiempo actual y la ultima vez que se midió como el intervalo, se ejecuta la acción
{tiempoled=millis();
if (ledstate==LOW)
{ledstate=HIGH;
intervaloled=1000;
}
else
{ledstate=LOW;
}
}
}
else
{if (diferenciatled>=intervaloled)
{tiempoled=millis();
if (ledstate==LOW)
{ledstate=HIGH;
intervaloled=500;
}
else
{ledstate=LOW;
}
}
}
}
else
{
digitalWrite(Sentido2, HIGH);
digitalWrite(Sentido1, LOW);

}

}
``````

It’s in spanish so let me explain:
Sentido1/2 are the directions of the DC Motors spin
intervaloled/sensor are the intervals of the led and the sensor
Activador is the enable pin in the H-Bridge used to change the DC Motors spin direction
tiempoled and tiemposensor are the “currentmillis” of the sensor and LED.
TM is the middle value of the sensor

If you could tell me what’s wrong or what’s causing this, or if it’s completely wrong I would really appreciate it. If I didn’t explain myself very well, I’m sorry, just ask and I will try to explain it a litte better
Thanks!
By the way, I’m doing this in tinkercad, here’s the link if you want to check it Circuit design Tarea Arduino | Tinkercad

`````` if (intervalosensor==0.005)
``````

floats don't always hold numbers exactly. They're more like approximations. That might print as 0.005 but it might be stored in memory as 0.00499999999999 and the equality doesn't work.

The lesson is, don't use == to compare floats. Take the absolute value of the difference between them and compare to some threshold value to see how close they are.

``````if (abs(intervalosensor-0.005)<0.01)