Actualizacion de datos en lcd {SOLUCIONADO}

Hola a todos:

Tengo un problema que no se como solucionar con mi cuentakilometros.

Añadí 2 sensores de temperatura y un voltimetro pero esta todo el rato actualizandose y tambien se actualiza cuando cuenta las vueltas de la rueda. Esto hace que a veces falle el código y no cuente alguna vez tal vez por saturación. El led TX esta parpadeando todo el rato aunque no haga nada.

Quisiera, si se puede, que la temperatura y voltimetro actualice a las 10 segundos, pero que el cuentakilometros lo haga con cada vuelta que da la rueda. Con delay me todo y no funciona correctamente el cuentakilometros

Uso un Arduino Uno y una lcd I2C 20x4

Para un Arduino Nano, valen los codigos?
Es normal que tenga que hacer llamada a cada void? Si no lo hago no me sale en la pantalla

Gracias y un saludo

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

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

//Trips 1 y 2
int estadoActual1=0;
int estadoActual2=0;
int estadoActual3=0;
int estadoUltimo=0;
int estadoUltimo1=0;
unsigned long contador=0;
unsigned long contador1=0;
float perimetroRueda=2.205;
float Trip1=0;
float Trip2=0;
char buffer[20]=" ";
char* buffn=" ";
char* buffn1=" ";


//voltaje
int analogInput = 0;
float vout = 0;
float vin = 0
float R1 = 100000.0;
float R2 = 10000.0;
int value = 0;

// temperatura
float tempC=0;
double tempK =0;
float tempC1=0;
double tempK1 =0;

void setup(){
//pinMode(1, INPUT); //Voltaje
Serial.begin(57600);
lcd.begin(20,4);}

void loop(){
//Trip 1
lcd.setCursor(0,0);
dtostrf(Trip1,10,2,buffn);
char* formato="Trip 1 %s Km";
sprintf(buffer, formato, buffn);
lcd.print(buffer);

//Trip 2
lcd.setCursor(0,1);
dtostrf(Trip2,10,2,buffn);
char* formato1="Trip 2 %s Km";
sprintf(buffer, formato1, buffn1);
lcd.print(buffer);

//temperatura 1
lcd.setCursor(4,3);
lcd.print((char)223);
lcd.setCursor(5,3);
lcd.print("C");
lcd.setCursor(0,3);
dtostrf(tempC1,4,1,buffn1);
char* formato4="%s";
sprintf(buffer, formato4, buffn1);
lcd.print(buffer);

//temperatura 2
lcd.setCursor(18,3);
lcd.print((char)223); //223
lcd.setCursor(19,3);
lcd.print("C");
lcd.setCursor(9,3);
dtostrf(tempC,9,1,buffn);
char* formato5="%s";
sprintf(buffer, formato5, buffn);
lcd.print(buffer);

//Voltaje
lcd.setCursor(0,2);
dtostrf(vin,4,1,buffn);
char* formato3="%s V";
sprintf(buffer, formato3, buffn);
lcd.print(buffer);
trip_1();
}

void trip_1(){
Trip1 =((perimetroRueda*contador)/1000);
Serial.print("Distancia recorrida en km= ");
estadoActual1=digitalRead(3);
if (estadoActual1 != estadoUltimo){
  if (estadoActual1 == HIGH) {
    contador = contador + 1;
    Serial.print ("Vueltas ");
    Serial.println(contador);
}
}
estadoUltimo= estadoActual1;

trip_2();
}

void trip_2(){
// Trip 2
Trip2 =((perimetroRueda*contador1)/1000);
Serial.print("Distancia recorrida en km= ");
estadoActual1=digitalRead(3);
if (estadoActual1 != estadoUltimo1){
  if (estadoActual1 == HIGH) {
    contador1 = contador1 + 1;
    Serial.print ("Vueltas ");
    Serial.println(contador1);
    }
}
estadoUltimo1= estadoActual1;

temp();
}

