////////////////////////////////////////////////////////////////////////////////
// Name:       Domoticz-03                                                    //
//             00 = Test connection with Domoticz server                      //
//             01 = Push dynamic data                                         //
//             02 = Integrate into Florigs standard                           //
//             03 = Integratie van Florigs Ethernet bibliotheek               //
// http://robotigs.com/robots/includes/bots.php?idbot=28                      //
//             Robot that controls LABO                                       //
// Created by: HARB rboek2@gmail.com july 2020 GPL copyrights                 //
// Platform:   Arduino Mega 2560                                              //
//                                                                            //
// OUTPUTS                                                                    //
// - Standard Arduino Onboard LED (PWM)                                       //
//           http://robotigs.nl/robotigs/includes/parts_header.php?idpart=185 //
// - 3 color LED (PWM)                                                        //
//           http://robotigs.nl/robotigs/includes/parts_header.php?idpart=293 //
// - Activ loudspeaker / buzzer                                               //
//           http://robotigs.nl/robotigs/includes/parts_header.php?idpart=240 //
// - 220 Vac Relay                                                            //
//           http://robotigs.nl/robotigs/includes/parts_header.php?idpart=189 //
//                                                                            //
// INPUTS                                                                     //
// - DS1307 Real Time Clock                                                   //
//           http://robotigs.nl/robotigs/includes/parts_header.php?idpart=289 //
// - DHT22 air temperature and air humidity sensor                            //
//           http://robotigs.nl/robotigs/includes/parts_header.php?idpart=252 //
// - Temp DS18B20                                                             //
//           http://robotigs.nl/robotigs/includes/parts_header.php?idpart=180 //
//                                                                            //
// COMMUNICATION                                                              //
// - Standard Serial Monitor output                                           //
//            http://robotigs.nl/robotigs/includes/parts_header.php?idpart=43 //
// - Lan ENC28J60 unit                                                        //
//           http://robotigs.nl/robotigs/includes/parts_header.php?idpart=313 //
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// EEPROM MEMORY MAP:                                                         //
// Start End  Number Description                                              //
// 0000  0000      1   Never use this memory location to be AVR compatible    //
// 0001  0001      1 WATER propWaterProg program 1=off 2=on 3=auto     RELAY1 //
// 0002  0002      1   If capac1 reaches this propWaterON*10 then set  RELAY1 //
// 0003  0003      1   Number seconds*10 propWaterSecs water on        RELAY1 //
// 0004  0004      1 GROEILED1 propLED1Prog program 1=off 2=on 3=auto  RELAY2 //
// 0005  0005      1   Number of propLED1hours around noon groeiled1   RELAY2 //
// 0006  0006      1 VERWARMING propHeatProg program 1=off 2=on 3=auto RELAY3 //
// 0007  0007      1   propHeatON/10 (0-25,5) aanschakeltemperatuur    RELAY3 //
// 0008  0008      1   propHeatOFF/10 (0-25,5) uitschakeltemperatuur   RELAY3 //
// 0009  0009      1 GROEILED2 propLED2prog program 1=off 2=on 3=auto  RELAY4 //
// 0010  0010      1   Number of propLED2hours around noon groeiled2   RELAY4 //
////////////////////////////////////////////////////////////////////////////////




