Cronometro Gokart

Salve :) Sto sviluppando un cronometro per gokart, funziona con un reed che passa ogni giro su una banda magnetica. Display 16x2, 4 pulsanti di navigazione nei menu, e datalog nella eprom del chip integrato, scaricabile poi tramite seriale su pc. Ho sviluppato la maggiorparte del programma ma la mia conoscenza in programmazione è limitata, sto dunque cercando un aiuto concreto per il compimento del progetto! Chiunque volesse aiutarmi, anche via messenger o skype può contattarmi alla mia email o rispondere a questo tread, ovviamente a progetto ultimato metterò a disposizione il programma a tutta la comunità di Arduino! luca.rs197@live.it Vi ringrazio! Luca

...perchè non esponi qui i tuoi problemi?

Appunto per quanto è complesso cercavo qualcuno che mi aiutasse in tempo reale, comunque espongo anche qua i problemi.
Il programma funzionerà così:

Schermata di “Benvenuto” --[4sec]–> Menu principale --[navigo con frecce/OK]–> -set n° bande magnetiche (imposto il numero di volte che il reed verrà attivato per ogni giro, es. 3 bande, ogni 3 bande è un giro)
→ -Avvia Crono (avvia lo script del cronometro)
→ -Invia sessione Seriale (collegando con usb a pc invia i tempi)
→ -Cancella sessione (cancella i tempi memorizzati nella eeprom)

Se la pista ha 3 bande magnetiche, passata la prima avvia un nuovo giro, alla seconda mostrerà se si sta girando più veloci o più lenti rispetto al tempo più basso memorizzato, al terzo passaggio, ferma il crono salva il tempo nella eprom e riparte per cronometrare il giro successivo.
Per la gestione del menu sto utilizzando la libreria “MenuBackend.h” che semplifica parecchio la gestione, questo è lo script allo stato attuale, non funziona ancora correttamente e mancano molte cose.

#include <MenuBackend.h>
#include <LiquidCrystal.h>

const int buttonPinLeft = 3;
const int buttonPinRight = 4; 
const int buttonPinEsc = 5;
const int buttonPinEnter = 6;

int lastButtonPushed = 0;

int lastButtonEnterState = LOW;
int lastButtonEscState = LOW; 
int lastButtonLeftState = LOW;  
int lastButtonRightState = LOW; 


long lastEnterDebounceTime = 0; 
long lastEscDebounceTime = 0; 
long lastLeftDebounceTime = 0;  
long lastRightDebounceTime = 0; 
long debounceDelay = 100; 

int m,s,l;
int mu=0,md=0,su=0,sd=0,lu=0,ld=0,lc=0;
int pulsador,antes,despues;
long int tiempo,inicio;

LiquidCrystal lcd(11, NULL, 12, 7, 8, 9, 10);


MenuBackend menu = MenuBackend(menuUsed,menuChanged);

    MenuItem menu1Item1 = MenuItem(" -Bande Magnet.");
      MenuItem menuItem1SubItem1 = MenuItem("1");
      MenuItem menuItem1SubItem2 = MenuItem("2");
      MenuItem menuItem1SubItem3 = MenuItem("3");
      MenuItem menuItem1SubItem4 = MenuItem("4");
      MenuItem menuItem1SubItem5 = MenuItem("5");
      MenuItem menuItem1SubItem6 = MenuItem("6");
      MenuItem menuItem1SubItem7 = MenuItem("7");
      MenuItem menuItem1SubItem8 = MenuItem("8");
      MenuItem menuItem1SubItem9 = MenuItem("9");
    MenuItem menu1Item2 = MenuItem(" -Avvia Crono");
      MenuItem menuItem2SubItem1 = MenuItem("Crono");
    MenuItem menu1Item3 = MenuItem("Invia t. seriale");


void setup()
{
  
    pinMode(2, INPUT);                      //2 START/STOP
  antes=HIGH;
  despues=HIGH;
  
  
  pinMode(buttonPinLeft, INPUT);
  pinMode(buttonPinRight, INPUT);
  pinMode(buttonPinEnter, INPUT);
  pinMode(buttonPinEsc, INPUT);
 
  lcd.begin(16, 2);

  menu.getRoot().add(menu1Item1);
  menu1Item1.addRight(menu1Item2).addRight(menu1Item3);
  menu1Item1.add(menuItem1SubItem1).addRight(menuItem1SubItem2).addRight(menuItem1SubItem3).addRight(menuItem1SubItem4).addRight(menuItem1SubItem5).addRight(menuItem1SubItem6).addRight(menuItem1SubItem7).addRight(menuItem1SubItem8).addRight(menuItem1SubItem9);
  menu1Item2.add(menuItem2SubItem1);
  menu.toRoot();
  lcd.setCursor(0,0); 
  lcd.print("   PL Karting   ");

}

Continua...

void loop()
{

  readButtons(); 
  navigateMenus();
                 
}