void temp(){

int tempReading = analogRead(1);
tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK );
tempC = tempK - 273.15;

int tempReading1 = analogRead(2);
tempK1 = log(10000.0 * ((1024.0 / tempReading1 - 1)));
tempK1 = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK1 * tempK1 )) * tempK1 ); 
tempC1 = tempK1 - 273.15; 
voltaje();
}

void voltaje(){
 value = analogRead(0); 
   vout = (value * 5.0) / 1024.0; 
   vin = vout / (R2/(R1+R2)); 
if (vin<=1){
  vin = vin = 0;}
}

Nadie me puede ayudar?

El led TX está parpadeando todo el rato aunque no haga nada.

Como que no hace nada, si en tu codigo estas imprimiendo los valores por el puerto serial como esto:

Serial.print("Distancia recorrida en km= ");
Serial.print ("Vueltas ");
Serial.println(contador);
Serial.print("Distancia recorrida en km= ");
Serial.print ("Vueltas ");
Serial.println(contador1)

y dices que no está haciendo nada.
Bueno ahora en tu código tienes diferentes funciones, estas funciones las llamas una tras otra y además tienes cosas como estas tienes cosas como esto:

void temp(){
int tempReading = analogRead(1);
tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK );
tempC = tempK - 273.15;
int tempReading1 = analogRead(2);
tempK1 = log(10000.0 * ((1024.0 / tempReading1 - 1)));
tempK1 = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK1 * tempK1 )) * tempK1 );
tempC1 = tempK1 - 273.15;
voltaje();
}

donde tranquilamente podías dejarlo así :

float temp(int tempReading) {
	float
		tempC = 0,
		tempK = 0;
	tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
	tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK)) * tempK);
	tempC = tempK - 273.15;
	return tempC;
}

y te servirá para ambos sensores de temperatura.
Ahora no entiendo el resto de tu código por lo que no te puedo ayudar a menos que expliques bien lo que hace, como por ejemplo:

void trip_1() {
	Trip1 = ((perimetroRueda*contador) / 1000);
	estadoActual1 = digitalRead(3);
	if (estadoActual1 != estadoUltimo) {
		if (estadoActual1 == HIGH) {
			contador = contador + 1;
		}
	}
	estadoUltimo = estadoActual1;
	trip_2();
}

void trip_2() {
	// Trip 2
	Trip2 = ((perimetroRueda*contador1) / 1000);
	estadoActual1 = digitalRead(3);
	if (estadoActual1 != estadoUltimo1) {
		if (estadoActual1 == HIGH) {
			contador1 = contador1 + 1;
		}
	}
	estadoUltimo1 = estadoActual1;
}

y pues no entiendo para qué necesitas 2 para leer el mismo pin?

void voltaje() {
	value = analogRead(0);
	vout = (value * 5.0) / 1024.0;
	vin = vout / (R2 / (R1 + R2));
	if (vin <= 1) {
		vin = vin = 0;
	}
}

que funcion tiene hacer esto?

vin = vin = 0;

Dejo tu código con un temporizador para actualizar la variable de la temperatura es lo mismo para la pantalla asi que intentalo hacer por tu cuenta, cualquier inquietud no dudes en preguntar

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

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

//Trips 1 y 2
int estadoActual1 = 0;
int estadoActual2 = 0;
int estadoActual3 = 0;
int estadoUltimo = 0;
int estadoUltimo1 = 0;
unsigned long contador = 0;
unsigned long contador1 = 0;
float perimetroRueda = 2.205;
float Trip1 = 0;
float Trip2 = 0;
char buffer[20] = " ";
char* buffn = " ";
char* buffn1 = " ";


//voltaje
int analogInput = 0;
float vout = 0;
float vin = 0;
float R1 = 100000.0;
float R2 = 10000.0;
int value = 0;

// temperatura
float
tempSensor1C = 0,				// Variable que almacena la temperatura del sensor 1 en grados centigrados 
tempSensor2C = 0;				// Variable que almacena la temperatura del sensor 2 en grados centigrados

