HI,
Newbie on the forum and looking for some help with some code.
I downloaded a sketch made by Filipe Dias that would display the gear my motorcycles is in. I have changed his code a bit (hope you don't mind Filipe . . ) and it does work. Changing up and down and neutral all work using tactile switches to simulate hall effect sensors.
My problem is: If the switch is pressed slowly it will rattle through the numbers to the max (in my case 5). Same going down. It does the same with the sensors. If the magnet is around for too long it thinks I've changed more than one gear.
I thought it was a debounce problem and fitted a debounce circuit on each input using R/C and a Schmitt inverter (x2).
I now believe the code is the problem.
Code:
/*
MOTORCYCLE SHIFT INDICATOR
( For Common Cathode Display )
by Filipe Dias
Pins:
D2 - 7 (A)
D3 - 6 (B)
D4 - 4 (C)
D5 - 2 (D)
D6 - 1 (E)
D7 - 9 (F)
D8 - 10 (G)
D10 - neutral
D11 - up
D12 - down
*/
byte change = 6;
#define segmenta 2
#define segmentb 3
#define segmentc 4
#define segmentd 5
#define segmente 6
#define segmentf 7
#define segmentg 8
#define neutral 10
#define up 11
#define down 12
void setup() {
// Define Pins
pinMode(segmenta, OUTPUT);
pinMode(segmentb, OUTPUT);
pinMode(segmentc, OUTPUT);
pinMode(segmentd, OUTPUT);
pinMode(segmente, OUTPUT);
pinMode(segmentf, OUTPUT);
pinMode(segmentg, OUTPUT);
pinMode(neutral, INPUT_PULLUP);
pinMode(up, INPUT_PULLUP);
pinMode(down, INPUT_PULLUP);
// All leds test
for (int x = 0; x < 3; x++){
digitalWrite(segmenta, 1);
delay(200);
digitalWrite(segmenta, 0);
digitalWrite(segmentb, 1);
delay(200);
digitalWrite(segmentb, 0);
digitalWrite(segmentg, 1);
delay(200);
digitalWrite(segmentg, 0);
digitalWrite(segmente, 1);
delay(200);
digitalWrite(segmente, 0);
digitalWrite(segmentd, 1);
delay(200);
digitalWrite(segmentd, 0);
digitalWrite(segmentc, 1);
delay(200);
digitalWrite(segmentc, 0);
digitalWrite(segmentg, 1);
delay(200);
digitalWrite(segmentg, 0);
digitalWrite(segmentf, 1);
delay(200);
digitalWrite(segmentf, 0);
}
}
void loop(){
if(change == 6){
//set LED values
if(digitalRead(neutral)==LOW){
change=0;
}
}else{
if(digitalRead(up)==LOW){
if(change==0){
change = 2; //shift up from neutral to 2nd
}else if(change == 1){
//do nothing check for neutral later
}else if(change<5){
change=change + 1; //shift up from any other gear
}
}else if(digitalRead(down)==LOW){
if(change ==2){
//do nothing check for neutral later
}else if(change == 0){
change = 1; //shift down from neutral into 1st
}else if(change>1){
change=change-1;
}else if(change == 1){
//do nothing check for neutral later
}
}else if(digitalRead(neutral)==LOW && (change == 2 || change == 1)){
change = 0;
}
updateLED();
delay(100);
}
}
void updateLED(){
switch(change){
case 0:
digitalWrite(segmenta, 0);
digitalWrite(segmentb, 0);
digitalWrite(segmentc, 1);
digitalWrite(segmentd, 0);
digitalWrite(segmente, 1);
digitalWrite(segmentf, 0);
digitalWrite(segmentg, 1);
break;
case 1:
digitalWrite(segmenta, 0);
digitalWrite(segmentb, 1);
digitalWrite(segmentc, 1);
digitalWrite(segmentd, 0);
digitalWrite(segmente, 0);
digitalWrite(segmentf, 0);
digitalWrite(segmentg, 0);
break;
case 2:
digitalWrite(segmenta, 1);
digitalWrite(segmentb, 1);
digitalWrite(segmentc, 0);
digitalWrite(segmentd, 1);
digitalWrite(segmente, 1);
digitalWrite(segmentf, 0);
digitalWrite(segmentg, 1);
break;
case 3:
digitalWrite(segmenta, 1);
digitalWrite(segmentb, 1);
digitalWrite(segmentc, 1);
digitalWrite(segmentd, 1);
digitalWrite(segmente, 0);
digitalWrite(segmentf, 0);
digitalWrite(segmentg, 1);
break;
case 4:
digitalWrite(segmenta, 0);
digitalWrite(segmentb, 1);
digitalWrite(segmentc, 1);
digitalWrite(segmentd, 0);
digitalWrite(segmente, 0);
digitalWrite(segmentf, 1);
digitalWrite(segmentg, 1);
break;
case 5:
digitalWrite(segmenta, 1);
digitalWrite(segmentb, 0);
digitalWrite(segmentc, 1);
digitalWrite(segmentd, 1);
digitalWrite(segmente, 0);
digitalWrite(segmentf, 1);
digitalWrite(segmentg, 1);
break;
case 6:
break;
}
}
Any help would be much appreciated.
Cheers,
Andy