#define Serial1 Serial
#include <IRremote.hpp>
#define IR_PIN 15
#define buzzer 9
#define led 5
#define fan 1
#define bat 26
bool status = false;
int timer = 1;
int timeCounter = 0;
int totalTime;
unsigned long timeNow;
void setup() {
  Serial.begin(115200);
  analogReadResolution(12);
  Serial.println("Initiate...");
  IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK);
  pinMode(buzzer, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(fan, OUTPUT);
  pinMode(bat, INPUT);
}
void loop() {
  if (IrReceiver.decode()) {
    uint16_t data = IrReceiver.decodedIRData.command;
    Serial.println(data);
    // btn ON
    if (data == 162) {
      Serial.println("Timer : ON");
      status = true;
    }
    // btn OFF
    if (data == 226) {
      Serial.println("Timer : OFF");
      status = false;
      digitalWrite(fan, 0);
    }
    // btn 1
    if (data == 48) {
      Serial.println("Timer : 1");
      timer = 1;
      status = true;
    }
    // btn 2
    if (data == 24) {
      Serial.println("Timer : 2");
      timer = 2;
      status = true;
    }
    // btn 3
    if (data == 122) {
      Serial.println("Timer : 3");
      timer = 3;
      status = true;
    }
    // btn 4
    if (data == 16) {
      Serial.println("Timer : 4");
      timer = 4;
      status = true;
    }
    // reset timer
    timeCounter = 0;
    totalTime = timer * 3600;
    // the buzzer will buzz to indicate a button on the remote was pressed
    digitalWrite(buzzer, 1);
    delay(100);
    digitalWrite(buzzer, 0);
    IrReceiver.resume();
  }
  if (millis() - timeNow >= 1000) {
    timeNow = millis();
    // read battery voltage
    float vbat = 3 * analogRead(bat) * (3.3 / 4095.0);
    Serial.print("Battery(v) : ");
    Serial.println(vbat);
    // led turn on when the battery voltage is low
    if (vbat > 5.5 && vbat < 6.3) {
      digitalWrite(led, 1);
      Serial.println("Battery Low.");
    }
    if (status) {
      // start the timer
      timeCounter++;
      // The fan will turn on and run for 30 seconds
      if (timeCounter < 30) {
        digitalWrite(fan, 1);
      } else {
        digitalWrite(fan, 0);
      }
      // when timer finished
      if (timeCounter >= totalTime) {
        status = false;
        Serial.println("Timer ended.");
      }
    }
  }
}