Hi!
I have a problem with the distance calculation of my ultrasonic sensor. He calculates the distance well but apparently from time to time a value appears: 72cm / 0.72cm when losing the signal. I have tried to do a reset so that this number does not appear and the previous value is maintained but it does not work.
Attached code:
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
int VO = 3;
int RS = 4;
int E = 5;
int D4 = 6;
int D5 = 7;
int D6 = 8;
int D7 = 9;
LiquidCrystal lcd (RS, E, D4, D5, D6, D7);
int pin_TRIG = 10; //Pin para enviar pulsos
int pin_ECHO = 11; //Pin para recibir la señal de rebote
int tiempoSenal;
int distanciaCM;
float distanciaM;
int ultimaDistancia = 0;
void setup() {
pinMode(pin_TRIG, OUTPUT);
pinMode(pin_ECHO, INPUT);
lcd.begin(16, 2);
analogWrite(VO, 0);
}
void loop() {
digitalWrite(pin_TRIG, LOW);
delayMicroseconds(5); //Estabiliza el sensor
digitalWrite(pin_TRIG, HIGH); //Envia el pulso para iniciar el sensor
delayMicroseconds(10);
tiempoSenal = pulseIn(pin_ECHO, HIGH); //Tiempo que dura el pin ECHO en HIGH
distanciaCM = (0.034 * tiempoSenal) / 2; //Convierte el tiempo en distancia (cm)
distanciaM = ((0.034 * tiempoSenal) / 2) / 100; //Convierte el tiempo en distancia (m)
if(distanciaCM != ultimaDistancia);
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("not found");
lcd.print(distanciaCM); //Muestra en la pantalla la distancia en centímetros
lcd.print(" :(");
ultimaDistancia = distanciaCM;
}
lcd.setCursor(0, 0);
lcd.print("Distancia: ");
lcd.print(distanciaCM); //Muestra en la pantalla la distancia en centímetros
lcd.print("cm ");
lcd.setCursor(0, 1);
lcd.print("Distancia: ");
lcd.print(distanciaM); //Muestra en la pantalla la distancia en metros
lcd.print("m");
delay(500);
}
Now it's happening the same but with an other value (11,87m)... so i don't know how can i fix it.
Now the code it's like this.. any other idea?
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
int VO = 3;
int RS = 4;
int E = 5;
int D4 = 6;
int D5 = 7;
int D6 = 8;
int D7 = 9;
LiquidCrystal lcd (RS, E, D4, D5, D6, D7);
int pin_TRIG = 10; //Pin para enviar pulsos
int pin_ECHO = 11; //Pin para recibir la señal de rebote
uint32_t tiempoSenal;
int distanciaCM;
float distanciaM;
int ultimaDistancia = 0;
void setup() {
pinMode(pin_TRIG, OUTPUT);
pinMode(pin_ECHO, INPUT);
lcd.begin(16, 2);
analogWrite(VO, 0);
}
void loop() {
digitalWrite(pin_TRIG, HIGH); //Envia el pulso para iniciar el sensor
delayMicroseconds(10);
digitalWrite(pin_TRIG, LOW);
tiempoSenal = pulseIn(pin_ECHO, HIGH); //Tiempo que dura el pin ECHO en HIGH
distanciaCM = (0.034 * tiempoSenal) / 2; //Convierte el tiempo en distancia (cm)
distanciaM = ((0.034 * tiempoSenal) / 2) / 100; //Convierte el tiempo en distancia (m)
if(distanciaCM != ultimaDistancia);
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("not found");
lcd.print(distanciaCM); //Muestra en la pantalla la distancia en centímetros
lcd.print(" :(");
ultimaDistancia = distanciaCM;
}
lcd.setCursor(0, 0);
lcd.print("Distancia: ");
lcd.print(distanciaCM); //Muestra en la pantalla la distancia en centímetros
lcd.print("cm ");
lcd.setCursor(0, 1);
lcd.print("Distancia: ");
lcd.print(distanciaM); //Muestra en la pantalla la distancia en metros
lcd.print("m");
delay(500);
}
when you "loose the signal" (too far, pulseIn() returns 0) the distance is 0.
So you still display 0 but because you did not clear the previous display, whatever was there before remains, you should see weird stuff like (if the previous distance was 72cm)
There is a bad semi colon in your code: if(distanciaCM != ultimaDistancia);
--> loose the semicolon... of you'll always show not found quickly replaced by the new distance
Once you have done that, you start with ultimaDistancia = 0
if you read a valid distance, say 87cm it will be different than 0 and you modify ultimaDistancia and then you go write the screen which shows
distanciaCM: 87cm distanciaCM: 0.87m
this blue thing is what's on screen
now imagine that at the next loop() pulseIn() times out (can't read the echo). The doc states the function will return 0 into tiempoSenal so your maths
distanciaCM = (0.034 * tiempoSenal) / 2; //Convierte el tiempo en distancia (cm)
distanciaM = ((0.034 * tiempoSenal) / 2) / 100; //Convierte el tiempo en distancia (m)
will be 0 for both variables, so you write again on top of what was displayed previously. So I write in red what you send to the screen, but the blue has not been erased so you get
distanciaCM: 0cmm distanciaCM: 0m87m
of course there is no color on your screen, so it will look weird
PS/ the code about ultimaDistancia is weird as you still display anyway the distance later on so your not found thingy goes away super quickly