#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Erstelle ein I2C LCD-Objekt, Adresse 0x27 und 16x2 Display
LiquidCrystal_I2C lcd(0x27, 16, 2);
int tasterErhoehen = 12; // Taster 1 an Pin D12 für Zeiterhöhung
int tasterVerringern = 8; // Taster 2 an Pin D8 für Zeitverringerung
int tasterImpulse = 7; // Taster für Impulserhöhung/Verringerung an Pin D7
int tasterRelais = 11; // Taster 3 an Pin D11 für das Relais
int relaisPin = 4; // Relais an Pin D4
int zeit = 0; // Zeit in Millisekunden
const int zeitschritt = 20; // Zeitschritt von 20 Millisekunden
const unsigned long druckDauer = 100; // Mindestdauer für das Drücken des Tasters in ms
const int maxZeit = 800; // Maximale Zeit in Millisekunden
const int minZeit = 0; // Minimale Zeit in Millisekunden
int impulseAnzahl = 1; // Anfangswert für die Anzahl der Impulse
const int maxImpulse = 6; // Maximale Anzahl der Impulse
unsigned long letzteZeitAenderung = 0; // Zeitpunkt der letzten Zeitänderung
unsigned long letzteImpulsAenderung = 0; // Zeitpunkt der letzten Impulsänderung
unsigned long erhoehenStartZeit = 0; // Startzeit des Tasterdrucks für Erhöhen
unsigned long verringernStartZeit = 0; // Startzeit des Tasterdrucks für Verringern
const unsigned long langeDruckDauer = 1000; // 1 Sekunde für schnelles Zählen
const unsigned long schnelleAenderungIntervall = 100; // 100 ms für schnelles Zählen
const unsigned long normaleAenderungIntervall = 500; // 300 ms für normales Zählen
bool relaisAktiviert = false; // Status des Relais
unsigned long druckStartZeit = 0; // Zeitpunkt, an dem der Taster gedrückt wurde
bool relaisAnzeigeAktiv = false; // Status für Relaisanzeige
// Erstelle ein benutzerdefiniertes Zeichen (voller Block)
byte vollerBlock[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111 };
void setup() {
// LCD initialisieren
lcd.begin(16, 2); // 16 Spalten, 2 Zeilen
lcd.backlight(); // Hintergrundbeleuchtung einschalten
// Benutzerdefiniertes Zeichen laden
lcd.createChar(0, vollerBlock); // Erstelle Zeichen 0 als vollen Block
// Pins als Eingang/Ausgang setzen
pinMode(tasterErhoehen, INPUT_PULLUP);
pinMode(tasterVerringern, INPUT_PULLUP);
pinMode(tasterImpulse, INPUT_PULLUP);
pinMode(tasterRelais, INPUT_PULLUP);
pinMode(relaisPin, OUTPUT);
// Anfangsanzeige der Zeit und Impulse auf dem LCD
updateDisplay();
}
void loop() {
// Zeit erhöhen
if (digitalRead(tasterErhoehen) == LOW) {
if (erhoehenStartZeit == 0) {
erhoehenStartZeit = millis(); // Starte die Zeitmessung
}
unsigned long gedruecktDauer = millis() - erhoehenStartZeit;
unsigned long aktuellesIntervall = (gedruecktDauer >= langeDruckDauer) ? schnelleAenderungIntervall : normaleAenderungIntervall;
if (millis() - letzteZeitAenderung >= aktuellesIntervall) {
if (zeit < maxZeit) {
zeit += zeitschritt;
if (zeit > maxZeit) zeit = maxZeit;
updateDisplay();
letzteZeitAenderung = millis();
}
}
} else {
erhoehenStartZeit = 0; // Taster losgelassen, zurücksetzen
}
// Zeit verringern
if (digitalRead(tasterVerringern) == LOW) {
if (verringernStartZeit == 0) {
verringernStartZeit = millis(); // Starte die Zeitmessung
}
unsigned long gedruecktDauer = millis() - verringernStartZeit;
unsigned long aktuellesIntervall = (gedruecktDauer >= langeDruckDauer) ? schnelleAenderungIntervall : normaleAenderungIntervall;
if (millis() - letzteZeitAenderung >= aktuellesIntervall) {
if (zeit > minZeit) {
zeit -= zeitschritt;
if (zeit < minZeit) zeit = minZeit;
updateDisplay();
letzteZeitAenderung = millis();
}
}
} else {
verringernStartZeit = 0; // Taster losgelassen, zurücksetzen
}
// Impulse ändern
if (digitalRead(tasterImpulse) == LOW) {
if (millis() - letzteImpulsAenderung >= 500) { // 500 ms Wartezeit für Impulsänderung
impulseAnzahl++;
if (impulseAnzahl > maxImpulse) {
impulseAnzahl = 1; // Zurücksetzen auf 1, wenn max erreicht ist
}
updateDisplay();
letzteImpulsAenderung = millis();
}
}
// Relaissteuerung mit Impulsfunktion
int relStatus = digitalRead(tasterRelais);
if (relStatus == LOW) {
if (druckStartZeit == 0) {
druckStartZeit = millis();
if (!relaisAnzeigeAktiv) {
blinkRelaisAnzeigen(); // Relais-Anzeige blinken lassen
relaisAnzeigeAktiv = true;
}
} else if (millis() - druckStartZeit >= druckDauer) {
if (!relaisAktiviert) {
for (int i = 0; i < impulseAnzahl; i++) {
int impulsDauer = zeit / (2 * impulseAnzahl); // Berechne Impulsdauer
digitalWrite(relaisPin, HIGH); // Relais einschalten
delay(impulsDauer);
digitalWrite(relaisPin, LOW); // Relais ausschalten
delay(impulsDauer);
}
relaisAktiviert = true;
}
}
} else {
druckStartZeit = 0;
relaisAktiviert = false;
if (relaisAnzeigeAktiv) {
updateDisplay(); // Zurück zur normalen Anzeige
relaisAnzeigeAktiv = false;
}
}
}
// Funktion zur Aktualisierung des LCD-Displays
void updateDisplay() {
lcd.setCursor(0, 0); // Erste Zeile: Impulsanzahl anzeigen
lcd.print("Impulse: ");
lcd.print(impulseAnzahl);
lcd.print(" "); // Leerzeichen, um Reste von vorherigen Texten zu überschreiben
lcd.setCursor(0, 1); // Zweite Zeile: Zeit in ms anzeigen
lcd.print("Zeit: ");
lcd.print(zeit);
lcd.print(" ms "); // Leerzeichen, um Reste von vorherigen Texten zu überschreiben
}
// Funktion zum Blinken des Relais-Anzeigers
void blinkRelaisAnzeigen() {
lcd.setCursor(14, 0); // Setze den Cursor auf Spalte 14 in der ersten Zeile
lcd.write(byte(0)); // Zeige den vollen Block an
delay(400); // Block für 400 ms anzeigen
lcd.setCursor(14, 0); // Cursor wieder an die Stelle setzen
lcd.print(" "); // Block wieder löschen
}