I'm trying to build a timer for an rc racetrak using an ultrasonic sensor, a 4 digit 7 segment display (5461as), a 74HC595N IC and an UNO R3.
I have managed to make the counting part work (the variable "passage" that is going to be displayed only updates once every lap) but I cannot figure how to display it. Currently it only shows 8s and dots and I'm 99% sure the issue comes from my programming.
Here is the code :
Big thanks in advance ![]()
//4 digit display using 74HC595 shift register
#define clockPin 10 // Clock pin for 74HC595
#define dataPin 8 // Data pin for 74HC595
#define latchPin 9 // Latch pin for 74HC595
// Common pins of the four digits definitions
#define Dig1 2
#define Dig2 3
#define Dig3 4
#define Dig4 5
//Clock
#include <Chrono.h>
Chrono tours;
unsigned long passage=0;
//Echo_sensor
#include "SR04.h"
#define TRIG_PIN 11
#define ECHO_PIN 12
SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
long a;
int memo_passage = LOW;
// Variable declarations
byte current_digit = 1;
int count = 0;
// Digit to segment map for common cathode display (change as needed for common anode)
const byte segmentMap[10] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
void setup() {
// Set pin modes
Serial.begin(9600);
pinMode(Dig1, OUTPUT);
pinMode(Dig2, OUTPUT);
pinMode(Dig3, OUTPUT);
pinMode(Dig4, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(latchPin, OUTPUT);
// Function to turn off all digits
}
void disp_off() {
digitalWrite(Dig1, LOW);
digitalWrite(Dig2, LOW);
digitalWrite(Dig3, LOW);
digitalWrite(Dig4, LOW);
}
// Function to display a number on the 7-segment
void disp(byte number) {
digitalWrite(latchPin, LOW); // Prepare shift register for new data
shiftOut(dataPin, clockPin, MSBFIRST, segmentMap[number]); // Send digit data
digitalWrite(latchPin, HIGH); // Latch the data to update the display
}
void loop() {
a = sr04.Distance();
Serial.println(a);
Serial.println(passage);
Serial.println(current_digit);
if ((a < 30) && (memo_passage == LOW)) {
passage=tours.elapsed();
tours.restart();
memo_passage = HIGH;
}
if ((a > 30)) {
memo_passage = LOW;
}
disp_off(); // Turn off the display before updating
// Display the appropriate digit
switch (current_digit) {
case 1:
disp((passage / 10000) % 10); // Display thousands place
digitalWrite(Dig4, HIGH); // Turn on digit 4
break;
case 2:
disp((passage / 1000) % 10); // Display hundreds place
digitalWrite(Dig3, HIGH); // Turn on digit 3
break;
case 3:
disp((passage / 100) % 10); // Display tens place
digitalWrite(Dig2, HIGH); // Turn on digit 2
break;
case 4:
disp((passage / 10) % 10); // Display ones place
digitalWrite(Dig1, HIGH); // Turn on digit 1
break;
}
delay(500);
current_digit = (current_digit % 4) + 1; // Cycle to the next digit
}
