#include <DHT.h>
#include <DHT_U.h>
#include<LiquidCrystal_I2C.h>
#include<Wire.h>
#include<ESP8266WiFi.h>
#include<BlynkSimpleEsp8266.h>
#include <IRremoteESP8266.h>
#include <IRutils.h>
#include <IRsend.h>
#include <ir_Panasonic.h>

#define dhttype DHT11
#define scl D1
#define sda D2
#define buzz D3
#define sensor D4
#define irtx D5
//#define irrc D6
#define button D0
#define col 16
#define row 2

#define ssid "IoT"
#define password "demoiot"

#define auth "--contoh kode otentikasi--"

BlynkTimer timer;
LiquidCrystal_I2C lcd(0x27,col,row);
WiFiClient wifiClient;
DHT dht(sensor,dhttype);
WidgetLCD virtlcd(V1);
IRPanasonicAc ac(irtx);

float h=0.0;
float t=0.0;

void readDHT11(){
  h=dht.readHumidity();
  t=dht.readTemperature();
  if(isnan(h) || isnan(t)){
    Serial.println("dht11 error");
  }
  else{
    Blynk.virtualWrite(V3,t);
    Blynk.virtualWrite(V4,h);
    //Serial.print("T:"); Serial.println(t);
    //Serial.print("H:"); Serial.println(h);
    lcd.setCursor(0,1); lcd.print("T:");lcd.setCursor(2,1); lcd.print(t);
    lcd.setCursor(8,1); lcd.print("H:");lcd.setCursor(10,1); lcd.print(h);
  }
}

BLYNK_WRITE(V1){
  int val = param.asInt();
  if(val==1){
    ac.on();
    ac.send();
    digitalWrite(buzz,HIGH);
    delay(100);
    digitalWrite(buzz,LOW);
  }
  if(val==0){
    ac.off();
    ac.send();
    digitalWrite(buzz,HIGH);
    delay(100);
    digitalWrite(buzz,LOW);
  }
}

BLYNK_WRITE(V0){
  int val = param.asInt();
  ac.setTemp(val);
  ac.send();
  digitalWrite(buzz,HIGH);
  delay(100);
  digitalWrite(buzz,LOW);
}

BLYNK_WRITE(V2){
  int val = param.asInt();
  if(val==1){
    ac.on();
    ac.send();
    digitalWrite(buzz,HIGH);
    delay(100);
    digitalWrite(buzz,LOW);
  }
  else{
    ac.off();
    ac.send();
    digitalWrite(buzz,HIGH);
    delay(100);
    digitalWrite(buzz,LOW);
  }
}

BLYNK_CONNECTED(){
  virtlcd.clear();
  virtlcd.print(0,0,"ready");
}

/*
void dumpIRSensor(){
  uint8_t val = digitalRead(button);
  if(val==0){
    if(irrecv.decode(&result)){
      Serial.println(resultToSourceCode(&result));
      irrecv.resume();
    }
  }
}
*/

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(buzz,OUTPUT);
  pinMode(irtx,OUTPUT);
  Wire.begin(sda, scl);
  lcd.init();
  lcd.backlight();


  lcd.clear();
  lcd.setCursor(0,0); lcd.print("starting dht11");
  dht.begin();
  delay(1000);
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid,password);
  lcd.clear(); lcd.setCursor(0,0); lcd.print("connecting...");
  while(WiFi.status()!=WL_CONNECTED){
    delay(100);
  }
  lcd.clear();
  lcd.setCursor(0,0);  lcd.print("connected to ip");
  lcd.setCursor(0,1);  lcd.print(WiFi.localIP());
  delay(1000);
  Blynk.config(auth,"blynk-cloud.com",80);
  lcd.clear();
  lcd.setCursor(0,0); lcd.print("try connect");
  lcd.setCursor(0,1); lcd.print("please wait...");
  while (!Blynk.connect()) {}
  timer.setInterval(100L,readDHT11);
  //Serial.println("berhasil terhubung ke blynk-cloud.com:80");
  lcd.clear();
  lcd.setCursor(0,0); lcd.print("connected to");
  lcd.setCursor(0,1); lcd.print("blynk-cloud.com");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0,0); lcd.print("listening...");
}

void loop() {
  // put your main code here, to run repeatedly:
  Blynk.run(); 
  timer.run();
}