Sensor no entrega datos al instante

Hola, resulta que tengo 2 sensores que deberian entregarme datos a mi lcd, pero realicé una función para que con un boton cada vez que presione me cambie de sensor para los datos del lcd, algo asi como "presiono boton, datos sensor 1", presiono boton, limpia pantalla y datos del sensor 2 y así, junto con un switch case
Pero mi problema es que ahora al recibir los datos no me los da al momento conforme manipulo los sensores en tiempo real, sino que toma una vez un dato, nada mas lo que capta al momento y no se mueven los valores, si modifico digamos en el sensor ultrasonico el objeto que capta, tengo que regresar a ese dato en mi menu con boton para que se actualice el dato de lo que lee el sensor y no deberia de ser asi, no se si me doy a entender...

ADJUNTO VIDEO DE LO QUE ME SUCEDE: video funcionamiento codigo circuito

de antemano agradezco sus aportes

mi codigo:

#include <LiquidCrystal_I2C.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(0x27,20,4);
int trig=10;
int eco=9;
int duracion; 
int distancia;
int sensor;   //variables para sensor y conversion de datos 
int valor;
const int buttonPin=2;
//variables de estado
byte lastButtonState = LOW;
//VARIABLE almacenar estado del boton
byte noSensor = 1; //numero de sensor
//retardo para evitar rebote del boton
unsigned long debounceDelay = 50;



 void setup(){
  lcd.init();
  lcd.backlight();
  lcd.setCursor(1.5,1.5);
  lcd.print("DAVID ELECTRONICS");
  delay(2000);
  lcd.clear();
     lcd.print("PRESIONAR BOTON");
  Serial.begin(9600); //monitor serial
  pinMode(trig,OUTPUT);
  pinMode(eco,INPUT_PULLUP);
  pinMode(buttonPin,INPUT); 
 }
 

void loop(){
   digitalWrite(trig,LOW);
  delayMicroseconds(2);
  digitalWrite(trig,HIGH);
  delayMicroseconds(15);
  duracion=pulseIn(eco,HIGH,26000);
  distancia = duracion/58;
  
  int buttonState=digitalRead(buttonPin);
  if(buttonState != lastButtonState){
    lastButtonState=buttonState;

  if(lastButtonState==LOW){
    Serial.println("Boton presionado");
    LeerSensor();
    //SIGUIENTE SENSOR
    noSensor = (noSensor < 4)?
    noSensor + 1:1;
    //Esperamos un tiempo minimo para evitar el rebote del boton
    delay(debounceDelay);
  }
  }
  //SENSOR DE AGUA
  sensor=analogRead(A0);  //ESTABLECER LECTURA ANALOGICA EN PIN A0
  valor=map(sensor,0,1023,0,100); //CONVERTIR LOS VALORES ANALOGICOS 0 1023 A 0 A 100
}
void LeerSensor(){
  Serial.print("Leer Sensor Numero: ");
  Serial.println(noSensor);

  switch(noSensor){
    case 1:
    //Leer sensor 1 e imprimir en pantalla.
    lcd.setCursor(0,0);
  lcd.print("NIVEL DE AGUA: ");
  lcd.println(distancia);

  if(distancia>=20 && distancia<=30){
    lcd.setCursor(1,1);
    lcd.print("NIVEL OPTIMO");
    Serial.println("NIVEL OPTIMO");
    Serial.println();
  }
 if(distancia>=31 && distancia<=40){
    lcd.println("PRECAUCION");
    lcd.clear();
  }
 if(distancia>40){
    lcd.println("NIVEL CRITICO, EVACUAR");
    lcd.clear();
  }


    break;
    case 2:
  
    //Leer sensor 2 e imprimir en pantalla
    Serial.println("DATO 2");
    //SENSOR DE AGUA
  sensor=analogRead(A0);  //ESTABLECER LECTURA ANALOGICA EN PIN A0
  valor=map(sensor,0,1023,0,100); //CONVERTIR LOS VALORES ANALOGICOS 0 1023 A 0 A 100
  Serial.print("LECTURA VALORES ANALOGICOS: "); //IMPRESION EN MONITOR SERIAL
  Serial.println(sensor); //IMPRIME DATOS ANALOGICOS 0 A 1023

  
 lcd.setCursor(3,0);
 lcd.print("POR. NIVEL AGUA: ");
 lcd.println(valor);
 lcd.println("o/o");
 
  Serial.print("PORCENTAJE DE NIVEL DE AGUA: ");
  Serial.print("%");
  Serial.println(valor);
  Serial.println();
  break;
    
    case 3:
    lcd.clear();
    delay(50);
    //Leer sensor 3 e imprimir en pantalla
    Serial.println("DATO 3");
    lcd.print("DATO 3");
    break;
    case 4:
    lcd.clear();
    delay(50);
    //Leer sensor 4 e imprimir en pantalla
    Serial.println("DATO 4");
    lcd.print("DATO 4");
    break;
    default:
    //ERROR
    Serial.println("El sensor no existe.");
    break;
  }
}

  

Moderador:
Por favor, lee las Normas del foro y postea el código para poder entenderte.

Por favor, si subes un video que sea a una plataforma instantánea donde alguien que quiere responderte no tiene que descargar algo que luego es basura para si mismo. Entiendo que puedo borrarlo pero nada mas fácil que Youtube o plataformas similares.
Lo que no funciona asi yo no lo miro.
Asi que quedo al menos yo a la espera de un video que pueda ver rápidamente.

1 Like

hola, pero no hay que descargarlo solo entras al link y lo reproduces no necesitas descargar el video, esta en drive solo lo reproduces como que si fuera un video de youtube y listo, puse el acceso publico y todos lo pueden ver, y se pueden añadir comentarios :slight_smile:

lo subí a youtube lo pueden ver: Video del circuito y codigo

if(distancia>=31 && distancia<=40){ 
  lcd.println("PRECAUCION");
  lcd.clear();
} 

if(distancia>40){
  lcd.println("NIVEL CRITICO, EVACUAR");
  lcd.clear();
} 

En estos 2 casos, si imprimes e inmediatamente borras el display ¿qué esperas ver?

no no es eso, sino que cuando presiono el botón para cambiar de informacion de otro sensor, o de ese mismo se quedan estaticos los valores, ni en el monitor serial avanzan los datos

Ya se que no es eso lo que planteaste pero fue lo primero que vi. Ahí tienes un error.

pulseIn() tiene por defecto un timeout de 1 segundo, si no hay nada cercano al sensor, va a estar 1 segundo esperando el pulso a medir.
Eso puede ser parte del problema.

Por cierto, la vista previa del video no estaría funcionando, al menos yo no puedo verlo, se queda en el segundo 0.

1 Like

aaaaaaah ya, cierto, pero fijate que probe con ese mismo pulseIn() y si me funciono a la perfeccion, es cuando esta en ese codigo completo que no funciona, pero si lo pongo en un codigo aparte no me da problemas, pero igual deberia de cambiarlo entonces?

perdon ahora arreglo lo del video jeje

o mejor haré otro video mas detallado es que ese lo hice aparte y mal explicado

Te recomiendo Newping.h
Ejemplo de uso

#include <NewPing.h>

#define TRIGGER_PIN  12  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     11  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

void setup() {
  Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
  sonar();
}

void loop() {
  delay(50);                     // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
  Serial.print("Ping: ");
  Serial.print(sonar.ping_cm()); // Send ping, get distance in cm and print result (0 = outside set distance range)
  Serial.println("cm");
}

Muy fácil de usar y no tienes el drama de pulsein porque no es bloqueante.

1 Like

A fin de no complicar el post anterior te hice una versión con Newping
Tambien mejoré algunas cosas.
Puede que haya algun error porque no lo compile para asegurarme que este ok

#include <Wire.h>
#include <NewPing.h>

#define TRIGGER_PIN  10  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN      9  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);

