Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Einstellbarer Countdown-Timer mit Arduino & 4-stelligem 7-Segment-Display

Komponenten und Zubehör

Bauteil Menge Hinweise
Arduino Mega 2560 (oder beliebiger Arduino) 1
4-stelliges 7-Segment-Display (Common Anode) 1 4 Digit-Pins, 7 Segment-Pins
Taster 4 Start/Stop, Reset, Hoch, Runter
Summer (Piezo) 1 Für Alarmton
Steckbrücken ca. 21
Steckbrett (Full-Size) 1

Projektbeschreibung

Ein Countdown-Timer ist das klassische Projekt für 4-stellige 7-Segment-Displays. Ich fand jedoch keine Version, die standalone per Taster einstellbar ist (ohne Code-Änderung). Also entwickelte ich diesen Timer mit komfortabler Bedienung.

Der Code enthält eine wiederverwendbare Funktion PrintNumber(int zahl, int zeit), die eine Zahl (0–9999) für eine gewisse Zeit anzeigt – nützlich für andere Projekte.

Bedienung

Nach Ablauf ertönt Summer (1 kHz, 1 s). Danach zurück zum Einstellmodus.

Code (C/C++)

#include <math.h>

int digit_pin[] = {6, 9, 10, 11}; // Digit-Pins (PWM) links nach rechts
int speakerPin = 15;
#define DIGIT_ON LOW
#define DIGIT_OFF HIGH

// Segment-Pins (Common Anode: HIGH = an)
int segA = 2, segB = 3, segC = 4, segD = 5, segE = A0, segF = 7, segG = 8;

int button1 = 13, button2 = 12, button3 = 16, button4 = 17;
int countdown_time = 60; // Startwert in Sekunden

