/*
Reads characters from Serial, converts them to an integer if possible
and displays the number on a dual 7 segment display.
Written for common cathode, in a real circuit the digits should
have transistor drivers. Here 510Ω limits the common pin current to about 30 mA.
Serial input adapted from https://forum.arduino.cc/t/serial-input-basics-updated/382007
AnonEngineering - 3/24/26
Beerware
*/
const int NUM_CHARS = 32;
const int MAX_DIGITS = 2;
const int DIG_PINS[] = {11, 12}; // digit common pins
const int SEG_PINS[] = {9, 10, 8, 5, 6, 3, 4, 7}; // a, b, c, d, e, f, g, dp
const byte DIGITS[] = { // 7 seg look up table
0xFC, // 0
0x60, // 1
0xDA, // 2
0xF2, // 3
0x66, // 4
0xB6, // 5
0xBE, // 6
0xE0, // 7
0xFE, // 8
0xF6, // 9
0x00 // blank
};
char rxBuffer[NUM_CHARS]; // received data array
int value = 0;
void getSerial() {
static byte index = 0;
char endMarker = '\n';
char rxChar;
while (Serial.available() > 0 ) {
rxChar = Serial.read();
if (rxChar != endMarker) {
rxBuffer[index] = rxChar;
index++;
if (index >= NUM_CHARS) {
index = NUM_CHARS - 1;
}
}
else {
rxBuffer[index] = '\0'; // terminate the string
index = 0;
Serial.print("Received data: ");
Serial.println(rxBuffer);
value = atoi(rxBuffer); // convert c string to integer
}
}
}
void showValue(int number) {
int value[MAX_DIGITS];
// tens digit, lead zero blanking (10 is blank char)
value[0] = (number < 10) ? 10 : (number % 100) / 10;
value[1] = number % 10; // ones digit
// loop thru the digits
for (int digit = 0; digit < MAX_DIGITS; digit++) {
writeDigit(digit, value[digit]);
}
}
void writeDigit(int pos, int num) {
byte segments = DIGITS[num];
for (int i = 0; i < 8; i++) {
digitalWrite(SEG_PINS[i], bitRead(segments, 7 - i) ? HIGH : LOW); // bitRead is LSB first
}
digitalWrite(DIG_PINS[pos], LOW);
digitalWrite(DIG_PINS[pos], HIGH);
}
void setup() {
Serial.begin(115200);
for (int i = 0; i < MAX_DIGITS; i++) {
pinMode(DIG_PINS[i], OUTPUT);
digitalWrite(DIG_PINS[i], HIGH); // turn digit off
}
for (int i = 0; i < 8; i++) {
pinMode (SEG_PINS[i], OUTPUT);
}
Serial.println("Enter values between 0 and 99\n");
}
void loop() {
getSerial();
showValue(value);
}