I was trying to make my 4-dig 7-seg display increase from this code but would only increase the first number, all others blank. I feel like I've tried everything, but I know it's possible.
/*
Forum: https://forum.arduino.cc/t/4-digit-7-segment-display-not-increasing/1215547
Wokwi: https://wokwi.com/projects/387845602713171969
*/
/*
* Author: SMRAZA KEEN
* Date:2016/6/29
* IDE V1.6.9
* Email:TechnicSmraza@outlook.com
* Function:
*/
int ASeg = 9;
int BSeg = 13;
int CSeg = 4;
int DSeg = 6;
int ESeg = 7;
int FSeg = 10;
int GSeg = 3;
int a1 = 8;
int a2 = 11;
int a3 = 12;
int a4 = 2;
// set variable
long n = 1;
int x = 1;
int del = 500; // fine adjustment for clock
void setup()
{
pinMode(a1, OUTPUT);
pinMode(a2, OUTPUT);
pinMode(a3, OUTPUT);
pinMode(a4, OUTPUT);
pinMode(ASeg, OUTPUT);
pinMode(BSeg, OUTPUT);
pinMode(CSeg, OUTPUT);
pinMode(DSeg, OUTPUT);
pinMode(ESeg, OUTPUT);
pinMode(FSeg, OUTPUT);
pinMode(GSeg, OUTPUT);
}
unsigned long lastCount = 0;
void loop()
{
printToSeg();
if (millis()-lastCount > 100){
lastCount = millis();
n++;
}
}
void printToSeg(){
long no = n;
setSeg(4, no);
setSeg(3, no);
setSeg(2, no);
setSeg(1, no);
}
void setSeg(byte digit, long &number){
clearLEDS(); // Eliminating ghost
pickDigit(digit); // Display position digit
pickNumber(number%10); // Display number
delayMicroseconds(del); // Time adjustment
number = number/10;
}
// Select display position
void pickDigit(int x)
{
digitalWrite(a1, LOW);
digitalWrite(a2, LOW);
digitalWrite(a3, LOW);
digitalWrite(a4, LOW);
switch(x)
{
case 1:
digitalWrite(a1, HIGH);
break;
case 2:
digitalWrite(a2, HIGH);
break;
case 3:
digitalWrite(a3, HIGH);
break;
case 4:
digitalWrite(a4, HIGH);
break;
}
}
// select display number
void pickNumber(int x)
{
switch(x) {
case 1: one(); break;
case 2: two(); break;
case 3: three(); break;
case 4: four(); break;
case 5: five(); break;
case 6: six(); break;
case 7: seven(); break;
case 8: eight(); break;
case 9: nine(); break;
default: zero(); break;
}
}
void clearLEDS() // clear the screen
{
digitalWrite(ASeg, HIGH);
digitalWrite(BSeg, HIGH);
digitalWrite(CSeg, HIGH);
digitalWrite(DSeg, HIGH);
digitalWrite(ESeg, HIGH);
digitalWrite(FSeg, HIGH);
digitalWrite(GSeg, HIGH);
}
//Display function ā0-9ā
void zero() {
digitalWrite(ASeg, LOW);
digitalWrite(BSeg, LOW);
digitalWrite(CSeg, LOW);
digitalWrite(DSeg, LOW);
digitalWrite(ESeg, LOW);
digitalWrite(FSeg, LOW);
digitalWrite(GSeg, HIGH);
}
void one() {
digitalWrite(ASeg, HIGH);
digitalWrite(BSeg, LOW);
digitalWrite(CSeg, LOW);
digitalWrite(DSeg, HIGH);
digitalWrite(ESeg, HIGH);
digitalWrite(FSeg, HIGH);
digitalWrite(GSeg, HIGH);
}
void two() {
digitalWrite(ASeg, LOW);
digitalWrite(BSeg, LOW);
digitalWrite(CSeg, HIGH);
digitalWrite(DSeg, LOW);
digitalWrite(ESeg, LOW);
digitalWrite(FSeg, HIGH);
digitalWrite(GSeg, LOW);
}
void three() {
digitalWrite(ASeg, LOW);
digitalWrite(BSeg, LOW);
digitalWrite(CSeg, LOW);
digitalWrite(DSeg, LOW);
digitalWrite(ESeg, HIGH);
digitalWrite(FSeg, HIGH);
digitalWrite(GSeg, LOW);
}
void four() {
digitalWrite(ASeg, HIGH);
digitalWrite(BSeg, LOW);
digitalWrite(CSeg, LOW);
digitalWrite(DSeg, HIGH);
digitalWrite(ESeg, HIGH);
digitalWrite(FSeg, LOW);
digitalWrite(GSeg, LOW);
}
void five() {
digitalWrite(ASeg, LOW);
digitalWrite(BSeg, HIGH);
digitalWrite(CSeg, LOW);
digitalWrite(DSeg, LOW);
digitalWrite(ESeg, HIGH);
digitalWrite(FSeg, LOW);
digitalWrite(GSeg, LOW);
}
void six() {
digitalWrite(ASeg, LOW);
digitalWrite(BSeg, HIGH);
digitalWrite(CSeg, LOW);
digitalWrite(DSeg, LOW);
digitalWrite(ESeg, LOW);
digitalWrite(FSeg, LOW);
digitalWrite(GSeg, LOW);
}
void seven() {
digitalWrite(ASeg, LOW);
digitalWrite(BSeg, LOW);
digitalWrite(CSeg, LOW);
digitalWrite(DSeg, HIGH);
digitalWrite(ESeg, HIGH);
digitalWrite(FSeg, HIGH);
digitalWrite(GSeg, HIGH);
}
void eight() {
digitalWrite(ASeg, LOW);
digitalWrite(BSeg, LOW);
digitalWrite(CSeg, LOW);
digitalWrite(DSeg, LOW);
digitalWrite(ESeg, LOW);
digitalWrite(FSeg, LOW);
digitalWrite(GSeg, LOW);
}
void nine() {
digitalWrite(ASeg, LOW);
digitalWrite(BSeg, LOW);
digitalWrite(CSeg, LOW);
digitalWrite(DSeg, LOW);
digitalWrite(ESeg, HIGH);
digitalWrite(FSeg, LOW);
digitalWrite(GSeg, LOW);
}
Feel free to check it out on Wokwi:
The most relevant changes:
Update the 7Segment Display as quick as possible in loop()
Use a millis() function to delay the increasing of the counter
Use a second counter variable that you can change without altering the "real counter"
Start with the lowest digit first (secondcounter modulo 10) and then divide secondcounter by 10. This removes the lowest digit so that the second lowest can now be evaluated by modulo 10
Repeat this for all four digits
These are the relevant parts;
// Stores the time in millis() when n was increased
unsigned long lastCount = 0;
void loop()
{
// Prints to 7Segment display every loop() without delay!
printToSeg();
// Changes n every 100 ms
if (millis()-lastCount > 100){
lastCount = millis();
n++;
}
}
// Copies n to no which will be divided by 10 with every call of setSeg()
void printToSeg(){
long no = n;
setSeg(4, no);
setSeg(3, no);
setSeg(2, no);
setSeg(1, no);
}
// Prints the lowest digit of number
// The address operator in front of number (&number) ensures that
// the compiler does not hand over a copy of the variable but the address of
// the variable. This allows to change the value of &number!
void setSeg(byte digit, long &number){
clearLEDS(); // Eliminating ghost
pickDigit(digit); // Display position digit
pickNumber(number%10); // Display number
delayMicroseconds(del); // Time adjustment
number = number/10;
}
Good luck and have fun!
[Edit: 2024/01/25] : printToSeg() can be made even shorter like this:
void printToSeg(){
long divider = 1000;
for (int digit = 1;digit < 5; digit++){
clearLEDS(); // Eliminating ghost
pickDigit(digit); // Display position digit
pickNumber((n/divider)%10); // Display number
delayMicroseconds(del); // Time adjustment
divider = divider/10;
}
}