struct Digits { int d[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 num) {
  #define SEG_ON HIGH
  #define SEG_OFF LOW
  switch (num) {
    case 0: digitalWrite(segA, SEG_ON); digitalWrite(segB, SEG_ON); digitalWrite(segC, SEG_ON); digitalWrite(segD, SEG_ON); digitalWrite(segE, SEG_ON); digitalWrite(segF, SEG_ON); digitalWrite(segG, SEG_OFF); break;
    case 1: digitalWrite(segA, SEG_OFF); digitalWrite(segB, SEG_ON); digitalWrite(segC, SEG_ON); digitalWrite(segD, SEG_OFF); digitalWrite(segE, SEG_OFF); digitalWrite(segF, SEG_OFF); digitalWrite(segG, SEG_OFF); break;
    case 2: digitalWrite(segA, SEG_ON); digitalWrite(segB, SEG_ON); digitalWrite(segC, SEG_OFF); digitalWrite(segD, SEG_ON); digitalWrite(segE, SEG_ON); digitalWrite(segF, SEG_OFF); digitalWrite(segG, SEG_ON); break;
    case 3: digitalWrite(segA, SEG_ON); digitalWrite(segB, SEG_ON); digitalWrite(segC, SEG_ON); digitalWrite(segD, SEG_ON); digitalWrite(segE, SEG_OFF); digitalWrite(segF, SEG_OFF); digitalWrite(segG, SEG_ON); break;
    case 4: digitalWrite(segA, SEG_OFF); digitalWrite(segB, SEG_ON); digitalWrite(segC, SEG_ON); digitalWrite(segD, SEG_OFF); digitalWrite(segE, SEG_OFF); digitalWrite(segF, SEG_ON); digitalWrite(segG, SEG_ON); break;
    case 5: digitalWrite(segA, SEG_ON); digitalWrite(segB, SEG_OFF); digitalWrite(segC, SEG_ON); digitalWrite(segD, SEG_ON); digitalWrite(segE, SEG_OFF); digitalWrite(segF, SEG_ON); digitalWrite(segG, SEG_ON); break;
    case 6: digitalWrite(segA, SEG_ON); digitalWrite(segB, SEG_OFF); digitalWrite(segC, SEG_ON); digitalWrite(segD, SEG_ON); digitalWrite(segE, SEG_ON); digitalWrite(segF, SEG_ON); digitalWrite(segG, SEG_ON); break;
    case 7: digitalWrite(segA, SEG_ON); digitalWrite(segB, SEG_ON); digitalWrite(segC, SEG_ON); digitalWrite(segD, SEG_OFF); digitalWrite(segE, SEG_OFF); digitalWrite(segF, SEG_OFF); digitalWrite(segG, SEG_OFF); break;
    case 8: digitalWrite(segA, SEG_ON); digitalWrite(segB, SEG_ON); digitalWrite(segC, SEG_ON); digitalWrite(segD, SEG_ON); digitalWrite(segE, SEG_ON); digitalWrite(segF, SEG_ON); digitalWrite(segG, SEG_ON); break;
    case 9: digitalWrite(segA, SEG_ON); digitalWrite(segB, SEG_ON); digitalWrite(segC, SEG_ON); digitalWrite(segD, SEG_ON); digitalWrite(segE, SEG_OFF); digitalWrite(segF, SEG_ON); digitalWrite(segG, SEG_ON); break;
    case 10: digitalWrite(segA, SEG_OFF); digitalWrite(segB, SEG_OFF); digitalWrite(segC, SEG_OFF); digitalWrite(segD, SEG_OFF); digitalWrite(segE, SEG_OFF); digitalWrite(segF, SEG_OFF); digitalWrite(segG, SEG_OFF); break;
  }
}

void switchDigit(int d) {
  for (int i = 0; i < 4; i++) digitalWrite(digit_pin[i], (i == d) ? DIGIT_ON : DIGIT_OFF);
}

Digits intToDigits(int n) {
  Digits dig; int zeros = 0, d;
  for (int i = 0; i < 4; i++) {
    d = n / pow(10, 3 - i);
    zeros += d;
    n -= d * pow(10, 3 - i);
    dig.d[i] = (zeros != 0 || i == 3) ? d : 10; // 10 = führende Null ausblenden
  }
  return dig;
}

void printNumber(int n, int timeMs) {
  Digits dig = intToDigits(n);
  for (int i = 0; i <= timeMs / 20; i++) {
    if (digitalRead(button2) == LOW) return; // Abbruch
    for (int j = 0; j < 4; j++) { switchDigit(j); lightNumber(dig.d[j]); delay(5); }
  }
}

bool countdown(int n, int tickMs) {
  for (int q = n; q > 0; q--) {
    printNumber(q, tickMs);
    if (digitalRead(button2) == LOW) return false;
  }
  printNumber(0, 0);
  playTone(1519, 1000); // Alarm
  return true;
}

void resetMode() {
  int pressed3 = 0, pressed4 = 0;
  Digits dig = intToDigits(countdown_time);
  while (digitalRead(button1) == HIGH) { // Warten auf Start
    for (int j = 0; j < 4; j++) { switchDigit(j); lightNumber(dig.d[j]); delay(5); }
    if (digitalRead(button3) == LOW) {
      if (pressed3 == 0 || pressed3 > 30) { if (countdown_time > 0) countdown_time--; dig = intToDigits(countdown_time); }
      pressed3++;
    } else if (digitalRead(button4) == LOW) {
      if (pressed4 == 0 || pressed4 > 30) { if (countdown_time < 9999) countdown_time++; dig = intToDigits(countdown_time); }
      pressed4++;
    }
    if (digitalRead(button3) == HIGH) pressed3 = 0;
    if (digitalRead(button4) == HIGH) pressed4 = 0;
  }
}

void loop() {
  resetMode();
  while (!countdown(countdown_time, 962)) { resetMode(); }
  while (digitalRead(button2) == HIGH) {} // Warten auf Reset-Taste
}

Schaltplan

Siehe Fritzing-Bild im Original: Segmente an Pins 2–5, 7, 8, A0; Digit-Pins an 6, 9, 10, 11 (PWM); Taster an 12, 13, 16, 17 (Pull-Up); Summer an Pin 15.

Herstellungsprozess

  1. Flüssigkristall-Display (LCD): Technologie, Fertigung und Zukunftsaussichten
  2. Methodenüberladung in C# meistern: Konzepte, Beispiele und Best Practices
  3. Primal Display: Raspberry Pi LCD-Temperaturmonitor mit DHT11 bauen
  4. Kuman 3,5″ TFT Display auf RetroPie installieren – Schritt-für-Schritt-Anleitung
  5. Verilog Tasks verstehen: Functions vs. Tasks, Syntax und Verwendung
  6. Klassisches Pong-Spiel auf Arduino UNO mit OLED-Display bauen – Schritt-für-Schritt-Tutorial
  7. Watchdog-Timer am Arduino verstehen & nutzen – Schutz vor Programmabstürzen
  8. ATmega328P Alien-Slot-Machine Kit – Selbstbau-Spielautomat
  9. Interaktives Nextion HMI Projekt mit Arduino Mega und Sensoren
  10. Einstellbare Stoßdämpfer: Fahrhöhe und Performance optimieren