Contador con Ultrasónico y LCD

Hola, tengo un problema con mi proyecto, tengo que realizar un contador de personas con 2 sensores ultrasonicos, el programa tiene que contar y descontar, basicamente el codigo ya esta, el problema que tengo es que en la pantalla del LCD cuando esta en “10” y le resto un numero si se baja a “9” pero al lado del 9 se queda el “0” del numero “10” que estaba previamente, espero haberme explicado bien

Aqui dejare mi código y al ultimo unas fotos del problema, espero puedan ayudarme Gracias :smiley:

#include <LiquidCrystal.h>

 
  int led=5;
  int Buzzer=4;
  int trigger=3;
  int echo=2;
   int trigger2=6;
  int echo2=7;
  int tiempo=0;
  int distancia=0;
  int contador=0;
  int rs=8;                     
int en=9;
int d4=10;
int d5=11;
int d6=12;
int d7=13;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
  lcd.begin(16,2);
  lcd.clear();
  Serial.begin(9600);
  pinMode(led,OUTPUT);
  pinMode(Buzzer,OUTPUT);
  pinMode(trigger,OUTPUT);
  pinMode(echo,INPUT);
  pinMode(trigger2,OUTPUT);
  pinMode(echo2,INPUT);
}

void loop() {
  digitalWrite(trigger,LOW);
  delay(2);
  digitalWrite(trigger,HIGH);
  delay(10);
  digitalWrite(trigger,LOW);
  tiempo=pulseIn(echo,HIGH);
  distancia=(tiempo/1)/9;
//  Serial.println(distancia);
  digitalWrite(trigger2,LOW);
  delay(2);
  digitalWrite(trigger2,HIGH);
  delay(10);
  digitalWrite(trigger2,LOW);
  tiempo=pulseIn(echo2,HIGH);
  distancia=(tiempo/1)/9;
//  Serial.println(distancia);
  if(distancia<50){
    digitalWrite(led,HIGH);
    digitalWrite(Buzzer,HIGH);
    delay(600);
    digitalWrite(Buzzer,LOW);
  }else{
    digitalWrite(led,LOW);
    contador=contador;
    digitalWrite(Buzzer,LOW);
  }
  if(digitalRead(led)==HIGH)
  {
    contador--;
    delay(1000);
    
  }
  if(contador>15){
    contador=0;
    lcd.clear();
    
  }
  Serial.println(contador);
  Serial.print(" ");
  Serial.print(distancia);
  Serial.print(" cm ");
  lcd.setCursor(0,0);
  lcd.print("Electrotek");
  lcd.setCursor(0,1);
  lcd.print(contador);





   digitalWrite(trigger2,LOW);
  delay(2);
  digitalWrite(trigger2,HIGH);
  delay(10);
  digitalWrite(trigger2,LOW);
  tiempo=pulseIn(echo2,HIGH);
  distancia=(tiempo/2)/29;
//  Serial.println(distancia);
  digitalWrite(trigger,LOW);
  delay(2);
  digitalWrite(trigger,HIGH);
  delay(10);
  digitalWrite(trigger,LOW);
  tiempo=pulseIn(echo,HIGH);
  distancia=(tiempo/2)/29;
//  Serial.println(distancia);
  if(distancia<50){
    digitalWrite(led,HIGH);
    digitalWrite(Buzzer,HIGH);
    delay(600);
    digitalWrite(Buzzer,LOW);
  }else
  {
    digitalWrite(led,LOW);
    contador=contador;
    digitalWrite(Buzzer,LOW);
  }
  if(digitalRead(led)==HIGH)
  {
    contador++;
    delay(1000);
    
  }
  if(contador>15){
    contador=0;
    lcd.clear();

    
  }
  Serial.println(contador);
  Serial.print(" ");
  Serial.print(distancia);
  Serial.print(" cm ");
  lcd.setCursor(0,0);
  lcd.print("Electrotek");
  lcd.setCursor(0,1);
  lcd.print(contador);

}

tienes varias opciones, una de ellas y la mas sencilla es con un “clear.();” despues de la lectura y escritura limpias toda la pantalla y vuelva a escribir sobre pantalla limpia, o si aun asi no te lo corrige, puedes usar un “if” para posicionar los numeros en pantalla.

