Countdown Timer Arduino mit einem LCD-Display

Ein Arduino-Countdown-Timer mit Drucktasten oder Encoder und LCD 1602 I2C-Display ist ein interessantes und nützliches Projekt. Schauen wir uns einige Optionen für einen Arduino Uno Countdown-Timer an, den Sie in Ihrer Küche oder im Aquarium verwenden können, um ein Licht und eine Tonanzeige oder ein Relais vom Arduino aus einzuschalten. Und Sie können für sich selbst die am besten geeignete Version dieses Projekts wählen.




Bestandteile:

  • Arduino Uno / Arduino Nano / Arduino Mega
  • 1602 LCD-Display mit I2C
  • Rotary Encoder / Tasten
  • LED und Widerständen
  • Buzzer
  • Breadboard
  • Bibliothek LiquidCrystal_I2C.h und RotaryEncoder.h

Die erste Version des Projekts ist ein Arduino-Timer, der über eine Taste gesteuert wird. Durch Drücken des ersten und zweiten Knopfes kann das Zeitintervall in Minuten erhöht und verringert werden. Wenn der dritte Knopf gedrückt wird, startet der Arduino einen Countdown. Am Ende des Countdowns leuchtet die LED auf und ein Summer ertönt. Der vierte Knopf, der mit Pin 8 verbunden ist, wird zum Zurücksetzen des Timers verwendet.

Countdown-Timer Arduino mit Druckknopfsteuerung

Countdown-Timer Arduino mit Druckknopfsteuerung

LCD 1602 i2c Arduino Uno Arduino Nano Arduino Mega
GND GND GND GND
VCC 5V 5V 5V
SDA A4 A4 20
SCL A5 A5 21

Der Timer kann jederzeit durch Drücken des dritten Knopfes gestoppt werden. Nach dem Zusammenbau des Schaltplans laden Sie das folgende Beispielprogramm. Beachten Sie, dass Sie die Bibliothek LiquidCrystal_I2C.h installieren müssen, um die Uhr auf dem Display LCD 1602 mit einem I2C-Modul zu betreiben. Diese und andere beliebte Bibliotheken können von unserer Website auf der Seite heruntergeladen werden.

Programm für Arduino Timer mit Druckknopfsteuerung




#include "Wire.h"
#include "LiquidCrystal_I2C.h"
LiquidCrystal_I2C LCD(0x27, 20, 2);

boolean button1WasUp = true;
boolean button2WasUp = true;
boolean button3WasUp = true;
boolean button4WasUp = true;

byte w = 0;

int SEC = 0;
int MIN = 0;
unsigned long timer;

void setup() {
   pinMode(2, INPUT_PULLUP);
   pinMode(4, INPUT_PULLUP);
   pinMode(6, INPUT_PULLUP);
   pinMode(8, INPUT_PULLUP);

   pinMode(10, OUTPUT);
   pinMode(12, OUTPUT);
   digitalWrite(10, HIGH);

   LCD.begin();
   LCD.backlight();

   LCD.setCursor(2, 0);
   LCD.print("TIMER  STOP");
   LCD.setCursor(5, 1);
   LCD.print(MIN);
   LCD.print(" : ");
   LCD.print(SEC);
}