/*Temporizador*/
unsigned long
tiempoActual = 0,
tiempoAnterioDatos = 0;

constexpr unsigned long
intervaloDatos = 10000; 

void setup() {
	lcd.begin(20, 4);
}

void loop() {
//Actualizacion de datos
	tiempoActual = millis();
	if (tiempoActual - tiempoAnterioDatos >= intervaloDatos) {
		tempSensor1C = temp(analogRead(A1));
		tempSensor2C = temp(analogRead(A2));
		voltaje();
	}

	//Trip 1
	lcd.setCursor(0, 0);
	dtostrf(Trip1, 10, 2, buffn);
	char* formato = "Trip 1 %s Km";
	sprintf(buffer, formato, buffn);
	lcd.print(buffer);

	//Trip 2
	lcd.setCursor(0, 1);
	dtostrf(Trip2, 10, 2, buffn);
	char* formato1 = "Trip 2 %s Km";
	sprintf(buffer, formato1, buffn1);
	lcd.print(buffer);

	//temperatura 1
	lcd.setCursor(4, 3);
	lcd.print((char)223);
	lcd.setCursor(5, 3);
	lcd.print("C");
	lcd.setCursor(0, 3);
	dtostrf(tempSensor1C, 4, 1, buffn1);
	char* formato4 = "%s";
	sprintf(buffer, formato4, buffn1);
	lcd.print(buffer);

	//temperatura 2
	lcd.setCursor(18, 3);
	lcd.print((char)223); //223
	lcd.setCursor(19, 3);
	lcd.print("C");
	lcd.setCursor(9, 3);
	dtostrf(tempSensor2C, 9, 1, buffn);
	char* formato5 = "%s";
	sprintf(buffer, formato5, buffn);
	lcd.print(buffer);

	//Voltaje
	lcd.setCursor(0, 2);
	dtostrf(vin, 4, 1, buffn);
	char* formato3 = "%s V";
	sprintf(buffer, formato3, buffn);
	lcd.print(buffer);
	trip_1();
}

void trip_1() {
	Trip1 = ((perimetroRueda*contador) / 1000);
	estadoActual1 = digitalRead(3);
	if (estadoActual1 != estadoUltimo) {
		if (estadoActual1 == HIGH) {
			contador = contador + 1;
		}
	}
	estadoUltimo = estadoActual1;
	trip_2();
}

void trip_2() {
	// Trip 2
	Trip2 = ((perimetroRueda*contador1) / 1000);
	estadoActual1 = digitalRead(3);
	if (estadoActual1 != estadoUltimo1) {
		if (estadoActual1 == HIGH) {
			contador1 = contador1 + 1;
		}
	}
	estadoUltimo1 = estadoActual1;
}

float temp(int tempReading) {
	float
		tempC = 0,
		tempK = 0;
	tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
	tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK)) * tempK);
	tempC = tempK - 273.15;
	return tempC;
}

void voltaje() {
	value = analogRead(0);
	vout = (value * 5.0) / 1024.0;
	vin = vout / (R2 / (R1 + R2));
	if (vin <= 1) {
		vin = vin = 0;
	}
}

Gracias por tu tiempo!!
Yo ya veia algo raro al ver queel led TX no pararba de parpadear

Es un cuentakilometros que estoy haciendo para la moto con voltimetro y temperatura como has podido ver.

Sobre el apartado del voltaje, queria que si es menor a 1 voltio apareciera 0 en la pantalla

if (vin <= 1) {
  vin = vin = 0;
}

es un equívoco mío y sobra un vin :blush:
Lo he corregido y funciona

Te explico lo de los trips:
Es para navegar con roadbook. Uno será el parcial y el otro el total de la ruta (que no total de la moto)
Estoy con el tema de la Eeprom para guardar los datos cuando se corte corriente (que va para largo) y con el reseteo de los contadores

Me puedes ayudar con el reset de los 2 trips?
Al pulsar el boton reset menos de 2 segundos resetee el trip 1 y si es de mas de 2 resetee el trip 2
independientes si lo he conseguido pero quiero ahorrar un pulsador por espacio

estadoActual4=digitalRead(9);{
    if (estadoActual4 == HIGH) {
      if(Trip1=0);
      contador = 0;
      Serial.print ("Vueltas ");
      Serial.println(contador);

Para que almacene la Eeprom, tendria que poner algun condensador para que almacene esa energia?

He de reconocer que no tengo mucha idea y tal vez me he embarcado en mucho

He comprobado que en el codigo que has puesto, al iniciar Arduino tarda unos 10 segundos en aparecer la temperatura y los voltios correctos (inicia con 0,0). Después de los 10 segundos, se ve el valor correcto pero cuando hay una modificación de esos valores (grados o voltios) lo actualiza instantaneamente

Esto se puede modificar y hacer que actualice la visualización de la temperatura y los voltios cada x segundos?

Bueno para guardar los datos hace un tiempo vi un post que te puede ayudar: almacenar en eeprom funciona pero con detalle ¿ cual es la mejor forma? léelo puede que te sirva lo que comentaron.
Ahora con respecto a los trips como bien dices son para diferentes distancias, pero necesitas dos funciones? No bastaría con una sola? Esto:

void trip_1() {
 Trip1 = ((perimetroRueda*contador) / 1000);
 estadoActual1 = digitalRead(3);
 if (estadoActual1 != estadoUltimo) {
 if (estadoActual1 == HIGH) {
 contador = contador + 1;
 }
 }
 estadoUltimo = estadoActual1;
 trip_2();
}

void trip_2() {
 // Trip 2
 Trip2 = ((perimetroRueda*contador1) / 1000);
 estadoActual1 = digitalRead(3);
 if (estadoActual1 != estadoUltimo1) {
 if (estadoActual1 == HIGH) {
 contador1 = contador1 + 1;
 }
 }
 estadoUltimo1 = estadoActual1;
}

Y esto me parece que hace lo mismo:

 void trips() {
	Trip1 = ((perimetroRueda*contador) / 1000);
	Trip2 = ((perimetroRueda*contador) / 1000);
	estadoActual1 = digitalRead(3);
	if (estadoActual1 != estadoUltimo) {
		if (estadoActual1 == HIGH) {
			contador += 1;
		}
	}
	estadoUltimo = estadoActual1;
}

Cómo te dije el código actualiza las lecturas cada 10 segundos, solo con meter las funciones que muestran las lecturas en la lcd, ya te las actualiza en la pantalla cada 10 segundos.
Ten en cuenta que al principio va a tardar 10 segundos en mostrar esos datos por lo que si quieres que lo muestre enseguida tienes que poner una vez en el void setup

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

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

//Trips 1 y 2
int estadoActual1 = 0;
int estadoActual2 = 0;
int estadoActual3 = 0;
int estadoUltimo = 0;
int estadoUltimo1 = 0;
unsigned long contador = 0;
unsigned long contador1 = 0;
float perimetroRueda = 2.205;
float Trip1 = 0;
float Trip2 = 0;
char buffer[20] = " ";
char* buffn = " ";
char* buffn1 = " ";


//voltaje
int analogInput = 0;
float vout = 0;
float vin = 0;
float R1 = 100000.0;
float R2 = 10000.0;
int value = 0;

// temperatura
float
tempSensor1C = 0,				// Variable que almacena la temperatura del sensor 1 en grados centigrados 
tempSensor2C = 0;				// Variable que almacena la temperatura del sensor 2 en grados centigrados

/*Temporizador*/
unsigned long
tiempoActual = 0,
tiempoAnterioDatos = 0;

constexpr unsigned long
intervaloDatos = 10000; 

void setup() {
	lcd.begin(20, 4);
}

void loop() {
//Actualizacion de datos
	tiempoActual = millis();
	if (tiempoActual - tiempoAnterioDatos >= intervaloDatos) {
		tempSensor1C = temp(analogRead(A1));
		tempSensor2C = temp(analogRead(A2));
		//temperatura 1
	lcd.setCursor(4, 3);
	lcd.print((char)223);
	lcd.setCursor(5, 3);
	lcd.print("C");
	lcd.setCursor(0, 3);
	dtostrf(tempSensor1C, 4, 1, buffn1);
	char* formato4 = "%s";
	sprintf(buffer, formato4, buffn1);
	lcd.print(buffer);

	//temperatura 2
	lcd.setCursor(18, 3);
	lcd.print((char)223); //223
	lcd.setCursor(19, 3);
	lcd.print("C");
	lcd.setCursor(9, 3);
	dtostrf(tempSensor2C, 9, 1, buffn);
	char* formato5 = "%s";
	sprintf(buffer, formato5, buffn);
	lcd.print(buffer);

	//Voltaje
	lcd.setCursor(0, 2);
	dtostrf(vin, 4, 1, buffn);
	char* formato3 = "%s V";
	sprintf(buffer, formato3, buffn);
	lcd.print(buffer);
		voltaje();
	}

	//Trip 1
	lcd.setCursor(0, 0);
	dtostrf(Trip1, 10, 2, buffn);
	char* formato = "Trip 1 %s Km";
	sprintf(buffer, formato, buffn);
	lcd.print(buffer);

	//Trip 2
	lcd.setCursor(0, 1);
	dtostrf(Trip2, 10, 2, buffn);
	char* formato1 = "Trip 2 %s Km";
	sprintf(buffer, formato1, buffn1);
	lcd.print(buffer);

	
	trips();
}

void trips() {
	Trip1 = ((perimetroRueda*contador) / 1000);
	Trip2 = ((perimetroRueda*contador) / 1000);
	estadoActual1 = digitalRead(3);
	if (estadoActual1 != estadoUltimo) {
		if (estadoActual1 == HIGH) {
			contador += 1;
		}
	}
	estadoUltimo = estadoActual1;
}

float temp(int tempReading) {
	float
		tempC = 0,
		tempK = 0;
	tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
	tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK)) * tempK);
	tempC = tempK - 273.15;
	return tempC;
}

