#include <IRremote.h>             //include the IR library

int sensorValue = 0;              //variable to store data from ldr

const int LDR_sensor = A3;            //ldr LDR_sensor connected to A3 pin
const int ldr_light = 9;          //dim tube_light connected to analog pin 9

int RECV_PIN = 2;                 //IR receiver signal pin connected to 2
int tube_light = 13;               //triac driver pin connected for tube light control
int fan = 6;                     //triac driver pin connected for fan control

int buzzer = 7;                   //buzzer connected as sound indicator
int light_off_indicator = 8;      //tube light off indicator blue led
int light_on_indicator = 3;       //tube light on indicator green led

int fan_off_indicator = 10;       //fan off indicator blue led pin
int fan_on_indicator = 11;        //fan on indicator green led pin

int fan_manual_button = 5;        //push switch connected to pin 5
int tube_manual_button = 4;       //push switch connected to pin 6

#define IR_RECEIVE_PIN RECV_PIN   //initiate pin 2 as input signal 





void setup() {
  Serial.begin(9600);
  IrReceiver.begin(IR_RECEIVE_PIN); //begin receiving

  //state the inputs and outputs
  pinMode(ldr_light, OUTPUT);      
  pinMode(tube_light, OUTPUT);
  pinMode(fan, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(light_off_indicator, OUTPUT);
  pinMode(light_on_indicator, OUTPUT);
  pinMode(fan_off_indicator, OUTPUT);
  pinMode(fan_on_indicator, OUTPUT);
  pinMode(fan_manual_button, INPUT_PULLUP);
  pinMode(tube_manual_button, INPUT_PULLUP);

  digitalWrite(buzzer, LOW);        //initially buzzer do not make sound
  }





//declaring function that will turn on and off fan triac when called
void fan_main() {
  static int b = LOW;
  b = !b;
  digitalWrite(fan, b);                         //turn on/off fan
  if(b == HIGH){
        digitalWrite(fan_on_indicator, HIGH);   //green indicator led on
        digitalWrite(fan_off_indicator, LOW);   //blue indicator led off
  }
   else{
        digitalWrite(fan_on_indicator, LOW);    //green indicator led off
        digitalWrite(fan_off_indicator, HIGH);  //blue indicator led on
   }
}


//declaring function that will rotate fan at lowest speed when called
void fan_1(){
    digitalWrite(fan_on_indicator, HIGH);
    digitalWrite(fan_off_indicator, LOW);
  analogWrite(fan, 5);                         //write fan speed
}
//declaring function that will rotate fan at medium speed when called
void fan_2(){
    digitalWrite(fan_on_indicator, HIGH);
    digitalWrite(fan_off_indicator, LOW);
  analogWrite(fan, 25);                        //write fan speed
}
//declaring function that will rotate fan at medium high speed when called
void fan_3(){
    digitalWrite(fan_on_indicator, HIGH);
    digitalWrite(fan_off_indicator, LOW);
  analogWrite(fan, 50);                         //write fan speed
}


 
//declaring function that will turn on or off the light when called
void light_main() {
  static int a = HIGH;
  a = !a;
  digitalWrite(tube_light, a);                    //turn on/off the light
  if(a == HIGH){
        digitalWrite(light_on_indicator, HIGH);
        digitalWrite(light_off_indicator, LOW);
  }
  else{
    digitalWrite(light_on_indicator, LOW);
    digitalWrite(light_off_indicator, HIGH);
  }
} 

//declaring functions that will turn on/off dim light when called
void ldr_on(){
    digitalWrite(ldr_light, LOW);             //dim light on since other pin of light connected to 5V
    delay(50);
}
void ldr_off(){
  digitalWrite(ldr_light,HIGH);               //dim light off since other pin of light connected to 5V
  delay(50);  
}





//continuous code
void loop() {

//read data from LDR
sensorValue = 0.1 * analogRead(LDR_sensor);

if (sensorValue < 1){
  digitalWrite( ldr_light, LOW);                          //dim light off
}
else if (sensorValue <= 4 && sensorValue >= 1){           
int sensorValue2 = sensorValue*50  ;
analogWrite(ldr_light, sensorValue2);                     //dim light moderately on
}
else if (sensorValue >= 4){
  digitalWrite(ldr_light, HIGH);                          //dim light fully on
}



//read if a button is pressed
int    fan_btnState = digitalRead(fan_manual_button);     //store the fan button data in variable
int    light_btnState = digitalRead(tube_manual_button);  //store the light button data in variable

//Code to turn on/off fan manually
  if(fan_btnState == LOW){
   digitalWrite(buzzer, HIGH);          //sound buzzer
   delay(100);
   digitalWrite(buzzer, LOW);
   delay(300);
   fan_main();                          //turn fan on/off
  
  }

//Code to turn on/off light manually
  if(light_btnState == LOW){
   digitalWrite(buzzer, HIGH);          //sound buzzer
   delay(100);
   digitalWrite(buzzer, LOW);
    delay(300);
    light_main();                       //turn light on/off
   
  }

  



//IR code
  if (IrReceiver.decode()) {            //if IR code found 
   delay(300);                          //wait to avoid multiple read
   Serial.println(IrReceiver.decodedIRData.command);
   IrReceiver.resume();
    
  //controlling light
  if (IrReceiver.decodedIRData.command == 108) {   //check if the button 'A' of remote is pressed
   digitalWrite(buzzer, HIGH);                      //sound buzzer
   delay(100);
   digitalWrite(buzzer, LOW); 
  light_main();                                     //turn light on/off
  } 
  

  //controlling fan
  if (IrReceiver.decodedIRData.command == 70) {     //check if the button '[]' of remote is pressed
   digitalWrite(buzzer, HIGH);                      //sound buzzer
   delay(100);
   digitalWrite(buzzer, LOW);
   fan_main();                                      //turn light on/off
  }
  if (IrReceiver.decodedIRData.command == 20) {     //check if the button 'B' of remote is pressed
   digitalWrite(buzzer, HIGH);                      //sound buzzer
   delay(100);
   digitalWrite(buzzer, LOW);
   fan_1();                                         //turn fan low
  }
  if (IrReceiver.decodedIRData.command == 21) {     //check if the button 'C' of remote is pressed
   digitalWrite(buzzer, HIGH);                      //sound buzzer
   delay(100);
   digitalWrite(buzzer, LOW);
   fan_2();                                         //turn fan medium
  }
  if (IrReceiver.decodedIRData.command == 22) {     //check if the button 'D' of remote is pressed
   digitalWrite(buzzer, HIGH);                      //sound buzzer
   delay(100);
   digitalWrite(buzzer, LOW);
   fan_3();                                         //turn fan medium high
  }

   

  }
}
