/*
Stand: 02.10.2022
Beschreibung:
Code für eine Zuendbox mit zwei Tastern, einem Schalter, drei LEDs, LCD Display und Tastenfeld.
*/
// Pins Input Eingänge
int impuls_gas_inp = 10; // Taster für Impulsgas
int dauer_gas_inp = 11; // Schalter für Dauergas
int zuend_inp = 12; // Taster für Zündung
// Pins Output Ausgänge zu den Relais
int gas_outp = 13; // Ausgang für Relais Magnetventil
int zuend_outp = 14; // Ausgang für Relais Zündmodul
int LED1 = 15; // Ausgang für LED Relais Magnetventil Impuls !!!!schlechte Benennung, bezug der LED im Prgramm nicht ersichtlich
int LED2 = 16; // Ausgang für LED Relais Magnetventil Dauer
int LED3 = 17; // Ausgang für LED Relais Zündmodul
// Zählvariablen
int number = 0;
// Zeitvariablen
unsigned long loop_time; // Timecode bei Beginn des Loops
unsigned long run_time; // Laufzeit des gesamten Loops
unsigned long zuend_time; // Zündzeit
// Bool Variablen
bool zuendfreigabe = false;
bool LOCK = true;
// einbinden LCD Display
#include <Wire.h> // Wire Bibliothek einbinden
#include <LiquidCrystal_I2C.h> // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek einbinden
LiquidCrystal_I2C lcd(0x27, 20, 4); // hier wird festgelegt um welches Display es sich handelt
// einbinden Keypad
#include <Keypad.h>
const int ROW_NUM = 4; //vier Reihen
const int COLUMN_NUM = 3; //drei Zeilen
char keys[ROW_NUM][COLUMN_NUM] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte pin_column[COLUMN_NUM] = {5, 4, 3}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );
const String password = "1234"; // Passwort
String input_password;
void setup() { // Hier beginnt das setup (läuft nur einmal durch)
//Deklaration Inputs
pinMode(impuls_gas_inp, INPUT); // Pin6 ist Impulsgas Eingang
pinMode(dauer_gas_inp, INPUT); // Pin7 ist Dauergas Eingang
pinMode(zuend_inp, INPUT); // Pin8 ist Zündimpuls Eingang
// Deklaration Outputs
pinMode(gas_outp, OUTPUT); // Pin10 ist Ausgang für Magnetventil Relais
pinMode(zuend_outp, OUTPUT); // Pin11 ist Ausgang für Zündmodul Relais
pinMode(LED1, OUTPUT); // Pin3 ist Ausgang für LED1 Magnetventil Impulsgas
pinMode(LED2, OUTPUT); // Pin4 ist Ausgang für LED2 Magnetventil Dauergas
pinMode(LED3, OUTPUT); // Pin5 ist Ausgang für LED3 Zündmodul
delay(1000); // Warten 1 Sekunde (1000 Millisekunden)
//Initierung LCD Display
lcd.init(); // LCD wird gestartet
lcd.backlight(); // Hintergrundbeleuchtung einschalten
lcd.setCursor(0, 0); // Hier wird die Position des ersten Zeichens festgelegt (0,0) bedeutet erstes Zeichen in der ersten Zeile
lcd.print(" Aldini Pyrotechnik");
//Abfragen Passwort
Serial.begin(9600);
input_password.reserve(7); // maximum input characters is 8, change if needed
lock(); //aufrufen Furnktion Passwortabfrage
} // Hier ist das Setup beendet
void loop() { // Hier beginnt die Loop (läuft wiederholt durch)
loop_time = millis(); // Schleifenzeit in Millisekunden
// Ansteuerung Gas
if (digitalRead(dauer_gas_inp) == HIGH || digitalRead(impuls_gas_inp) == HIGH){ // wenn hier am Pin7 5 Volt ausgelesen werden und mit dem Wert HIGH gespeichert werden
digitalWrite(gas_outp, HIGH); // ist hier der Pin10 auch HIGH
}
else { // oder
digitalWrite(gas_outp, LOW); // LOW wenn LOW an Pin 7
}
if (digitalRead(zuend_inp) == HIGH) { // wenn hier am Pin8 5 Volt ausgelesen werden und mit dem Wert HIGH gespeichert werden
zuendfreigabe = true; // erfolgt die Zündfreigabe
} // Hier ist ein Programmabschnitt beendet
// Ansteuerung (Zeitfunktion) Zündung und optische Ausgabe bei Zündung HIGH
if (loop_time - zuend_time <= 2000 && zuendfreigabe) { // wenn Taste gedrückt ist fällt die Zeitschleife nach 2 Sek. auf LOW
digitalWrite(zuend_outp, HIGH); // Pin 11 ist HIGH
digitalWrite(LED3, HIGH); // Pin 5 ist HIGH
lcd.setCursor(0, 3);
lcd.print(" Zuendimpuls"); // in der vierten Zeile erscheint der Text "Zuendimpuls"
}
else {
digitalWrite(zuend_outp, LOW);
digitalWrite(LED3, LOW);
lcd.setCursor(0, 3);
lcd.print(" ");
zuendfreigabe = false;
zuend_time = millis();
}
// optische Ausgabe bei Impuls-Gas HIGH
if (digitalRead(impuls_gas_inp) == HIGH) { // wenn hier am Pin6 5 Volt ausgelesen werden und mit dem Wert HIGH gespeichert werden
lcd.setCursor(0, 1); // Hier wird die Position des ersten Zeichens festgelegt (0,0) bedeutet erstes Zeichen in der ersten Zeile
lcd.print(" Impulsgas"); // in der zweiten Zeile erscheint der Text "Impulsgas"
digitalWrite(LED1, HIGH); // ist hier der Pin3 auch HIGH
} // Hier ist ein Programmabschnitt beendet
else { // oder
lcd.setCursor(0, 1);
lcd.print(" ");
digitalWrite(LED1, LOW); // LOW wenn LOW an Pin6
}
// optische Ausgabe bei Dauer-Gas HIGH
if (digitalRead(dauer_gas_inp) == HIGH) { // wenn hier am Pin7 5 Volt ausgelesen werden und mit dem Wert HIGH gespeichert werden
lcd.setCursor(0, 2); // in diesem Fall bedeutet (0,1) das erste Zeichen in der zweiten Zeile
lcd.print(" Dauergas"); // in der dritten Zeile erscheint der Text "Dauergas"
digitalWrite(LED2, HIGH); // ist hier der Pin4 auch HIGH
}
else { // oder
lcd.setCursor(0, 2);
lcd.print(" ");
digitalWrite(LED2, LOW); // LOW wenn LOW an Pin7
}
} // hier endet das Programm
void lock(){
while(LOCK){
char key = keypad.getKey();
lcd.setCursor(0, 1);
lcd.print(" LOCKED");
if (key){
if(key == '*') {
input_password = ""; // clear input password
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Aldini Pyrotechnik");
number = 0;
}
else if(key == '#') {
if(password == input_password) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Aldini Pyrotechnik");
lcd.setCursor(0, 1);
lcd.print(" Unlocked");
LOCK = false;
delay(1000);
lcd.print(" ");
number = 0;
} else {
lcd.setCursor(0, 3);
lcd.print(" WRONG");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Aldini Pyrotechnik");
number = 0;
}
input_password = ""; // clear input password
}
else {
input_password += key; // append new character to input password string
lcd.setCursor(number+8, 3);
lcd.print("#");
number ++;
}
}
}
}