/*
Arduino | coding-help
Making a simple 4 digit seven Segment display
without using any sevSeg and Clock library
Moong OP — 08/28/2024 3:51 AM
Hello, I am currently trying to make a simple clock without using any
of the given libraries. I am still not really well versed in coding so
i tried to make the code with some of the assistance from ai but i
cant really seem to create any specific output and i have no clue how
to create a proper clock output
NOTE:
In a real circuit use a resistor per segment
and a transistor driver for each digit.
*/
int A = 2;
int B = 3;
int C = 4;
int D = 5;
int E = 6;
int F = 7;
int G = 8;
int D1 = 9;
int D2 = 10;
int D3 = 11;
int D4 = 12;
int DP = 13;
int min_add = A0;
int min_minus = A1;
int MIN_ADD = 0;
int MIN_MINUS = 0;
unsigned long previousMillis = 0;
const long interval = 60000; // 1 minute interval
int hr = 1;
int min = 0;
void setup() {
// 7 SEGMENT LED
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
// Decimal point
pinMode(DP, OUTPUT);
// Clock digits
pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
pinMode(D3, OUTPUT);
pinMode(D4, OUTPUT);
pinMode(min_add, INPUT);
pinMode(min_minus, INPUT);
}
void closed() {
digitalWrite(D1, HIGH);
digitalWrite(D2, HIGH);
digitalWrite(D3, HIGH);
digitalWrite(D4, HIGH);
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, LOW);
}
void pick_num(int digit) {
switch (digit) {
case 1: digitalWrite(D1, LOW); break;
case 2: digitalWrite(D2, LOW); break;
case 3: digitalWrite(D3, LOW); break;
case 4: digitalWrite(D4, LOW); break;
}
}
void exit_num(int digit) {
switch (digit) {
case 1: digitalWrite(D1, HIGH); break;
case 2: digitalWrite(D2, HIGH); break;
case 3: digitalWrite(D3, HIGH); break;
case 4: digitalWrite(D4, HIGH); break;
}
}
void display_num(int number) {
switch (number) {
case 0: digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, LOW);
break;
case 1: digitalWrite(A, LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
case 2: digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, LOW);
digitalWrite(G, HIGH);
break;
case 3: digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, HIGH);
break;
case 4: digitalWrite(A, LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
break;
case 5: digitalWrite(A, HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
break;
case 6: digitalWrite(A, HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
break;
case 7: digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
case 8: digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
break;
case 9: digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
break;
}
}
void all_low() {
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
digitalWrite(D1, LOW);
digitalWrite(D2, LOW);
digitalWrite(D3, LOW);
digitalWrite(D4, LOW);
}
void display_min(int number) {
closed();
int num1 = number % 10;
int num2 = number / 10;
pick_num(1);
display_num(num1);
delay(5);
exit_num(1);
pick_num(2);
display_num(num2);
delay(5);
exit_num(2);
}
void display_hr(int number) {
closed();
int num1 = number % 10;
int num2 = number / 10;
pick_num(3);
display_num(num1);
delay(5);
exit_num(3);
pick_num(4);
display_num(num2);
delay(5);
exit_num(4);
}
void adjust_time(int &hr, int &min) {
unsigned long currentMillis = millis();
// Automatic time increment every 1 minute
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (min < 59) {
min++;
} else {
min = 0;
if (hr < 12) {
hr++;
} else {
hr = 1;
}
}
}
// Manual time adjustment
MIN_ADD = digitalRead(min_add);
MIN_MINUS = digitalRead(min_minus);
if (MIN_ADD == HIGH) {
delay(50); // Debounce delay
if (digitalRead(min_add) == HIGH) {
if (min < 59) {
min++;
} else {
min = 0;
if (hr < 12) {
hr++;
} else {
hr = 1;
}
}
delay(250); // Prevent multiple increments on a single press
}
}
if (MIN_MINUS == HIGH) {
delay(50); // Debounce delay
if (digitalRead(min_minus) == HIGH) {
if (min > 0) {
min--;
} else {
min = 59;
if (hr > 1) {
hr--;
} else {
hr = 12;
}
}
delay(250); // Prevent multiple decrements on a single press
}
}
}
void display_time() {
adjust_time(hr, min);
for (int j = 0; j < 5; j++) {
display_min(min);
display_hr(hr);
}
}
void loop() {
display_time();
}