void voltaje() {
	value = analogRead(0);
	vout = (value * 5.0) / 1024.0;
	vin = vout / (R2 / (R1 + R2));
	if (vin <= 1) {
		vin = 0;
	}
}

Que estoy haciendo mal?
He intentado de mil formas hacer que al pulsar un botón menos de 3 segundos muestre un valor y si han pasados 3 segundos otro, pero no encuentro la manera de que funcione
He probado con “else if”, por separado y 1000 pruebas mas, pero no hay manera, que no doy con ello

int estadoActual4 = 0;
unsigned long tiempo1 = 0;
unsigned long tiempo2 = 0;
unsigned long tiempo3 = 0;
int tiempo4 = 3000;

void loop(){
estadoActual4 = digitalRead(9);
  if(estadoActual4 == HIGH){ 
      tiempo1 = millis();}
  if(estadoActual4 == HIGH){
      tiempo2 = millis();}
  
    if(estadoActual4 == HIGH){
      tiempo4 = millis();
      if(tiempo3 <= tiempo4);{
        contador = 300;
}
if(estadoActual4 == HIGH){
      tiempo4 = millis();
      if(tiempo3 >= tiempo4);{
       contador = 3300;
   }
}

tiempo3 = tiempo2 - tiempo1;


}

Swift:
Bueno para guardar los datos hace un tiempo vi un posible que es este: almacenar en eeprom funciona pero con detalle ¿ cual es la mejor forma? léelo puede que te sirva lo que comentaron.

Lo miro mas a fondo porque creo que es lo que necesito :slight_smile:

Hay una función que se llama pulseIn() que te devuelve el tiempo, según este configurado el botón (High - Low) revisa es lo que quieres hacer.
Con millis se puede hacer, pero lo que tienes que hacer es:
Cuando accionas el botón, actualizas el tiempo de la variable una sola vez, lo que tú estás haciendo es actualizarlo mientras lo tienes accionado.
Después en otra variable actualizar el tiempo cuando se suelta el botón una sola vez.
Después la diferencia de esta es el tiempo transcurrido de que se a presionado el botón.

Conseguí hacerlo funcionar la pulsación larga y corta sin PulseIn, actualizando el tiempo cuando soltaba el botón
Lo que no sabía era que había que ponerle un minimo y un maximo de tiempo para que funcionase y mira que ya habia probado antes

estadoActual4=digitalRead(9);{
if (estadoActual4 == HIGH) {
  tiempo2 = millis();}
if (estadoActual4 == LOW) {
    tiempo1 = millis();}
B_reset = (tiempo2 - tiempo1);
if (estadoActual4 == HIGH);{
  if(B_reset > 3000 && B_reset < 5000){
    contador1 = 0;}

Swift:
Cómo te dije el código actualiza las lecturas cada 10 segundos, solo con meter las funciones que muestran las lecturas en la lcd, ya te las actualiza en la pantalla cada 10 segundos.
Ten en cuenta que al principio va a tardar 10 segundos en mostrar esos datos por lo que si quieres que lo muestre enseguida tienes que poner una vez en el void setup

Siento decirte qu el código que pusiste no funciona como dices.
Tarda 10 segundos al inicio pero despúes se actualiza con cada variación de valor, osea que no es cada 10 segundos, sino enseguida

Siento decirte que el código que pusiste no funciona como dices.

Tienes mucha razón me equivoque yo, me e olvidado de actualizar el tiempo una vez que se cumple la condición, por lo que una vez que transcurren los 10 segundos siempre va a seguir cumpliendo y actualizando a cada rato.

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

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

//Trips 1 y 2
int estadoActual1 = 0;
int estadoActual2 = 0;
int estadoActual3 = 0;
int estadoUltimo = 0;
int estadoUltimo1 = 0;
unsigned long contador = 0;
unsigned long contador1 = 0;
float perimetroRueda = 2.205;
float Trip1 = 0;
float Trip2 = 0;
char buffer[20] = " ";
char* buffn = " ";
char* buffn1 = " ";


//voltaje
int analogInput = 0;
float vout = 0;
float vin = 0;
float R1 = 100000.0;
float R2 = 10000.0;
int value = 0;

// temperatura
float
tempSensor1C = 0, // Variable que almacena la temperatura del sensor 1 en grados centigrados 
tempSensor2C = 0; // Variable que almacena la temperatura del sensor 2 en grados centigrados

/*Temporizador*/
unsigned long
tiempoActual = 0,
tiempoAnterioDatos = 0;

constexpr unsigned long
intervaloDatos = 10000;

void setup() {
 lcd.begin(20, 4);
}

void loop() {
 //Actualizacion de datos
 tiempoActual = millis();
 if (tiempoActual - tiempoAnterioDatos >= intervaloDatos) {
 tiempoAnterioDatos = tiempoActual;
 tempSensor1C = temp(analogRead(A1));
 tempSensor2C = temp(analogRead(A2));

 //temperatura 1
 lcd.setCursor(4, 3);
 lcd.print((char)223);
 lcd.setCursor(5, 3);
 lcd.print("C");
 lcd.setCursor(0, 3);
 dtostrf(tempSensor1C, 4, 1, buffn1);
 char* formato4 = "%s";
 sprintf(buffer, formato4, buffn1);
 lcd.print(buffer);

 //temperatura 2
 lcd.setCursor(18, 3);
 lcd.print((char)223); //223
 lcd.setCursor(19, 3);
 lcd.print("C");
 lcd.setCursor(9, 3);
 dtostrf(tempSensor2C, 9, 1, buffn);
 char* formato5 = "%s";
 sprintf(buffer, formato5, buffn);
 lcd.print(buffer);

 //Voltaje
 lcd.setCursor(0, 2);
 dtostrf(vin, 4, 1, buffn);
 char* formato3 = "%s V";
 sprintf(buffer, formato3, buffn);
 lcd.print(buffer);
 voltaje();
 }

 //Trip 1
 lcd.setCursor(0, 0);
 dtostrf(Trip1, 10, 2, buffn);
 char* formato = "Trip 1 %s Km";
 sprintf(buffer, formato, buffn);
 lcd.print(buffer);

 //Trip 2
 lcd.setCursor(0, 1);
 dtostrf(Trip2, 10, 2, buffn);
 char* formato1 = "Trip 2 %s Km";
 sprintf(buffer, formato1, buffn1);
 lcd.print(buffer);


 trips();
}

void trips() {
 Trip1 = ((perimetroRueda*contador) / 1000);
 Trip2 = ((perimetroRueda*contador) / 1000);
 estadoActual1 = digitalRead(3);
 if (estadoActual1 != estadoUltimo) {
 if (estadoActual1 == HIGH) {
 contador += 1;
 }
 }
 estadoUltimo = estadoActual1;
}

float temp(int tempReading) {
 float
 tempC = 0,
 tempK = 0;
 tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
 tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK)) * tempK);
 tempC = tempK - 273.15;
 return tempC;
}

