Duda con cuentakilometros

Buenas a todos:
Me llamo Jose y soy nuevo con Arduino.
Me he metido a fondo con este proyecto, pero no me sale bien del todo.

Estoy haciendo un cuentakilometros con 2 parciales y 3 pulsadores:
1- aumenta parcial 2.
2 - disminuye parcial 2.
3 - puesta a 0 de los 2 parciales (parcial 1 con pulsación y parcial 2 pulsación de mas de 2 segundos).

Problemas:
1- He conseguido que cuente distancia pero cuando llega a 72.06 km, me pasa a -72.06 km (cualquiera de los 2).

2 - No consigo encontrar el codigo que haga resetear el parcial 2 despues de 2 segundos. Tal vez no sea la codificación mas correcta que estoy usando para hacer esto.

Os pongo mi codigo para que lo echeis un vistazo

Muchas gracias de antemano

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);

int estadoActual1=0;    //Km Trip 1
int estadoActual2=0;    //Km Trip 2
int estadoActual3=0;    //Aumenta
int estadoActual4=0;    //Disminuye
int estadoActual5=0;    //Resetear Trip 1
int estadoActual6=0;    //Resetear Trip 2
int estadoUltimo=0;
int estadoUltimo1=0;
int contador=0;
int contador1=0;
float radioEnM=0.35;   //INGRESAR radio de la rueda en cm
float pi=3.141592;
float perimetroRueda=2*pi*radioEnM;  //Calcula Perimetro en metros 
float perimetroRueda1=2*pi*radioEnM;  //Calcula Perimetro en metros 
float distRecorrida=0;
float distRecorrida1=0;
float distKM=0;
float distKM1=0;

void setup(){
        pinMode(3,INPUT);
        Serial.begin(57600);
        lcd.begin(16,2);
        Serial.println(estadoActual5);
        Serial.println(estadoActual6);
}
void loop(){
  // Trip 1
        estadoActual1=digitalRead(3);{
              if (estadoActual1 != estadoUltimo){
                    if (estadoActual1 == HIGH) {
                        contador = contador + 1;
                        Serial.print ("Vueltas ");
                        Serial.println(contador);
                        distancia();
                    }
              }
        }
        estadoUltimo= estadoActual1;
              
// Trip 2
        estadoActual2=digitalRead(3);{
              if (estadoActual2 != estadoUltimo1){
                    if (estadoActual2 == HIGH) {
                        contador1 = contador1 + 1;
                        Serial.print ("Vueltas ");
                        Serial.println(contador1);
                        distancia1();
                    }
              }
        }
        estadoUltimo1= estadoActual2;
          
//Boton Aumentar Trip 2
        estadoActual3=digitalRead(4);
        delay(10);{
              if (estadoActual3 != estadoUltimo1){
                    if (estadoActual3 == HIGH) {
                        contador1 = contador1 + 1;
                        Serial.print ("Vueltas ");
                        Serial.println(contador1);
                        distancia1();
                    }
              }
        }
// Boton Dismiunir Trip 2
        estadoActual4=digitalRead(5);
        delay(10);{
              if (estadoActual4 != estadoUltimo1){
                    if (estadoActual4 == HIGH) {
                        contador1 = contador1 - 1;
                        Serial.print ("Vueltas ");
                        Serial.println(contador1);
                        distancia1();
                        if (distKM1<=0){
                          distKM1 = distKM1 = 0;
                          contador1 = contador1 = 0;}
                    }
             }
      }
//Boton Reset Trip 1
        estadoActual5=digitalRead(6);{
                    if (estadoActual5 == HIGH) {
                       if(distKM=0);
                       contador = contador = 0;
                        Serial.print ("Vueltas ");
                        Serial.println(contador);
                        distancia();
                    }
        }
PantallaLCD();
}
void distancia(){
                        distRecorrida=perimetroRueda*contador;
                        distKM=distRecorrida/1000;
                        if(distRecorrida<=0){
                                Serial.print("Distancia recorrida en km= ");
                                Serial.println(distKM);
                        }
}
void distancia1(){
                        distRecorrida1=perimetroRueda1*contador1;
                        distKM1=distRecorrida1/1000;
                        if(distRecorrida1<=0){
                        }
                                Serial.print("Distancia recorrida en Km= ");
                                Serial.println(distKM1);
}
 void PantallaLCD(){
            lcd.clear();
              lcd.setCursor(0,0);
                lcd.write("Trip 1 ");
                lcd.print(distKM);
                lcd.write(" Km");
                        lcd.setCursor(0,1);
                         lcd.write("Trip 2 ");
                         lcd.print(distKM1);
                         lcd.write(" Km");
}

Por ciento, que no lo comenté, es un Arduino UNO con el que lo estoy haciendo

Olvida el código y describe el instrumento.
¿Es para una bicicleta? ¿Es el clásico instrumento de rueda que uno lo lleva caminando haciéndolo rodar por el piso para medir una distancia?

¿para medir la distancia usas una rueda? ¿Que sensor piensas usar para tomar una vuelta o usarías varios pulsos por vueltas?

¿Pensaste que tu código pueda llegar a adaptarse a distintas ruedas? En este caso lo mejor sería crear una forma de que el usuario le diga al instrumentos cuantos centímetros o milímetros tiene una vuelta, como lo hacen los velócímetros de bicicletas.

También es importante saber cuanto será la distancia máxima que puede medir el instrumento antes que se terminen los dígitos. A cuantas rpm crees que será la máxima