void loop() {
   boolean button1IsUp = digitalRead(2);
   boolean button2IsUp = digitalRead(4);
   boolean button3IsUp = digitalRead(6);
   boolean button4IsUp = digitalRead(8);

   if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(2);
      if (!button1IsUp) {
         MIN = MIN - 1; SEC = 0;
         if (MIN < 0) { MIN = 0; }
         LCD.clear(); 
         LCD.setCursor(2, 0); 
         LCD.print("TIMER STOP"); 
         LCD.setCursor(5, 1); 
         LCD.print(MIN); 
         LCD.print(" : "); 
         LCD.print(SEC);
      }
   } 
   button1WasUp = button1IsUp;
   
   if (button2WasUp && !button2IsUp) {
      delay(10); 
      button2IsUp = digitalRead(4); 
      if (!button2IsUp) { 
         MIN = MIN + 1; SEC = 0; 
         LCD.clear(); 
         LCD.setCursor(2, 0); 
         LCD.print("TIMER STOP"); 
         LCD.setCursor(5, 1); 
         LCD.print(MIN); 
         LCD.print(" : "); 
         LCD.print(SEC);
      }
   } 
   button2WasUp = button2IsUp;

   if (button3WasUp && !button3IsUp && MIN > 0) {
      delay(10);
      button3IsUp = digitalRead(6);
      if (!button3IsUp) {
         if (SEC == 0) { SEC = 60; MIN = MIN - 1; }
         if (MIN < 0 ) { MIN = 0; }
         digitalWrite(10, LOW);
         w = 1;
      }
   }
   button3WasUp = button3IsUp;

   if (button4WasUp && !button4IsUp) {
      delay(10);
      button4IsUp = digitalRead(8);
      if (!button4IsUp) {
         MIN = 0; SEC = 0;
         digitalWrite(10, HIGH);
         LCD.clear();
         LCD.setCursor(2, 0);
         LCD.print("TIMER STOP");
         LCD.setCursor(5, 1);
         LCD.print(MIN);
         LCD.print(" : ");
         LCD.print(SEC);
      }
   }
   button4WasUp = button4IsUp;

   while (w == 1 ) {
      if (millis() - timer > 1000) {
         timer = millis();
         SEC = SEC - 1;

         if (SEC == 0 && MIN == 0) {
            LCD.clear();
            LCD.setCursor(2, 0);
            LCD.print("TIMER  STOP");
            LCD.setCursor(5, 1);
            LCD.print(MIN);
            LCD.print(" : ");
            LCD.print(SEC);
            digitalWrite(10, HIGH);
            tone(12, 100);
            delay(500);
            noTone(12);
            w = 0;
         }

         if (SEC == 0) {
            SEC = 59; MIN = MIN - 1;
            if (MIN < 0 ) { MIN = 0; }
         }

         if (w == 1) {
            LCD.clear();
            LCD.setCursor(2, 0);
            LCD.print("TIMER START");
            LCD.setCursor(5, 1);
            LCD.print(MIN);
            LCD.print(" : ");
            LCD.print(SEC);
         }
     }
 
     boolean button3IsUp = digitalRead(6);
     if (button3WasUp && !button3IsUp) {
        delay(10);
        button3IsUp = digitalRead(6);
        if (!button3IsUp) {
           LCD.setCursor(2, 0);
           LCD.print("TIMER  STOP");
           w = 0;
        }
     }
     button3WasUp = button3IsUp;
   }
}
  1. Der Timer kann nur durch Anhalten des Countdowns zurückgesetzt werden;
  2. Eine Sekunde wird nach 1000 ms hinzugefügt, eine Minute wird hinzugefügt, wenn die Variable SEC größer als 59 ist.

Countdown-Küchentimer Arduino mit Gebergesteuerter

Countdown-Küchentimer Arduino mit Gebergesteuerter

Schauen wir uns an, wie man einen Küchentimer auf einem Arduino mit einem Encoder und LCD 1602 macht. Das Steuerungsprinzip ist ähnlich wie bei der vorherigen Version. Durch Drehen des Encoders können Sie das gewünschte Zeitintervall einstellen, und durch Drücken des Encoders können Sie den Countdown starten und stoppen. In der Abbildung oben sehen Sie den Schaltplan des Küchentimers mit Countdown auf dem Arduino.

Programm für Arduino Küchentimer mit Gebergesteuerter

#include "Wire.h"
#include "LiquidCrystal_I2C.h"
LiquidCrystal_I2C LCD(0x27, 20, 2);

#include "RotaryEncoder.h"
RotaryEncoder encoder(4, 2); // (DT, CLK)

#define STEPS  1
#define POSMIN 0
#define POSMAX 30

int lastPos, newPos;
boolean buttonWasUp = true;

byte w = 0;

int SEC = 0;
int MIN = 0;
unsigned long timer;