void voltaje() {
 value = analogRead(0);
 vout = (value * 5.0) / 1024.0;
 vin = vout / (R2 / (R1 + R2));
 if (vin <= 1) {
 vin = 0;
 }
}

Con respecto a los trips yo tenía otra idea con respecto a lo que planteas, lo que yo tenía pensado es que con el botón y una pulsación corta selecciones los trips por ejemplo cuando realizas una pulsación corta a una variable contador le sumas de una en una: por ejemplo en la primera pulsación será contador = 1, que equivaldría al trip 1 y para resetear este tendrás que presionar más de 2 segundos y así con el otro.

 byte
contador = 0;
bool
estadoReinicioTrips = 0,
estadoBoton = 0,
estadoAnteriorBoton = 0;
unsigned long
tiempoActual = 0,
tiempoBoton1 = 0,
tiempoBoton2 = 0;

void setup() {
	Serial.begin(115200);
	pinMode(9, INPUT);
}

void loop() {
	tiempoActual = millis();
	estadoBoton = digitalRead(9);
	if (estadoBoton != estadoAnteriorBoton) {
		if (estadoBoton == HIGH) {
			tiempoBoton1 = tiempoActual;
		}
		else
		{
			if ((tiempoActual - tiempoBoton1) < 300) {
				estadoReinicioTrips = 1;
				if (contador < 2) {
					contador++;
				}
				else
				{
					contador = 1;
				}
				Serial.println(contador);
			}
		}
	}
	else
	{
		if (estadoReinicioTrips) {
			if (estadoBoton == HIGH && (tiempoActual - tiempoBoton1) >= 2000) {
				switch (contador)
				{
				case 1:
					if (estadoReinicioTrips) {
						Serial.println("Hola 1");
						estadoReinicioTrips = 0;
					}
					break;
				case 2:
					if (estadoReinicioTrips) {
						Serial.println("Hola 2");
						estadoReinicioTrips = 0;
					}
					break;
				default:
					break;
				}
			}
		}
	}
	estadoAnteriorBoton = estadoBoton;

}

Ahora ya funciona. Gracias

Los trips quería que fueran independientes, por eso 2 contadores para poder ajustar el parcial si me equivoco con el roadbook

Con la funcion “case” se puede hacer un cambio de displays?

Me gustaria poder cambiar la visualización, osea que salgan los 2 trips o 1 trip y una temperatura… claro, con numeros mas grandes para aprovechar la pantalla. Ya conseguí añadir la velocidad, pero como estaba muy ocupado el procesador, no pasaba de 56 km/h y lo eliminé del codigo