int duracion; 
int distancia;
int sensor;   //variables para sensor y conversion de datos 
int valor;
const int buttonPin  =  2;
//variables de estado
byte lastButtonState = LOW;
//VARIABLE almacenar estado del boton
byte noSensor = 1; //numero de sensor
//retardo para evitar rebote del boton
unsigned long debounceDelay = 50;

 void setup(){
   lcd.init();
   lcd.backlight();
   lcd.setCursor(1.5,1.5);
   lcd.print("DAVID ELECTRONICS");
   delay(2000);
   lcd.clear();
   lcd.print("PRESIONAR BOTON");
   Serial.begin(9600); //monitor serial
   pinMode(buttonPin,INPUT); 
 }
 
void loop(){
   distancia = sonar.ping_cm(); // Send ping, get distance in cm and print result (0 = outside set distance range)
  
   int buttonState = digitalRead(buttonPin);
  
   if (buttonState != lastButtonState) {
      lastButtonState=buttonState;

      if (lastButtonState==LOW){
         Serial.println("Boton presionado");
         LeerSensor();
         //SIGUIENTE SENSOR
         noSensor = (noSensor < 4)?
         noSensor + 1:1;
         //Esperamos un tiempo minimo para evitar el rebote del boton
         delay(debounceDelay);
      }
  }
  
  //SENSOR DE AGUA
  sensor = analogRead(A0);  //ESTABLECER LECTURA ANALOGICA EN PIN A0
  valor=map(sensor,0,1023,0,100); //CONVERTIR LOS VALORES ANALOGICOS 0 1023 A 0 A 100
}

void LeerSensor() {
   char buffer[20];

   Serial.print("Leer Sensor Numero: ");
   Serial.println(noSensor);

  switch(noSensor){
    case 1:
            //Leer sensor 1 e imprimir en pantalla.
            lcd.setCursor(0,0);
            sprintf(buffer,"NIVEL DE AGUA: %d", distancia);
            lcd.print(buffer);
            lcd.setCursor(1,1);
            if (distancia >=20 && distancia <= 30){
               sprintf(buffer,"NIVEL OPTIMO");
            }
            if (distancia >= 31 && distancia <= 40){
               sprintf(buffer,"PRECAUCION");
            }
            if (distancia > 40){
               // Mensaje excede capacidad de linea del LCD
               //lcd.println(   "NIVEL CRITICO, EVACUAR");
                            // 01234567890123456789 
               sprintf(buffer,"NIVEL CRIT, EVACUAR"); 
            }
            lcd.print(buffer);
            Serial.println(buffer);
            break;
    case 2: //Leer sensor 2 e imprimir en pantalla
            Serial.println("DATO 2");
            //SENSOR DE AGUA
            sensor = analogRead(A0);  //ESTABLECER LECTURA ANALOGICA EN PIN A0
            valo r =map(sensor,0,1023,0,100); //CONVERTIR LOS VALORES ANALOGICOS 0 1023 A 0 A 100
            Serial.print("LECTURA VALORES ANALOGICOS: "); //IMPRESION EN MONITOR SERIAL
            Serial.println(sensor); //IMPRIME DATOS ANALOGICOS 0 A 1023

            lcd.setCursor(3,0);
                         // 01234567890123456789 
            sprintf(buffer,"POR.NIVEL AGUA: %3d%", valor); // Tampoco entraba en la linea del LCD
            Serial.println(buffer);
            break;
    case 3:
            //Leer sensor 3 e imprimir en pantalla
            sprintf(buffer,"DATO 3"); 
            lcd.print(buffer);
            Serial.println(buffer);
            break;
   case 4:
            //Leer sensor 4 e imprimir en pantalla
            sprintf(buffer,"DATO 4"); 
            lcd.print(buffer);
            Serial.println(buffer);
            break;
   default:
            // ERROR        01234567890123456789 
            sprintf(buffer,"El sensor no existe."); 
            lcd.print(buffer);
            Serial.println(buffer);
            break;
  }
}

Si funciona como lo he pensado, no necesitas clear porque buffer tiene 20 caracteres y siempre que presentas borras lo anterior.

1 Like

muchisimas gracias mi amigo de verdad!!!! voy a probarlo enseguida y te cuento que tal

Observa que hay textos que he recortado porque no puedes superar 20 caracteres.

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