#include <Arduino.h>
#ifdef ESP32
#include <WiFi.h>
#endif
#include "SinricPro.h"
#include "SinricProSwitch.h"
/*************** WiFi & Sinric Pro ****************/
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASS ""
#define APP_KEY "d5c3394b-fb7d-4b3d-9827-bebf1d04575d"
#define APP_SECRET "76f251e6-2dbf-4e7a-9f32-7fdaf5350b26-9d2a5280-5b9b-48b9-b876-d6204f862f5e"
#define SWITCH1_ID "681de519dc4a25d5c3cab622" // lamp1 (аларма)
#define SWITCH2_ID "681de58edc4a25d5c3cab66a" // lamp2 (бойлер)
#define SWITCH3_ID "681de5e1bddfc53e33f29d86" // lamp3 (врата)
/*************** GPIO Пинове ****************/
#define PIR_PIN 32
#define GREEN_LED 33
#define RED_LED 14
#define BUZZER_PIN 27
#define DOOR_LED 26
#define DOOR_BUTTON 12
#define SWITCH_PIN 4 // slide switch за алармата
/*************** Променливи ****************/
bool securityActive = false;
unsigned long alarmStartTime = 0;
bool alarmOn = false;
bool lastButtonState = HIGH;
SinricProSwitch& lamp1Switch = SinricPro[SWITCH1_ID];
SinricProSwitch& lamp3Switch = SinricPro[SWITCH3_ID];
/*************** Sinric callback ****************/
bool onPowerState(const String &deviceId, bool &state) {
if (deviceId == SWITCH1_ID) {
securityActive = state;
if (!alarmOn) {
digitalWrite(GREEN_LED, state);
}
Serial.println(state ? "СИГУРНОСТ: ВКЛЮЧЕНА (от Alexa/Sinric)" : "СИГУРНОСТ: ИЗКЛЮЧЕНА");
}
else if (deviceId == SWITCH2_ID) {
digitalWrite(BUZZER_PIN, state); // бойлер (симулация с зумер)
Serial.println(state ? "БОЙЛЕР: ВКЛЮЧЕН" : "БОЙЛЕР: ИЗКЛЮЧЕН");
}
else if (deviceId == SWITCH3_ID) {
digitalWrite(DOOR_LED, state); // LED за врата
Serial.println(state ? "ВРАТА: ОТВОРЕНА" : "ВРАТА: ЗАТВОРЕНА");
}
return true;
}
void setup() {
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
pinMode(SWITCH_PIN, INPUT_PULLUP);
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(DOOR_LED, OUTPUT);
pinMode(DOOR_BUTTON, INPUT_PULLUP);
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, LOW);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(DOOR_LED, LOW);
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi свързан");
lamp1Switch.onPowerState(onPowerState);
SinricProSwitch& s2 = SinricPro[SWITCH2_ID];
s2.onPowerState(onPowerState);
lamp3Switch.onPowerState(onPowerState);
SinricPro.begin(APP_KEY, APP_SECRET);
SinricPro.restoreDeviceStates(true);
}
void loop() {
SinricPro.handle();
// >>>>> Контрол от slide switch
bool switchState = digitalRead(SWITCH_PIN) == LOW;
if (switchState != securityActive) {
securityActive = switchState;
// Изпращане на статуса към Sinric Pro
lamp1Switch.sendPowerStateEvent(securityActive);
if (!alarmOn) {
digitalWrite(GREEN_LED, securityActive);
}
Serial.println(securityActive ? "Алармата е ВКЛЮЧЕНА (от суич)" : "Алармата е ИЗКЛЮЧЕНА");
}
// >>>>> Аларма при движение (5 секунди)
if (securityActive && digitalRead(PIR_PIN) == HIGH && !alarmOn) {
Serial.println("ДВИЖЕНИЕ! Аларма за 5 сек.");
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BUZZER_PIN, HIGH);
alarmStartTime = millis();
alarmOn = true;
}
if (alarmOn && millis() - alarmStartTime > 5000) {
digitalWrite(RED_LED, LOW);
digitalWrite(BUZZER_PIN, LOW);
alarmOn = false;
Serial.println("Алармата изключена.");
if (securityActive) {
digitalWrite(GREEN_LED, HIGH);
}
}
bool currentButtonState = digitalRead(DOOR_BUTTON);
if (lastButtonState == HIGH && currentButtonState == LOW) {
lamp3Switch.sendPowerStateEvent(true);
digitalWrite(DOOR_LED, HIGH); // локално включи лампата
Serial.println("ВРАТА: ОТВОРЕНА с бутон (локално + Sinric)");
}
lastButtonState = currentButtonState;
}