problema con Lectura de un sensor analógico

Hola amigos, soy nuevo, y durante estos últimos meses me he involucrado es este mundo de arduino, he realizado un proyecto que describo a continuación: se trata de la lectura de un sensor analogico (presion) de 0.5 a 4.5V y su rango maximo varia de 0 a 300psi. ademas incluyo un pulsador sin retencion que cambia la unidad de medicion de 0 a 300psi pasando a 0 a 20.7 bar. El boceto que presento compila y sube correctamente; pero al mostrasrse en un display 20x4 no actua correctamente mostrando la lectura intercalandose intermitente una con la otra (titila ambas lecturas)
Acudo a su experiancia para que puedan echarle un vistazo. saludos cordiales

#include <Wire.h>
#include <LiquidCrystal_I2C.h> // libreria para que funcione el display 20X4
LiquidCrystal_I2C lcd (0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // encuentran conectados RS, E, D4, D5, D6, D7

int ibut = 10 ;     // ibut PIN10 de entrada para el control del botón
int tiempo = 1000 ;    // Tiempo para dar tiempo a retirar el dedo del botón hasta hacer otra lectura
int estadoboton = 0 ;   // Variable para guardar el estado del boton LOW (bajo = 0) o HIGH (alto = 1)
int vista = 1 ;    // Primera vez controla lo que se hace únicamente en el primer bucle, luego se le cambia de valor


int SENSOR;   // variable almacena valor leido de entrada analogica A0
float PRESION;  // valor de presion en en decimales
float SUMA;   // valor de la suma de las 5 lecturas de presion

void setup() {                                // encender el LDC 20x4
   Wire.begin();
   lcd.begin (20,4) ;
   lcd.backlight();                    // terminar con luz de fondo encendida   
   lcd.clear();
   pinMode(ibut, INPUT);  // En el PIN 10 entra la medida del circuito del buton abrimos como lNPUT
   delayMicroseconds(50);
}

void loop() {
   if(leerBoton(ibut)== 1){
   if(vista == 1){
     vista++;
     lcd.clear();
     }
     else if (vista == 2){
       vista--;}
       lcd.clear();
   }

 switch (vista) {

 case 1:
 SUMA = 0;         // valor inicial de SUMA en cero
 for (int i=0; i < 5; i++){      // bucle que repite 5 veces
 SENSOR = analogRead(A0);      // lectura de entrada analogica A0
 PRESION = map(SENSOR, 102, 921, 0, 300);                           // Funcion map () entre 0.5 a 4.5V con 0 a 300 psi (lectura de entrada analogica A0)
 SUMA = PRESION + SUMA;      // suma de cada lectura de presion
 delay(100);         // demora de medio seg. entre lecturas
 }
 lcd.setCursor(0, 0);        // cursor en primer fila y primer columna
 lcd.print("Pres: ");        // escribe Pres:
 lcd.print(SUMA/5.0, 1);     // escribe valor promedio de 5 lecturas con un decimal
 lcd.setCursor(13, 0);        // cursor en primer fila y primer columna
 lcd.print(" psi ");        // imprime psi
 break;

case 2:
  SUMA = 0;         // valor inicial de SUMA en cero
 for (int i=0; i < 5; i++){      // bucle que repite 5 veces
 SENSOR = analogRead(A0);      // lectura de entrada analogica A0
 PRESION = map(SENSOR, 102, 921, 0, 20.7);                           // Funcion map () entre 0.5 a 4.5V con 0 a 20.7 psi (lectura de entrada analogica A0)
 SUMA = PRESION + SUMA;      // suma de cada lectura de presion
 delay(200);         // demora de medio seg. entre lecturas
 }
 lcd.setCursor(0, 0);        // cursor en primer fila y primer columna
 lcd.print("Pres: ");        // escribe Pres:
 lcd.print(SUMA/5.0, 1);     // escribe valor promedio de 5 lecturas con un decimal
 lcd.setCursor(13, 0);        // cursor en primer fila y primer columna
 lcd.print(" bar ");        // imprime psi
 default :
 break;
   }
}
int leerBoton(int boton){
 boton = digitalRead(ibut);
 delay(200);
 return boton;
 }

Adjunto esquema y datasheet del sensor

Moderador
Nada absolutamente nada se permite postear como simple texto.
Los códigos vas posteados usando etiquetas para tal efecto.

Las imagenes deben verse. Al final de las normas se explica cómo hacer visible una imagen adjunta como en tu caso.

Lee las Normas del foro

A ver como se comporta asi el código

#include <Wire.h>
#include <LiquidCrystal_I2C.h> // libreria para que funcione el display 20X4
LiquidCrystal_I2C lcd (0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // encuentran conectados RS, E, D4, D5, D6, D7

int ibut = 10 ;     // ibut PIN10 de entrada para el control del botón
int tiempo = 1000 ;    // Tiempo para dar tiempo a retirar el dedo del botón hasta hacer otra lectura
int estadoboton = 0 ;   // Variable para guardar el estado del boton LOW (bajo = 0) o HIGH (alto = 1)
bool vista = false ;    // Primera vez controla lo que se hace únicamente en el primer bucle, luego se le cambia de valor


int sensor;   // variable almacena valor leido de entrada analogica A0
float presion;  // valor de presion en en decimales
float suma;   // valor de la suma de las 5 lecturas de presion

bool boton, botonAnt = false;

void setup() {                                // encender el LDC 20x4
    Wire.begin();
    lcd.begin (20,4) ;
    lcd.backlight();                    // terminar con luz de fondo encendida   
    lcd.clear();
    pinMode(ibut, INPUT);  // En el PIN 10 entra la medida del circuito del buton abrimos como lNPUT
    delayMicroseconds(50);
 }

void loop() {
  
  boton = digitalRead(ibut);
  
  if (boton && !botonAnt){
      vista = !vista;
      lcd.clear();
  }
  botonAnt = boton;

  suma = 0;         // valor inicial de suma en cero
  for (int i=0; i < 5; i++){      // bucle que repite 5 veces
      sensor = analogRead(A0);      // lectura de entrada analogica A0
      if (vista) 
          presion = map(sensor, 102, 921, 0, 300);                           // Funcion map () entre 0.5 a 4.5V con 0 a 300 psi (lectura de entrada analogica A0)
      else
          presion = map(sensor, 102, 921, 0, 20.7);                           // Funcion map () entre 0.5 a 4.5V con 0 a 20.7 psi (lectura de entrada analogica A0)
      suma = presion + suma;      // suma de cada lectura de presion
      delay(100);         // demora de medio seg. entre lecturas
  }
  
  lcd.setCursor(0, 0);        // cursor en primer fila y primer columna
  lcd.print("Pres: ");        // escribe Pres:
  lcd.print(suma/5.0, 1);     // escribe valor promedio de 5 lecturas con un decimal
  lcd.setCursor(13, 0);        // cursor en primer fila y primer columna
  if (vista) 
      lcd.print(" psi ");        // imprime psi
  else 
      lcd.print(" bar ");        // imprime psi  
  
}

Gracias surbyte, pero probé tu código y tambien sucede lo mismo que el que yo postee en un principio.

prueba reemplazando todos los Delay de tu código por millis

Lo probe con millis, y no hay ningun cambio, me parece extraño que me intercale todo el tiempo el caso 1 con el caso 2 sin apretar el pulsador

Moderador:
Que tal si antes de continuar me haces caso al pedido de que edites el post y que te manejes de acuerdo a las normas del foro!!

Creo que fui claro al respecto.
En su momento respondí pero parece que al hacerlo te habilito a que olvides dicho pedido
Por favor, corrige el post inicial presentándolo como yo he hecho.

El boceto que presento compila y sube correctamente; pero al mostrarse en un display 20x4 no actúa correctamente mostrando la lectura intercalándose intermitente una con la otra (titila ambas lecturas)

Bueno ahora detecto varios errores.
Primero: map no hace correcciones sobre valores del tipo float. Solo int o long de modo que corrige la funcion map por fmap (búscala porque no existe o no esta disponible).

Segundo: El comando del pulsador ahora bascula o intercambia convenientemente entre un tipo y otro de lectura.
Solo que si map no funciona obviamente el resto estará mal.

Tercero: millis() no tiene nada que ver y no modificará nada.

esta es fmap

float fmap(long x, long in_min, long in_max, long out_min, long out_max) {
 return (float)(x - in_min) * (out_max - out_min) / (float)(in_max - in_min) + out_min;
}

Muchas gracias en principio por dos cosas
1- Por ayudarme a ordenar mi consulta y que se visibilice mejor (no lo había comprendido al principio)
2- Por volver a indicarme donde corregir el código, lo estaré probando en breve y comento la variante

Buenos días!
Pude modificar el código pero manteniendo la función map() (no pude entender la función fmap() y el porque de no usar map () en una acotar una señal analógica). Lo que me surge ahora con el código es que no me aplica con un pulsador si retención, es decir que solo funciona con un interruptor. En otras palabras cuando aplico el pulsador cambia la lectura mientras lo sostengo, cuando lo suelto vuelve al estado actual, alguien podría indicarme como corregir este error?

#include <Wire.h>
#include <LiquidCrystal_I2C.h> // libreria para que funcione el display 20X4
LiquidCrystal_I2C lcd (0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // encuentran conectados RS, E, D4, D5, D6, D7

int ibut = 10 ;     // ibut PIN10 de entrada para el control del botón


int sensor;   // variable almacena valor leido de entrada analogica A0
float presion;  // valor de presion en en decimales
float suma;   // valor de la suma de las 5 lecturas de presion
float presion1;  // valor de presion en en decimales
float suma1;   // valor de la suma de las 5 lecturas de presion

void setup() {                                // encender el LDC 20x4
    Wire.begin();
    lcd.begin (20,4) ;
    lcd.backlight();                    // terminar con luz de fondo encendida   
    lcd.clear();
    pinMode(ibut, INPUT);  // En el PIN 10 entra la medida del circuito del buton abrimos como lNPUT
    delayMicroseconds(50);
 }

void loop() {
 
  suma = 0;         // valor inicial de suma en cero
  suma1 = 0;         // valor inicial de suma en cero
  
  for (int i=0; i < 5; i++){      // bucle que repite 5 veces
      sensor = analogRead(A0);      // lectura de entrada analogica A0
       presion = map(sensor, 102, 921, 0, 300);                           // Funcion map () entre 0.5 a 4.5V con 0 a 300 psi (lectura de entrada analogica A0)
       presion1 = map(sensor, 102, 921, 0, 20.7);                           // Funcion map () entre 0.5 a 4.5V con 0 a 20.7 psi (lectura de entrada analogica A0)
      suma = presion + suma;      // suma de cada lectura de presion
      suma1 = presion1 + suma1;      // suma de cada lectura de presion
      delay(100);         // demora de medio seg. entre lecturas
  }
 
  lcd.setCursor(0, 0);        // cursor en primer fila y primer columna
  lcd.print("Presion: ");        // escribe Pres:
  
  lcd.setCursor(9, 0);        // cursor en primer fila y primer columna
  if (digitalRead(ibut))
 { lcd.print(suma/5.0, 1);     // escribe valor promedio de 5 lecturas con un decimal
   lcd.print(" psi ");        // imprime psi
 } else
  {  
    lcd.print(suma1/5.0, 1);     // escribe valor promedio de 5 lecturas con un decimal
    lcd.print(" bar ");        // imprime psi 
  }
}