//1
#include "RTClib.h"
RTC_DS1307 rtc;
DateTime now;
byte hrs, mins, secs;

#define KI 10 // коефицент для силы тока
const float BETA = 3950; // should match the Beta Coefficient of the thermistor

#define PIN_SPump 2

#define PIN_R0 3 // relay N
#define PIN_R1 4 //rel1
#define PIN_R2 5 //rel2
#define PIN_R3 6 //rel3
#define PIN_R4 7 //rel4
#define CELSIUS_MULT 64
#define CELSIUS_MULT_F 64.0
#define PIN_ESP A3

char Tempr; //
char TemprBuf;
enum KeyType { _DTempr1,_DTempr2,_DR0,_DR1,_DR2,_DR3,_DR4,//setDay
               _NTempr1,_NTempr2,_NR0,_NR1,_NR2,_NR3,_NR4,//set Night
               _Tempr1,_Tempr2,_R0,_R1,_R2,_R3,_R4, // State
               _Tin,_Tin2,_Tout,_Twt,_pzmI,_pzmU,_pzmF,_pzmP,_Ipump,_I0,_I1,_I2, //sens int
               _Esp,_Day,_v220,_Pump,_hr,_mn,_sc, //Sens boolean
               _SetDay,_SetNight,_Sens,_Counters,_GetSet,
               _noneKey } Key;

enum eventType {_none,_lcd,_sensor,_state,_rel,_calcAverage,_sendSerial,_relSwitch,_sendSettings};
volatile eventType Event;
struct CounterPack {
 
unsigned int P0; // Wt общее потребление
unsigned int P1; // Wt потребление насоса
unsigned int P2; // Wt потребление нагревателей

         int tick;
} Counter;

struct SensPack {
     float Tin;
     float Tin2;
     int Tout;
     int Twt;
     int pzmI; // общая
     int pzmU; 
     int pzmF;
     int pzmP;
     int Ipump; // НАСОС
     int Icontr; //  УПРАВЛЯЕМАЯ НАРГУЗКА БЕЗ НАСОСА
     int I0; // Wt общее потребление
     int I1; // Wt потребление насоса
     int I2; // Wt потребление нагревателей
 boolean Day;
 boolean Esp;
 boolean v220;
 boolean Pump;
 boolean R0;
 boolean R1;
 boolean R2;
 boolean R3;
 boolean R4;
 byte hr;
 byte mn;
 byte sc;
  
} Sens;

SensPack SensBuf;

volatile boolean ScreenNeedUpdate=true;
volatile boolean RPump=0;
volatile boolean RelNeedUpdate=false;
volatile boolean StateNeedUpdate=false;
volatile boolean SetUpdate=0;
         boolean RTempr;
         boolean RTime;
         boolean RHeatUp;
         boolean RBuf;

boolean R0Invert=0;
//boolean R0=1;
//boolean R1=1;
//boolean R2=1;
//boolean R3=0;
//boolean R4=1;

//enum RelType {_tmax,_r0,_r1,_r2,_r3,_r4}
//const byte N=10
//boolean Rel[N]

struct RelStruct {
      int Tempr1;
      int Tempr2;
  boolean Day;
  boolean RTempr1;
  boolean RTempr2;
  boolean R0;
  boolean R1;
  boolean R2;
  boolean R3;
  boolean R4;
  //   byte R1switch;
  //   byte R2switch;
  //   byte R3switch;
  //   byte R4switch;
} ;

boolean R2switch=0;
boolean R3switch=0;
boolean R4switch=0;

RelStruct State; //current state
RelStruct Set; //curent settings
RelStruct SetDay;
RelStruct SetNight;
RelStruct StateBuf;

unsigned long Tmr;
              int TmInterval=500;
unsigned long TmrTick;
          
unsigned long TmrSensor;
          int TmSensor=1000;
unsigned long TmrSwitch;
          int TmSwitch=3000;
unsigned long TmrSend;
          int TmSend=2000; // sec

int TickCounter=0;
int Sendcounter=0;
int IntervalSend=3;

//int SwitchCounter=0;
byte RelSwitch=0;
boolean Anim=false;
boolean Day=true;
//#define PIN_Day 13 //
String Str="";

void SensorRead();
void SendCounters(); //serialTransfer.h
#include "sensor.h"


