Simon Liebelt / Mbed 2 deprecated BewaesserungsanlageTCGensingen_sicher

Dependencies:   mbed

Revision:
0:34f429428d45
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Mar 28 09:07:49 2017 +0000
@@ -0,0 +1,849 @@
+/* Includes */
+#include "mbed.h"
+#include "RTC.h"
+
+/* Defines */
+#define nWATERINGDURATIONDAY            180 //Sekunden = 3 Minuten
+#define nWATERINGDURATIONNIGHT          600 //Sekunden = 10 Minuten
+#define nCHECKBTTNINTERVAL              0.025
+#define nCHECKROTARYSWITCHINTERVAL      1   
+#define nCHECKNIGHTWATERINGINTERVAL     1
+
+/* Funktionsstrukturen */
+void vfInit();
+void vfQueueCourt(unsigned char bCourtNumber);
+void vfBttnOnP3();
+void vfBttnOnP4();
+void vfBttnOnP5();
+void vfBttnOnP6();
+void vfBttnOnP7();
+void vfBttnOnP8();
+void vfEndWateringP3();
+void vfEndWateringP4();
+void vfEndWateringP5();
+void vfEndWateringP6();
+void vfEndWateringP7();
+void vfEndWateringP8();
+void vfWaterNextCourt();
+void vfShiftCourtQueue(unsigned char bCourtNumber);
+void vfWateringAllCourts();
+void vfResetFlag();
+unsigned char bfGetRotarySwitchValue();
+void vfCheckBttns();
+void vfCheckRotarySwitch();
+void vfCheckNightWatering();
+
+/* Pinfunktionen */
+/* Button Ein */
+DigitalIn diBttnOnP3(PB_15);        //Button-Ein für Platz 3
+DigitalIn diBttnOnP4(PC_2);         //Button-Ein für Platz 4
+DigitalIn diBttnOnP5(PC_3);         //Button-Ein für Platz 5
+DigitalIn diBttnOnP6(PB_12);        //Button-Ein für Platz 6
+DigitalIn diBttnOnP7(PB_2);         //Button-Ein für Platz 7
+DigitalIn diBttnOnP8(PB_1);         //Button-Ein für Platz 8
+/* Button Aus */
+DigitalIn diBttnOffP3(PA_11);       //Button-Aus für Platz 3
+DigitalIn diBttnOffP4(PC_6);        //Button-Aus für Platz 4
+DigitalIn diBttnOffP5(PC_12);       //Button-Aus für Platz 5
+DigitalIn diBttnOffP6(PC_5);        //Button-Aus für Platz 6
+DigitalIn diBttnOffP7(PB_7);        //Button-Aus für Platz 7
+DigitalIn diBttnOffP8(PC_8);        //Button-Aus für Platz 8
+/* Relais für LEDs */
+DigitalOut doRelaisLEDP3(PA_5);     //LED für Platz 3, 
+DigitalOut doRelaisLEDP4(PC_11);     //LED für Platz 4, 
+DigitalOut doRelaisLEDP5(PC_9);     //LED für Platz 5
+DigitalOut doRelaisLEDP6(PC_7);     //LED für Platz 6
+DigitalOut doRelaisLEDP7(PB_6);     //LED für Platz 7
+DigitalOut doRelaisLEDP8(PA_7);     //LED für Platz 8
+/* Relais für Ventile */
+DigitalOut doRelaisVentP3(PB_13);   //Ventil für Platz 3
+DigitalOut doRelaisVentP4(PB_14);   //Ventil für Platz 4
+DigitalOut doRelaisVentP5(PB_4);    //Ventil für Platz 5
+DigitalOut doRelaisVentP6(PB_5);    //Ventil für Platz 6
+DigitalOut doRelaisVentP7(PB_10);   //Ventil für Platz 7
+DigitalOut doRelaisVentP8(PA_9);    //Ventil für Platz 8
+/* Schlüsselschalter */
+DigitalIn diNightWatering(PC_10);   //Schlüsselschalter 
+/* Drehschalter */
+DigitalIn diRotarySwitchPin1(PA_1); //Drehschalter Wert 1
+DigitalIn diRotarySwitchPin4(PA_4); //Drehschalter Wert 4
+DigitalIn diRotarySwitchPin8(PA_0); //Drehschalter Wert 8
+DigitalIn diRotarySwitchPin2(PA_10); //Drehschalter Wert 2
+
+Serial pc(USBTX,USBRX);
+
+
+/* Nutzfunktionen */
+Timeout toEndWateringP3;
+Timeout toEndWateringP4;
+Timeout toEndWateringP5;
+Timeout toEndWateringP6;
+Timeout toEndWateringP7;
+Timeout toEndWateringP8;
+Timeout toResetFlag;
+Ticker tkCheckBttns;
+Ticker tkCheckRotarySwitch;
+Ticker tkCheckNightWatering;
+
+
+/* Globale Variablen */
+unsigned char abCourtQueue[6]={0};      //Warteschlange Bewässerung (immer nur ein Platz wird gewässert)
+unsigned char bValveState;
+int i32WateringDurationNight;    //Dauer der Bewässerung eines Platzes während der Nacht
+int i32WateringDurationDay;
+int i32NightWateringMinute[10];
+int i32NightWateringHour[10];
+unsigned int abFlagSetzen[6]={0};
+unsigned int abFlagZaehler[7]={0};
+unsigned int bKeySwitch;
+unsigned int bNightWateringIsRunning;
+
+enum enValveState{
+    enValveInUse,
+    enValveUnused
+    };
+
+/* Funktionen */
+void vfCheckNightWatering(){
+    unsigned char bSeconds, bMinutes, bHours;
+    int i;    
+    if( bKeySwitch == 1 ){
+        vfGetTime(&bSeconds, &bMinutes, &bHours);
+        for(i = 0; i < 10; i++){
+            if(i32NightWateringHour[i] == bHours && i32NightWateringMinute[i] == bMinutes && bNightWateringIsRunning == 0){
+                    vfWateringAllCourts();
+                    bNightWateringIsRunning = 1;
+                    toResetFlag.attach(&vfResetFlag, 90); //Nach 90 Sekunden wird die Flag resetet
+                }
+            } 
+        }
+    }
+
+void vfCheckRotarySwitch(){
+    int i;
+    switch(bfGetRotarySwitchValue()){
+        default:
+            i32WateringDurationDay = 180;
+            i32WateringDurationNight = 180;       //3 Minuten
+            i32NightWateringHour[0] = 23;
+            i32NightWateringMinute[0] = 0;
+            i32NightWateringHour[1] = 4;
+            i32NightWateringMinute[1] = 30;
+            i32NightWateringHour[2] = 7;
+            i32NightWateringMinute[2] = 0;
+            for(i = 3; i < 10; i++){
+                i32NightWateringMinute[i] = 65;   //65 ist unerreichbar
+                i32NightWateringHour[i] = 25;      //25 ist unerreichbar
+                }  
+            break;
+        case 0:
+            i32WateringDurationDay = 180;
+            i32WateringDurationNight = 180;       //3 Minuten
+            i32NightWateringHour[0] = 23;
+            i32NightWateringMinute[0] = 0;
+            i32NightWateringHour[1] = 4;
+            i32NightWateringMinute[1] = 30;
+            i32NightWateringHour[2] = 7;
+            i32NightWateringMinute[2] = 0;
+            for(i = 3; i < 10; i++){
+                i32NightWateringMinute[i] = 65;   //65 ist unerreichbar
+                i32NightWateringHour[i] = 25;      //25 ist unerreichbar
+                }            
+            break;
+        case 1:
+            i32WateringDurationDay = 180;
+            i32WateringDurationNight = 240;       //4 Minuten
+            i32NightWateringHour[0] = 23;
+            i32NightWateringMinute[0] = 0;
+            i32NightWateringHour[1] = 4;
+            i32NightWateringMinute[1] = 30;
+            i32NightWateringHour[2] = 7;
+            i32NightWateringMinute[2] = 0;
+            for(i = 3; i < 10; i++){
+                i32NightWateringMinute[i] = 65;   //65 ist unerreichbar
+                i32NightWateringHour[i] = 25;      //25 ist unerreichbar
+                } 
+            break;
+        case 2:
+            i32WateringDurationDay = 180;
+            i32WateringDurationNight = 300;       //5 Minuten
+            i32NightWateringHour[0] = 23;
+            i32NightWateringMinute[0] = 0;
+            i32NightWateringHour[1] = 4;
+            i32NightWateringMinute[1] = 30;
+            i32NightWateringHour[2] = 7;
+            i32NightWateringMinute[2] = 0;
+            for(i = 3; i < 10; i++){
+                i32NightWateringMinute[i] = 65;   //65 ist unerreichbar
+                i32NightWateringHour[i] = 25;      //25 ist unerreichbar
+                } 
+            break;
+        case 3:
+            i32WateringDurationDay = 180;
+            i32WateringDurationNight = 180;       //3 Minuten
+            i32NightWateringHour[0] = 23;
+            i32NightWateringMinute[0] = 0;
+            i32NightWateringHour[1] = 4;
+            i32NightWateringMinute[1] = 30;
+            for(i = 2; i < 10; i++){
+                i32NightWateringMinute[i] = 65;   //65 ist unerreichbar
+                i32NightWateringHour[i] = 25;      //25 ist unerreichbar
+                } 
+            break;
+        case 4:
+            i32WateringDurationDay = 180;
+            i32WateringDurationNight = 240;       //4 Minuten
+            i32NightWateringHour[0] = 23;
+            i32NightWateringMinute[0] = 0;
+            i32NightWateringHour[1] = 4;
+            i32NightWateringMinute[1] = 30;
+            for(i = 2; i < 10; i++){
+                i32NightWateringMinute[i] = 65;   //65 ist unerreichbar
+                i32NightWateringHour[i] = 25;      //25 ist unerreichbar
+                } 
+            break;
+        case 5:
+            i32WateringDurationDay = 180;
+            i32WateringDurationNight = 300;       //5 Minuten
+            i32NightWateringHour[0] = 23;
+            i32NightWateringMinute[0] = 0;
+            i32NightWateringHour[1] = 4;
+            i32NightWateringMinute[1] = 30;
+            for(i = 2; i < 10; i++){
+                i32NightWateringMinute[i] = 65;   //65 ist unerreichbar
+                i32NightWateringHour[i] = 25;      //25 ist unerreichbar
+                } 
+            break;
+        case 6:
+            i32WateringDurationDay = 180;
+            i32WateringDurationNight = 360;     //6 Minuten
+            i32NightWateringHour[0] = 23;
+            i32NightWateringMinute[0] = 0;
+            i32NightWateringHour[1] = 4;
+            i32NightWateringMinute[1] = 30;
+            for(i = 2; i < 10; i++){
+                i32NightWateringMinute[i] = 65;   //65 ist unerreichbar
+                i32NightWateringHour[i] = 25;      //25 ist unerreichbar
+                } 
+            break;
+        case 7:
+            i32WateringDurationDay = 180;
+            i32WateringDurationNight = 420;       //7 Minuten
+            i32NightWateringHour[0] = 23;
+            i32NightWateringMinute[0] = 0;
+            i32NightWateringHour[1] = 4;
+            i32NightWateringMinute[1] = 30;
+            for(i = 2; i < 10; i++){
+                i32NightWateringMinute[i] = 65;   //65 ist unerreichbar
+                i32NightWateringHour[i] = 25;      //25 ist unerreichbar
+                } 
+            break;
+        case 8:
+            i32WateringDurationDay = 180;
+            i32WateringDurationNight = 480;       //8 Minuten
+            i32NightWateringHour[0] = 23;
+            i32NightWateringMinute[0] = 0;
+            i32NightWateringHour[1] = 4;
+            i32NightWateringMinute[1] = 30;
+            for(i = 2; i < 10; i++){
+                i32NightWateringMinute[i] = 65;   //65 ist unerreichbar
+                i32NightWateringHour[i] = 25;      //25 ist unerreichbar
+                } 
+            break;
+        case 9:
+            i32WateringDurationDay = 180;
+            i32WateringDurationNight = 540;       //9 Minuten
+            i32NightWateringHour[0] = 23;
+            i32NightWateringMinute[0] = 0;
+            i32NightWateringHour[1] = 4;
+            i32NightWateringMinute[1] = 30;
+            for(i = 2; i < 10; i++){
+                i32NightWateringMinute[i] = 65;   //65 ist unerreichbar
+                i32NightWateringHour[i] = 25;      //25 ist unerreichbar
+                } 
+            break;
+        case 10:
+            i32WateringDurationDay = 180;
+            i32WateringDurationNight = 600;       //10 Minuten
+            i32NightWateringHour[0] = 23;
+            i32NightWateringMinute[0] = 0;
+            i32NightWateringHour[1] = 4;
+            i32NightWateringMinute[1] = 30;
+            for(i = 2; i < 10; i++){
+                i32NightWateringMinute[i] = 65;   //65 ist unerreichbar
+                i32NightWateringHour[i] = 25;      //25 ist unerreichbar
+                } 
+            break;
+        case 11:
+            i32WateringDurationDay = 180;
+            i32WateringDurationNight = 660;       //11 Minuten
+            i32NightWateringHour[0] = 23;
+            i32NightWateringMinute[0] = 0;
+            i32NightWateringHour[1] = 4;
+            i32NightWateringMinute[1] = 30;
+            for(i = 2; i < 10; i++){
+                i32NightWateringMinute[i] = 65;   //65 ist unerreichbar
+                i32NightWateringHour[i] = 25;      //25 ist unerreichbar
+                } 
+            break;
+         case 12:
+            i32WateringDurationDay = 180;
+            i32WateringDurationNight = 720;       //12 Minuten
+            i32NightWateringHour[0] = 23;
+            i32NightWateringMinute[0] = 0;
+            i32NightWateringHour[1] = 4;
+            i32NightWateringMinute[1] = 30;
+            for(i = 2; i < 10; i++){
+                i32NightWateringMinute[i] = 65;   //65 ist unerreichbar
+                i32NightWateringHour[i] = 25;      //25 ist unerreichbar
+                } 
+            break;
+        case 13:
+            i32WateringDurationDay = 180;
+            i32WateringDurationNight = 780;       //13 Minuten
+            i32NightWateringHour[0] = 23;
+            i32NightWateringMinute[0] = 0;
+            i32NightWateringHour[1] = 4;
+            i32NightWateringMinute[1] = 30;
+            for(i = 2; i < 10; i++){
+                i32NightWateringMinute[i] = 65;   //65 ist unerreichbar
+                i32NightWateringHour[i] = 25;      //25 ist unerreichbar
+                } 
+            break;
+        case 14:
+            i32WateringDurationDay = 180;
+            i32WateringDurationNight = 840;       //14 Minuten
+            i32NightWateringHour[0] = 23;
+            i32NightWateringMinute[0] = 0;
+            i32NightWateringHour[1] = 4;
+            i32NightWateringMinute[1] = 30;
+            for(i = 2; i < 10; i++){
+                i32NightWateringMinute[i] = 65;   //65 ist unerreichbar
+                i32NightWateringHour[i] = 25;      //25 ist unerreichbar
+                } 
+            break;
+        case 15:
+            i32WateringDurationDay = 15;
+            i32WateringDurationNight = 15;
+            for(i = 0; i < 10; i++){
+                i32NightWateringHour[i] = 10+i;       //10 Uhr bis 19 Uhr
+                }
+            for(i = 0; i < 10; i++){
+                i32NightWateringMinute[i] = i * 6;    //Alle 6 Minuten
+                }     
+            break;
+        }            
+    }
+
+void vfCheckBttns(){
+  //  static int abFlagZaehler[7];
+    
+    if(diBttnOnP3.read() == 1)
+    {
+        abFlagZaehler[0]++;
+        if(abFlagZaehler[0] >= 10)
+            {
+                vfBttnOnP3();
+                abFlagZaehler[0] = 10;
+            }
+    }
+    else
+                abFlagZaehler[0] = 0;                
+    
+    if(diBttnOnP4.read() == 1)
+    {
+        abFlagZaehler[1]++;
+        if(abFlagZaehler[1] >= 10)
+            {
+                vfBttnOnP4();
+                abFlagZaehler[1] = 10;
+            }
+    }
+    else
+                abFlagZaehler[1] = 0;                
+    
+    if(diBttnOnP5.read() == 1)
+    {
+        abFlagZaehler[2]++;
+        if(abFlagZaehler[2] >= 10)
+            {
+                vfBttnOnP5();
+                abFlagZaehler[2] = 10;
+            }
+    }
+    else
+                abFlagZaehler[2] = 0;                
+    
+    if(diBttnOnP6.read() == 1)
+    {
+        abFlagZaehler[3]++;
+        if(abFlagZaehler[3] >= 10)
+            {
+                vfBttnOnP6();
+                abFlagZaehler[3] = 10;
+            }
+    }
+    else
+                abFlagZaehler[3] = 0;                
+    
+    if(diBttnOnP7.read() == 1)
+    {
+        abFlagZaehler[4]++;
+        if(abFlagZaehler[4] >= 10)
+            {
+                vfBttnOnP7();
+                abFlagZaehler[4] = 10;
+            }
+    }
+    else
+                abFlagZaehler[4] = 0;                
+
+    if(diBttnOnP8.read() == 1)
+    {
+        abFlagZaehler[5]++;
+        if(abFlagZaehler[5] >= 10)
+            {
+                vfBttnOnP8();
+                abFlagZaehler[5] = 10;
+            }
+    }
+    else
+                abFlagZaehler[5] = 0;                
+           
+    if(diBttnOffP3.read() == 0){
+        vfEndWateringP3();
+        }
+    else if(diBttnOffP4.read() == 0){
+        vfEndWateringP4();
+        }
+    else if(diBttnOffP5.read() == 0){
+        vfEndWateringP5();
+        }
+    else if(diBttnOffP6.read() == 0){
+        vfEndWateringP6();
+        }
+    else if(diBttnOffP7.read() == 0){
+        vfEndWateringP7();
+        }
+    else if(diBttnOffP8.read() == 0){
+        vfEndWateringP8();
+        }
+        
+    if(diNightWatering.read() == 1)
+    {
+        abFlagZaehler[6]++;
+        if(abFlagZaehler[6] >= 50)
+            {
+                bKeySwitch = 1;
+                abFlagZaehler[6] = 50;
+            }
+    }
+    else
+    {
+                bKeySwitch = 0;
+                abFlagZaehler[6] = 0;                
+    }
+}
+
+
+void vfBttnOnP3(){
+    if(abFlagSetzen[0] == 0)
+        {
+        doRelaisLEDP3 = 0;              //Relais schaltet bei ziehen auf GND
+        abFlagSetzen[0] = 1;
+        vfQueueCourt((unsigned char)3);
+        }
+    }
+    
+void vfBttnOnP4(){
+    if(abFlagSetzen[1] == 0)
+        {
+        doRelaisLEDP4 = 0;
+        abFlagSetzen[1] = 1;
+        vfQueueCourt((unsigned char)4);
+        }
+    
+    }
+    
+void vfBttnOnP5(){
+    if(abFlagSetzen[2] == 0)
+        {
+        doRelaisLEDP5 = 0;
+        abFlagSetzen[2] = 1;
+        vfQueueCourt((unsigned char)5);
+        }    
+    }
+    
+void vfBttnOnP6(){
+    if(abFlagSetzen[3] == 0)
+        {
+        doRelaisLEDP6 = 0;
+        abFlagSetzen[3] = 1;
+        vfQueueCourt((unsigned char)6);
+        }
+    }
+    
+void vfBttnOnP7(){
+    if(abFlagSetzen[4] == 0)
+        {
+        doRelaisLEDP7 = 0;
+        abFlagSetzen[4] = 1;
+        vfQueueCourt((unsigned char)7);
+        }
+    }
+    
+void vfBttnOnP8(){
+    if(abFlagSetzen[5] == 0)
+        {
+        doRelaisLEDP8 = 0;
+        abFlagSetzen[5] = 1;
+        vfQueueCourt((unsigned char)8);
+        }
+    
+    }
+    
+
+void vfQueueCourt(unsigned char bCourtNumber){
+    int i;
+    for( i = 0; i < 6; i++){
+        if( abCourtQueue[i] == 0 || abCourtQueue[i] == bCourtNumber){
+            abCourtQueue[i] = bCourtNumber;
+            i = 7;      //Abbruch der for-Schleife
+            }
+        }
+    }
+
+void vfShiftCourtQueue(unsigned char bCourtNumberDay, unsigned char bCourtNumberNight){
+    int i,j;
+    for( i = 0; i < 6; i++){
+        if( abCourtQueue[i] == bCourtNumberDay || abCourtQueue[i] == bCourtNumberNight){
+            abCourtQueue[i] = 0;
+            }
+        }
+    for( j = 0; j < 5; j++){    
+        for( i = 0; i < 5; i++){
+            if( abCourtQueue[i] == 0){
+                abCourtQueue[i] = abCourtQueue[i+1];
+                abCourtQueue[i+1] = 0;
+                }
+            }
+        }
+    }
+    
+    
+void vfEndWateringP3(){
+        doRelaisVentP3 = 1;     //Relais wird ausgeschaltet
+        doRelaisLEDP3 = 1;
+        toEndWateringP3.detach();
+        vfShiftCourtQueue(3,13);
+        bValveState = enValveUnused;        
+        abFlagSetzen[0] = 0;
+}
+
+void vfEndWateringP4(){
+        doRelaisVentP4 = 1;    
+        doRelaisLEDP4 = 1;
+        toEndWateringP4.detach();
+        vfShiftCourtQueue(4,14); 
+        bValveState = enValveUnused;
+        abFlagSetzen[1] = 0;
+} 
+  
+void vfEndWateringP5(){
+        abFlagSetzen[2] = 0;
+        doRelaisVentP5 = 1;   
+        doRelaisLEDP5 = 1;
+        toEndWateringP5.detach();
+        vfShiftCourtQueue(5,15); 
+        bValveState = enValveUnused;
+        abFlagSetzen[2] = 0;
+}
+    
+void vfEndWateringP6(){
+        doRelaisVentP6 = 1;    
+        doRelaisLEDP6 = 1;
+        toEndWateringP6.detach();
+        vfShiftCourtQueue(6,16); 
+        bValveState = enValveUnused;
+        abFlagSetzen[3] = 0;
+}
+    
+void vfEndWateringP7(){
+        doRelaisVentP7 = 1;    
+        doRelaisLEDP7 = 1;
+        toEndWateringP7.detach();
+        vfShiftCourtQueue(7,17); 
+        bValveState = enValveUnused;
+        abFlagSetzen[4] = 0;
+}
+    
+void vfEndWateringP8(){
+        doRelaisVentP8 = 1;    
+        doRelaisLEDP8 = 1;
+        toEndWateringP8.detach();
+        vfShiftCourtQueue(8,18); 
+        bValveState = enValveUnused;
+        abFlagSetzen[5] = 0;
+}
+    
+void vfWateringAllCourts(){
+    unsigned char i;
+    for( i = 18; i >= 13; i-- ){
+        abFlagSetzen[i-13] = 1;
+        vfQueueCourt(i);
+        }    
+    doRelaisLEDP3 = 0;
+    doRelaisLEDP4 = 0;
+    doRelaisLEDP5 = 0;
+    doRelaisLEDP6 = 0;
+    doRelaisLEDP7 = 0;
+    doRelaisLEDP8 = 0;
+    }
+    
+void vfWaterNextCourt(){
+    switch(abCourtQueue[0]){
+        default:
+            break;
+        case 0:
+            bValveState = enValveUnused;
+            break;
+        case 3:
+            doRelaisVentP3 = 0;
+            toEndWateringP3.attach(&vfEndWateringP3, i32WateringDurationDay);
+            bValveState = enValveInUse;
+            break;
+        case 4:
+            doRelaisVentP4 = 0;
+            toEndWateringP4.attach(&vfEndWateringP4, i32WateringDurationDay);
+            bValveState = enValveInUse;
+            break;
+        case 5:
+            doRelaisVentP5 = 0;
+            toEndWateringP5.attach(&vfEndWateringP5, i32WateringDurationDay);
+            bValveState = enValveInUse;
+            break;
+        case 6:
+            doRelaisVentP6 = 0;
+            toEndWateringP6.attach(&vfEndWateringP6, i32WateringDurationDay);
+            bValveState = enValveInUse;
+            break;
+        case 7:
+            doRelaisVentP7 = 0;
+            toEndWateringP7.attach(&vfEndWateringP7, i32WateringDurationDay);
+            bValveState = enValveInUse;
+            break;
+        case 8:
+            doRelaisVentP8 = 0;
+            toEndWateringP8.attach(&vfEndWateringP8, i32WateringDurationDay);
+            bValveState = enValveInUse;
+            break;
+        case 13:
+            if(bKeySwitch == 1){
+                doRelaisVentP3 = 0;
+                bValveState = enValveInUse;
+                toEndWateringP3.attach(&vfEndWateringP3, i32WateringDurationNight);
+                }
+            else
+                doRelaisVentP3 = 1;
+            break;
+        case 14:
+            if(bKeySwitch == 1){
+                doRelaisVentP4 = 0;            
+                toEndWateringP4.attach(&vfEndWateringP4, i32WateringDurationNight);
+                bValveState = enValveInUse;
+                }
+            else
+                doRelaisVentP4 = 1;
+            break;
+        case 15:
+            if(bKeySwitch == 1){
+                doRelaisVentP5 = 0;                                
+                toEndWateringP5.attach(&vfEndWateringP5, i32WateringDurationNight);
+                bValveState = enValveInUse;
+                }
+            else
+                doRelaisVentP5 = 1;
+            break;
+        case 16:
+            if(bKeySwitch == 1){
+                doRelaisVentP6 = 0;
+                toEndWateringP6.attach(&vfEndWateringP6, i32WateringDurationNight);
+                bValveState = enValveInUse;
+                }
+            else
+                doRelaisVentP6 = 1;
+            break;
+        case 17:
+            if(bKeySwitch == 1){
+                doRelaisVentP7 = 0;
+                toEndWateringP7.attach(&vfEndWateringP7, i32WateringDurationNight);
+                bValveState = enValveInUse;
+                }
+            else
+                doRelaisVentP7 = 1;
+            break;
+        case 18:
+            if(bKeySwitch == 1){
+                doRelaisVentP8 = 0;
+                toEndWateringP8.attach(&vfEndWateringP8, i32WateringDurationNight);
+                bValveState = enValveInUse;
+                }
+            else
+                doRelaisVentP8 = 1;
+            break;
+        }
+            
+    }
+    
+unsigned char bfGetRotarySwitchValue(){
+    unsigned char bRotarySwitchPin1 = 0;
+    unsigned char bRotarySwitchPin2 = 0;
+    unsigned char bRotarySwitchPin4 = 0;
+    unsigned char bRotarySwitchPin8 = 0;
+    if(diRotarySwitchPin1.read() > (float)0.5)
+        bRotarySwitchPin1 = 1;
+    if(diRotarySwitchPin2.read() > (float)0.5)
+        bRotarySwitchPin2 = 1;
+    if(diRotarySwitchPin4.read() > (float)0.5)
+        bRotarySwitchPin4 = 1;            
+    if(diRotarySwitchPin8.read() > (float)0.5)
+        bRotarySwitchPin8 = 1;    
+    return ( (bRotarySwitchPin1 * 1) +
+             (bRotarySwitchPin2 * 2) +
+             (bRotarySwitchPin4 * 4) +
+             (bRotarySwitchPin8 * 8) );
+    }
+    
+void vfResetFlag(){
+    bNightWateringIsRunning = 0;
+    }
+    
+void vfInit(){
+    /* Initialisierung der Knöpfe und derer Interruptfunktionen */
+    
+    /* Alle Relais ausschalten */
+    doRelaisVentP3 = 1;
+    doRelaisVentP4 = 1;
+    doRelaisVentP5 = 1;
+    doRelaisVentP6 = 1;
+    doRelaisVentP7 = 1;
+    doRelaisVentP8 = 1;
+
+    doRelaisLEDP3 = 1;   
+    doRelaisLEDP4 = 1;   
+    doRelaisLEDP5 = 1;   
+    doRelaisLEDP6 = 1;   
+    doRelaisLEDP7 = 1;   
+    doRelaisLEDP8 = 1;  
+    
+    abFlagSetzen[0] = 0;
+    abFlagSetzen[1] = 0;
+    abFlagSetzen[2] = 0;
+    abFlagSetzen[3] = 0;
+    abFlagSetzen[4] = 0;
+    abFlagSetzen[5] = 0;
+    
+    abFlagZaehler[0] = 0;
+    abFlagZaehler[1] = 0;
+    abFlagZaehler[2] = 0;
+    abFlagZaehler[3] = 0;
+    abFlagZaehler[4] = 0;
+    abFlagZaehler[5] = 0;
+    abFlagZaehler[6] = 0;
+    
+    diBttnOnP3.mode(PullDown);
+    diBttnOnP4.mode(PullDown);
+    diBttnOnP5.mode(PullDown);
+    diBttnOnP6.mode(PullDown);
+    diBttnOnP7.mode(PullDown);
+    diBttnOnP8.mode(PullDown);
+    
+    diBttnOffP3.mode(PullDown);
+    diBttnOffP4.mode(PullDown);
+    diBttnOffP5.mode(PullDown);
+    diBttnOffP6.mode(PullDown);
+    diBttnOffP7.mode(PullDown);
+    diBttnOffP8.mode(PullDown);
+    
+    diRotarySwitchPin1.mode(PullDown);
+    diRotarySwitchPin2.mode(PullDown);
+    diRotarySwitchPin4.mode(PullDown);
+    diRotarySwitchPin8.mode(PullDown);
+    
+    diNightWatering.mode(PullDown);    
+    bNightWateringIsRunning = 0;
+    bKeySwitch = 0;
+    
+    tkCheckBttns.attach(&vfCheckBttns, nCHECKBTTNINTERVAL);                 
+    tkCheckRotarySwitch.attach(&vfCheckRotarySwitch,nCHECKROTARYSWITCHINTERVAL);     
+    tkCheckNightWatering.attach(&vfCheckNightWatering,nCHECKNIGHTWATERINGINTERVAL);  
+           
+    i32WateringDurationDay = nWATERINGDURATIONDAY;
+    i32WateringDurationNight = nWATERINGDURATIONNIGHT;
+        
+    bValveState = enValveUnused;
+    }
+
+int main() {
+    char acTime[6];
+    unsigned char bcTime[6];
+    char cBuffer;
+    unsigned char bSeconds, bMinutes, bHours;
+    int i=-1;
+    int j;
+    vfInit();
+        
+    /*
+        Möglichen Befehle:
+        "z":
+            Gibt die akutelle Uhrzeit in der Konsole aus.
+        "d":
+            Gibt die aktuelle Drehschalterstellung in der Konsole aus.
+        "t":
+            Initialisiert die Zeitsetzung.
+            Beispiel:
+                Es soll die Uhrzeit 22:35:59 eingestellt werden.
+                Befehl: "t223559"
+    */
+    while(1) {  
+        if(pc.readable()){
+            cBuffer = pc.getc();
+            if(i >= 0 && i <= 5){
+                acTime[i] = cBuffer;
+                i++;
+                }
+            if(cBuffer == 't'){
+                i = 0;
+                }
+            if(cBuffer == 'z'){
+                vfGetTime(&bSeconds, &bMinutes, &bHours);
+                pc.printf("\n\rAktuelle Zeit:\n\r");
+                pc.printf("%2u:%2u:%2u\n\r", bHours, bMinutes, bSeconds);
+                }
+            if(cBuffer == 'd'){
+                pc.printf("\n\rDrehschalterstellung: %u \n\r",bfGetRotarySwitchValue());
+                }
+            if(i >= 6){
+                for(j = 0; j<6; j++){
+                    bcTime[j] = acTime[j] - 48;
+                    }
+                vfStopRTCOszi();
+                wait(0.3);
+                vfSetTime((bcTime[4]*10)+bcTime[5],(bcTime[2]*10)+bcTime[3],(bcTime[0]*10)+bcTime[1]);
+                i = -1;                
+                vfGetTime(&bSeconds, &bMinutes, &bHours);
+                pc.printf("\n\rAktuelle Zeit:\n\r");
+                pc.printf("%2u:%2u:%2u\n\r", bHours, bMinutes, bSeconds);
+                }
+            }      
+        switch(bValveState){
+            default:
+                break;
+            case enValveUnused:
+                vfWaterNextCourt();                
+                break;
+            case enValveInUse:
+                break;
+            }
+        }
+    }