Components and supplies
Push button
Jumper wires (generic)
Solderless Breadboard Full Size
Buzzer
4-digit 7-segment display
Arduino Mega 2560
Project description
Code
4-digit 7-segment display countdown timer
c_cpp
The code contains the countdown timer function that initiates the countdown shown in the 4-digit 7-segment display. It also has a useful function PrintNumber that shows a given 4-digit number on the display for a given amount of time. It can be used in other projects.
1#include <math.h> 2 3int digit_pin[] = {6, 9, 10, 11}; // PWM Display digit pins from left to right 4 5int speakerPin = 15; 6 7#define DIGIT_ON LOW 8#define DIGIT_OFF HIGH 9 10int segA = 2; 11int segB = 3; 12int segC = 4; 13int segD = 5; 14int segE = A0; //pin 6 is used bij display 1 for its pwm function 15int segF = 7; 16int segG = 8; 17//int segPD = ; 18 19 20int button1=13; 21int button2=12; 22int button3=16; 23int button4=17; 24 25int countdown_time = 60; 26 27struct struct_digits { 28 int digit[4]; 29 }; 30 31 32void setup() { 33 pinMode(segA, OUTPUT); 34 pinMode(segB, OUTPUT); 35 pinMode(segC, OUTPUT); 36 pinMode(segD, OUTPUT); 37 pinMode(segE, OUTPUT); 38 pinMode(segF, OUTPUT); 39 pinMode(segG, OUTPUT); 40 41 for (int i=0; i<4; i++) { 42 pinMode(digit_pin[i], OUTPUT); 43 } 44 45 pinMode(speakerPin, OUTPUT); 46 47 pinMode(button1,INPUT_PULLUP); 48 pinMode(button2,INPUT_PULLUP); 49 pinMode(button3,INPUT_PULLUP); 50 pinMode(button4,INPUT_PULLUP); 51} 52 53 54void playTone(int tone, int duration) { 55 for (long k = 0; k < duration * 1000L; k += tone * 2) { 56 digitalWrite(speakerPin, HIGH); 57 delayMicroseconds(tone); 58 digitalWrite(speakerPin, LOW); 59 delayMicroseconds(tone); 60 } 61} 62 63 64void lightNumber(int numberToDisplay) { 65 66#define SEGMENT_ON HIGH 67#define SEGMENT_OFF LOW 68 69 switch (numberToDisplay){ 70 71 case 0: 72 digitalWrite(segA, SEGMENT_ON); 73 digitalWrite(segB, SEGMENT_ON); 74 digitalWrite(segC, SEGMENT_ON); 75 digitalWrite(segD, SEGMENT_ON); 76 digitalWrite(segE, SEGMENT_ON); 77 digitalWrite(segF, SEGMENT_ON); 78 digitalWrite(segG, SEGMENT_OFF); 79 break; 80 81 case 1: 82 digitalWrite(segA, SEGMENT_OFF); 83 digitalWrite(segB, SEGMENT_ON); 84 digitalWrite(segC, SEGMENT_ON); 85 digitalWrite(segD, SEGMENT_OFF); 86 digitalWrite(segE, SEGMENT_OFF); 87 digitalWrite(segF, SEGMENT_OFF); 88 digitalWrite(segG, SEGMENT_OFF); 89 break; 90 91 case 2: 92 digitalWrite(segA, SEGMENT_ON); 93 digitalWrite(segB, SEGMENT_ON); 94 digitalWrite(segC, SEGMENT_OFF); 95 digitalWrite(segD, SEGMENT_ON); 96 digitalWrite(segE, SEGMENT_ON); 97 digitalWrite(segF, SEGMENT_OFF); 98 digitalWrite(segG, SEGMENT_ON); 99 break; 100 101 case 3: 102 digitalWrite(segA, SEGMENT_ON); 103 digitalWrite(segB, SEGMENT_ON); 104 digitalWrite(segC, SEGMENT_ON); 105 digitalWrite(segD, SEGMENT_ON); 106 digitalWrite(segE, SEGMENT_OFF); 107 digitalWrite(segF, SEGMENT_OFF); 108 digitalWrite(segG, SEGMENT_ON); 109 break; 110 111 case 4: 112 digitalWrite(segA, SEGMENT_OFF); 113 digitalWrite(segB, SEGMENT_ON); 114 digitalWrite(segC, SEGMENT_ON); 115 digitalWrite(segD, SEGMENT_OFF); 116 digitalWrite(segE, SEGMENT_OFF); 117 digitalWrite(segF, SEGMENT_ON); 118 digitalWrite(segG, SEGMENT_ON); 119 break; 120 121 case 5: 122 digitalWrite(segA, SEGMENT_ON); 123 digitalWrite(segB, SEGMENT_OFF); 124 digitalWrite(segC, SEGMENT_ON); 125 digitalWrite(segD, SEGMENT_ON); 126 digitalWrite(segE, SEGMENT_OFF); 127 digitalWrite(segF, SEGMENT_ON); 128 digitalWrite(segG, SEGMENT_ON); 129 break; 130 131 case 6: 132 digitalWrite(segA, SEGMENT_ON); 133 digitalWrite(segB, SEGMENT_OFF); 134 digitalWrite(segC, SEGMENT_ON); 135 digitalWrite(segD, SEGMENT_ON); 136 digitalWrite(segE, SEGMENT_ON); 137 digitalWrite(segF, SEGMENT_ON); 138 digitalWrite(segG, SEGMENT_ON); 139 break; 140 141 case 7: 142 digitalWrite(segA, SEGMENT_ON); 143 digitalWrite(segB, SEGMENT_ON); 144 digitalWrite(segC, SEGMENT_ON); 145 digitalWrite(segD, SEGMENT_OFF); 146 digitalWrite(segE, SEGMENT_OFF); 147 digitalWrite(segF, SEGMENT_OFF); 148 digitalWrite(segG, SEGMENT_OFF); 149 break; 150 151 case 8: 152 digitalWrite(segA, SEGMENT_ON); 153 digitalWrite(segB, SEGMENT_ON); 154 digitalWrite(segC, SEGMENT_ON); 155 digitalWrite(segD, SEGMENT_ON); 156 digitalWrite(segE, SEGMENT_ON); 157 digitalWrite(segF, SEGMENT_ON); 158 digitalWrite(segG, SEGMENT_ON); 159 break; 160 161 case 9: 162 digitalWrite(segA, SEGMENT_ON); 163 digitalWrite(segB, SEGMENT_ON); 164 digitalWrite(segC, SEGMENT_ON); 165 digitalWrite(segD, SEGMENT_ON); 166 digitalWrite(segE, SEGMENT_OFF); 167 digitalWrite(segF, SEGMENT_ON); 168 digitalWrite(segG, SEGMENT_ON); 169 break; 170 171 case 10: 172 digitalWrite(segA, SEGMENT_OFF); 173 digitalWrite(segB, SEGMENT_OFF); 174 digitalWrite(segC, SEGMENT_OFF); 175 digitalWrite(segD, SEGMENT_OFF); 176 digitalWrite(segE, SEGMENT_OFF); 177 digitalWrite(segF, SEGMENT_OFF); 178 digitalWrite(segG, SEGMENT_OFF); 179 break; 180 } 181 182} 183 184 185 186void SwitchDigit(int digit) { 187 for (int i=0; i<4; i++) { 188 if (i == digit) { 189 digitalWrite(digit_pin[i], DIGIT_ON); 190 } else { 191 digitalWrite(digit_pin[i], DIGIT_OFF); 192 } 193 } 194} 195 196 197struct struct_digits IntToDigits(int n){ 198 struct struct_digits dig; 199 int zeros=0; 200 int d; 201 for (int i=0; i<4; i++) { 202 d=n/pow(10,3-i); 203 zeros += d; 204 n = n - d*pow(10,3-i); 205 if (zeros!=0 || i==3) { 206 dig.digit[i]=d; 207 } else { 208 dig.digit[i]=10; 209 } 210 } 211 return dig; 212} 213 214void PrintNumber(int n, int time) { 215 struct struct_digits dig; 216 217 dig = IntToDigits(n); 218 219 for (int i=0; i<= time/20; i++) { 220 if (digitalRead(button2)==LOW) { 221 return; 222 } 223 for (int j=0; j<4; j++) { 224 SwitchDigit(j); 225 lightNumber(dig.digit[j]); 226 delay(5); 227 } 228 } 229} 230 231 232bool Countdown(int n, int del){ 233 for (int q=n; q>0; q--){ 234 PrintNumber(q,del); 235 if (digitalRead(button2)==LOW) { 236 return false; 237 } 238 } 239 PrintNumber(0,0); 240 playTone(1519,1000); 241 return true; 242} 243 244 245 246void reset() { 247 int m, zeros, d, pressed3 = 0, pressed4 = 0; 248 m=countdown_time; 249 struct struct_digits dig; 250 251 dig = IntToDigits(countdown_time); 252 253 while (digitalRead(button1)==HIGH) { 254 for (int j=0; j<4; j++) { 255 SwitchDigit(j); 256 lightNumber(dig.digit[j]); 257 delay(5); 258 } 259 if (digitalRead(button3)==LOW) { 260 if (pressed3 == 0 || pressed3 > 30) { 261 if (countdown_time > 0) { 262 countdown_time -= 1 ; 263 } 264 dig = IntToDigits(countdown_time); 265 } 266 pressed3 += 1; 267 } 268 else if (digitalRead(button4)==LOW) { 269 if (pressed4 == 0 || pressed4 > 30) { 270 if (countdown_time <9999) { 271 countdown_time += 1 ; 272 } 273 dig = IntToDigits(countdown_time); 274 } 275 pressed4 += 1; 276 } 277 if (digitalRead(button3)==HIGH) { 278 pressed3=0; 279 } 280 if (digitalRead(button4)==HIGH) { 281 pressed4=0; 282 } 283 } 284} 285 286void loop(){ 287 reset(); 288 while (!Countdown(countdown_time,962)) { 289 reset(); 290 } 291 while (digitalRead(button2)==1){}; 292}
Downloadable files
Circuit Diagram for Adjustable Countdown timer
Circuit Diagram for Adjustable Countdown timer
Circuit Diagram for Adjustable Countdown timer
Circuit Diagram for Adjustable Countdown timer
Comments
Only logged in users can leave comments