if(distancia<10) le dices al lcd que posicione los numeros de “tal forma” (le puedes dejar el 9 en el digito de unidades y delante un vacio, o ponerlo en el de la decenas y mover el resto hacia la izquierda o poner un vacio en esa unidad.

if >=10 te escriba en tal posicion (tambien te vale “else” en vez de if)

simplemente le dices antes mediante if o if/else que posicion quieres que te escriba los numeros segun te interese

Ahora respondo tu consulta pero tienes algunas cosas que no entiendo.

  1. contador=contador
if(distancia<50){
    digitalWrite(led,HIGH);
    digitalWrite(Buzzer,HIGH);
    delay(600);
    digitalWrite(Buzzer,LOW);
  }else{
    digitalWrite(led,LOW);
    contador=contador;    // <==== QUE SENTIDO TIENE ESTO?
    digitalWrite(Buzzer,LOW);
  }
  1. la rutina del sensor ultrasónico esta mal
  distancia=(tiempo/1)/9;

debe ser

distancia=(tiempo/29)/2;
  1. No entiendo porque lees la distancia del sensor ultrasonico 1 seguido de la dos al comienzo y te quedas con la distancia del sensor2 y muestras contador y bla bla bla
    Luego repiteslo mismo a la inversa, pides la distancia del sensor 2 luego el sensor 1 y de nuevo ambos los guardas en una misma variable distancia y incrementas el contador
    Ahi es como que tienes un problema de criterio creo.

  2. He simplificado tu código y agregé la modificación que permite que se lea siempre ordenado sin if para controlar la longitud de la presentación

requieres de una variable char buffer[20] 20 por la longitud de caracteres de tu LCD
luego usas una instrucción que se llama sprintf

sprintf(buffer,"%02d", contador);

buffer es donde quedará toda la información.
%02d es lo que le dice… ojo, contador puede mostrar dos caracteres pero si es solo 1 muestra un 0 a la izquierda.
si el dato de contador es
0 … 9 mostrara 00 … 09
si el dato es
10 a 15 mostrará 10 a 15

código modificado

#include <LiquidCrystal.h>

const byte led       = 5;
const byte Buzzer    = 4;
const byte trigger   = 3;
const byte echo      = 2;
const byte trigger2  = 6;
const byte echo2     = 7;
const byte tiempo    = 0;
const byte distancia = 0;
const byte contador  = 0;
const byte rs        = 8;                    
const byte en        = 9;
const byte d4        = 10;
const byte d5        = 11;
const byte d6        = 12;
const byte d7        = 13;

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  lcd.begin(16,2);
  lcd.clear();
  Serial.begin(9600);
  pinMode(led,OUTPUT);
  pinMode(Buzzer,OUTPUT);
  pinMode(trigger,OUTPUT);
  pinMode(echo,INPUT);
  pinMode(trigger2,OUTPUT);
  pinMode(echo2,INPUT);
}

void loop() {
  char buffer[20];
  distancia = calcula_distancia(trigger, echo);
 
  // Serial.println(distancia);
  if (distancia < 50){
      digitalWrite(led,HIGH);
      digitalWrite(Buzzer,HIGH);
      delay(600);
      digitalWrite(Buzzer,LOW);
  } else{
      digitalWrite(led,LOW);
      contador = contador;
      digitalWrite(Buzzer,LOW);
  }

  if (digitalRead(led)==HIGH) {
      contador--;
      delay(1000);  
  }

  if (contador>15){
      contador = 0;
      lcd.clear();  
  }

  Serial.println(contador);
  Serial.print(" ");
  Serial.print(distancia);
  Serial.print(" cm ");

  lcd.setCursor(0,0);
  lcd.print("Electrotek");
  lcd.setCursor(0,1);
  sprintf(buffer, "%02d", contador);
  lcd.print(buffer);

  // Serial.println(distancia);
  distancia = calcula_distancia(trigger2, echo2);

  //  Serial.println(distancia);
  if (distancia < 50){
      digitalWrite(led,HIGH);
      digitalWrite(Buzzer,HIGH);
      delay(600);
      digitalWrite(Buzzer,LOW);
  } else {
      digitalWrite(led,LOW);
      contador = contador;
      digitalWrite(Buzzer,LOW);
  }
  if (digitalRead(led)==HIGH) {
      contador++;
      delay(1000);
  }
  if (contador > 15) {
      contador = 0;
      lcd.clear();   
  }

  Serial.println(contador);
  Serial.print(" ");
  Serial.print(distancia);
  Serial.print(" cm ");
  lcd.setCursor(0,0);
  lcd.print("Electrotek");
  lcd.setCursor(0,1);
  sprintf(buffer, "%02d", contador);
  lcd.print(buffer);
}

void calcula_distancia(const byte t, const byte e) {
  digitalWrite(t,LOW);
  delay(2);
  digitalWrite(t,HIGH);
  delay(10);
  digitalWrite(t,LOW);
  tiempo=pulseIn(e,HIGH);
  return tiempo/29/2; 
}