// SET PRECOMPILER OPTIONS *****************************************************
  // Initialse conditional compiling, uncomment to include, comment to exclude -
  // Do comment the next line for runtime versions -----------------------------
  #define RS232                   //Uncomment to include Serial Monitor sections
  //#ifdef RS232     //Only include these lines if the variable has been defined


  //Define the needed header files for the precompiler, no charge if not used --
  #include <DHT.h> //Needed for DHT22 and DHT11 Temperature and humidity sensors
             // http://robotigs.nl/robotigs/includes/parts_header.php?idpart=252
  #include <EEPROM.h>                       //Needed for read or write in EEPROM
             // http://robotigs.nl/robotigs/includes/parts_header.php?idpart=312
  #include <RTClib.h>        //Manipulates clock DS1307 via I2C needs Wire.h lib
             // http://robotigs.nl/robotigs/includes/parts_header.php?idpart=289
  #include <Wire.h>                //Needed ao by RTClib: Two Wire Interface lib
              // http://robotigs.nl/robotigs/includes/parts_header.php?idpart=31
  #include <OneWire.h>    //Library can be installed through Arduino IDE DS18B20
             // http://robotigs.nl/robotigs/includes/parts_header.php?idpart=180
  #include <UIPEthernet.h>              //Library ment for ethernet LAN ENC28J60
             // http://robotigs.nl/robotigs/includes/parts_header.php?idpart=313
             

  // Define precompiler variables, runs faster & doesn`t use RAM ---------------
  // Define PINS ---------------------------------------------------------------
  OneWire term1(17);         //Connects to pin 17, but may be any DIO pin DS1820
  #define buzActPin    A7          //Define DIO output pin connects ACTIV BUZZER
  #define DHTPIN        4                   //Which DIO input pin connects DHT22
  #define DHTTYPE   DHT22     //What sensor is connected (AM2302) (AM2321) DHT22
  #define ledRedPin    44         //3 Colour LED, which PWM pin connects RED LED
  #define ledGrePin    45       //3 Colour LED, which PWM pin connects GREEN LED
  #define ledBluPin    46        //3 Colour LED, which PWM pin connects BLUE LED
  #define heaterPin    38             //220Vac DIO 34 36 38 40 VERWARMING RELAY1
  #define lightPin     40            //220Vac DIO 34 36 38 40 VERLICHTING RELAY2
  #define moistPin     A8        //Analog input pin connects CAPACATIVE MOISTURE
  #define moist2Pin    A9      //Analog input pin connects CAPACATIVE 2 MOISTURE
  #define moist3Pin   A10      //Analog input pin connects CAPACATIVE 3 MOISTURE
    //#define SpiSS    53                //PB0 -- CS/PCINT0 SPI pin LAN ENC28J60
    //#define SpiMOSI  51              //PB2 -- MOSI/PCINT2 SPI pin LAN ENC28J60
    //#define SpiMISO  50             //PB3 -- MISO/PCINT3  SPI pin LAN ENC28J60
    //#define SpiSCK   52               //PB1 -- SCK/PCINT1 SPI pin LAN ENC28J60    

  //Define EEPROM variables ----------------------------------------------------
  int     progHeater = EEPROM.read(1);     //VERWARMING 1=off 2=auto 3=on RELAY1
  int     tempOn     = EEPROM.read(2);       //Temp Celcius verwarming ON RELAY1
  int     tempOff    = EEPROM.read(3);      //Temp Celcius verwarming OFF RELAY1
  int     progLed    = EEPROM.read(4);    //VERLICHTING 1=off 2=auto 3=on RELAY2
  int     hoursLed   = EEPROM.read(5);       //Burning hours around 13:00 RELAY2
  int     ledRedBril = EEPROM.read(6);            //Current brillance of RED LED
  int     ledGreBril = EEPROM.read(7);          //Current brillance of GREEN LED
  int     ledBluBril = EEPROM.read(8);           //Current brillance of BLUE LED
  int     freqMeasSec= EEPROM.read(9);   //Measurement sensors every seconds SYS
  int     versionMaj = EEPROM.read(10);                       //Versie Major SYS
  int     versionMin = EEPROM.read(11);                       //Versie Minor SYS
  int     versionRev = EEPROM.read(12);                    //Versie Revision SYS
  int     serialNum  = EEPROM.read(13);                      //Serial Number SYS
  char    ssid[]         = "Ranonkel9";               //Network SSID (name) WIFI
  char    pass[]         = "Kat14_-5";                   //Network password WIFI  
  
  //Define DATABASE VARIABLES --------------------------------------------------
  int    jaar           = 1991;                    //Read or set the year DS1307
  int    maand          =   12;                   //Read or set the month DS1307
  int    dag            =   31;                     //Read or set the dag DS1307
  int    uur            =   23;                     //Read or set the uur DS1307
  int    minuut         =   59;                  //Read or set the minuut DS1307
  int    seconde        =   59;                 //Read or set the seconds DS1307
  float  tempDS18B20;                      //Soil temperature in Celsius DS18B20
  bool   lightStatus    = HIGH;       //Status HI=on, LOW=off VERLICHTING RELAY1
  bool   heaterStatus   = HIGH;        //Status HI=on, LOW=off VERWARMING RELAY2
  float  propAirTemp;                     //Air temperature degree Celcius DHT22
  float  propAirHum;                             //Air humidity percentage DHT22
  word   propCapac1;                      //Moisture measured (0-1023) by CAPAC1
  word   propCapac1Min  = 1023;    //Min moisture measured in sequence by CAPAC1
  word   propCapac1Max  =    0;    //Max moisture measured in sequence by CAPAC1
  word   propCapac2;                               //Moisture measured by CAPAC2
  word   propCapac2Min  = 1023;    //Min moisture measured in sequence by CAPAC2
  word   propCapac2Max  =    0;    //Max moisture measured in sequence by CAPAC2
  word   propCapac3;                               //Moisture measured by CAPAC3
  word   propCapac3Min  = 1023;    //Min moisture measured in sequence by CAPAC3
  word   propCapac3Max  =    0;    //Max moisture measured in sequence by CAPAC3

  //Define VARIABLES -----------------------------------------------------------
  bool   ledOnBoardVal  = LOW;   //You choose HIGH=on or LOW=off for LED_BUILTIN
  byte   msWait         = 1;            //Test your patience during the test LED
  byte   brillance      = 0;     //Brightness of any color, just to test PWM LED
  byte   present        = 0;    //Used for oneWire, present = ds.reset() DS18B20
  byte   i;                   //Used for oneWire, loopcounter byte array DS18B20
  byte   data[12];            //Used for oneWire to store data read from DS18B20
  byte   type1_s        = 0;         //Type 0 = ok, except old DS1820=1, DS18B20
  byte   addr1[8];               //Array with first 8 bytes, inc/address DS18B20
  String inStri         = "No answer received";        //Default answer of ESP01

  char   zxa[5];             //Needed to convert float to sting for LAN ENC28J60
  char   zxb[5];             //Needed to convert float to sting for LAN ENC28J60
  char   zxc[5];             //Needed to convert float to sting for LAN ENC28J60
  char* incomingData;
  long   value          =   0;      //Value to process, received by LAN ENC28J60
  byte   value1         =  '0';    //Value least significant bit by LAN ENC28J60
  byte   value2         =  '0';       //Value to store, received by LAN ENC28J60
  byte   value3         =  '0';       //Value to store, received by LAN ENC28J60
  byte   value4         =  '0';     //Value most significant bit by LAN ENC28J60
  int    starthours1;                                 //Switch ON clock GROWLED1
  int    finishhours1;                               //Switch OFF clock GROWLED1
  int    starthours2;                                 //Switch ON clock GROWLED2
  int    finishhours2;                               //Switch OFF clock GROWLED2
  int    currenthour;      //Compare with starthours and finishhours for GROWLED
  word   readCounter    = 0;      //Read sensors if counted down to zero SENSORS
  word   readTimer      = 3800;   //Fill readCounter after reaching zero SENSORS
  String receiveStr     = "";               //Commands received by html INTERNET
  String commandStr     = "";               //Commands received by html INTERNET
  int    panel          =  1;                                 //Panel to PERFORM
  char   commando       =  0;                               //Command to PERFORM
  String html           = "";                //Creating response string INTERNET
  word   bodyLength     = 0;          //Creating response string length INTERNET
  static unsigned long SwitchOFFtimer = millis()+ 300000;             //WATERING
  String tmpStr         = " ";                            //Can be used anywhere
  String tmp            = "";                             //Can be used anywhere
  String tempo          = "";                             //Can be used anywhere
  int    tmp1;                                            //Can be used anywhere
  int    tmp2;                                            //Can be used anywhere
  String dater          = "";                             //Can be used anywhere
  word   timerSprinkler =    0;   //Timer resets to zero at Day/Night change LDR
  int    currentMinute  =    0;  //If not equal time increase timerSprinkler LDR

  // **** ETHERNET SETTING DOMOTICZ ****
  word   domoCounter    = 10000;     //Set sendDomoticz if counted down DOMOTICZ
  word   domoTimer      = 10000; //Run sendDomoticz after reaching zero DOMOTICZ
  static uint8_t mac[]  = {0x00,0x01,0x02,0x03,0x04,0x08}; //Unique LAN ENC28J60
  String domoticz       = "";                //Creating response string INTERNET
  const char * domoticz_server_ip = "192.168.2.24"; // IP Adres (or name) of server to dump Domoticz data to
  int port = 8080;                               //Domoticz port
  int idx = 26;                                   //IDX for this virtual sensor, found in Setup -> Devices

  
  //Initialise objects ---------------------------------------------------------
  EthernetServer server(80); 
  EthernetClient client;                           //Start ethernet LAN ENC28J60
  DHT dht(DHTPIN, DHTTYPE);                     //Initialize sensor object DHT22
  DS1307 rtc;                         //Initialize Real Time Clock object DS1307
//END OF PRECOMPILER OPTIONS ---------------------------------------------------



