├── .gitattributes └── Arduino_Nano_ESP32 ├── arduino_secrets.h ├── thingProperties.h └── Arduino_Nano_ESP32.ino /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /Arduino_Nano_ESP32/arduino_secrets.h: -------------------------------------------------------------------------------- 1 | #define SECRET_SSID "SSID" 2 | #define SECRET_OPTIONAL_PASS "PASS" 3 | #define SECRET_DEVICE_KEY "SECRET_KEY" 4 | -------------------------------------------------------------------------------- /Arduino_Nano_ESP32/thingProperties.h: -------------------------------------------------------------------------------- 1 | // Code generated by Arduino IoT Cloud, DO NOT EDIT. 2 | 3 | #include 4 | #include 5 | 6 | const char DEVICE_LOGIN_NAME[] = "d0c8af50-fc5c-42aa-ac25-7ad7088a0b3e"; 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 | 19 | CloudDimmedLight fan; 20 | CloudLight relay1; 21 | CloudLight relay2; 22 | CloudLight relay3; 23 | CloudLight relay4; 24 | CloudTemperatureSensor temperature; 25 | CloudRelativeHumidity humidity; 26 | 27 | void initProperties(){ 28 | 29 | ArduinoCloud.setBoardId(DEVICE_LOGIN_NAME); 30 | ArduinoCloud.setSecretDeviceKey(DEVICE_KEY); 31 | ArduinoCloud.addProperty(fan, READWRITE, ON_CHANGE, onFanChange); 32 | ArduinoCloud.addProperty(relay1, READWRITE, ON_CHANGE, onRelay1Change); 33 | ArduinoCloud.addProperty(relay2, READWRITE, ON_CHANGE, onRelay2Change); 34 | ArduinoCloud.addProperty(relay3, READWRITE, ON_CHANGE, onRelay3Change); 35 | ArduinoCloud.addProperty(relay4, READWRITE, ON_CHANGE, onRelay4Change); 36 | ArduinoCloud.addProperty(temperature, READWRITE, ON_CHANGE, onTemperatureChange); 37 | ArduinoCloud.addProperty(humidity, READWRITE, ON_CHANGE, onHumidityChange); 38 | 39 | } 40 | 41 | WiFiConnectionHandler ArduinoIoTPreferredConnection(SSID, PASS); 42 | -------------------------------------------------------------------------------- /Arduino_Nano_ESP32/Arduino_Nano_ESP32.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 D9 31 | #define DHTTYPE DHT11 32 | #define irPin D11 // IR sensor pin 33 | 34 | DHT dht(DHTPIN, DHTTYPE); 35 | 36 | using namespace ace_button; 37 | 38 | bool DEBUG_SW = 1; 39 | 40 | // Pins of Fan Regulator Knob 41 | #define fan_switch A4 42 | #define s1 A3 43 | #define s2 A2 44 | #define s3 A1 45 | #define s4 A0 46 | 47 | // Pins of Switches 48 | #define S5 A5 49 | #define S6 A6 50 | #define S7 A7 51 | #define S8 D13 52 | 53 | // Pins of Relay (Appliances Control) 54 | #define R5 D2 55 | #define R6 D3 56 | #define R7 D4 57 | #define R8 D5 58 | 59 | // Pins of Relay (Fan Speed Control) 60 | #define Speed1 D6 61 | #define Speed2 D7 62 | #define Speed4 D8 63 | 64 | bool speed1_flag = 1; 65 | bool speed2_flag = 1; 66 | bool speed3_flag = 1; 67 | bool speed4_flag = 1; 68 | bool speed0_flag = 1; 69 | 70 | int switch_ON_Flag1_previous_I = 0; 71 | int switch_ON_Flag2_previous_I = 0; 72 | int switch_ON_Flag3_previous_I = 0; 73 | int switch_ON_Flag4_previous_I = 0; 74 | 75 | int curr_speed = 0; 76 | bool fan_power = 0; 77 | 78 | // IR Remote Code for Lights 79 | #define IR_Relay1 0x1FE50AF 80 | #define IR_Relay2 0x1FED827 81 | #define IR_Relay3 0x1FEF807 82 | #define IR_Relay4 0x1FE30CF 83 | #define IR_Relay_All_Off 0x1FE48B7 84 | #define IR_Relay_All_On 0x1FE7887 85 | 86 | // IR Remote Code for Fan 87 | #define IR_Speed_Up 0x1FE609F 88 | #define IR_Speed_Dw 0x1FEA05F 89 | #define IR_Fan_off 0x1FE10EF 90 | #define IR_Fan_on 0x1FE906F 91 | 92 | IRrecv irrecv(irPin); 93 | decode_results results; 94 | 95 | ButtonConfig config1; 96 | AceButton button1(&config1); 97 | ButtonConfig config2; 98 | AceButton button2(&config2); 99 | ButtonConfig config3; 100 | AceButton button3(&config3); 101 | ButtonConfig config4; 102 | AceButton button4(&config4); 103 | ButtonConfig config5; 104 | AceButton button5(&config5); 105 | 106 | void handleEvent1(AceButton*, uint8_t, uint8_t); 107 | void handleEvent2(AceButton*, uint8_t, uint8_t); 108 | void handleEvent3(AceButton*, uint8_t, uint8_t); 109 | void handleEvent4(AceButton*, uint8_t, uint8_t); 110 | void handleEvent5(AceButton*, uint8_t, uint8_t); 111 | 112 | void setup() { 113 | // Initialize serial and wait for port to open: 114 | Serial.begin(115200); 115 | 116 | dht.begin(); 117 | irrecv.enableIRIn(); // Enabling IR sensor 118 | 119 | pinMode(s1, INPUT); 120 | pinMode(s2, INPUT); 121 | pinMode(s3, INPUT_PULLUP); 122 | pinMode(s4, INPUT); 123 | pinMode(S5, INPUT); 124 | pinMode(S6, INPUT); 125 | pinMode(S7, INPUT); 126 | pinMode(S8, INPUT); 127 | 128 | pinMode(R5, OUTPUT); 129 | pinMode(R6, OUTPUT); 130 | pinMode(R7, OUTPUT); 131 | pinMode(R8, OUTPUT); 132 | pinMode(Speed1, OUTPUT); 133 | pinMode(Speed2, OUTPUT); 134 | pinMode(Speed4, OUTPUT); 135 | 136 | config1.setEventHandler(button1Handler); 137 | config2.setEventHandler(button2Handler); 138 | config3.setEventHandler(button3Handler); 139 | config4.setEventHandler(button4Handler); 140 | config5.setEventHandler(button5Handler); 141 | 142 | button1.init(S5); 143 | button2.init(S6); 144 | button3.init(S7); 145 | button4.init(S8); 146 | button5.init(fan_switch); 147 | 148 | // This delay gives the chance to wait for a Serial Monitor without blocking if none is found 149 | delay(1500); 150 | 151 | 152 | 153 | // Defined in thingProperties.h 154 | initProperties(); 155 | 156 | // Connect to Arduino IoT Cloud 157 | ArduinoCloud.begin(ArduinoIoTPreferredConnection); 158 | 159 | /* 160 | The following function allows you to obtain more information 161 | related to the state of network and IoT Cloud connection and errors 162 | the higher number the more granular information you’ll get. 163 | The default is 0 (only errors). 164 | Maximum is 4 165 | */ 166 | setDebugMessageLevel(2); 167 | ArduinoCloud.printDebugInfo(); 168 | } 169 | 170 | void loop() { 171 | 172 | ArduinoCloud.update(); 173 | // Your code here 174 | DHT_SENSOR_READ(); 175 | ir_remote(); 176 | Fan(); 177 | 178 | button1.check(); 179 | button2.check(); 180 | button3.check(); 181 | button4.check(); 182 | button5.check(); 183 | } 184 | 185 | void button1Handler(AceButton* button, uint8_t eventType, uint8_t buttonState) 186 | { 187 | if (DEBUG_SW) Serial.println("EVENT1"); 188 | switch (eventType) { 189 | case AceButton::kEventPressed: 190 | if (DEBUG_SW) Serial.println("kEventPressed"); 191 | relay1 = 1; 192 | digitalWrite(R5, HIGH); 193 | break; 194 | case AceButton::kEventReleased: 195 | if (DEBUG_SW) Serial.println("kEventReleased"); 196 | relay1 = 0; 197 | digitalWrite(R5, LOW); 198 | break; 199 | } 200 | } 201 | 202 | void button2Handler(AceButton* button, uint8_t eventType, uint8_t buttonState) 203 | { 204 | if (DEBUG_SW) Serial.println("EVENT2"); 205 | //EspalexaDevice* d2 = espalexa.getDevice(1); 206 | switch (eventType) { 207 | case AceButton::kEventPressed: 208 | if (DEBUG_SW) Serial.println("kEventPressed"); 209 | relay2 = 1; 210 | digitalWrite(R6, HIGH); 211 | break; 212 | case AceButton::kEventReleased: 213 | if (DEBUG_SW) Serial.println("kEventReleased"); 214 | relay2 = 0; 215 | digitalWrite(R6, LOW); 216 | break; 217 | } 218 | } 219 | void button3Handler(AceButton* button, uint8_t eventType, uint8_t buttonState) { 220 | if (DEBUG_SW) Serial.println("EVENT3"); 221 | //EspalexaDevice* d3 = espalexa.getDevice(2); 222 | switch (eventType) { 223 | case AceButton::kEventPressed: 224 | if (DEBUG_SW) Serial.println("kEventPressed"); 225 | relay3 = 1; 226 | digitalWrite(R7, HIGH); 227 | break; 228 | case AceButton::kEventReleased: 229 | if (DEBUG_SW) Serial.println("kEventReleased"); 230 | relay3 = 0; 231 | digitalWrite(R7, LOW); 232 | break; 233 | } 234 | } 235 | void button4Handler(AceButton* button, uint8_t eventType, uint8_t buttonState) { 236 | if (DEBUG_SW) Serial.println("EVENT4"); 237 | //EspalexaDevice* d4 = espalexa.getDevice(3); 238 | switch (eventType) { 239 | case AceButton::kEventPressed: 240 | if (DEBUG_SW) Serial.println("kEventPressed"); 241 | relay4 = 1; 242 | digitalWrite(R8, HIGH); 243 | break; 244 | case AceButton::kEventReleased: 245 | if (DEBUG_SW) Serial.println("kEventReleased"); 246 | relay4 = 0; 247 | digitalWrite(R8, LOW); 248 | break; 249 | } 250 | } 251 | 252 | void button5Handler(AceButton* button, uint8_t eventType, uint8_t buttonState) 253 | { 254 | if (DEBUG_SW) Serial.println("EVENT5"); 255 | switch (eventType) { 256 | case AceButton::kEventPressed: 257 | if (DEBUG_SW) Serial.println("kEventPressed"); 258 | if (curr_speed == 0) { 259 | speed0(); 260 | } 261 | if (curr_speed == 1) { 262 | speed1(); 263 | } 264 | if (curr_speed == 2) { 265 | speed2(); 266 | } 267 | if (curr_speed == 3) { 268 | speed3(); 269 | } 270 | if (curr_speed == 4) { 271 | speed4(); 272 | } 273 | break; 274 | case AceButton::kEventReleased: 275 | if (DEBUG_SW) Serial.println("kEventReleased"); 276 | digitalWrite(Speed1, LOW); 277 | digitalWrite(Speed2, LOW); 278 | digitalWrite(Speed4, LOW); 279 | fan.setSwitch(0); 280 | fan_power = 0; 281 | delay(100); 282 | break; 283 | } 284 | } 285 | 286 | void onRelay1Change() { 287 | digitalWrite(R5, relay1); 288 | // Do something 289 | } 290 | 291 | 292 | void onRelay2Change() { 293 | digitalWrite(R6, relay2); 294 | // Do something 295 | } 296 | 297 | 298 | void onRelay3Change() { 299 | digitalWrite(R7, relay3); 300 | // Do something 301 | } 302 | 303 | 304 | void onRelay4Change() { 305 | digitalWrite(R8, relay4); 306 | // Do something 307 | } 308 | 309 | 310 | void onFanChange() 311 | { 312 | int fan_speed_map = map(fan.getBrightness(), 0, 100, 0, 4); 313 | if (fan.getSwitch() == 0) 314 | { 315 | speed0(); 316 | } 317 | 318 | if (fan.getSwitch() == 1) 319 | { 320 | if (fan_speed_map == 0) 321 | speed0(); 322 | if (fan_speed_map == 1) 323 | speed1(); 324 | if (fan_speed_map == 2) 325 | speed2(); 326 | if (fan_speed_map == 3) 327 | speed3(); 328 | if (fan_speed_map == 4) 329 | speed4(); 330 | } // Do something 331 | } 332 | 333 | 334 | void Fan() 335 | { 336 | if (digitalRead(fan_switch) == LOW) 337 | { 338 | if (digitalRead(s1) == LOW && speed1_flag == 1) { 339 | speed1(); 340 | speed1_flag = 0; 341 | speed2_flag = 1; 342 | speed3_flag = 1; 343 | speed4_flag = 1; 344 | speed0_flag = 1; 345 | } 346 | if (digitalRead(s2) == LOW && digitalRead(s3) == HIGH && speed2_flag == 1) { 347 | speed2(); 348 | speed1_flag = 1; 349 | speed2_flag = 0; 350 | speed3_flag = 1; 351 | speed4_flag = 1; 352 | speed0_flag = 1; 353 | } 354 | if (digitalRead(s2) == LOW && digitalRead(s3) == LOW && speed3_flag == 1) { 355 | speed3(); 356 | speed1_flag = 1; 357 | speed2_flag = 1; 358 | speed3_flag = 0; 359 | speed4_flag = 1; 360 | speed0_flag = 1; 361 | } 362 | if (digitalRead(s4) == LOW && speed4_flag == 1) { 363 | speed4(); 364 | speed1_flag = 1; 365 | speed2_flag = 1; 366 | speed3_flag = 1; 367 | speed4_flag = 0; 368 | speed0_flag = 1; 369 | } 370 | if (digitalRead(s1) == HIGH && digitalRead(s2) == HIGH && digitalRead(s3) == HIGH && digitalRead(s4) == HIGH && speed0_flag == 1) { 371 | speed0(); 372 | speed1_flag = 1; 373 | speed2_flag = 1; 374 | speed3_flag = 1; 375 | speed4_flag = 1; 376 | speed0_flag = 0; 377 | } 378 | } 379 | } 380 | 381 | 382 | //functions for defining of speeds 383 | 384 | // Fan Speed Control 385 | 386 | void speed0() { 387 | //All Relays Off - Fan at speed 0 388 | Serial.println("SPEED 0"); 389 | digitalWrite(Speed1, LOW); 390 | digitalWrite(Speed2, LOW); 391 | digitalWrite(Speed4, LOW); 392 | fan.setSwitch(0); 393 | fan.setBrightness(0); 394 | delay(1000); 395 | } 396 | 397 | void speed1() { 398 | //Speed1 Relay On - Fan at speed 1 399 | Serial.println("SPEED 1"); 400 | digitalWrite(Speed1, LOW); 401 | digitalWrite(Speed2, LOW); 402 | digitalWrite(Speed4, LOW); 403 | fan.setSwitch(1); 404 | fan.setBrightness(25); 405 | curr_speed = 1; 406 | delay(1000); 407 | digitalWrite(Speed1, HIGH); 408 | } 409 | 410 | void speed2() { 411 | //Speed2 Relay On - Fan at speed 2 412 | Serial.println("SPEED 2"); 413 | digitalWrite(Speed1, LOW); 414 | digitalWrite(Speed2, LOW); 415 | digitalWrite(Speed4, LOW); 416 | fan.setSwitch(1); 417 | fan.setBrightness(50); 418 | curr_speed = 2; 419 | delay(1000); 420 | digitalWrite(Speed2, HIGH); 421 | } 422 | 423 | void speed3() { 424 | //Speed1 & Speed2 Relays On - Fan at speed 3 425 | Serial.println("SPEED 3"); 426 | digitalWrite(Speed1, LOW); 427 | digitalWrite(Speed2, LOW); 428 | digitalWrite(Speed4, LOW); 429 | fan.setSwitch(1); 430 | fan.setBrightness(75); 431 | curr_speed = 3; 432 | delay(1000); 433 | digitalWrite(Speed1, HIGH); 434 | digitalWrite(Speed2, HIGH); 435 | } 436 | 437 | void speed4() 438 | { 439 | //Speed4 Relay On - Fan at speed 4 440 | Serial.println("SPEED 4"); 441 | digitalWrite(Speed1, LOW); 442 | digitalWrite(Speed2, LOW); 443 | digitalWrite(Speed4, LOW); 444 | fan.setSwitch(1); 445 | fan.setBrightness(100); 446 | curr_speed = 4; 447 | delay(1000); 448 | digitalWrite(Speed4, HIGH); 449 | } 450 | 451 | void DHT_SENSOR_READ() { 452 | float h = dht.readHumidity(); 453 | float t = dht.readTemperature(); 454 | 455 | humidity = h; 456 | temperature = t; 457 | 458 | Serial.print("temp = "); 459 | Serial.println(t); 460 | Serial.print("Humi = "); 461 | Serial.println(h); 462 | //delay(100); 463 | } 464 | 465 | void ir_remote() 466 | { 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 | { 528 | speed2(); 529 | 530 | } else if (curr_speed == 2) { 531 | speed3(); 532 | 533 | } else if (curr_speed == 3) { 534 | speed4(); 535 | 536 | } else if (curr_speed == 4) { 537 | //Do nothing 538 | } 539 | else 540 | { 541 | 542 | } 543 | 544 | break; 545 | case IR_Speed_Dw: 546 | if (curr_speed == 1) { 547 | //Do nothing 548 | } 549 | if (curr_speed == 2) { 550 | speed1(); 551 | 552 | } 553 | if (curr_speed == 3) { 554 | speed2(); 555 | 556 | } 557 | if (curr_speed == 4) { 558 | speed3(); 559 | 560 | } else { 561 | } 562 | 563 | break; 564 | default: break; 565 | } 566 | irrecv.resume(); 567 | } 568 | DEBUG_SW = 0; 569 | } 570 | 571 | void All_Lights_Off() { 572 | switch_ON_Flag1_previous_I = 0; 573 | digitalWrite(R5, LOW); 574 | relay1 = 0; 575 | 576 | 577 | switch_ON_Flag2_previous_I = 0; 578 | digitalWrite(R6, LOW); 579 | relay2 = 0; 580 | 581 | switch_ON_Flag3_previous_I = 0; 582 | digitalWrite(R7, LOW); 583 | relay3 = 0; 584 | 585 | switch_ON_Flag4_previous_I = 0; 586 | digitalWrite(R8, LOW); 587 | relay4 = 0; 588 | } 589 | 590 | void All_Lights_On() { 591 | switch_ON_Flag1_previous_I = 1; 592 | digitalWrite(R5, HIGH); 593 | relay1 = 1; 594 | 595 | switch_ON_Flag2_previous_I = 1; 596 | digitalWrite(R6, HIGH); 597 | relay2 = 1; 598 | 599 | switch_ON_Flag3_previous_I = 1; 600 | digitalWrite(R7, HIGH); 601 | relay3 = 1; 602 | 603 | switch_ON_Flag4_previous_I = 1; 604 | digitalWrite(R8, HIGH); 605 | relay4 = 1; 606 | } 607 | --------------------------------------------------------------------------------