Hello dear reader.
i have been troubled lately becose i cant get a code to work.
iam trying to get a timer of 7 minutes on a 4 digit-7 segment display that gets activated when a button is pressed i tried anything and everything.
but i can t get the darn thing to work if you can help it would be fabulous.
i am using and arduino uno rev3 , there is no issue with the wiring or hardware.
i am already thankfull if you are reading this.
thanks.
beawere i did use chatGPT to try and fix it i am a real beginner started about 1 month ago i am trying to learn coding by myself but AI does help me a ton .
here is every code i tried:
// Include the required library for 7-segment display
#include <SevSeg.h>
// Pin definitions for the 7-segment display
#define NUM_DIGITS 4
#define DIGIT_1 2
#define DIGIT_2 3
#define DIGIT_3 4
#define DIGIT_4 5
#define SEGMENT_A 6
#define SEGMENT_B 7
#define SEGMENT_C 8
#define SEGMENT_D 9
#define SEGMENT_E 10
#define SEGMENT_F 11
#define SEGMENT_G 12
// Pin for the pushbutton
#define BUTTON_PIN 13
// Define the timer duration in milliseconds (7 minutes)
#define TIMER_DURATION 420000
// Create an instance of the SevSeg library
SevSeg sevseg;
// Global variables
unsigned long startTime = 0;
bool timerRunning = false;
void setup() {
// Initialize the display
byte numDigits = NUM_DIGITS;
byte digitPins[] = {DIGIT_1, DIGIT_2, DIGIT_3, DIGIT_4};
byte segmentPins[] = {SEGMENT_A, SEGMENT_B, SEGMENT_C, SEGMENT_D, SEGMENT_E, SEGMENT_F, SEGMENT_G};
sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
// Set up the button pin as input
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
// Check if the button is pressed
if (digitalRead(BUTTON_PIN) == LOW && !timerRunning) {
// Start the timer
startTime = millis();
timerRunning = true;
}
// Check if the timer is running
if (timerRunning) {
// Calculate the elapsed time
unsigned long elapsedTime = millis() - startTime;
// Check if the timer has reached the duration
if (elapsedTime >= TIMER_DURATION) {
// Timer expired, reset
timerRunning = false;
}
// Convert elapsed time to minutes and seconds
int minutes = (TIMER_DURATION - elapsedTime) / 60000;
int seconds = ((TIMER_DURATION - elapsedTime) / 1000) % 60;
// Display the time on the 7-segment display
sevseg.setNumber(minutes * 100 + seconds, 2); // Display only minutes and seconds
sevseg.refreshDisplay();
}
}
when that did not work i tried this:
// Include the required library for 7-segment display
#include <SevSeg.h>
// Pin definitions for the 7-segment display
#define NUM_DIGITS 4
#define DIGIT_1 2
#define DIGIT_2 3
#define DIGIT_3 4
#define DIGIT_4 5
#define SEGMENT_A 6
#define SEGMENT_B 7
#define SEGMENT_C 8
#define SEGMENT_D 9
#define SEGMENT_E 10
#define SEGMENT_F 11
#define SEGMENT_G 12
// Define the timer duration in milliseconds (7 minutes)
#define TIMER_DURATION 420000
// Create an instance of the SevSeg library
SevSeg sevseg;
// Global variables
unsigned long startTime = 0;
bool timerRunning = true; // Start the timer automatically
void setup() {
// Initialize the display
byte numDigits = NUM_DIGITS;
byte digitPins[] = {DIGIT_1, DIGIT_2, DIGIT_3, DIGIT_4};
byte segmentPins[] = {SEGMENT_A, SEGMENT_B, SEGMENT_C, SEGMENT_D, SEGMENT_E, SEGMENT_F, SEGMENT_G};
sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
}
void loop() {
// Check if the timer is running
if (timerRunning) {
// Calculate the elapsed time
unsigned long elapsedTime = millis() - startTime;
// Check if the timer has reached the duration
if (elapsedTime >= TIMER_DURATION) {
// Timer expired, reset
timerRunning = false;
}
// Convert elapsed time to minutes and seconds
int minutes = (TIMER_DURATION - elapsedTime) / 60000;
int seconds = ((TIMER_DURATION - elapsedTime) / 1000) % 60;
// Display the time on the 7-segment display
sevseg.setNumber(minutes * 100 + seconds, 2); // Display only minutes and seconds
sevseg.refreshDisplay();
}
}
after that :
// Include the required library for 7-segment display
#include <SevSeg.h>
// Pin definitions for the 7-segment display
#define NUM_DIGITS 4
#define DIGIT_1 2
#define DIGIT_2 3
#define DIGIT_3 4
#define DIGIT_4 5
#define SEGMENT_A 6
#define SEGMENT_B 7
#define SEGMENT_C 8
#define SEGMENT_D 9
#define SEGMENT_E 10
#define SEGMENT_F 11
#define SEGMENT_G 12
// Define the timer duration in milliseconds (7 minutes)
#define TIMER_DURATION 420000
// Create an instance of the SevSeg library
SevSeg sevseg;
// Global variables
unsigned long startTime;
bool timerRunning = true; // Start the timer automatically
void setup() {
// Initialize the display
byte numDigits = NUM_DIGITS;
byte digitPins[] = {DIGIT_1, DIGIT_2, DIGIT_3, DIGIT_4};
byte segmentPins[] = {SEGMENT_A, SEGMENT_B, SEGMENT_C, SEGMENT_D, SEGMENT_E, SEGMENT_F, SEGMENT_G};
sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
// Initialize the start time
startTime = millis();
}
void loop() {
// Check if the timer is running
if (timerRunning) {
// Calculate the elapsed time
unsigned long elapsedTime = millis() - startTime;
// Check if the timer has reached the duration
if (elapsedTime >= TIMER_DURATION) {
// Timer expired, reset
timerRunning = false;
}
// Convert elapsed time to minutes and seconds
int remainingTime = (TIMER_DURATION - elapsedTime) / 1000; // Remaining time in seconds
// Calculate minutes and seconds
int minutes = remainingTime / 60;
int seconds = remainingTime % 60;
// Display the time on the 7-segment display
sevseg.setNumber(minutes * 100 + seconds, 2); // Display only minutes and seconds
sevseg.refreshDisplay();
}
}
you get it :
// Include the required library for 7-segment display
#include <SevSeg.h>
// Pin definitions for the 7-segment display
#define NUM_DIGITS 4
#define DIGIT_1 2
#define DIGIT_2 3
#define DIGIT_3 4
#define DIGIT_4 5
#define SEGMENT_A 6
#define SEGMENT_B 7
#define SEGMENT_C 8
#define SEGMENT_D 9
#define SEGMENT_E 10
#define SEGMENT_F 11
#define SEGMENT_G 12
// Create an instance of the SevSeg library
SevSeg sevseg;
void setup() {
// Initialize the display
byte numDigits = NUM_DIGITS;
byte digitPins[] = {DIGIT_1, DIGIT_2, DIGIT_3, DIGIT_4};
byte segmentPins[] = {SEGMENT_A, SEGMENT_B, SEGMENT_C, SEGMENT_D, SEGMENT_E, SEGMENT_F, SEGMENT_G};
sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
}
void loop() {
// Display countdown timer from 99 to 0
for (int i = 99; i >= 0; i--) {
// Extract tens and units digits
int tens = i / 10;
int units = i % 10;
// Display tens and units digits
sevseg.setDigit(3, tens, false);
sevseg.setDigit(2, units, true);
// Refresh display
sevseg.refreshDisplay();
// Delay for 1 second
delay(1000);
}
}
i began simplifiying it:
// Pin definitions for the 7-segment display
#define SEGMENT_A 6
#define SEGMENT_B 7
#define SEGMENT_C 8
#define SEGMENT_D 9
#define SEGMENT_E 10
#define SEGMENT_F 11
#define SEGMENT_G 12
void setup() {
// Set segment pins as output
pinMode(SEGMENT_A, OUTPUT);
pinMode(SEGMENT_B, OUTPUT);
pinMode(SEGMENT_C, OUTPUT);
pinMode(SEGMENT_D, OUTPUT);
pinMode(SEGMENT_E, OUTPUT);
pinMode(SEGMENT_F, OUTPUT);
pinMode(SEGMENT_G, OUTPUT);
}
void loop() {
// Display countdown timer from 99 to 0
for (int i = 99; i >= 0; i--) {
// Extract tens and units digits
int tens = i / 10;
int units = i % 10;
// Display tens digit
displayDigit(tens, 3);
// Display units digit
displayDigit(units, 2);
// Delay for 1 second
delay(1000);
}
}
void displayDigit(int digit, int position) {
switch (digit) {
case 0:
displaySegments(true, true, true, true, true, true, false, position);
break;
case 1:
displaySegments(false, true, true, false, false, false, false, position);
break;
case 2:
displaySegments(true, true, false, true, true, false, true, position);
break;
case 3:
displaySegments(true, true, true, true, false, false, true, position);
break;
case 4:
displaySegments(false, true, true, false, false, true, true, position);
break;
case 5:
displaySegments(true, false, true, true, false, true, true, position);
break;
case 6:
displaySegments(true, false, true, true, true, true, true, position);
break;
case 7:
displaySegments(true, true, true, false, false, false, false, position);
break;
case 8:
displaySegments(true, true, true, true, true, true, true, position);
break;
case 9:
displaySegments(true, true, true, true, false, true, true, position);
break;
default:
// Display nothing if the digit is out of range
displaySegments(false, false, false, false, false, false, false, position);
break;
}
}
void displaySegments(bool a, bool b, bool c, bool d, bool e, bool f, bool g, int position) {
digitalWrite(SEGMENT_A, a);
digitalWrite(SEGMENT_B, b);
digitalWrite(SEGMENT_C, c);
digitalWrite(SEGMENT_D, d);
digitalWrite(SEGMENT_E, e);
digitalWrite(SEGMENT_F, f);
digitalWrite(SEGMENT_G, g);
// Activate the digit
digitalWrite(position, LOW);
}
that and a few bit more i am a 100 percent sure the hardware is fine.