-
-
Save sivar2311/790c82f651fc11e9bbc631f7fdd736e8 to your computer and use it in GitHub Desktop.
Multiple Garagedoors (single file version)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <Arduino.h> | |
#include <SinricPro.h> | |
#include <SinricProGarageDoor.h> | |
const char* WIFI_SSID = "WIFI_SSID_HERE"; | |
const char* WIFI_PASS = "WIFI_PASS_HERE"; | |
const char* APP_KEY = "APP_KEY_HERE"; | |
const char* APP_SECRET = "APP_SECRET_HERE"; | |
struct GarageDoor { | |
GarageDoor(const String& name, const String& deviceId, const int pin, const int delayTime) | |
: name(name), deviceId(deviceId), pin(pin), delayTime(delayTime), timer(0) {} | |
const String name; | |
const String deviceId; | |
const int pin; | |
const unsigned long delayTime; | |
unsigned long timer; | |
}; | |
GarageDoor garageDoors[]{ | |
// name deviceId pin delay time (ms) | |
{"GarageDoor1", "DEVICE_ID_DOOR1_HERE", 22, 20000}, | |
{"GarageDoor2", "DEVICE_ID_DOOR2_HERE", 23, 20000} | |
}; | |
void triggerGarageDoor(GarageDoor& garageDoor) { | |
digitalWrite(garageDoor.pin, LOW); | |
delay(500); | |
digitalWrite(garageDoor.pin, HIGH); | |
Serial.printf("[%s]: triggered\r\n", garageDoor.name.c_str()); | |
} | |
void startGarageDoorTimer(GarageDoor& garageDoor) { | |
Serial.printf("[%s]: timer started\r\n", garageDoor.name.c_str()); | |
garageDoor.timer = millis(); | |
} | |
void stopGarageDoorTimer(GarageDoor& garageDoor) { | |
Serial.printf("[%s]: timer stopped\r\n", garageDoor.name.c_str()); | |
garageDoor.timer = 0; | |
} | |
void openGarageDoor(GarageDoor& garageDoor) { | |
Serial.printf("[%s]: opening door\r\n", garageDoor.name.c_str()); | |
triggerGarageDoor(garageDoor); | |
startGarageDoorTimer(garageDoor); | |
} | |
void closeGarageDoor(GarageDoor& garageDoor) { | |
Serial.printf("[%s]: closing door\r\n", garageDoor.name.c_str()); | |
triggerGarageDoor(garageDoor); | |
stopGarageDoorTimer(garageDoor); | |
} | |
bool garageDoorTimerIsExpired(GarageDoor& garageDoor) { | |
if (garageDoor.timer && millis() - garageDoor.timer >= garageDoor.delayTime) { | |
Serial.printf("[%s]: timer expired\r\n", garageDoor.name.c_str()); | |
return true; | |
} | |
return false; | |
} | |
void sendGarageDoorCloseEvent(GarageDoor& garageDoor) { | |
SinricProGarageDoor& myGarageDoor = SinricPro[garageDoor.deviceId]; | |
myGarageDoor.sendDoorStateEvent(true); | |
Serial.printf("[%s]: close event sent\r\n", garageDoor.name.c_str()); | |
} | |
void handleGarageDoorTimer(GarageDoor& garageDoor) { | |
if (garageDoorTimerIsExpired(garageDoor)) { | |
stopGarageDoorTimer(garageDoor); | |
sendGarageDoorCloseEvent(garageDoor); | |
} | |
} | |
void handleGarageDoorTimers() { | |
for (auto& garageDoor : garageDoors) handleGarageDoorTimer(garageDoor); | |
} | |
bool onDoorState(const String& deviceId, bool& state) { | |
for (auto& garageDoor : garageDoors) { | |
if (deviceId == garageDoor.deviceId) { | |
if (state) { | |
closeGarageDoor(garageDoor); | |
} else { | |
openGarageDoor(garageDoor); | |
} | |
return true; | |
} | |
} | |
return false; | |
} | |
void setupGarageDoor(GarageDoor& garageDoor) { | |
int pin = garageDoor.pin; | |
pinMode(pin, OUTPUT); | |
digitalWrite(pin, HIGH); | |
SinricProGarageDoor& door = SinricPro[garageDoor.deviceId]; | |
door.onDoorState(onDoorState); | |
} | |
void setupGarageDoors() { | |
for (auto& garageDoor : garageDoors) setupGarageDoor(garageDoor); | |
} | |
void setupWiFi() { | |
Serial.println("[WiFi]: Connecting"); | |
WiFi.begin(WIFI_SSID, WIFI_PASS); | |
while (WiFi.status() != WL_CONNECTED) { | |
delay(100); | |
Serial.print("."); | |
} | |
Serial.println("Connected"); | |
} | |
void setupSinricPro() { | |
SinricPro.onConnected([]() { Serial.println("[SinricPro]: connected"); }); | |
SinricPro.onDisconnected([]() { Serial.println("[SinricPro]: disconnected"); }); | |
Serial.println("[SinricPro]: connecting..."); | |
SinricPro.begin(APP_KEY, APP_SECRET); | |
} | |
void setup() { | |
Serial.begin(115200); | |
setupGarageDoors(); | |
setupWiFi(); | |
setupSinricPro(); | |
} | |
void loop() { | |
SinricPro.handle(); | |
handleGarageDoorTimers(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment