#include <Wire.h> 
#include <Encoder.h>  // https://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <MsTimer2.h> // https://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>
#include <DHT.h> 
#include <LiquidCrystal_I2C.h> // -  http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
  OneWire oneWire(A0);//   18b20
  DHT dht(2, DHT22); //  DAT     2
  DallasTemperature temp(&oneWire);
  LiquidCrystal_I2C lcd(0x27,16,2);  //  
  Encoder myEnc(8, 9);//CLK, DT 

int buff[2],i,dig,arr[2],w,w1,reg,nakal,h_reg,h_rele,menu;
float k;
float gis=0.5; //  1 
unsigned long times,temp_time,oldPosition  = -999,newPosition;
 
void setup(){ Serial.begin(9600);Serial.setTimeout(50);
   temp.begin(); 
   temp.setResolution(11);//12  
   dht.begin(); 
   pinMode(10,INPUT);//   SW 
   Wire.begin();lcd.init();lcd.backlight();
   MsTimer2::set(3, to_Timer);MsTimer2::start();
   reg = EEPROM.read(0);h_reg = EEPROM.read(1);
   pinMode(12, OUTPUT); //   . .
   pinMode(11, OUTPUT); //   . .
}
 
void loop() {
  ///// DHT 
  byte h = dht.readHumidity();// 
  //h = 45;
  ///////    SERIAL PORT /////////////////////////
  while (Serial.available()>0){ 
   for (i=0;i<1;i++) { 
     buff[0] = Serial.parseInt(); 
     buff[1] = Serial.parseInt();}    
     w=1;w1=1;times=millis();}
 
 /////////////   /////////////////// 
 if(buff[0]>10&&w==1){ w=0; temp_time=millis();
     if(buff[0]==102){reg++;if(reg>125){reg=125;}}
     if(buff[0]==101){reg--;if(reg<0){reg=0;}}
     if(buff[0]==104){h_reg++;if(h_reg>100){h_reg=100;}}
     if(buff[0]==103){h_reg--;if(h_reg<20){h_reg=20;}}}
    /// EEPROM   
 if(w1==1&&millis()-times>10000){w1=0;EEPROM.update(0,reg);EEPROM.update(1,h_reg);}
   ///  
 if(millis()-temp_time>1000&&menu==0){  
   temp.requestTemperatures();
   k = temp.getTempCByIndex(0);
  // k=25;
   temp_time=millis();}
   ///    android
   Serial.print(k,1);
   Serial.print(":");
   Serial.print(reg);
   Serial.print(":");
   Serial.print(nakal);
   Serial.print(":");
   Serial.print(h);
   Serial.print(":");
   Serial.print(h_reg);
   Serial.print(":");
   Serial.println(h_rele);

   if(reg >= k + gis){digitalWrite(12,HIGH);nakal=1;}
   if(reg <= k - gis){digitalWrite(12,LOW);nakal=0;} 
    
   if(h_reg >= h + gis){digitalWrite(11,HIGH);h_rele=1;}
   if(h_reg <= h - gis){digitalWrite(11,LOW);h_rele=0;} 
///////////////////////////////////////////////////////////////
   if(digitalRead(10)==LOW){menu++;if(menu>2){menu=0;}delay(200);}
   
   if (newPosition != oldPosition&&menu==2){oldPosition = newPosition;
     h_reg=h_reg+newPosition;myEnc.write(0);newPosition=0;if(h_reg>100){h_reg=100;}if(h_reg<20){h_reg=20;}} 
   if (newPosition != oldPosition&&menu==1){oldPosition = newPosition;
     reg=reg+newPosition;myEnc.write(0);newPosition=0;if(reg>125){reg=125;}if(reg<0){reg=0;}}   
     
   lcd.setCursor(0,0);
   if(menu!=1){lcd.print(" T ");}
   if(menu==1){lcd.print(">T ");}
   lcd.print(k,1);
   lcd.setCursor(9,0);lcd.print("T ");lcd.print(reg);
   
   lcd.setCursor(0,1);
   if(menu!=2){lcd.print(" H ");}
   if(menu==2){lcd.print(">H ");}
   lcd.print(h);lcd.print(" %");
   lcd.setCursor(9,1);lcd.print("H ");lcd.print(h_reg);

}

void to_Timer(){newPosition = myEnc.read()/4;}