¿La distancia total y parciales se deben conservar ante un corte de energía?
Saludos

Hola Daniel:

Daniel_Arg:
¿para medir la distancia usas una rueda? ¿Que sensor piensas usar para tomar una vuelta o usarías varios pulsos por vueltas?

Si, es para una rueda de bici con un sensor magnético

Daniel_Arg:
¿Pensaste que tu código pueda llegar a adaptarse a distintas ruedas? En este caso lo mejor sería crear una forma de que el usuario le diga al instrumentos cuantos centímetros o milímetros tiene una vuelta, como lo hacen los velócímetros de bicicletas.

Si, con el radio de la llanta pero a través de la codificación

Daniel_Arg:
También es importante saber cuanto será la distancia máxima que puede medir el instrumento antes que se terminen los dígitos. A cuantas rpm crees que será la máxima

La distancia maxima serian 999 km en ambos y rpm... ni idea

Daniel_Arg:
¿La distancia total y parciales se deben conservar ante un corte de energía?

Los totales si me interesaría que los guardase si hay corte de corriente

De momento no he planteado hacer menús para cambiar visualizacón, ya que es una pantalla de 2 lineas y no se puede poner en grande

Hola,
Perfecto el post #2.
No he mirado el código, pero tiene toda la pinta de que necesitas un entero "largo" (lo siento, no me acuerdo de la sintáxis en "C").
Saludos

Entero largo es

unsigned long Variable

estas cosas

contador = contador = 0; 
contador1 = contador1 = 0;

dan advertencias del compilador.
Deja solo una.

en un momento completo mi respuesta porque tengo un problema con un dispositivo y no puedo probar tu código.

surbyte:
Entero largo es

unsigned long Variable

este como se usa?

surbyte:

contador = contador = 0; 

contador1 = contador1 = 0;




dan advertencias del compilador.
Deja solo una.

Que es eso de que dan advertencias?
El tema de tener 2 contadores es para que sean independientes a la hora de resetear uno u otro, o de ajustar la distancia

Soy novato, novatisimo así que os ruego paciencia conmigo :wink:

PUedes tener dos contadores pero no poner

contador = contador = 0;

te basta con

contador = 0;

esoj:
Problemas:
1- He conseguido que cuente distancia pero cuando llega a 72.06 km, me pasa a -72.06 km (cualquiera de los 2).

El problema no tiene que ver con la distancia sino con la variable que llamas CONTADOR. La has definido como un INT: Es decir "This yields a range of -32,768 to 32,767". Por eso cuando vas por la vuelta 32.767 y le sumas uno mas la variable se desborda y pasa a -32.768. Tu ves esos kilometros que dices porque el perimetro de tu rueda sera aprox. 2,2 mts. Cambia INT por una superior, por ejemplo LONG y no tendras ese problema.

aca esta tu solución

unsigned long contador  = 0;
unsigned long contador1 = 0;

Como bien dijo @cas6678 y ya te habia dicho antes @vffgaston y yo mismo, debes usar unsigned long para los contadores.

El problema de los kms esta solucionado. Ya va aumentando correctamente. Muchas gracias a los 3 @cas6678, @vffgaston y @surbyte!

¿Se puede hacer que al aumentar digito los kms (10, 100...) no corra un puesto en la pantalla o lo haga hacia la izquierda?
He provado con char para que dejase 3 digitos pero no funciona bien y no sale el valor correcto.

Me gustaría que me ayudaseis con el reseteo del contadores:
Parcial 1 con pulsación y parcial 2 pulsación de mas de 2 segundos. El parcial 1 esta hecho y funcionando pero no consigo encontrar un codigo de pulsación larga que me funcione con mi codigo

Otra consuta: se puede programar para que guarde la información de uno de los parciales si se va la corriente?

Siento ser tan pesado

Modifica esto

void PantallaLCD(){
  char buffer[20]=" ";      // Buffer de la cadena donde se devuelve todo, número formateado y cadena concatenada
  char* buffn="";           // Cadena donde almacenaremos el número convertido
  
  dtostrf(distKM,6,2,buffn);    // Llamada a la función 
  char* formato="Trip1 %s Km"; // Cadena con la mascara a convertir
  sprintf(buffer, formato, buffn);
  lcd.setCursor(0,0);
  lcd.print(buffer);

  dtostrf(distKM1,6,2,buffn);    // Llamada a la función 
  char* formato="Trip2 %s Km"; // Cadena con la mascara a convertir
  sprintf(buffer, formato, buffn);
  lcd.setCursor(0,1);
  lcd.print(buffer);
}

Ya lo hice funciona correctamente sin desplazarse los dígitos!!
Eres un fenómeno @surbyte

El tema de guardar un parcial... Se que un EEPROM se quemará porque tiene un límite de guardado de datos
Alguna opción al respecto?
Hay alguna forma para que sólo, cuando haya un corte de corriente, guarde los datos? Con un condensador tal vez?

La EEPROM tiene 100.000 ciclos de lectura/escritura. Tu vas a hacer 100.000 ciclos con la bicicleta?

Solo debes asegurarte que estas detenido y que un leve movimiento de la bicicleta no sea un inicio de movimiento o de kms a medir. Supongo que si la batería esta siempre podrias hacerlo por tiempo tmb
Son sugerencias.

Muchas gracias por las ideas
A ver si encuentro lo que busco en el buscador