void menuChanged(MenuChangeEvent changed){

  MenuItem newMenuItem=changed.to;

  lcd.setCursor(0,1);

  if(newMenuItem.getName()==menu.getRoot()){
      lcd.print("Main Menu       ");
  }else if(newMenuItem.getName()==" -Bande Magnet."){
      lcd.print(" -Bande Magnet. ");
  }else if(newMenuItem.getName()=="1"){
      lcd.print("1");
  }else if(newMenuItem.getName()=="2"){
      lcd.print("2");
      }else if(newMenuItem.getName()=="3"){
      lcd.print("3");
      }else if(newMenuItem.getName()=="4"){
      lcd.print("4");
      }else if(newMenuItem.getName()=="5"){
      lcd.print("5");
      }else if(newMenuItem.getName()=="6"){
      lcd.print("6");
      }else if(newMenuItem.getName()=="7"){
      lcd.print("7");
      }else if(newMenuItem.getName()=="8"){
      lcd.print("8");
      }else if(newMenuItem.getName()=="9"){
      lcd.print("9");
  }else if(newMenuItem.getName()==" -Avvia Crono"){
      lcd.print(" -Avvia Crono   ");
  }else if(newMenuItem.getName()=="Invia t. seriale"){
      lcd.print("Invia t. seriale");
  }
}

void menuUsed(MenuUseEvent used){

  despues=digitalRead(2);                 
  if(despues==LOW&&antes==HIGH){          
    inicio=millis();                      
                                          
    antes=despues;                        
    pulsador=0;                           
    delay(200);                           
    while(pulsador==0){                   
      tiempo=millis()-inicio;             
      m=tiempo/60000;                     
      mu=m%10;                           
      md=(m-mu)/10;                      
      s=(tiempo/1000)-(m*60);            
      su=s%10;                            
      sd=(s-su)/10;                       
      l=tiempo-(s*1000)-(m*60000);       
      lu=l%10;                            
      ld=((l-lu)/10)%10;                  
      lc=(l-(ld*10)-lu)/100;              
      lcd.setCursor(6, 0);                
      lcd.print(md);                      
      lcd.print(mu);              
      lcd.print(":");
      lcd.print(sd);
      lcd.print(su);
      lcd.print(":");
      lcd.print(lc);
      lcd.print(ld);
      lcd.print(lu);
      despues=digitalRead(2);             
      if(despues==LOW&&antes==HIGH){      
                                          
        antes=despues;                   
        pulsador=1;                       
      Serial.print(md);
      Serial.print(mu);
      Serial.print(":");
      Serial.print(sd);
      Serial.print(su);
      Serial.print(":");
      Serial.print(lc);
      Serial.print(ld);
      Serial.print(lu);
      Serial.println(" ");
        delay(200);                       
      }
      antes=despues;                     
    }
  }
  antes=despues;                          
}



void  readButtons(){  
  int reading;
  int buttonEnterState=LOW;             
  int buttonEscState=LOW;             
  int buttonLeftState=LOW;             
  int buttonRightState=LOW;             

  
                  
                  reading = digitalRead(buttonPinEnter);

                  
                  if (reading != lastButtonEnterState) {
                    
                    lastEnterDebounceTime = millis();
                  }
                 
                  if ((millis() - lastEnterDebounceTime) > debounceDelay) {
                   
                    buttonEnterState=reading;
                    lastEnterDebounceTime=millis();
                  }
                 
                  
                  lastButtonEnterState = reading;
                 

    
                  reading = digitalRead(buttonPinEsc);

                  
               
                  if (reading != lastButtonEscState) {
                   
                    lastEscDebounceTime = millis();
                  }
                 
                  if ((millis() - lastEscDebounceTime) > debounceDelay) {
                   
                    buttonEscState = reading;
                    lastEscDebounceTime=millis();
                  }
              
                  lastButtonEscState = reading;
                 
                    
  
                  reading = digitalRead(buttonPinRight);

                  if (reading != lastButtonRightState) {
                   
                    lastRightDebounceTime = millis();
                  }
                 
                  if ((millis() - lastRightDebounceTime) > debounceDelay) {
                   
                    buttonRightState = reading;
                   lastRightDebounceTime =millis();
                  }
               
                  lastButtonRightState = reading;                 
                 
     
                  reading = digitalRead(buttonPinLeft);

             
                  if (reading != lastButtonLeftState) {
                 
                    lastLeftDebounceTime = millis();
                  }
                 
                  if ((millis() - lastLeftDebounceTime) > debounceDelay) {
                 
                    buttonLeftState = reading;
                    lastLeftDebounceTime=millis();;
                  }
                 
               
                  lastButtonLeftState = reading; 

                
                  if (buttonEnterState==HIGH){
                    lastButtonPushed=buttonPinEnter;

                  }else if(buttonEscState==HIGH){
                    lastButtonPushed=buttonPinEsc;

                  }else if(buttonRightState==HIGH){
                    lastButtonPushed=buttonPinRight;

                  }else if(buttonLeftState==HIGH){
                    lastButtonPushed=buttonPinLeft;

                  }else{
                    lastButtonPushed=0;
                  }                 
}

void navigateMenus() {
  MenuItem currentMenu=menu.getCurrent();

  switch (lastButtonPushed){
    case buttonPinEnter:
      if(!(currentMenu.moveDown())){  
        menu.use();
      }else{ 
        menu.moveDown();
       }
      break;
    case buttonPinEsc:
      menu.toRoot(); 
      break;
    case buttonPinRight:
      menu.moveRight();
      break;     
    case buttonPinLeft:
      menu.moveLeft();
      break;     
  }

  lastButtonPushed=0; 
}

Dove hai preso / come hai realizzato la banda magnetica?

Le bande magnetiche ci sono in quasi tutte le piste per kart, è uno standard diciamo... ;)

ah, sulla pista! Pensavo stessero sulle ruote... :roll_eyes: Pensavo intendessi contare i giri delle ruote, per calcolare la velocità...

No no, la banda magnetica funge da "via" per far partire il cronometro ;)