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...
Pensavo intendessi contare i giri delle ruote, per calcolare la velocità...
No no, la banda magnetica funge da "via" per far partire il cronometro ![]()