#include "myLCD.h"
#include "serialTransfer.h"

void initDate();

void setup()
{ 
  
   
     
myLCDSetup();

  Serial.begin(9600);
  Serial.println("Start");

initDate();
sensorSetup(); 


pinMode(PIN_SPump, INPUT_PULLUP);
pinMode(PIN_ESP, INPUT);

pinMode(PIN_R0, OUTPUT); // rel1
pinMode(PIN_R1, OUTPUT); // rel1
pinMode(PIN_R2, OUTPUT); //rel2
pinMode(PIN_R3, OUTPUT);
pinMode(PIN_R4, OUTPUT);

Event=_none;
//HeatUp=1;
//RPump=digitalRead(PIN_SPump);
RPump=digitalRead(PIN_SPump);
SensorRead();
display();



RelUpdate();

attachInterrupt(0, R0Enable, CHANGE);
Tmr=millis();
TmrTick=Tmr;
//TmrSensor=Tmr;
//TmrSwitch=Tmr;
//TmrSend=Tmr;
}

void R0Enable()
{
if (!RPump) digitalWrite(PIN_R0,0);
RPump=digitalRead(PIN_SPump);
Event=_state;

}

void RelSwitchUpdate()
{
switch (RelSwitch) {
    case 0:
      R2switch=1;
      R3switch=0;
      R4switch=0;
      RelSwitch=1;
      break;
    case 1:
      R2switch=0;
      R3switch=1;
      R4switch=0;
      RelSwitch=2;
      break;
    case 2:
      R2switch=0;
      R3switch=0;
      R4switch=1;
      RelSwitch=0;
      break;
  }
R2switch=1;
R3switch=1;
R4switch=1;

}

int Tick=1000;

void loop()
{
//Event=_none;
SeralTick();

if ( (Tmr - TmrTick) >= Tick) { Event=getTimeEvent(); Anim=(!Anim); TmrTick=Tmr; }

switch (Event) {
case    _sensor : SensorRead(); 
                  StateUpdate(); 
                  RelSwitchUpdate(); //break;
                  display(); 
                  RelUpdate();
                  CountersUpdate();
                  //SendUpdate();
                  break;

case    _state : StateUpdate(); 
                  RelSwitchUpdate(); 
                  display(); 
                  RelUpdate();
                  //SendUpdate();
                  break;
case   _sendSettings:SendSingle(_SetDay);  
                  Event=_none;
                  break;


}


Tmr=millis();
}
void SPrint(RelStruct _R)
{
Serial.print("R0-5:"+String(_R.R0)+String(_R.R1)+String(_R.R2)+String(_R.R3)+String(_R.R4));
Serial.print("");


}


void initDate()
{ 
  SetDay.Day=1; 
  SetDay.Tempr1=11; 
  SetDay.Tempr1=12;
  SetDay.R0=1; //пушка вентилятор + 1,5квт
  SetDay.R1=0; //geirf + 1,5квт
  SetDay.R2=1; // котельная 400вт
  SetDay.R3=0; // комната 1эт 1квт
  SetDay.R4=1; // спальня 2эт 400вт
  SetDay.RTempr1=0; // ?
  SetDay.RTempr2=0;
 // SendSingle(_SetDay); 
  
  SetNight.Tempr1=20;
  SetNight.Tempr2=18;
  SetNight.Day=0;
  SetNight.R0=1; //пушка вентилятор + 1,5квт
  SetNight.R1=1; //geirf + 1,5квт
  SetNight.R2=1; // котельная 400вт
  SetNight.R3=1; // комната 1эт 1квт
  SetNight.R4=1; // спальня 2эт 400вт
  SetNight.RTempr1=0; // ?
  SetNight.RTempr2=0; 
 // SendSingle(_NTempr); SendSingle(_NR0); SendSingle(_NR1); SendSingle(_NR2); SendSingle(_NR3); SendSingle(_NR4);
 // Serial.println();


  
  //Set=SetDay;
  //State=SetDay;
  State.R0=0; 
  State.R1=0; 
  State.R2=0; 
  State.R3=0; 
  State.R4=0;  

Counter.tick=0;
Counter.P0=0; 

}


GND5VSDASCLSQWRTCDS1307+