#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
LiquidCrystal_I2C lcd(0x27,16,2); // Setzen der LED Adresse und Angabe über Felder (16) und Linien (2) des Displays
#define RelaisMagnet 12 // pin 12 schaltet Relaise für Elektromagnet
#define RelaisZylinder 11 // pin 11 schaltet Relais für Pneumatikzylinder
#define Aufschlagsensor 10 // pin 10 löst Aufschlagsensor aus
String inputString; // Zeichenfolge für gewünschte Schlagzahl
long inputInt = 0; // Variable zum speichern der gewünschten Schlagzahl als integer-Zahl
long Schlagzaehler = 0; // Variable um durchgeführte Schläge zu zählen
int Zaehler; // Variable damit pro Aufschlag die Schlagzahler-Variable nur einmal um 1 erhöht wird
int Aufschlag; // Variable um registrierten Aufschlag abzubilden
const int ROW_NUM = 4; // vier Reihen
const int COLUMN_NUM = 3; // drei Spalten
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}; // Verbindungen zu den Reihen des Keypads
byte pin_column[COLUMN_NUM] = {5, 4, 3}; // Verbindungen zu den Spalten des Keypads
Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );
/*---------------------------------------------- Eingabe der gewünschten Schläge als integer Zahl ----------------------------------------------*/
void getSchlagzahl()
{
lcd.setCursor(0,1);
lcd.print("*-Clear #-Start");
while (inputInt == 0)
{
char key = keypad.getKey();
if (key)
{
Serial.println(key);
if (key >= '0' && key <= '9') // Mit 0-9 Tasten gewünschte Schlagzahl eingeben
{
inputString += key; // Neues Zeichen an Zeichenfolge anhängen
lcd.setCursor(11,0);
lcd.print(inputString);
}
else if (key == '#') //Mit #-Taste die gewünschte Schlagzahl bestätigen
{
if (inputString.length() > 0)
{
inputInt = inputString.toInt(); // Eingegebene Schlagzahl als integer-Zahl speichern
inputString = ""; // Eingabe löschen
return inputInt;
}
}
else if (key == '*') //Mit *-Taste Schlagzahl korrigieren
{
inputString = ""; // Eingabe löschen
lcd.setCursor(0,0);
lcd.print("Schlagzahl: ");
}
}
}
}
/*------------------- Alle Schläge durchgeführt und "Fertig-Neustarten" Meldung wird dauerhaft angezeigt, Neustart ist erforderlich -------------------*/
void Fertigmeldung()
{
while (0 == 0)
{
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(5,0);
lcd.print("Fertig");
delay(2400);
lcd.setCursor(3,0);
lcd.print("Neustarten");
delay(2400);
}
}
/*---------------------------------------------------------- Setup-Teil ----------------------------------------------------------*/
void setup()
{
Serial.begin(9600);
lcd.init(); // LCD Display initialisieren
inputString.reserve(5); // max. 5-stellige Schlagzahl
pinMode(Aufschlagsensor, INPUT_PULLUP);
}
/*---------------------------------------------------------- Loop-Teil ----------------------------------------------------------*/
void loop()
{
lcd.setCursor(0,0);
lcd.print("Schlagzahl:");
getSchlagzahl(); //Unterprogramm zur Eingabe der Schlagzahl aufrufen, Return = Anzahl der Schläge
Zaehler = 1;
lcd.setCursor(0,1);
lcd.print("Schlaege: ");
while (Schlagzaehler < inputInt) //Gewünschte Schläge durchführen
{
Aufschlag = digitalRead(Aufschlagsensor);
if (Aufschlag == HIGH && Zaehler >= 1) //Wenn Aufschlagbutton nicht gedrückt und Zähler >= 1
{
digitalWrite(RelaisZylinder, HIGH); //Relais am Pneumatikzylinder wird geschlossen und Zylinder fährt ein
delay (2400);
Zaehler = 0;
}
if (Aufschlag == LOW && Zaehler < 1) //Wenn Aufschlagbutton gedrückt und Zähler < 1
{
digitalWrite(RelaisMagnet, HIGH); //Relais am Elektromagneten wird geschlossen und Elektromagnet hat Spannung anliegen
delay(1200);
digitalWrite(RelaisMagnet, LOW); //Relais am Elektromagneten wird geöffnet und Elektromagnet ist spannungslos
digitalWrite(RelaisZylinder, LOW); //Relais am Pneumatikzylinder wird geöffntet und Zylinder fährt aus
Schlagzaehler++;
lcd.setCursor(10,1);
lcd.print(Schlagzaehler); //Zeigt aktuellen Wert der Schlagzaehler-Variable auf dem Display an
//delay(2400);
Zaehler++;
}
}
Fertigmeldung(); //Unterprogramm nach Abschluss der Schlagprüfung aufrufen
}