/*
ESP32 / 7 segment count up demo
Green wires are segments, grey wires are digits.
In a real circuit NPN drivers should be used for each digit.
Beerware - 9/1/25
*/
const int DP_POS = 2; // decimal point at 3rd digit
// Define digit control pins (D1 to D4)
const int DIGIT_PINS[4] = {16, 17, 5, 18};
// Define segment pins (A-G, DP)
const int SEG_PINS[8] = {13, 33, 26, 14, 12, 32, 25, 27};
// Segment configuration for numbers 0-9 (A to G, DP)
const byte DIGITS[][8] = {
{1, 1, 1, 1, 1, 1, 0, 0}, // 0
{0, 1, 1, 0, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1, 0}, // 2
{1, 1, 1, 1, 0, 0, 1, 0}, // 3
{0, 1, 1, 0, 0, 1, 1, 0}, // 4
{1, 0, 1, 1, 0, 1, 1, 0}, // 5
{1, 0, 1, 1, 1, 1, 1, 0}, // 6
{1, 1, 1, 0, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1, 0}, // 8
{1, 1, 1, 1, 0, 1, 1, 0}, // 9
{0, 0, 0, 0, 0, 0, 0, 0} // blank
};
// show a number on a specific digit
void showDigit(int num, int digit) {
for (int i = 0; i < 8; i++) {
if (digit == DP_POS && i == 7) {
digitalWrite(SEG_PINS[i], 1);
} else {
digitalWrite(SEG_PINS[i], DIGITS[num][i]);
}
}
// toggle digit pin
digitalWrite(DIGIT_PINS[digit], LOW); // enable digit
digitalWrite(DIGIT_PINS[digit], HIGH); // disable digit
}
// display a 4-digit number on the 7-segment display
void showNumber(int number) {
int digitArray[4];
for (int i = 3; i >= 0; i--) {
digitArray[i] = number % 10;
number /= 10;
}
for (int i = 0; i < 4; i++) {
showDigit(digitArray[i], i);
}
}
/*
// display a 4-digit number on the 7-segment display
void showNumber(int number) {
int digitArray[4] = {
number / 1000,
(number / 100) % 10,
(number / 10) % 10,
number % 10
};
for (int i = 0; i < 4; i++) {
showDigit(digitArray[i], i);
}
}
*/
void setup() {
Serial.begin(115200);
for (int i = 0; i < 8; i++) {
pinMode(SEG_PINS[i], OUTPUT);
}
for (int i = 0; i < 4; i++) {
pinMode(DIGIT_PINS[i], OUTPUT);
}
Serial.println("Ready");
}
void loop() {
for (int i = 0; i < 10000; i++) {
showNumber(i);
delay(100);
}
}