void setup() { // **************************************************************
  disable_jtag();         //Disable jtag to free port C, enabled by default JTAG
  Serial.begin(115200);       //Nothing more needed for the Serial Monitor RS232
  Serial.println(" ");                    //Show the user the setup starts RS232
  Serial.println("Setup start");          //Show the user the setup starts RS232
  
  //EEPROMfirstTime();                    //First time use, set values in EEPROM
  calculateGrowLED1();              //Calculate start and finisch clock GROWLED1
  
  pinMode(LED_BUILTIN, OUTPUT);  //Arduino boards contain an onboard LED_BUILTIN
  pinMode(buzActPin, OUTPUT);                 //Set this pin as output to BUZZER
  pinMode(ledRedPin, OUTPUT);                 //Set this pin as output to redLED
  pinMode(ledBluPin, OUTPUT);                //Set this pin as output to blueLED
  pinMode(ledGrePin, OUTPUT);               //Set this pin as output to greenLED
  pinMode(lightPin, OUTPUT);                  //Set this pin as output to RELAY1


  //Start objects --------------------------------------------------------------
  Serial.println("Start DHT22");                           //Show the user RS232
  dht.begin();                               //Start sensor object running DHT22

  
  Serial.println("Start DS1307");                          //Show the user RS232
  Wire.begin();                 //Start the Two Wire Interface object I2C DS1307
  rtc.begin();    //Initialize Wire.begin first. Start the object running DS1307
  //rtc.adjust(DateTime(__DATE__, __TIME__));      //Set to time compiled DS1307
  
  Serial.println("Start Ethernet 0");                      //Show the user RS232
  Ethernet.begin(mac);                                            //LAN ENC28J60
  server.begin();
   
  Serial.println("Start DS1820");                          //Show the user RS232
  DS1820_init();      //Determins the type of DS1820 and reads properties DS1820
  //Test hardware and software -------------------------------------------------
  
  Serial.println("Start Tests");                           //Show the user RS232
  show_LAN();                                       //Shows DHCP settings of LAN
  test_LEDs();            //PWM fade in and fade out for all 4 LEDs on board LED
  //test_RELAY();                          //Switches ON for 2 seconds the RELAY
  Serial.println("Setup completed");     //Show the user the setup is done RS232
  beep(1);                        //Create a test beep with KY-012 active BUZZER
} //End of setup ---------------------------------------------------------------




void loop() { //KEEP ON RUNNING THIS LOOP FOREVER  *****************************
  readClock();       //Reading the time and format results into variables DS1307
  readSensors();          //Read several sensors at timed intervals only SENSORS
  sendDomoticz();                        //Write measurements to Domoticz server
  checkBuffer();              //Check if valid tcp data is received LAN ENC28J60
} //End of void loop() ----------------------- KEEP ON RUNNING THIS LOOP FOREVER




void checkBuffer() { //Check if valid tcp data is received LAN ENC28J60 ********
  EthernetClient client = server.available();     // listen for incoming clients
  if (client){  
    Serial.println("-> Nieuwe Verbinding");
    receiveStr = "";
    boolean currentLineIsBlank = true; // een http request eindigt met een lege regel
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        receiveStr += c;
        // als je aan het einde van een regel bent (newline karakter ontvangen)
        // en de regel is leeg, dan zijn we aan het einde van een HTTP request gekomen,
        // en kunnen we een antwoord sturen
        if (c == '\n' && currentLineIsBlank) {
          performCommand();              //Do as the user commands us to act
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Pragma: no-cache");
          client.println(""); 
          client.println(html);
          break;
        } //End of if (c == '\n' && currentLineIsBlank)
        if (c == '\n') { // We beginnen met een nieuwe regel
          currentLineIsBlank = true;
        }else if (c != '\r') { // we ontvingen een karakter (niet einde regel)
          currentLineIsBlank = false;
        } //End of if (c == '\n')
      } //End of if (client.available())
    } //End of while (client.connected())
    delay(10);    // geef de browser tijd om de data te ontvangen
    client.stop();     // sluit de verbinding:
    Serial.println(receiveStr);
    Serial.println("Einde verbinding");
  } //End of if (client)
} //Exit checkBuffer -----------------------------------------------------------





void sendDomoticz(){ //Write measurements to Domoticz server *******************
  if (domoCounter == 0){       //Only perform measurements if counted down TIMER
    domoCounter = domoTimer;                           //RESET the counter TIMER
    if (client.connect(domoticz_server_ip, port)) {    //If connection available
      digitalWrite(ledBluPin, HIGH);            //BLUE HIGH=on, LOW=off BLUE LED
      //Serial.println(domoticz);
      //client.println(domoticz); 
      Serial.println("-> Send Domoticz data");             //Make a HTTP request
        client.print("GET /json.htm?type=command&param=udevice&idx=");
        client.print(idx);
        client.print("&nvalue=0&svalue=");
        client.print(propAirTemp);
        client.print(";");
        client.print(propAirHum);
        client.print(";3");     //HUM_STAT 0=Normal, 1=Comfortable, 2=Dry, 3=Wet
        client.println(" HTTP/1.1");
        client.print("Host: ");
        client.print(domoticz_server_ip);
        client.print(":");
        client.println(port);
        client.println("User-Agent: Arduino-ethernet");
        client.println("Connection: close");
        client.println();
        client.stop();
        digitalWrite(ledBluPin, LOW);           //Blue HIGH=on, LOW=off BLUE LED
      }else{
        Serial.println("--> connection failed/n");        //Report no connection
      } //End of if (client.connect(domoticz_server_ip, port))
  }else{                                //Meaning counter was not yet zero TIMER
    domoCounter--;                        //Decrement of the timer counter TIMER
  } //End of if (domoCounter == 0)Perform action if counted down           TIMER
} //Exit sendDomoticz ----------------------------------------------------------






void readClock(){ //Read timestamp and write results into variables DS1307 *****
  DateTime now = rtc.now();                           //Read clock object DS1307
  jaar = now.year();            //Needed to http respond the right date and time
  maand = now.month();          //Needed to http respond the right date and time
  dag = now.day();              //Needed to http respond the right date and time
  uur = now.hour();             //Needed to http respond the right date and time
  minuut = now.minute();            //Needed to http respond and watering switch
  seconde = now.second();       //Needed to http respond the right date and time
} //Exit readClock -------------------------------------------------------------






