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...
#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.
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
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.
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
#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.
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.