-
-
Save sivar2311/675b7ba84e9bd0032e40f1a2903b1ab1 to your computer and use it in GitHub Desktop.
Multiple GarageDoors with automatic close after n milliseconds
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
#pragma once | |
#include <Arduino.h> | |
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; | |
}; |
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 "GarageDoor.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"; | |
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