void readSensors() { //Read several sensors at timed intervals only ************
  if (readCounter == 0){       //Only perform measurements if counted down TIMER
    readCounter  =  readTimer;                         //RESET the counter TIMER

    analogWrite(ledGrePin, 5);              //Green HIGH=on, LOW=off activityLED
    DS1820_read();               //Reads the temperature in Celsius from DS18B20
    propAirTemp = dht.readTemperature();     //Read temperature as Celsius DHT22
    propAirHum = dht.readHumidity();      //Reading takes 250 milliseconds DHT22

    propCapac1 = analogRead(moistPin);        //Moisture measured by CAPACATIVE1
    if (propCapac1 < propCapac1Min){       //Do some statistics MOISTURE MINIMUM
      propCapac1Min = propCapac1;                         //Set MOISTURE MINIMUM
    }                                      //Do some statistics MOISTURE MINIMUM
    if (propCapac1 > propCapac1Max){       //Compare statistics MOISTURE MAXIMUM
      propCapac1Max = propCapac1;                         //Set MOISTURE MAXIMUM
    } //End of  if (propCapac1 > propCapacMax)  Some statistics MOISTURE MAXIMUM

    propCapac2 = analogRead(moist2Pin);       //Moisture measured by CAPACATIVE2
    if (propCapac2 < propCapac2Min){       //Do some statistics MOISTURE MINIMUM
      propCapac2Min = propCapac2;                         //Set MOISTURE MINIMUM
    }                                      //Do some statistics MOISTURE MINIMUM
    if (propCapac2 > propCapac2Max){       //Compare statistics MOISTURE MAXIMUM
      propCapac2Max = propCapac2;                         //Set MOISTURE MAXIMUM
    } //End of  if (propCapac2 > propCapac2Max) Some statistics MOISTURE MAXIMUM

    propCapac3 = analogRead(moist3Pin);       //Moisture measured by CAPACATIVE3
    if (propCapac3 < propCapac3Min){       //Do some statistics MOISTURE MINIMUM
      propCapac3Min = propCapac3;                         //Set MOISTURE MINIMUM
    }                                      //Do some statistics MOISTURE MINIMUM
    if (propCapac3 > propCapac3Max){       //Compare statistics MOISTURE MAXIMUM
      propCapac3Max = propCapac3;                         //Set MOISTURE MAXIMUM
    } //End of  if (propCapac2 > propCapac2Max) Some statistics MOISTURE MAXIMUM

    setActuators();                              //Calculate and set all OUTPUTS
    refreshAnswer();                  //Replace the old answer by a new one WIFI
    refreshMessage();           //Refresh the push message by a new one DOMOTICZ
    Serial.println(html);                      //Show activity to the user RS232
    digitalWrite(ledGrePin, LOW);            //Blue HIGH=on, LOW=off activityLED
  }else{                                //Meaning counter was not yet zero TIMER
    readCounter--;                        //Decrement of the timer counter TIMER
  } //End of if (moistureCnt1 == 0)Perform measurements if counted down    TIMER
} //Exit readSensors -----------------------------------------------------------




void refreshMessage(void) { //Refresh the push message by a new one DOMOTICZ ***
   domoticz  = "GET /json.htm?type=command&param=udevice&idx=";        //Request
   domoticz += String(idx);                          //Device number in domoticz
   domoticz += "&nvalue=0&svalue=";                                    //Request
   domoticz += String(propAirTemp); 
   domoticz += ";";
   domoticz += String(propAirHum);
   domoticz += ";0";
   domoticz += " HTTP/1.1\n";
   domoticz += "Host: ";
   domoticz += domoticz_server_ip;
   domoticz += ":";
   domoticz += port;
   domoticz += "\n";
   domoticz += "User-Agent: Arduino-ethernet\n";
   domoticz += "Connection: close\n";
} //Exit refreshMessage ---------------------------------------------------------



void refreshAnswer(void) { //Replace the old answer by a new one WIFI **********
  html  = String(jaar) + " ";                                        //Timestamp
  html += String(maand) + " ";                                       //Timestamp
  html += String(dag) + " ";                                         //Timestamp
  html += String(uur) + " ";                                         //Timestamp
  html += String(minuut) + " ";                                      //Timestamp
  html += String(seconde) + " ";                                     //Timestamp
  html += String(tempDS18B20) + " ";            //Temperature in Celcius DS18B20
  html += String(heaterStatus) + " "; //Status HIGH=off LOW=on VERWARMING RELAY1
  html += String(progHeater) + " ";        //VERWARMING 1=off 2=auto 3=on RELAY1
  html += String(tempOn) + " ";       //Temperature Celcius verwarming ON RELAY1
  html += String(tempOff) + " ";     //Temperature Celcius verwarming OFF RELAY1
  html += String(lightStatus) + " "; //Status HIGH=off LOW=on VERLICHTING RELAY2
  html += String(progLed) + " ";          //VERLICHTING 1=off 2=aut 3=off RELAY2
  html += String(hoursLed) + " ";       //Hours around 13:00h VERLICHTING RELAY2
  html += String(freqMeasSec) + " ";        //How often will the sensors be read
  html += String(propAirTemp) + " ";
  html += String(propAirHum) + " ";
  html += String(propCapac1) + " "; 
  html += String(propCapac1Min) + " ";
  html += String(propCapac1Max) + " ";
  html += String(propCapac2) + " "; 
  html += String(propCapac2Min) + " "; 
  html += String(propCapac2Max) + " ";
  html += String(propCapac3) + " "; 
  html += String(propCapac3Min) + " "; 
  html += String(propCapac3Max); 
} //Exit refreshAnswer ---------------------------------------------------------




