//https://forum.arduino.cc/t/slot-car-lap-counter/1376016
/*
SN74HC595/6 PIN Equivalente
14 DS 14 SER SERIAL_IN
13 OE 13 OE GND
12 STCP 12 RCLK LATCH
11 SHCP 11 SRCLK CLOCK
10 MR 10 SRCLR +V
9 Q7S 9 QH SERIAL_OUT
15 Q0 A
1 Q1 F
2 Q2 G
3 Q3 E
4 Q4 D
5 Q5 C
6 Q6 B
7 Q7 DP
#define SER 7 //data
#define RCLK 5 // LATCH
#define SRCLK 6 // CLOCK
*/
int SRCLK = 6;//SHcp pin of 74HC595
int RCLK = 5;//STcp pin of 74HC595
int SER = 7;//ds pin of 74HC595
int digit1, digit2, digit3, digit4;
byte segmentsBits[] = {B01111011, //0
B01100000, //1
B01011101, //2
B01110101, //3
B01100110, //4
B00110111, //5
B00111111, //6
B01100001, //7
B01111111, //8
B01110111 //9
};
byte score1 = 0;
byte score2 = 0;
#define sns1 2
#define sns2 3
#define rst 4
bool flagUnder1 = false;
bool flagUnder2 = false;
//------------------------------------------------------------------
void setup() {
pinMode(SRCLK, OUTPUT);
pinMode(RCLK, OUTPUT);
pinMode(SER, OUTPUT);
digitalWrite(SRCLK, LOW);
digitalWrite(RCLK, LOW);
digitalWrite(SER, LOW);
pinMode(sns1, INPUT_PULLUP);
pinMode(sns2, INPUT_PULLUP);
pinMode(rst, INPUT_PULLUP);
}
//------------------------------------------------------------------
void loop() {
if (digitalRead(sns1) == HIGH) { // Depending sensor use HIGH or LOW
if (flagUnder1 == false) {
flagUnder1 = true;
score1++;
if (score1 > 99 ) {
score1 = 0;
}
}
}
if (digitalRead(sns2) == HIGH) { // Depending sensor use HIGH or LOW
if (flagUnder2 == false) {
flagUnder2 = true;
score2++;
if (score2 > 99 ) {
score2 = 0;
}
}
}
if (digitalRead(sns1) == LOW) { // Depending sensor use HIGH or LOW
flagUnder1 = false;
}
if (digitalRead(sns2) == LOW) { // Depending sensor use HIGH or LOW
flagUnder2 = false;
}
if (digitalRead(rst) == LOW) {
delay(30);
if (digitalRead(rst) == LOW) {
score1 = 0;
score2 = 0;
}
}
digit1 = score1 % 10 ; // gets dec
showDig(digit1, 0xFD);
digit2 = (score1 / 10) % 10 ; //gets unit
showDig(digit2, 0xFE);
digit3 = score2 % 10 ; //gets dec
showDig(digit3, 0xFB);
digit4 = (score2 / 10) % 10 ; //gets unit
showDig(digit4, 0xF7);
}
//---------------------------------------------------------------------
void showDig(int digit, byte digitBits) {
digitalWrite(RCLK, LOW);
shiftOut(SER, SRCLK, MSBFIRST, digitBits);
shiftOut(SER, SRCLK, MSBFIRST, segmentsBits[ digit]);
digitalWrite(RCLK, HIGH);
delay(1);
}A
B
C
D
E
F
G
Reset