DIY Instelbare Afteltimer met Arduino Mega 2560
Onderdelen en benodigdheden
| Arduino Mega 2560 | Elke Arduino zou moeten werken | 1 |
| 4-digit 7-segment display | 1 | |
| Drukknop | 4 | |
| Buzzer | 1 | |
| Jumper wires (generiek) | 21 | |
| Solderloos Breadboard Volle Formaat | 1 |
Over dit project
Afteltimer is waarschijnlijk het meest natuurlijke project voor een 4-digit 7-segment display. Terwijl ik online keek wat er beschikbaar was, vond ik verschillende projecten, maar niet de ene die ik in gedachten had: een zelfstandige instelbare afteltimer die je handmatig met knoppen kunt instellen (en niet door gewijzigde code te uploaden). Dus besloot ik er een te maken.
Ik heb tijd besteed aan het schrijven van code die het gemakkelijk maakt om de timer te gebruiken en in te stellen, zodat het in de praktijk bruikbaar is.
De bijgevoegde code kan ook in andere projecten met 4-digit 7-segment display worden gebruikt. Met name de functie die een gegeven getal (0-9999) voor een gegeven tijdinterval weergeeft. Misschien zit deze functionaliteit in sommige bibliotheken, maar een snelle zoektocht leverde het niet op. Omdat programmeren van dit display een beetje lastig is (je kunt maar één digit tegelijk tonen), is zo'n functie erg handig.
Code
4-digit 7-segment display afteltimer
De code bevat de afteltimer-functie die de aftelling initieert op het 4-digit 7-segment display. Het heeft ook een handige functie PrintNumber die een gegeven 4-cijferig getal op het display toont voor een gegeven tijd. Het kan in andere projecten gebruikt worden.
#include <math.h>
int digit_pin[] = {6, 9, 10, 11}; // PWM Display digit pinnen van links naar rechts
int speakerPin = 15;
#define DIGIT_ON LOW
#define DIGIT_OFF HIGH
int segA = 2;
int segB = 3;
int segC = 4;
int segD = 5;
int segE = A0; //pin 6 wordt gebruikt door display 1 voor zijn PWM-functie
int segF = 7;
int segG = 8;
int button1 = 13;
int button2 = 12;
int button3 = 16;
int button4 = 17;
int countdown_time = 60;
struct struct_digits {
int digit[4];
};
void setup() {
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
for (int i = 0; i < 4; i++) {
pinMode(digit_pin[i], OUTPUT);
}
pinMode(speakerPin, OUTPUT);
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(button3, INPUT_PULLUP);
pinMode(button4, INPUT_PULLUP);
}
void playTone(int tone, int duration) {
for (long k = 0; k < duration * 1000L; k += tone * 2) {
digitalWrite(speakerPin, HIGH);
delayMicroseconds(tone);
digitalWrite(speakerPin, LOW);
delayMicroseconds(tone);
}
}
void lightNumber(int numberToDisplay) {
#define SEGMENT_ON HIGH
#define SEGMENT_OFF LOW
switch (numberToDisplay) {
case 0:
digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_OFF);
break;
case 1:
digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
case 2:
digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_OFF); digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_ON);
break;
case 3:
digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_ON);
break;
case 4:
digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 5:
digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 6:
digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 7:
digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
case 8:
digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 9:
digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 10: // Alle segmenten uit
digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_OFF); digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
}
}
void SwitchDigit(int digit) {
for (int i = 0; i < 4; i++) {
if (i == digit) {
digitalWrite(digit_pin[i], DIGIT_ON);
} else {
digitalWrite(digit_pin[i], DIGIT_OFF);
}
}
}
struct struct_digits IntToDigits(int n) {
struct struct_digits dig;
int zeros = 0;
int d;
for (int i = 0; i < 4; i++) {
d = n / pow(10, 3 - i);
zeros += d;
n = n - d * pow(10, 3 - i);
if (zeros != 0 || i == 3) {
dig.digit[i] = d;
} else {
dig.digit[i] = 10; // 10 = leeg/uit
}
}
return dig;
}
void PrintNumber(int n, int time) {
struct struct_digits dig;
dig = IntToDigits(n);
for (int i = 0; i <= time / 20; i++) {
if (digitalRead(button2) == LOW) {
return;
}
for (int j = 0; j < 4; j++) {
SwitchDigit(j);
lightNumber(dig.digit[j]);
delay(5);
}
}
}
bool Countdown(int n, int del) {
for (int q = n; q > 0; q--) {
PrintNumber(q, del);
if (digitalRead(button2) == LOW) {
return false;
}
}
PrintNumber(0, 0);
playTone(1519, 1000);
return true;
}
void reset() {
int m, zeros, d, pressed3 = 0, pressed4 = 0;
m = countdown_time;
struct struct_digits dig;
dig = IntToDigits(countdown_time);
while (digitalRead(button1) == HIGH) {
for (int j = 0; j < 4; j++) {
SwitchDigit(j);
lightNumber(dig.digit[j]);
delay(5);
}
if (digitalRead(button3) == LOW) {
if (pressed3 == 0 || pressed3 > 30) {
if (countdown_time > 0) {
countdown_time -= 1;
}
dig = IntToDigits(countdown_time);
}
pressed3 += 1;
} else if (digitalRead(button4) == LOW) {
if (pressed4 == 0 || pressed4 > 30) {
if (countdown_time < 9999) {
countdown_time += 1;
}
dig = IntToDigits(countdown_time);
}
pressed4 += 1;
}
if (digitalRead(button3) == HIGH) {
pressed3 = 0;
}
if (digitalRead(button4) == HIGH) {
pressed4 = 0;
}
}
}
void loop() {
reset();
while (!Countdown(countdown_time, 962)) {
reset();
}
while (digitalRead(button2) == 1) {};
}
Schema's
Productieproces
- Vloeistofkristal Display (LCD): Technologie, Productie en Toekomstperspectief
- Primal Display: Een Raspberry Pi LCD-temperatuurmonitor bouwen
- Hoe de Kuman 3,5″ TFT-display op RetroPie te Installeren – Stap-voor-stap Handleiding
- Bouw een Klassiek Pong-spel op Arduino UNO met OLED-display – Stap-voor-stap Tutorial
- De Watchdog Timer begrijpen: Hoe het microcontroller-ophangen voorkomt
- ATmega328P Alien-gokkast Kit
- Interactief Nextion HMI-weerstation met Arduino Mega en sensoren
- Bouw een Betrouwbare Arduino Afteltimer met SparkFun 7‑Segment Display
- Instelbare Schokdempers: Verbetering van Rijhoogte en Prestaties
- Method overloading in C#: concepten, voorbeelden en best practices
- Verilog Tasks begrijpen: Functions vs Tasks, Syntax en Gebruik