├── .gitattributes └── AIO_V2_may31a ├── .DS_Store ├── sketch.json ├── thingProperties.h └── AIO_V2_may31a.ino /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /AIO_V2_may31a/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techiesms/Google-Assistant-with-Arduino-Cloud-Home-Automation/main/AIO_V2_may31a/.DS_Store -------------------------------------------------------------------------------- /AIO_V2_may31a/sketch.json: -------------------------------------------------------------------------------- 1 | { 2 | "cpu": { 3 | "fqbn": "esp32:esp32:esp32doit-devkit-v1", 4 | "name": "", 5 | "type": "serial" 6 | }, 7 | "secrets": [ 8 | { 9 | "name": "SECRET_DEVICE_KEY", 10 | "value": "" 11 | }, 12 | { 13 | "name": "SECRET_OPTIONAL_PASS", 14 | "value": "" 15 | }, 16 | { 17 | "name": "SECRET_SSID", 18 | "value": "" 19 | } 20 | ], 21 | "included_libs": [] 22 | } -------------------------------------------------------------------------------- /AIO_V2_may31a/thingProperties.h: -------------------------------------------------------------------------------- 1 | // Code generated by Arduino IoT Cloud, DO NOT EDIT. 2 | 3 | #include 4 | #include 5 | 6 | const char DEVICE_LOGIN_NAME[] = ""; 7 | 8 | const char SSID[] = SECRET_SSID; // Network SSID (name) 9 | const char PASS[] = SECRET_OPTIONAL_PASS; // Network password (use for WPA, or use as key for WEP) 10 | const char DEVICE_KEY[] = SECRET_DEVICE_KEY; // Secret device password 11 | 12 | void onFanChange(); 13 | void onRelay1Change(); 14 | void onRelay2Change(); 15 | void onRelay3Change(); 16 | void onRelay4Change(); 17 | 18 | CloudDimmedLight fan; 19 | CloudLight relay1; 20 | CloudLight relay2; 21 | CloudLight relay3; 22 | CloudLight relay4; 23 | CloudTemperatureSensor humidity; 24 | CloudTemperatureSensor temperature; 25 | 26 | void initProperties(){ 27 | 28 | ArduinoCloud.setBoardId(DEVICE_LOGIN_NAME); 29 | ArduinoCloud.setSecretDeviceKey(DEVICE_KEY); 30 | ArduinoCloud.addProperty(fan, READWRITE, ON_CHANGE, onFanChange); 31 | ArduinoCloud.addProperty(relay1, READWRITE, ON_CHANGE, onRelay1Change); 32 | ArduinoCloud.addProperty(relay2, READWRITE, ON_CHANGE, onRelay2Change); 33 | ArduinoCloud.addProperty(relay3, READWRITE, ON_CHANGE, onRelay3Change); 34 | ArduinoCloud.addProperty(relay4, READWRITE, ON_CHANGE, onRelay4Change); 35 | ArduinoCloud.addProperty(humidity, READ, ON_CHANGE, NULL); 36 | ArduinoCloud.addProperty(temperature, READ, ON_CHANGE, NULL); 37 | 38 | } 39 | 40 | WiFiConnectionHandler ArduinoIoTPreferredConnection(SSID, PASS); 41 | -------------------------------------------------------------------------------- /AIO_V2_may31a/AIO_V2_may31a.ino: -------------------------------------------------------------------------------- 1 | #include "arduino_secrets.h" 2 | /* 3 | Sketch generated by the Arduino IoT Cloud Thing "Untitled" 4 | https://create.arduino.cc/cloud/things/1ff00950-7b48-4205-ad1c-da3936fb10b2 5 | 6 | Arduino IoT Cloud Variables description 7 | 8 | The following variables are automatically generated and updated when changes are made to the Thing 9 | 10 | CloudDimmedLight fan; 11 | CloudLight relay1; 12 | CloudLight relay2; 13 | CloudLight relay3; 14 | CloudLight relay4; 15 | CloudTemperatureSensor temperature; 16 | CloudRelativeHumidity humidity; 17 | 18 | 19 | Variables which are marked as READ/WRITE in the Cloud Thing will also have functions 20 | which are called when their values are changed from the Dashboard. 21 | These functions are generated with the Thing and added at the end of this sketch. 22 | */ 23 | 24 | 25 | #include "thingProperties.h" 26 | #include "DHT.h" 27 | #include // https://github.com/Arduino-IRremote/Arduino-IRremote (3.6.1) 28 | #include // https://github.com/bxparks/AceButton (1.9.2) 29 | 30 | #define DHTPIN 16 31 | #define DHTTYPE DHT11 32 | #define irPin 17 // IR sensor pin 33 | 34 | DHT dht(DHTPIN, DHTTYPE); 35 | 36 | using namespace ace_button; 37 | 38 | bool DEBUG_SW = 1; 39 | 40 | unsigned long previousMillis = 0; // Stores the last time data was sent 41 | const long interval = 5000; // Interval at which to send data (milliseconds) 42 | 43 | // Pins of Fan Regulator Knob 44 | #define fan_switch 33 45 | #define s1 27 46 | #define s2 14 47 | #define s3 12 48 | #define s4 13 49 | 50 | // Pins of Switches 51 | #define S5 32 52 | #define S6 35 53 | #define S7 34 54 | #define S8 39 55 | 56 | // Pins of Relay (Appliances Control) 57 | #define R5 15 58 | #define R6 2 59 | #define R7 4 60 | #define R8 22 61 | 62 | // Pins of Relay (Fan Speed Control) 63 | #define Speed1 21 64 | #define Speed2 19 65 | #define Speed4 18 66 | 67 | bool speed1_flag = 1; 68 | bool speed2_flag = 1; 69 | bool speed3_flag = 1; 70 | bool speed4_flag = 1; 71 | bool speed0_flag = 1; 72 | 73 | int switch_ON_Flag1_previous_I = 0; 74 | int switch_ON_Flag2_previous_I = 0; 75 | int switch_ON_Flag3_previous_I = 0; 76 | int switch_ON_Flag4_previous_I = 0; 77 | 78 | int curr_speed = 0; 79 | bool fan_power = 0; 80 | 81 | // IR Remote Code for Lights 82 | #define IR_Relay1 0x1FE50AF 83 | #define IR_Relay2 0x1FED827 84 | #define IR_Relay3 0x1FEF807 85 | #define IR_Relay4 0x1FE30CF 86 | #define IR_Relay_All_Off 0x1FE48B7 87 | #define IR_Relay_All_On 0x1FE7887 88 | 89 | // IR Remote Code for Fan 90 | #define IR_Speed_Up 0x1FE609F 91 | #define IR_Speed_Dw 0x1FEA05F 92 | #define IR_Fan_off 0x1FE10EF 93 | #define IR_Fan_on 0x1FE906F 94 | 95 | IRrecv irrecv(irPin); 96 | decode_results results; 97 | 98 | ButtonConfig config1; 99 | AceButton button1(&config1); 100 | ButtonConfig config2; 101 | AceButton button2(&config2); 102 | ButtonConfig config3; 103 | AceButton button3(&config3); 104 | ButtonConfig config4; 105 | AceButton button4(&config4); 106 | ButtonConfig config5; 107 | AceButton button5(&config5); 108 | 109 | void handleEvent1(AceButton*, uint8_t, uint8_t); 110 | void handleEvent2(AceButton*, uint8_t, uint8_t); 111 | void handleEvent3(AceButton*, uint8_t, uint8_t); 112 | void handleEvent4(AceButton*, uint8_t, uint8_t); 113 | void handleEvent5(AceButton*, uint8_t, uint8_t); 114 | 115 | void setup() { 116 | // Initialize serial and wait for port to open: 117 | Serial.begin(115200); 118 | 119 | dht.begin(); 120 | irrecv.enableIRIn(); // Enabling IR sensor 121 | 122 | pinMode(s1, INPUT); 123 | pinMode(s2, INPUT); 124 | pinMode(s3, INPUT_PULLUP); 125 | pinMode(s4, INPUT); 126 | pinMode(S5, INPUT); 127 | pinMode(S6, INPUT); 128 | pinMode(S7, INPUT); 129 | pinMode(S8, INPUT); 130 | 131 | pinMode(R5, OUTPUT); 132 | pinMode(R6, OUTPUT); 133 | pinMode(R7, OUTPUT); 134 | pinMode(R8, OUTPUT); 135 | pinMode(Speed1, OUTPUT); 136 | pinMode(Speed2, OUTPUT); 137 | pinMode(Speed4, OUTPUT); 138 | 139 | config1.setEventHandler(button1Handler); 140 | config2.setEventHandler(button2Handler); 141 | config3.setEventHandler(button3Handler); 142 | config4.setEventHandler(button4Handler); 143 | config5.setEventHandler(button5Handler); 144 | 145 | button1.init(S5); 146 | button2.init(S6); 147 | button3.init(S7); 148 | button4.init(S8); 149 | button5.init(fan_switch); 150 | 151 | // This delay gives the chance to wait for a Serial Monitor without blocking if none is found 152 | delay(1500); 153 | 154 | 155 | 156 | // Defined in thingProperties.h 157 | initProperties(); 158 | 159 | // Connect to Arduino IoT Cloud 160 | ArduinoCloud.begin(ArduinoIoTPreferredConnection); 161 | 162 | /* 163 | The following function allows you to obtain more information 164 | related to the state of network and IoT Cloud connection and errors 165 | the higher number the more granular information you’ll get. 166 | The default is 0 (only errors). 167 | Maximum is 4 168 | */ 169 | setDebugMessageLevel(2); 170 | ArduinoCloud.printDebugInfo(); 171 | } 172 | 173 | void loop() { 174 | 175 | ArduinoCloud.update(); 176 | // Your code here 177 | unsigned long currentMillis = millis(); 178 | 179 | if (currentMillis - previousMillis >= interval) { 180 | previousMillis = currentMillis; 181 | DHT_SENSOR_READ(); 182 | } 183 | 184 | 185 | ir_remote(); 186 | Fan(); 187 | 188 | button1.check(); 189 | button2.check(); 190 | button3.check(); 191 | button4.check(); 192 | button5.check(); 193 | } 194 | 195 | void button1Handler(AceButton* button, uint8_t eventType, uint8_t buttonState) { 196 | if (DEBUG_SW) Serial.println("EVENT1"); 197 | switch (eventType) { 198 | case AceButton::kEventPressed: 199 | if (DEBUG_SW) Serial.println("kEventPressed"); 200 | relay1 = 1; 201 | digitalWrite(R5, HIGH); 202 | break; 203 | case AceButton::kEventReleased: 204 | if (DEBUG_SW) Serial.println("kEventReleased"); 205 | relay1 = 0; 206 | digitalWrite(R5, LOW); 207 | break; 208 | } 209 | } 210 | 211 | void button2Handler(AceButton* button, uint8_t eventType, uint8_t buttonState) { 212 | if (DEBUG_SW) Serial.println("EVENT2"); 213 | //EspalexaDevice* d2 = espalexa.getDevice(1); 214 | switch (eventType) { 215 | case AceButton::kEventPressed: 216 | if (DEBUG_SW) Serial.println("kEventPressed"); 217 | relay2 = 1; 218 | digitalWrite(R6, HIGH); 219 | break; 220 | case AceButton::kEventReleased: 221 | if (DEBUG_SW) Serial.println("kEventReleased"); 222 | relay2 = 0; 223 | digitalWrite(R6, LOW); 224 | break; 225 | } 226 | } 227 | void button3Handler(AceButton* button, uint8_t eventType, uint8_t buttonState) { 228 | if (DEBUG_SW) Serial.println("EVENT3"); 229 | //EspalexaDevice* d3 = espalexa.getDevice(2); 230 | switch (eventType) { 231 | case AceButton::kEventPressed: 232 | if (DEBUG_SW) Serial.println("kEventPressed"); 233 | relay3 = 1; 234 | digitalWrite(R7, HIGH); 235 | break; 236 | case AceButton::kEventReleased: 237 | if (DEBUG_SW) Serial.println("kEventReleased"); 238 | relay3 = 0; 239 | digitalWrite(R7, LOW); 240 | break; 241 | } 242 | } 243 | void button4Handler(AceButton* button, uint8_t eventType, uint8_t buttonState) { 244 | if (DEBUG_SW) Serial.println("EVENT4"); 245 | //EspalexaDevice* d4 = espalexa.getDevice(3); 246 | switch (eventType) { 247 | case AceButton::kEventPressed: 248 | if (DEBUG_SW) Serial.println("kEventPressed"); 249 | relay4 = 1; 250 | digitalWrite(R8, HIGH); 251 | break; 252 | case AceButton::kEventReleased: 253 | if (DEBUG_SW) Serial.println("kEventReleased"); 254 | relay4 = 0; 255 | digitalWrite(R8, LOW); 256 | break; 257 | } 258 | } 259 | 260 | void button5Handler(AceButton* button, uint8_t eventType, uint8_t buttonState) { 261 | if (DEBUG_SW) Serial.println("EVENT5"); 262 | switch (eventType) { 263 | case AceButton::kEventPressed: 264 | if (DEBUG_SW) Serial.println("kEventPressed"); 265 | if (curr_speed == 0) { 266 | speed0(); 267 | } 268 | if (curr_speed == 1) { 269 | speed1(); 270 | } 271 | if (curr_speed == 2) { 272 | speed2(); 273 | } 274 | if (curr_speed == 3) { 275 | speed3(); 276 | } 277 | if (curr_speed == 4) { 278 | speed4(); 279 | } 280 | break; 281 | case AceButton::kEventReleased: 282 | if (DEBUG_SW) Serial.println("kEventReleased"); 283 | digitalWrite(Speed1, LOW); 284 | digitalWrite(Speed2, LOW); 285 | digitalWrite(Speed4, LOW); 286 | fan.setSwitch(0); 287 | fan_power = 0; 288 | delay(100); 289 | break; 290 | } 291 | } 292 | 293 | void onRelay1Change() { 294 | digitalWrite(R5, relay1); 295 | // Do something 296 | } 297 | 298 | 299 | void onRelay2Change() { 300 | digitalWrite(R6, relay2); 301 | // Do something 302 | } 303 | 304 | 305 | void onRelay3Change() { 306 | digitalWrite(R7, relay3); 307 | // Do something 308 | } 309 | 310 | 311 | void onRelay4Change() { 312 | digitalWrite(R8, relay4); 313 | // Do something 314 | } 315 | 316 | 317 | void onFanChange() { 318 | int fan_speed_map = map(fan.getBrightness(), 0, 100, 0, 4); 319 | if (fan.getSwitch() == 0) { 320 | speed0(); 321 | } 322 | 323 | if (fan.getSwitch() == 1) { 324 | if (fan_speed_map == 0) 325 | speed0(); 326 | if (fan_speed_map == 1) 327 | speed1(); 328 | if (fan_speed_map == 2) 329 | speed2(); 330 | if (fan_speed_map == 3) 331 | speed3(); 332 | if (fan_speed_map == 4) 333 | speed4(); 334 | } // Do something 335 | } 336 | 337 | 338 | void Fan() { 339 | if (digitalRead(fan_switch) == LOW) { 340 | if (digitalRead(s1) == LOW && speed1_flag == 1) { 341 | speed1(); 342 | speed1_flag = 0; 343 | speed2_flag = 1; 344 | speed3_flag = 1; 345 | speed4_flag = 1; 346 | speed0_flag = 1; 347 | } 348 | if (digitalRead(s2) == LOW && digitalRead(s3) == HIGH && speed2_flag == 1) { 349 | speed2(); 350 | speed1_flag = 1; 351 | speed2_flag = 0; 352 | speed3_flag = 1; 353 | speed4_flag = 1; 354 | speed0_flag = 1; 355 | } 356 | if (digitalRead(s2) == LOW && digitalRead(s3) == LOW && speed3_flag == 1) { 357 | speed3(); 358 | speed1_flag = 1; 359 | speed2_flag = 1; 360 | speed3_flag = 0; 361 | speed4_flag = 1; 362 | speed0_flag = 1; 363 | } 364 | if (digitalRead(s4) == LOW && speed4_flag == 1) { 365 | speed4(); 366 | speed1_flag = 1; 367 | speed2_flag = 1; 368 | speed3_flag = 1; 369 | speed4_flag = 0; 370 | speed0_flag = 1; 371 | } 372 | if (digitalRead(s1) == HIGH && digitalRead(s2) == HIGH && digitalRead(s3) == HIGH && digitalRead(s4) == HIGH && speed0_flag == 1) { 373 | speed0(); 374 | speed1_flag = 1; 375 | speed2_flag = 1; 376 | speed3_flag = 1; 377 | speed4_flag = 1; 378 | speed0_flag = 0; 379 | } 380 | } 381 | } 382 | 383 | 384 | //functions for defining of speeds 385 | 386 | // Fan Speed Control 387 | 388 | void speed0() { 389 | //All Relays Off - Fan at speed 0 390 | Serial.println("SPEED 0"); 391 | digitalWrite(Speed1, LOW); 392 | digitalWrite(Speed2, LOW); 393 | digitalWrite(Speed4, LOW); 394 | fan.setSwitch(0); 395 | fan.setBrightness(0); 396 | delay(1000); 397 | } 398 | 399 | void speed1() { 400 | //Speed1 Relay On - Fan at speed 1 401 | Serial.println("SPEED 1"); 402 | digitalWrite(Speed1, LOW); 403 | digitalWrite(Speed2, LOW); 404 | digitalWrite(Speed4, LOW); 405 | fan.setSwitch(1); 406 | fan.setBrightness(25); 407 | curr_speed = 1; 408 | delay(1000); 409 | digitalWrite(Speed1, HIGH); 410 | } 411 | 412 | void speed2() { 413 | //Speed2 Relay On - Fan at speed 2 414 | Serial.println("SPEED 2"); 415 | digitalWrite(Speed1, LOW); 416 | digitalWrite(Speed2, LOW); 417 | digitalWrite(Speed4, LOW); 418 | fan.setSwitch(1); 419 | fan.setBrightness(50); 420 | curr_speed = 2; 421 | delay(1000); 422 | digitalWrite(Speed2, HIGH); 423 | } 424 | 425 | void speed3() { 426 | //Speed1 & Speed2 Relays On - Fan at speed 3 427 | Serial.println("SPEED 3"); 428 | digitalWrite(Speed1, LOW); 429 | digitalWrite(Speed2, LOW); 430 | digitalWrite(Speed4, LOW); 431 | fan.setSwitch(1); 432 | fan.setBrightness(75); 433 | curr_speed = 3; 434 | delay(1000); 435 | digitalWrite(Speed1, HIGH); 436 | digitalWrite(Speed2, HIGH); 437 | } 438 | 439 | void speed4() { 440 | //Speed4 Relay On - Fan at speed 4 441 | Serial.println("SPEED 4"); 442 | digitalWrite(Speed1, LOW); 443 | digitalWrite(Speed2, LOW); 444 | digitalWrite(Speed4, LOW); 445 | fan.setSwitch(1); 446 | fan.setBrightness(100); 447 | curr_speed = 4; 448 | delay(1000); 449 | digitalWrite(Speed4, HIGH); 450 | } 451 | 452 | void DHT_SENSOR_READ() { 453 | float h = dht.readHumidity(); 454 | float t = dht.readTemperature(); 455 | 456 | humidity = h; 457 | temperature = t; 458 | 459 | Serial.print("temp = "); 460 | Serial.println(t); 461 | Serial.print("Humi = "); 462 | Serial.println(h); 463 | //delay(100); 464 | } 465 | 466 | void ir_remote() { 467 | if (DEBUG_SW) Serial.println("Inside IR REMOTE"); 468 | if (irrecv.decode(&results)) { 469 | if (DEBUG_SW) Serial.println(results.value, HEX); //print the HEX code 470 | switch (results.value) { 471 | case IR_Relay1: 472 | switch_ON_Flag1_previous_I = !switch_ON_Flag1_previous_I; 473 | digitalWrite(R5, switch_ON_Flag1_previous_I); 474 | if (DEBUG_SW) Serial.println("RELAY1 ON"); 475 | relay1 = switch_ON_Flag1_previous_I; 476 | delay(100); 477 | break; 478 | case IR_Relay2: 479 | switch_ON_Flag2_previous_I = !switch_ON_Flag2_previous_I; 480 | digitalWrite(R6, switch_ON_Flag2_previous_I); 481 | relay2 = switch_ON_Flag2_previous_I; 482 | delay(100); 483 | break; 484 | case IR_Relay3: 485 | switch_ON_Flag3_previous_I = !switch_ON_Flag3_previous_I; 486 | digitalWrite(R7, switch_ON_Flag3_previous_I); 487 | relay3 = switch_ON_Flag3_previous_I; 488 | delay(100); 489 | break; 490 | case IR_Relay4: 491 | switch_ON_Flag4_previous_I = !switch_ON_Flag4_previous_I; 492 | digitalWrite(R8, switch_ON_Flag4_previous_I); 493 | relay4 = switch_ON_Flag4_previous_I; 494 | delay(100); 495 | break; 496 | case IR_Relay_All_Off: 497 | All_Lights_Off(); 498 | 499 | break; 500 | case IR_Relay_All_On: 501 | All_Lights_On(); 502 | 503 | break; 504 | case IR_Fan_on: 505 | fan.setSwitch(1); 506 | if (curr_speed == 0) { 507 | speed0(); 508 | } else if (curr_speed == 1) { 509 | speed1(); 510 | // fan.setBrightness(25); 511 | } else if (curr_speed == 2) { 512 | speed2(); 513 | } else if (curr_speed == 3) { 514 | speed3(); 515 | } else if (curr_speed == 4) { 516 | speed4(); 517 | 518 | } else { 519 | } 520 | break; 521 | case IR_Fan_off: 522 | fan.setSwitch(0); 523 | speed0(); 524 | break; 525 | case IR_Speed_Up: 526 | if (curr_speed == 1) { 527 | speed2(); 528 | 529 | } else if (curr_speed == 2) { 530 | speed3(); 531 | 532 | } else if (curr_speed == 3) { 533 | speed4(); 534 | 535 | } else if (curr_speed == 4) { 536 | //Do nothing 537 | } else { 538 | } 539 | 540 | break; 541 | case IR_Speed_Dw: 542 | if (curr_speed == 1) { 543 | //Do nothing 544 | } 545 | if (curr_speed == 2) { 546 | speed1(); 547 | } 548 | if (curr_speed == 3) { 549 | speed2(); 550 | } 551 | if (curr_speed == 4) { 552 | speed3(); 553 | 554 | } else { 555 | } 556 | 557 | break; 558 | default: break; 559 | } 560 | irrecv.resume(); 561 | } 562 | DEBUG_SW = 0; 563 | } 564 | 565 | void All_Lights_Off() { 566 | switch_ON_Flag1_previous_I = 0; 567 | digitalWrite(R5, LOW); 568 | relay1 = 0; 569 | 570 | 571 | switch_ON_Flag2_previous_I = 0; 572 | digitalWrite(R6, LOW); 573 | relay2 = 0; 574 | 575 | switch_ON_Flag3_previous_I = 0; 576 | digitalWrite(R7, LOW); 577 | relay3 = 0; 578 | 579 | switch_ON_Flag4_previous_I = 0; 580 | digitalWrite(R8, LOW); 581 | relay4 = 0; 582 | } 583 | 584 | void All_Lights_On() { 585 | switch_ON_Flag1_previous_I = 1; 586 | digitalWrite(R5, HIGH); 587 | relay1 = 1; 588 | 589 | switch_ON_Flag2_previous_I = 1; 590 | digitalWrite(R6, HIGH); 591 | relay2 = 1; 592 | 593 | switch_ON_Flag3_previous_I = 1; 594 | digitalWrite(R7, HIGH); 595 | relay3 = 1; 596 | 597 | switch_ON_Flag4_previous_I = 1; 598 | digitalWrite(R8, HIGH); 599 | relay4 = 1; 600 | } --------------------------------------------------------------------------------