#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
int AnzahlZykAuswahl = 18;
int zykAuswahl[] = { 1,2,3,4,5,6,7,8,9,10, 20, 50, 100, 200,300,400, 500, 1000};
int zyk = 12;
int zyklus = zykAuswahl[zyk];
int pause1 = 14;
int pump1 = 16;
int menue = 1;
int vorlauf1=0;
int z = 0;
int i = 1;
String ja = "ja";
String nein = "nein";
String rev[2] = {"ja" , "Nein"};
String menueName [] = {"Zyklen", "Pumpen", "Pause", "Revers", "Vorlauf" };
bool revers1 = false;
bool switch1up = false;
bool switch1read = false;
bool switch2select = false;
bool switch2read = false;
bool switch3down = false;
bool switch3read = false;
bool switch1on = false;
bool switch2on = false;
bool switch3on = false;
bool adj0on = false;
unsigned long switch1millis = 0;
unsigned long switch2millis = 0;
unsigned long switch3millis = 0;
unsigned long serial0millis = 0;
unsigned long temp0millis = 0;
unsigned long temp1millis = 0;
unsigned long timeout1millis = 0;
void setup() {
lcd.begin(0x27, 20, 4);
lcd.backlight();
Serial.begin(9600);
pinMode(12, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
pinMode(10, INPUT_PULLUP);
}
void loop() {
switchRead();
monitorWrite();
timeout();
if(switch1read==false&&switch3read==false){
i=1;
z=0;
}
}
void switchRead() {
// Taster werden ausgelesen
switch3read = !digitalRead(12); // up
switch2read = !digitalRead(11); // select
switch1read = !digitalRead(10); // down
/******Taster 1 down*******/
//Wenn Tste down gedrückt wird
if (switch1read == true) { //Wenn down Taste gedrückt
switch1on = true; //wird switchon1 auf true gesetzt
}
//Wenn switch1on false ist
if (switch1on == false) {
switch1millis = millis(); // switch1 +
temp1millis = millis(); // temp1 Millis werden auf Millis gesetzt
}
//** IM SETUP MENUE -- Beim loslassen der Taste down ***************************************************************************
if (switch1read == false && switch1on == true &&
adj0on == false && millis() - switch1millis > 20) {
temp1millis = millis(); //temp1millis wieder auf millis() setzen
lcd.clear(); //Display löschen
menue = menue + 1; //Menue 1 weiter (runter)
switch1on = false; //switch1on wieder audf false setzen
// Begrenzung vom Menue
if (menue >= 5) { //Menue bleibt beim letzten Punkt
menue = 4;
}
}
//---IM SETUPMENU--ENDE----------------------------------------------------------------------------------------------------------
//** IM UNTER MENUE -- beim drücken der Taste down ******************************************************************************
if (switch1on == true && adj0on == true &&
millis() - switch1millis > 100) {
// Auswahl im Abhängigkeit des Untermenues
switch (menue) {
case 1: // bei auswahl Zyklen
if(z==0){ // z wird auf 0 gesetzt ( verhindert das schnelle vorspringen)
zyk = zyk - 1; // Zyklus wird um eine Stelle verringert (array)
lcd.setCursor(8,2); // Cursor wird auf Pos. gesetzt
z=1; // z wird auf 1 gesetzt (geht erst eins höher wenn z wieder auf 0)
lcd.print(" "); // Display wird hinter "Zyklus:" gelöscht (vorheriger Eintrag)
if (zyk <= -1) { // wenn unterster (erster) array-Eintrag (Pos.0=1) erreicht ist
zyk = 0; // bleibt Zyklus auf 1 (array 0)
}
}
switch1on=false; //switch1on wird wieder auf fals gesetzt
break;
case 2: // bei auswahl Pause
if (z == 0) { //
if (millis() - temp1millis > 2000) { //
i = 10; //
} //
pause1 = pause1 - i; //
lcd.setCursor(7, 2); //
lcd.print(" "); //
z = 1; //
if(pause1<0){ //
pause1=0; //
}
}
if (millis() - switch1millis > 200) { //
z = 0; //
switch1millis = millis(); //
}
switch1on = false; //
break;
case 3:
if (z == 0) { //
if (millis() - temp1millis > 2000) { //
i = 10; //
} //
revers1 = !revers1; //
lcd.setCursor(7, 2); //
lcd.print(" "); //
z = 1; //
}
if (millis() - switch1millis > 200) { //
z = 0; //
switch1millis = millis(); //
}
switch1on = false; // //
break;
case 4:
if (z == 0) { //
if (millis() - temp1millis > 2000) { //
i = 10; //
} //
vorlauf1 = vorlauf1 - i; //
lcd.setCursor(7, 2); //
lcd.print(" "); //
z = 1; //
if(vorlauf1<0){ //
vorlauf1=0; //
}
}
if (millis() - switch1millis > 200) { //
z = 0; //
switch1millis = millis(); //
}
switch1on = false;
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
}
}//---IM UNTER MENUE -- beim drücken der Taste down ENDE----------------------------------------------------------------------
// ** Taster 2 select ************************************************************************************************************
if (switch2read == true) {
switch2on = true;
}
if (switch2on == false) {
switch2millis = millis();
}
if (switch2read == false && switch2on == true && millis() - switch2millis > 20) {
adj0on = !adj0on;
lcd.clear();
switch2on = false;
}
// -- Taster 2 selekt ENDE -------------------------------------------------------------------------------------------------------
// ** Taster 3 up ***************************************************************************************************************
if (switch3read == true) {
switch3on = true;
}
if (switch3on == false) {
switch3millis = millis();
temp0millis = millis();
}
if (switch3read == false && switch3on == true && adj0on == false && millis() - switch3millis > 20) {
temp0millis = millis();
lcd.clear();
menue = menue - 1;
switch3on = false;
if (menue <= 0) {
menue = 1;
}
}
// Einstellung Untermenue
if (switch3on == true && adj0on == true && millis() - switch3millis > 20) {
//Funktionen in Abhängigkeit des Menue
switch (menue) {
case 1:
if (z == 0) {
zyk = zyk + 1;
z = 1;
}
if (millis() - switch3millis > 200) {
z = 0;
switch3millis = millis();
}
switch3on = false;
if (zyk >= AnzahlZykAuswahl) {
zyk = AnzahlZykAuswahl-1;
}
break;
case 2:
if (z == 0) {
if (millis() - temp0millis > 2000) {
i = 10;
}
pause1 = pause1 + i;
z = 1;
}
if (millis() - switch3millis > 200) {
z = 0;
switch3millis = millis();
}
switch3on = false;
break;
case 3:
if (z == 0) {
if (millis() - temp0millis > 2000) {
i = 10;
}
revers1 = !revers1;
z = 1;
}
if (millis() - switch3millis > 200) {
z = 0;
switch3millis = millis();
}
switch3on = false;
break;
case 4:
if (z == 0) {
if (millis() - temp0millis > 2000) {
i = 10;
}
vorlauf1 = vorlauf1 + i;
z = 1;
}
if (millis() - switch3millis > 200) {
z = 0;
switch3millis = millis();
}
switch3on = false;
break;
}
}
switch (menue) {
case 1:
Menue1();
break;
case 2:
Menue2();
break;
case 3:
Menue3();
break;
case 4:
Menue4();
break;
}
//-- ENDE Taster 3 up ----------------------------------------------------------------------------------------------------------------------------
} // ENDE void switchRead()
void monitorWrite() {
//Seriele Monitorausgabe zum Test
if (millis() - serial0millis > 1000) {
Serial.println("down: " + (String)switch1read + " select: " + (String)switch2read + " up: " + (String)switch3read);
Serial.println("down on: " + (String)switch1on + " select on: " + (String)switch2on + " up on: " + (String)switch3on+ (String)switch2on + " z: " + (String)z);
Serial.println((String)switch1millis + " Menue: " + (String)menue + " Adjust: " + (String)adj0on + " zyk: " + (String)zyk + " Pause: " + (String)pause1 + " switch3Millis: " + (String)switch3millis + " temp03Millis: " + (String)temp0millis);
serial0millis = millis();
}
}
/******************************************************************************************************************************************************
*******************************************************************************************************************************************************
****** LCD AUSGABE SETUP *****************************************************************************************************************************
*******************************************************************************************************************************************************
*****************************************************************************************************************************************************/
void Menue1() {
if (adj0on == true) {
if (millis() - switch2millis > 20) {
lcd.clear();
}
adj();
//** > ZYKLUS **
} else {
lcd.setCursor(0, 0);
lcd.print("*** Setup Menue ***");
lcd.setCursor(0, 1);
lcd.print(">"+menueName[0]+": ");
lcd.print(zyklus);
lcd.setCursor(0, 2);
lcd.print(" Pause: ");
lcd.print(pause1);
lcd.setCursor(0, 3);
lcd.print(" revers: ");
if(revers1==false){
lcd.print("Nein");
}
else{lcd.print("Ja ");}
return;
}
}
//** > PAUSE **
void Menue2() {
if (adj0on == true) {
if (millis() - switch2millis > 20) {
lcd.clear();
}
adj();
} else {
lcd.setCursor(0, 0);
lcd.print("*** Setup Menue ***");
lcd.setCursor(0, 1);
lcd.print(" zyklen: ");
lcd.print(zyklus);
lcd.setCursor(0, 2);
lcd.print(">Pause: ");
lcd.print(pause1);
lcd.setCursor(0, 3);
lcd.print(" revers: ");
if(revers1==false){
lcd.print("Nein");
}
else{lcd.print("Ja ");}
return;
}
}
//** > REVERS **
void Menue3() {
if (adj0on == true) {
if (millis() - switch2millis > 20) {
lcd.clear();
}
adj();
} else {
lcd.setCursor(0, 0);
lcd.print("*** Setup Menue ***");
lcd.setCursor(0, 1);
lcd.print(" zyklen: ");
lcd.print(zyklus);
lcd.setCursor(0, 2);
lcd.print(" Pause: ");
lcd.print(pause1);
lcd.setCursor(0, 3);
lcd.print(">revers: ");
if(revers1==false){
lcd.print("Nein");
}
else{lcd.print("Ja ");}
return;
}
}
//** > VORLAUF **
void Menue4() {
if (adj0on == true) {
if (millis() - switch2millis > 20) {
lcd.clear();
}
adj();
} else {
lcd.setCursor(0, 0);
lcd.print("*** Setup Menue ***");
lcd.setCursor(0, 1);
lcd.print(" Pause: ");
lcd.print(pause1);
lcd.setCursor(0, 2);
lcd.print(" revers: ");
if(revers1==false){
lcd.print("Nein");
}
else{lcd.print("Ja");}
lcd.setCursor(0, 3);
lcd.print(">Vorlauf: ");
lcd.print(vorlauf1);
return;
}
}
/******************************************************************************************************************************************************
*******************************************************************************************************************************************************
****** LCD AUSGABE ADJUST ****************************************************************************************************************************
*******************************************************************************************************************************************************
*****************************************************************************************************************************************************/
void adj() {
// ZYKLEN SETUP
if (menue == 1) {
zyklus = zykAuswahl[zyk];
lcd.setCursor(3, 0);
lcd.print("Setup Zyklen");
lcd.setCursor(0, 2);
lcd.print(">Zyklen: " + (String)zyklus);
return;
}
// PAUSE SETUP
if (menue == 2) {
zyklus = zykAuswahl[zyk];
lcd.setCursor(3, 0);
lcd.print("Setup Pause");
lcd.setCursor(0, 2);
lcd.print(">Pause: " + (String)pause1);
return;
}
// Revers SETUP
if (menue == 3) {
lcd.setCursor(3, 0);
lcd.print("Setup Revers");
lcd.setCursor(0, 2);
lcd.print(">Revers: " );
if(revers1==false){
lcd.print("Nein");
}
else{lcd.print("Ja ");}
return;
}
// Vorlauf SETUP
if (menue == 4) {
lcd.setCursor(3, 0);
lcd.print("Setup Vorlauf");
lcd.setCursor(0, 2);
lcd.print(">Vorlauf: " + (String)vorlauf1);
return;
}
}
void timeout(){
if(switch1read==HIGH|switch2read==HIGH|switch3read==HIGH){
timeout1millis=millis();
}
if(millis() -timeout1millis>10000){
lcd.noBacklight();
}else{lcd.backlight();}
}