void setup() {
   pinMode(6, INPUT_PULLUP);
   encoder.setPosition(0 / STEPS);

   pinMode(10, OUTPUT);
   pinMode(12, OUTPUT);
   digitalWrite(10, HIGH);

   LCD.begin();
   LCD.backlight();

   LCD.setCursor(2, 0);
   LCD.print("TIMER  STOP");
   LCD.setCursor(5, 1);
   LCD.print(MIN);
   LCD.print(" : ");
   LCD.print(SEC);
}

void loop() {
   encoder.tick();
   newPos = encoder.getPosition() * STEPS;
   if (newPos < POSMIN) {
      encoder.setPosition(POSMIN / STEPS);
      newPos = POSMIN;
   }
   else if (newPos > POSMAX) {
      encoder.setPosition(POSMAX / STEPS);
      newPos = POSMAX;
   }

   if (lastPos != newPos) {
      MIN = newPos;
      lastPos = newPos;
      LCD.clear();
      LCD.setCursor(2, 0);
      LCD.print("TIMER  STOP");
      LCD.setCursor(5, 1);
      LCD.print(MIN);
      LCD.print(" : ");
      LCD.print(SEC);
   }

   boolean buttonIsUp = digitalRead(6);
   if (buttonWasUp && !buttonIsUp && MIN > 0) {
      delay(10);
      buttonIsUp = digitalRead(6);
      if (!buttonIsUp) {
         if (SEC == 0) { SEC = 60; MIN = MIN - 1; }
         if (MIN < 0 ) { MIN = 0; }
         digitalWrite(10, LOW);
         w = 1;
      }
   }
   buttonWasUp = buttonIsUp;

   while (w == 1 ) {
      if (millis() - timer > 1000) {
         timer = millis();
         SEC = SEC - 1;
 
      if (SEC == 0 && MIN == 0) {
         lastPos = 0; newPos = 0; MIN = 0; SEC = 0;
         LCD.clear();
         LCD.setCursor(2, 0);
         LCD.print("TIMER  STOP");
         LCD.setCursor(5, 1);
         LCD.print(MIN);
         LCD.print(" : ");
         LCD.print(SEC);
         digitalWrite(10, HIGH);
         tone(12, 100);
         delay(500);
         noTone(12);
         w = 0;
      }

      if (SEC == 0 && w==1) {
         SEC = 59; MIN = MIN - 1;
         if (MIN < 0 ) { MIN = 0; }
      }

      if (w == 1) {
         LCD.clear();
         LCD.setCursor(2, 0);
         LCD.print("TIMER START");
         LCD.setCursor(5, 1);
         LCD.print(MIN);
         LCD.print(" : ");
         LCD.print(SEC);
      }
    }

    buttonIsUp = digitalRead(6);
    if (buttonWasUp && !buttonIsUp) {
       delay(10);
       buttonIsUp = digitalRead(6);
       if (!buttonIsUp) {
          lastPos = 0; newPos = 0; MIN = 0; SEC = 0;
          LCD.clear();
          LCD.setCursor(2, 0);
          LCD.print("TIMER  STOP");
          LCD.setCursor(5, 1);
          LCD.print(MIN);
          LCD.print(" : ");
          LCD.print(SEC);
          digitalWrite(10, HIGH);
          w = 0;
       }
    }
    buttonWasUp = buttonIsUp;
  }
}
  1. Die Frequenz des Audiosignals kann mit dem Befehl tone() geändert werden;
  2. Für das Programm muss die RotaryEncoder-Bibliothek installiert sein.

Schlussfolgerung. In diesem Beitrag werden zwei Möglichkeiten vorgestellt, wie man eine Zeitschaltuhr für ein Aquarium oder eine Küche mit eigenen Händen herstellen kann. Die erste Variante mit Druckknopfsteuerung, die zweite Variante mit Encodersteuerung. In den Kommentaren zu diesem Artikel können Sie Fragen zu diesem Projekt hinterlassen oder Ihre eigene Version des Projekts mit einem Countdown-Timer vorschlagen.

5/5 - (2 votes)


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert