Un saluto a tutti.
Sto realizzando un cronometro per dei kart prendendo spunto da quelli attualmente in commercio esempio Alfano, che sfruttano le bande magnetiche presenti sulle piste. Possono essercene 1 o 2 o 3 a seconda della pista.
Ho utilizzato quindi un Arduino Nano 5v, un display Hitaci (16x2) e un sensore reed (provato sia con ampolla diretta o ampolla su supporto come quello dei sensori di allarme) collegato come INPUT_PULLUP tra pin 3 e GND. Il risultato finale è quello in foto allegata (è solo un prototipo quindi va sicuramente migliorato :P). Facendo dei test in casa con una calamita tutto ok, il sistema conteggia 2 bande magnetiche (sono 2 nella pista in cui vado di solito) e al passaggio della seconda tiene il tempo visualizzato sul display, se questo è anche il miglior tempo della sessione lo scrive sulla seconda riga, fin qui tutto ok, funziona alla perfezione.
Il problema nasce quando l'ho testato direttamente in pista sul kart. Passando il kart (anche con motore in moto) sulle bande il sistema funziona perfettamente, anche in un giro è andato bene, mentre nel resto delle prove sia passando a bassa velocità che alta velocità il sistema sembra impazzisca, ovvero segna tipo 190 giri oppure il timer non va avanti ma oscilla tra 0.2 e 0.3 secondi senza proseguire o azzerarsi.
Ho quindi pensato fosse un problema di vibrazioni, ma mi pare strano che in certi passaggi i giri rimanessero a 0 quando il timer non proseguiva.
La domanda che mi pongo è se possano essere delle masse sul telaio (il filo del sensore è stato fascettato sul telaio) oppure un problema di alimentazione, ho utilizzato una battery pack usb, oppure qualcos'altro...
Qualche suggerimento?
Grazieee
Di seguito anche il codice, sicuramente è da migliorare, ma almeno su banco funziona bene
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <neotimer.h>
Neotimer mytimer = Neotimer(10000); // 10 second timer
LiquidCrystal_I2C lcd(0x3F,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
#define REEDPIN 3
#define LEDPIN 13
#define DEBOUNCE 2000
#define MAX_SECTORS 2
volatile int newlap = 0;
volatile long reedready;
long lasttime = 0;
long besttime = 0;
long curtime = 0;
long laptime = 0;
int sectors;
int cursector;
int lastsector;
int curlap;
int state;
void setup()
{
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.print("Scuderia xxxxx");
lcd.setCursor(0,1);
lcd.print("READY TO GO!");
pinMode(REEDPIN , INPUT_PULLUP);
pinMode(LEDPIN, OUTPUT);
digitalWrite(LEDPIN,HIGH);
delay(1000);
digitalWrite(LEDPIN,LOW);
delay(2000);
lcd.clear();
lcd.print("LAP:0");
Serial.begin(9600);
sectors = MAX_SECTORS;
// attachInterrupt(0, magnet_detect, RISING);//Initialize the intterrupt pin (Arduino digital pin 2)
}
void loop()
{
for (int i=0; i <= 1024; i++) {
if (digitalRead(REEDPIN)==0) {
if( millis() > reedready + DEBOUNCE){
if (--sectors == 0) {
newlap++;
sectors = MAX_SECTORS;
curtime = millis();
lasttime = (curtime - lasttime);
display_last(lasttime);
if (lasttime < besttime || besttime == 0)
besttime = lasttime;
display_best(besttime);
lasttime = curtime;
laptime = 1;
mytimer.start();
}
reedready = millis();
digitalWrite(LEDPIN,HIGH);
break;
}
else {
reedready = millis();
}
}
}
if (laptime==0) {
display();
}
if (mytimer.done()) {
laptime = 0;
}
}
void last_time() {
}
void display_last(long time) {
char buff[16];
lcd.setCursor(0,0);
lcd.print("LAST: ");
lcd.print(ftime(time,buff));
}
void display_best(long time) {
char buff[16];
lcd.setCursor(0,1);
lcd.print("BEST: ");
lcd.print(ftime(time,buff));
}
void display() {
char buff[16];
lcd.setCursor(0,0);
lcd.print("LAP:");
lcd.setCursor(4,0);
lcd.print(newlap);
lcd.setCursor(7,0);
lcd.print(ftime( (millis()-curtime) ,buff));
}
char* ftime(long time, char* buf) {
unsigned int m,s,ms;
//time=time%3600000;
ms=(time % 1000);
m=(time/60000L);
s=(time/1000L);
if (m>0) s=s-(60*m);
sprintf(buf, "%2u.%02d.%03u",m,s,ms);
return(buf);
}