void performCommand() { //Do as the user commands us to act ********************
  tmpStr = receiveStr.substring(7, 8);                   //Extract command 01-99
  panel = tmpStr.toInt();               //Translate the function to a executable
  if (panel > 0){
    Serial.println(panel);                  //Showing we handeld a request RS232
    tmpStr = receiveStr.substring(9, 10);                //Extract command 01-99
    commando = tmpStr.toInt();          //Translate the function to a executable
    tmpStr = receiveStr.substring(11,15);                 //Extract value 01-255
    value = tmpStr.toInt();       //Translate into a temerature or hours setting
   
    Serial.print("-");                      //Showing we handeld a request RS232
    Serial.print(receiveStr);               //Showing we handeld a request RS232
    Serial.print("-");                      //Showing we handeld a request RS232
    Serial.print(panel);                    //Showing we handeld a request RS232
    Serial.print("-");                      //Showing we handeld a request RS232
    Serial.print(commando + 48);            //Showing we handeld a request RS232
    Serial.println("-");                    //Showing we handeld a request RS232
    switch (panel) {    //Go to the according panel /flora/includes/florabot.php

    case 1: //==================================== Command panel 1 = DS1307 KLOK
      switch (commando) {                        //Go to the according procedure
        
        case 1:                            //Adjust clock with given time DS1307
          tmpStr = receiveStr.substring(11, 15);             //Extract 0000-9999
          jaar = tmpStr.toInt();                //Translate the data into a year
          tmpStr = receiveStr.substring(16, 18);                 //Extract 01-12
          maand = tmpStr.toInt();              //Translate the data into a month
          tmpStr = receiveStr.substring(19, 21);                 //Extract 01-31
          dag = tmpStr.toInt();                  //Translate the data into a day
          tmpStr = receiveStr.substring(22, 24);                 //Extract 00-23
          uur = tmpStr.toInt();                 //Translate the data into a hour
          tmpStr = receiveStr.substring(25, 27);                 //Extract 00-59
          minuut = tmpStr.toInt();            //Translate the data into a minute
          tmpStr = receiveStr.substring(28, 30);                 //Extract 00-59
          seconde = tmpStr.toInt();          //Translate the data into a seconds
          Serial.println("YES");            //Showing we handeld a request RS232
          Serial.println(uur);                           //Showing data at RS232
          Serial.println(minuut);                        //Showing data at RS232
          Serial.println(seconde);                       //Showing data at RS232
          rtc.adjust(DateTime(jaar, maand, dag, uur, minuut, seconde)); //DS1307
          setActuators();                        //Calculate and set all OUTPUTS
          showCommand();                  //Show command as received by HTML LAN
        break;                     //case 1: Adjust clock with given time DS1307

      } //End of switch (commando)                 Go to the according procedure
    break;                                       //Command panel 1 = DS1307 KLOK




    case 2: //===================================== Command panel 2 = VERWARMING
      switch (commando) {                        //Go to the according procedure

        case 1:                                //Set program 1 => VERWARMING off
          progHeater = 1;              //0=unknown, 1=off, 2=auto, 3=on, set OFF
          EEPROM.write(1, 1);                         //Write 1 byte into EEPROM
          setRelay1();                                //Calculate and set RELAY1
        break;                         //case 1: Set program 1 => VERWARMING off

        case 2:                               //Set program 2 => VERWARMING auto
          progHeater = 2;             //0=unknown, 1=off, 2=auto, 3=on, set AUTO
          EEPROM.write(1, 2);                         //Write 1 byte into EEPROM
          setRelay1();                                //Calculate and set RELAY1
        break;                        //case 2: Set program 2 => VERWARMING auto

        case 3:                                 //Set program 3 => VERWARMING on
          progHeater = 3;               //0=unknown, 1=off, 2=auto, 3=on, set ON
          EEPROM.write(1, 3);                         //Write 1 byte into EEPROM
          setRelay1();                                //Calculate and set RELAY1
        break;                          //case 3: Set program 3 => VERWARMING on
        
        case 4:                           //Set aanschakeltemperatuur VERWARMING
          tempOn = value;                                       //Set to reading
          EEPROM.write(2, tempOn);                    //Write 1 byte into EEPROM
          setRelay1();                                //Calculate and set RELAY1
        break;                                     //case 4 => Set hours per day

        case 5:                           //Set uitschakeltemperatuur VERWARMING
          tempOff = value;                                      //Set to reading
          EEPROM.write(3, tempOff);                   //Write 1 byte into EEPROM
          setRelay1();                                //Calculate and set RELAY1
        break;                                     //case 4 => Set hours per day
        
      } //End of switch (commando)                 Go to the according procedure
    break;                                        //Command panel 3 = VERWARMING




    case 3: //==================================== Command panel 3 = VERLICHTING
      switch (commando) {                        //Go to the according procedure

        case 1:                               //Set program 1 => VERLICHTING off
          progLed = 1;                 //0=unknown, 1=off, 2=auto, 3=on, set OFF
          EEPROM.write(4, 1);                         //Write 1 byte into EEPROM
          setRelay2();                                //Calculate and set RELAY2
        break;                        //case 1: Set program 1 => VERLICHTING off

        case 2:                              //Set program 2 => VERLICHTING auto
          progLed = 2;                //0=unknown, 1=off, 2=auto, 3=on, set AUTO
          EEPROM.write(4, 2);                         //Write 1 byte into EEPROM
          setRelay2();                                //Calculate and set RELAY2
        break;                       //case 2: Set program 2 => VERLICHTING auto

        case 3:                                //Set program 3 => VERLICHTING on
          progLed = 3;                  //0=unknown, 1=off, 2=auto, 3=on, set ON
          EEPROM.write(4, 3);                         //Write 1 byte into EEPROM
          setRelay2();                                //Calculate and set RELAY2
        break;                         //case 3: Set program 3 => VERLICHTING on
        
          case 4:                                            //Set hours per day
            hoursLed = value;                                   //Set to reading
            EEPROM.write(5, hoursLed);                //Write 1 byte into EEPROM
            calculateGrowLED1();  //Calculate start and finisch time VERLICHTING
            setRelay2();                              //Calculate and set RELAY2
          break;                                   //case 4 => Set hours per day
          
        } //End of switch (commando)               Go to the according procedure
      break;                                     //Command panel 3 = VERLICHTING
      Serial.println("Panel afgewerkt. Niet per se een herkend panel.");
    } //End of switch (panel)   the according panel /flora/includes/florabot.php
  } //End of if (panel > 0)
  refreshAnswer();                         //Replace the old answer by a new one
} //Exit performCommand --------------------------------------------------------





void setActuators(){ //Calculate and set all OUTPUTS ***************************
  setRelay1();                         //HEATER switch, calculate and set RELAY1  
  setRelay2();                    //VERLICHTING switch, calculate and set RELAY2
} //Exit setActuators ----------------------------------------------------------




void setRelay1(){ //HEATER switch, calculate and set RELAY1 ********************
  switch (progHeater) {               //HEATER program: 1=off 2=auto 3=on RELAY1
    
    case 1:                      //Program = 1 = Set program  VERWARMINGSMAT OFF
      heaterStatus = LOW;        //Status HIGH=on, LOW=on VERWARMINGSMAT RELAIS1
    break;                //End of Program = 1 = Set program  VERWARMINGSMAT OFF

    case 2:                      //Program = 3 = Set program VERWARMINGSMAT AUTO
      if (tempDS18B20 < tempOn){               //If treshold measurement TURN ON
        heaterStatus = HIGH;        //Status HIGH=off or LOW=on HEATER ON RELAY1
      } //End of                                 If treshold measurement TURN ON
      if (tempDS18B20 > tempOff){             //If treshold measurement TURN OFF
        heaterStatus = LOW;         //Status HIGH=off or LOW=on HEATER ON RELAY1
      } //End of                                If treshold measurement TURN OFF
    break;                   //End of Program = 2 = Set program COIL HEATER AUTO

    case 3:                       //Program = 3 = Set program  VERWARMINGSMAT ON
      heaterStatus = HIGH;    //Status HIGH=off or LOW=on  VERWARMINGSMAT RELAY3
    break;                 //End of Program = 3 = Set program  VERWARMINGSMAT ON
  }                                                       //End of switch HEATER
  digitalWrite(heaterPin, heaterStatus);                       //Switches RELAY1
} //Exit setRelay1 -------------------------------------------------------------





void setRelay2(){ //VERLICHTING switch, calculate and set RELAY2 ***************
  switch (progLed) {             //VERLICHTING program: 1=off 2=auto 3=on RELAY2
    
    case 1:                          //Program = 1 = Set program VERLICHTING OFF
      lightStatus = LOW;          //Status HIGH=on or LOW=off VERLICHTING RELAY2
    break; //Case 1             End of Program = 1 = Set program VERLICHTING OFF

    case 2:                         //Program = 2 = Set program VERLICHTING AUTO
      if (uur < starthours1){                       //Too early, VERLICHTING OFF
         lightStatus = LOW;      //Switch OFF HIGH=on or LOW=off VERLICHTING OFF
      } //End of if (uur < starthours){             //Too early, VERLICHTING OFF
      
      if (uur >= finishhours1){                      //Too late, VERLICHTING OFF
         lightStatus = LOW;      //Switch OFF HIGH=on or LOW=off VERLICHTING OFF
      } //End of if (uur > finishhours)                Too late, VERLICHTING OFF
      
      if (uur > (starthours1-1) && uur <(finishhours1)){                    //ON
         lightStatus = HIGH;       //Switch ON HIGH=on or LOW=off VERLICHTING ON
      } //End of  if (currenthour > (starthours-1) && currenthour <(finishhours)
    break; //Case 3            End of Program = 2 = Set program VERLICHTING AUTO

    case 3:                           //Program = 3 = Set program VERLICHTING ON
      lightStatus = HIGH;         //Status HIGH=on or LOW=off VERLICHTING RELAY2
    break; //Case 2              End of Program = 3 = Set program VERLICHTING ON
    
  }                                                  //End of switch VERLICHTING
  digitalWrite(lightPin, lightStatus);                         //Switches RELAY2
} //Exit setRelay2 -------------------------------------------------------------


void DS1820_read(void) { //Reads the temperature from DS1820 in Celsius ********
  term1.reset();                              //Reset whatever still was running
  term1.select(addr1);                      //Set the parameters for the library
  term1.write(0x44);       //Start conversion, with parasite power on at the end
  delay(800);     //Maybe 750ms is enough, maybe not, takes a lot of time though
  present = term1.reset();              //We assume that the conversion is ready
  term1.select(addr1);                      //Set the parameters for the library
  term1.write(0xBE);                                          // Read Scratchpad
  for ( i = 0; i < 9; i++) {                                   //We need 9 bytes
    data[i] = term1.read();                                  //Read byte by byte
  }                                                       //End of reading bytes
  int16_t raw = (data[1] << 8) | data[0];                      //Rotate the data
  tempDS18B20 = (float)raw / 16.0;    //Untill they are in the correct position
} //Exit DS1820_read -----------------------------------------------------------





void DS1820_init(void) { //Determins the type of DS1820 thermometer1 ***********
  if (!term1.search(addr1)) {            //Term1 is an objest created by ONEWIRE
    term1.reset_search();                  //So if the variables are still empty
    delay(250);          //The variables must be filled and that costs some time
    return;                               //Are you sure any DS1820 is connected
  }                                           //End of if (!term1.search(addr1))
  if (OneWire::crc8(addr1, 7) != addr1[7]) {
      return;
  }
  switch (addr1[0]) {         //The first ROM byte indicates which  tupe of chip
    case 0x10:
      type1_s = 1;
      break;
    case 0x28:
      type1_s = 0;
      break;
    case 0x22:
      type1_s = 0;
      break;
    default:
      return;
  } 
  term1.reset();
  term1.select(addr1);
  term1.write(0x44, 1);    //Start conversion, with parasite power on at the end
  delay(800);     //Maybe 750ms is enough, maybe not, takes a lot of time though
  present = term1.reset();
  term1.select(addr1);    
  term1.write(0xBE);                                           //Read Scratchpad
  for ( i = 0; i < 9; i++) {                                   //We need 9 bytes
    data[i] = term1.read();
  }

  int16_t raw = (data[1] << 8) | data[0];
  if (type1_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {       // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {     //// default is 12 bit resolution, 750 ms conversion time
    byte cfg = (data[4] & 0x60);     
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
  }
  tempDS18B20 = (float)raw / 16.0;
} //Exit DS1820_init -----------------------------------------------------------



void showCommand(){ //Show command as received by HTML LAN *********************
      Serial.println(value);                                      //LAN ENC28J60
      Serial.println(" +-");
      Serial.print(incomingData);
      Serial.print("-");
      Serial.print(panel);
      Serial.print("-");
      Serial.print(commando);
      Serial.print("-");
      Serial.print(value);
      Serial.print("+");
      
      Serial.print(jaar);
      Serial.print("/");
      Serial.print(maand);
      Serial.print("/");
      Serial.print(dag);

      Serial.print("+");
      Serial.print(uur);
      Serial.print(":");
      Serial.print(minuut);
      Serial.print(":");
      Serial.print(seconde);
            
      Serial.println("-+");
      //beep(1);                  //Create a test beep with KY-012 active BUZZER
} //Exit showCommand -----------------------------------------------------------



void show_LAN(){ //Shows DHCP settings of LAN **********************************
  
  Serial.println("Tweaking4All.com - Temperature Drone - v2.0");
  Serial.println("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
  Serial.print("IP Address        : ");
  Serial.println(Ethernet.localIP());
  Serial.print("Subnet Mask       : ");
  Serial.println(Ethernet.subnetMask());
  Serial.print("Default Gateway IP: ");
  Serial.println(Ethernet.gatewayIP());
  Serial.print("DNS Server IP     : ");
  Serial.println(Ethernet.dnsServerIP());
  
  /*
  ether.printIp("My IP: ", ether.myip);
  ether.printIp("Netmask: ", ether.netmask);
  ether.printIp("GW IP: ", ether.gwip);
  ether.printIp("DNS IP: ", ether.dnsip);
  */
} //Exit show_LAN --------------------------------------------------------------



void calculateGrowLED1() {        //Calculate start and finish clock VERLICHTING
  starthours1  = 13 - (hoursLed / 2);     //Calculate switch ON time VERLICHTING
  finishhours1 = 13 + (hoursLed / 2);    //Calculate switch OFF time VERLICHTING
} //Exit calculateGrowLED1 -----------------------------------------------------



void EEPROMfirstTime() { //First time use, set values in EEPROM ****************
  EEPROM.write(1, 1);        //GROEILED current program 1=off 2=on 3=auto RELAY1
  EEPROM.write(2, 18);             //Number of hours around noon groeiled RELAY1
} //Exit EEPROMfirstTime -------------------------------------------------------



void test_RELAY(){ //Switches ON for 2 seconds all RELAY ***********************
  digitalWrite(lightPin, HIGH);                    //Switches ON the VERLICHTING
  delay (2000);                                             //Wait for 2 seconds
  digitalWrite(lightPin, LOW);                    //Switches OFF the VERLICHTING
} //End of test_Relay(){ Switches ON for 2 seconds the RELAY -------------------




void test_LEDs(void){ //PWM fade in and fade out for all 4 LEDs on board *******
  brillance = 0;                 //Brightness of any color, just to test PWM LED

  while (brillance<255){
    analogWrite(ledRedPin, brillance);        //Set LED to desired PWM value RED
    brillance++;
    delay (msWait);
  }
  while (brillance>0){
    analogWrite(ledRedPin, brillance);        //Set LED to desired PWM value RED
    brillance--;
    delay (msWait);
  }
  analogWrite(ledRedPin, 0);            //Set LED to desired PWM value = off RED

  while (brillance<255){
    analogWrite(ledGrePin, brillance);      //Set LED to desired PWM value GREEN
    brillance++;
    delay (msWait);
  }
  while (brillance>0){
    analogWrite(ledGrePin, brillance);      //Set LED to desired PWM value GREEN
    brillance--;
    delay (msWait);
  }
  analogWrite(ledGrePin, 0);          //Set LED to desired PWM value = off GREEN

  while (brillance<255){
    analogWrite(ledBluPin, brillance);       //Set LED to desired PWM value BLUE
    brillance++;
    delay (msWait);
  }
  while (brillance>0){
    analogWrite(ledBluPin, brillance);       //Set LED to desired PWM value BLUE
    brillance--;
    delay (msWait);
  }
  analogWrite(ledBluPin, 0);           //Set LED to desired PWM value = off BLUE

  while (brillance<255){
    analogWrite(LED_BUILTIN, brillance);  //Set to desired PWM value LED_BUILTIN
    brillance++;
    delay (msWait);
  }
  while (brillance>0){
    analogWrite(LED_BUILTIN, brillance);  //Set to desired PWM value LED_BUILTIN
    brillance--;
    delay (msWait);
  }
  analogWrite(LED_BUILTIN, 0);  //Set LED to desired PWM value = off LED_BUILTIN
} //Exit test_LEDs -------------------------------------------------------------



void beep(uint8_t ms) {      //Create a beep (x5ms) with KY-012 active BUZZER **
  digitalWrite(buzActPin,HIGH);                                 //Turn on BUZZER
  while (ms > 0){                     //Timer of the duration of the beep BUZZER
    delay(5);                                         //Wait milliseconds BUZZER
    ms--;                              //Countdown untill we reached zero BUZZER
  }                 //Timer of the duration has been counted down to zero BUZZER
  digitalWrite(buzActPin,LOW);                  //Turn annoying sound off BUZZER
} //Exit beep ------------------------------------------------------------------



void toggle_ledOnBoard(void){ //Toggles the LED_BUILTIN on-board LED on or off *
  ledOnBoardVal = !ledOnBoardVal;                                 //Toggle value
  digitalWrite(LED_BUILTIN, ledOnBoardVal);     //Set Arduino boards onboard LED
} //Exit toggle_ledBin ---------------------------------------------------------




void disable_jtag(void) { //Disable jtag to free port C, enabled by default ****
#if defined(JTD)                           //Not all AVR controller include jtag
  MCUCR |= ( 1 << JTD );                                //Write twice to disable
  MCUCR |= ( 1 << JTD );                                       //So stutter once
#endif                                            //End of conditional compiling
} //Exit jtag_disable ----------------------------------------------------------




////////////////////////////////////////////////////////////////////////////////
// PIN ALLOCATIONS TABLE ARDUINO MEGA 2560                                    //
// Board  -Atmel- PIN - Function          - External Connection          FUNC //
//                                                                            //
// CONNECTIONS RAILS RIGHT TOP: DIGITAL PWM<~> ****************************** //
// SCL    -  43 - PD0 - SCL/INT0          - Clock DS1307                  TWI //
// SDA    -  44 - PD1 - SDA/INT1          - Clock DS1307                  TWI //
// AREF   -  98 - REF - AREF              -                               REF //
// 13 PWM -  26 - PB7 - OC0A/OC1C/PCINT17 - LED Arduino LED_BUILTIN       PWM //
// 12 PWM -  25 - PB6 - OC1B/PCINT16      -                               PWM //
// 11 PWM -  24 - PB5 - OC1A/PCINT5       -                               PWM //
// 10 PWM -  23 - PB4 - OC2A/PCINT4       -                               PWM //
//  9 PWM -  18 - PH6 - OC2B              -                               PWM //
//  8 PWM -  17 - PH5 - OC4C              -                               PWM //
//                                                                            //
// CONNECTIONS RAILS RIGHT MIDDLE: DIGITAL PWM<~> *************************** //
//  7 PWM -  16 - PH4 - OC4B              -                               PWM //
//  6 PWM -  15 - PH3 - OC4A              -                               PWM //
//  5 PWM -   5 - PE3 - OC3A/AIN1         -                               PWM //
//  4 PWM -   1 - PG5 - OC0B              - DHT22 room temperature        PWM //
//  3 PWM -   7 - PE5 - OC3C/INT5         -                               INT //
//  2 PWM -   6 - PE4 - OC3B/INT4         -                               INT //
//  1 TX0 -   3 - PE1 - TXD0              - Serial monitor PC             TX0 //
//  0 RX0 -   2 - PE0 - RXD0/PCINT8       - Serial monitor PC             RX0 //
//                                                                            //
// CONNECTIONS RAILS RIGHT BOTTOM: DIGITAL PWM<~> *************************** //
// 14 TX3 -  64 - PJ1 - TXD3/PCINT10      -                               TX3 //
// 15 RX3 -  63 - PJ0 - RXD3/PCINT9       -                               RX3 //
// 16 TX2 -  13 - PH1 - TXD2              -                               TX2 //
// 17 RX2 -  12 - PH0 - RXD2              - DS18B20 Soil temperature      RX2 //
// 18 TX1 -  46 - PD3 - TXD1/INT3         -                               INT //
// 19 RX1 -  45 - PD2 - RXD1/INT2         -                               INT //
// 20 SDA -  44 - PD1 - SDA/INT1          - DS1307 I2C Clock              TWI //
// 21 SCL -  43 - PD0 - SCL/INT0          - DS1307 I2C Clock              TWI //
//                                                                            //
// CONNECTIONS RAILS LEFT TOP: POWER **************************************** //
// NC     -     -     -                   - Not Connected                     //
// IOREF  -     -     - 3.3/5Vdc          - Outputs controller voltage        //
// 5V     -   7 - VCC - VCC               -                               VCC //
// RES    -   1 - RES - PCINT14/RESET     -                               RES //
// 3.3V   -     -     -                   -                                   //
// 5V     -     -     -                   -                                   //
// GND    -     -     -                   -                                   //
// GND    -     -     -                   -                                   //
// Vin    -     -     - 7/9Vdc power in   -                                   //
//                                                                            //
// CONNECTIONS RAILS LEFT MIDDLE : ANALOG IN ******************************** //
// A0     -  97 - PF0 - ADC0              -                               ADC //
// A1     -  96 - PF1 - ADC1              -                               ADC //
// A2     -  95 - PF2 - ADC2              -                               ADC //
// A3     -  94 - PF3 - ADC3              -                               ADC //
// A4     -  93 - PF4 - ADC4/TCK          -                               ADC //
// A5     -  92 - PF5 - ADC5/TMS          -                               ADC //
// A6     -  91 - PF6 - ADC6/TDO          -                               ADC //
// A7     -  90 - PF7 - ADC7/TDI          - Buzzer activ                  ADC //
//                                                                            //
// CONNECTIONS RAILS LEFT BOTTOM: ANALOG IN ********************************* //
// A8     -  89 - PK0 - ADC8/PCINT16      - Moisture Capac 1              ADC //
// A9     -  88 - PK1 - ADC9/PCINT17      - Moisture Capac 2              ADC //
// A10    -  87 - PK2 - ADC10/PCINT18     - Moisture Capac 3              ADC //
// A11    -  86 - PK3 - ADC11/PCINT19     -                               ADC //
// A12    -  85 - PK4 - ADC12/PCINT20     -                               ADC //
// A13    -  84 - PK5 - ADC13/PCINT21     -                               ADC //
// A14    -  83 - PK6 - ADC14/PCINT22     -                               ADC //
// A15    -  82 - PK7 - ADC15/PCINT23     -                               ADC //
//                                                                            //
// CONNECTIONS DOUBLE RAILS BOTTOM ****************************************** //
// Board  -Atmel- PIN - Function          - External Connection          FUNC //
// 5V     -     - 5Vdc- 5Vdc              -                               VCC //
// 5V     -     - 5Vdc- 5Vdc              -                               VCC //
// 22     -  78 - PA0 - AD0               -                               DIO //
// 23     -  77 - PA1 - AD1               -                               DIO //
// 24     -  76 - PA2 - AD2               -                               DIO //
// 25     -  75 - PA3 - AD3               -                               DIO //
// 26     -  74 - PA4 - AD4               -                               DIO //
// 27     -  73 - PA5 - AD5               -                               DIO //
// 28     -  72 - PA6 - AD6               -                               DIO //
// 29     -  71 - PA7 - AD7               -                               DIO //
// 30     -  60 - PC7 - A14               -                               DIO //
// 31     -  59 - PC6 - A15               -                               DIO //
// 32     -  58 - PC5 - A13               -                               DIO //
// 33     -  57 - PC4 - A12               -                               DIO //
// 34     -  56 - PC3 - A11               - Relay1                        DIO //
// 35     -  55 - PC2 - A10               -                               DIO //
// 36     -  54 - PC1 - A9                - Relay2                        DIO //
// 37     -  53 - PC0 - A8                -                               DIO //
// 38     -  50 - PD7 - T0                - Relay3                        DIO //
// 39     -  70 - PG2 - ALE               -                               DIO //
// 40     -  52 - PG1 - RD                - Relay4                        DIO //
// 41     -  51 - PG0 - WR                -                               DIO //
// 42     -  42 - PL7 -                   -                               DIO //
// 43     -  41 - PL6 -                   -                               DIO //
// 44     -  40 - PL5 - OC5C              - 3 Color led Red               PWM //
// 45     -  39 - PL4 - OC5B              - 3 Color led Green             PWM //
// 46     -  38 - PL3 - OC5A              - 3 Color led Blue              PWM //
// 47     -  37 - PL2 - T5                -                               DIO //
// 48     -  36 - PL1 - ICP5              -                               DIO //
// 49     -  35 - PL0 - ICP4              -                               DIO //
// 50     -  22 - PB3 - MISO/PCINT3       - Lan ENC28J60                  SPI //
// 51     -  21 - PB2 - MOSI/PCINT2       - Lan ENC28J60                  SPI //
// 52     -  20 - PB1 - SCK/PCINT1        - Lan ENC28J60                  SPI //
// 53     -  19 - PB1 - SS/PCINT0         - Lan ENC28J60                  SPI //
// GND    -     - GND - GND               -                               GND //
// GND    -     - GND - GND               -                               GND //
////////////////////////////////////////////////////////////////////////////////




////////////////////////////////////////////////////////////////////////////////
// EEPROM MEMORY MAP:                                                         //
// Start End  Number Description                                              //
// 0000  0000      1   Never use this memory location to be AVR compatible    //
// 0001  0001      1 WATER propWaterProg program 1=off 2=on 3=auto     RELAY1 //
// 0002  0002      1   If capac1 reaches this propWaterON*10 then set  RELAY1 //
// 0003  0003      1   Number seconds*10 propWaterSecs water on        RELAY1 //
// 0004  0004      1 GROEILED1 propLED1Prog program 1=off 2=on 3=auto  RELAY2 //
// 0005  0005      1   Number of propLED1hours around noon groeiled1   RELAY2 //
// 0006  0006      1 VERWARMING propHeatProg program 1=off 2=on 3=auto RELAY3 //
// 0007  0007      1   propHeatON/10 (0-25,5) aanschakeltemperatuur    RELAY3 //
// 0008  0008      1   propHeatOFF/10 (0-25,5) uitschakeltemperatuur   RELAY3 //
// 0009  0009      1 GROEILED2 propLED2prog program 1=off 2=on 3=auto  RELAY4 //
// 0010  0010      1   Number of propLED2hours around noon groeiled2   RELAY4 //
////////////////////////////////////////////////////////////////////////////////




//345678911234567892123456789312345678941234567895123456789612345678971234567898
////////////////////////////////////////////////////////////////////////////////
// FUSES (can always be altered by using the STK500)                          //
// On-Chip Debug Enabled: off                            (OCDEN=0)            //
// JTAG Interface Enabled: off                           (JTAGEN=0)           //
// Preserve EEPROM mem through the Chip Erase cycle: On  (EESAVE = 0)         //
// Boot Flash section = 2048 words, Boot startaddr=$3800 (BOOTSZ=00)          //
// Boot Reset vector Enabled, default address=$0000      (BOOTSTR=0)          //
// CKOPT fuse (operation dependent of CKSEL fuses        (CKOPT=0)            //
// Brown-out detection level at VCC=2,7V;                (BODLEVEL=0)         //
// Ext. Cr/Res High Freq.; Start-up time: 16K CK + 64 ms (CKSEL=1111 SUT=11)  //
//                                                                            //
// LOCKBITS (are dangerous to change, since they cannot be reset)             //
// Mode 1: No memory lock features enabled                                    //
// Application Protect Mode 1: No lock on SPM and LPM in Application Section  //
// Boot Loader Protect Mode 1: No lock on SPM and LPM in Boot Loader Section  //
////////////////////////////////////////////////////////////////////////////////