Безплатно за лично ползване и за образователни цели с некомерсиален елемент.
Моля посочвайте източникът при ползване!
/**********************************************************************************
Проект: Комплексно управление на умен дом чрез ESP32, Arduino IoT Cloud, гласов асистент Alexa + IR дистанционно + Ръчен контрол Управляват се 3 релета и степер мотор (и серво) Чете се в реално време от сензор за пожар (за наводнение, за изтичане на газ и за температура)
* Поради ограниченията на свободния акаунт в Arduino IoT Cloud посочените в скоби функции не са представени в демонстрационния модел на умния дом
* Preferences--> Aditional boards Manager URLs :
* https://dl.espressif.com/dl/package_esp32_index.json, http://arduino.esp8266.com/stable/package_esp8266com_index.json
**********************************************************************************/
#include ArduinoIoTCloud.h>
#include Arduino_ConnectionHandler.h>
#include DHT.h>
#include IRremote.h>
#include ESP32Servo.h>
#include SPI.h>
#include Stepper.h>
const char THING_ID[] = "************************************"; //THING ID от Arduino IoT Cloud
const char DEVICE_LOGIN_NAME[] = "************************************"; //DEVICE ID от Arduino IoT Cloud
const char SSID[] = "**********"; //Име на безжичната мрежа към която се свързваме
const char PASS[] = "**********"; //Парола на безжичната мрежа към която се свързваме
const char DEVICE_KEY[] = "********************"; //Secret device password (Secret Key) от Arduino IoT Cloud
#define DHTPIN 34 //D34 пин на сензор за тепература
#define IR_RECV_PIN 35 //D35 пин на инфраред ресийвър за управление чрез дистанционно
#define RelayPin1 23 //D23 - пин на реле за осветление хол
#define RelayPin2 22 //D22 - пин на реле за осветление кухня
#define RelayPin3 21 //D21 - пин на реле за осветление спалня
#define ServoPin 19 //D19 - пин за серво за врата на гараж
#define FirePin 18 //D18 - пин за сензор за пожар
#define WaterPin 5 //D5 - пин за сензор за наводнение
#define GasPin 17 //D17 - пин за сензор за газ
#define BuzzerPin 15 //D15 - пин за бъзер
#define StepperPin1 32 //D32 - пин IN1 за степер мотор за завеси
#define StepperPin2 33 //D33 - пин IN2 за степер мотор за завеси
#define StepperPin3 25 //D25 - пин IN3 за степер мотор за завеси
#define StepperPin4 26 //D26 - пин IN4 за степер мотор за завеси
#define SwitchPin1 13 //D13 - пин за ръчен ключ за осветление хол
#define SwitchPin2 12 //D12 - пин за ръчен ключ за осветление кухня
#define SwitchPin3 14 //D14 - пин за ръчен ключ за осветление спалня
#define SwitchPin4 27 //D27 - пин за ръчен ключ за врата на гараж
#define SwitchPin5 16 //D16 - пин за ръчен ключ за завеси хол
#define wifiLed 2 //D2 пин за ЛЕД индикатор за свързване към безжична мрежа
#define DHTTYPE DHT11 // дефиниране на DHT 11
DHT dht(DHTPIN, DHTTYPE);
decode_results results;
int toggleState_1 = 0; //Запазване на статус на осветление хол
int toggleState_2 = 0; //Запазване на статус на осветление кухня
int toggleState_3 = 0; //Запазване на статус на осветление спалня
int toggleState_4 = 0; //Запазване на статус на врата гараж
int toggleState_5 = 0; //Запазване на статус на завеси хол
int toggleState_6 = 0; //Запазване на статус на сензор пожар
int toggleState_7 = 0; //Запазване на статус на сензор наводнение
int toggleState_8 = 0; //Запазване на статус на сензор газ
int ValueSensorWater; //статус на сензора за вода
int flame_pin = HIGH; //статус на сензора за огън
int LPG_detected; //статус на сензора за газ
int tap_servo_position_close = 0; //позиция за затворена врата на гаража
int tap_servo_position_open = 100; //позиция за отворена врата на гаража
float temperature1 = 0; //статус на сензора за температура
float humidity1 = 0; //статус на сензора за влажност
const int stepsPerRevolution = 200; // брой на обороти на мотора за завесите
Stepper myStepper(stepsPerRevolution, StepperPin3, StepperPin1, StepperPin2, StepperPin4); // инициализация на стъпковия мотор - инициализацията трябва да е в този ред на пиновете, тъй като в противен случай няма ход обратно на часовниковата стрелка
Servo tap_servo; // инициализация на серво за врата на гараж
Servo myservo; // инициализация на серво за врата на гараж
void onSwitch1Change(); //функция за упраление на осветление хол
void onSwitch2Change(); //функция за упраление на осветление кухня
void onSwitch3Change(); //функция за упраление на осветление спалня
void onSwitch4Change(); //функция за упраление на врата на гараж
void onSwitch5Change(); //функция за упраление на завеси хол
// дефиниране на променливи в Arduino IoT Cloud --------------------------------------------------------
// променливите трябва да бъдат Alexa Compatible и тип Switch
CloudSwitch switch1; //дефиниране на облачна променлива за осветление на хол - слайдер, ЛЕД
CloudSwitch switch2; //дефиниране на облачна променлива за осветление на кухня - слайдер, ЛЕД
CloudSwitch switch3; //дефиниране на облачна променлива за осветление на спалня - слайдер, ЛЕД
CloudSwitch switch4; //дефиниране на облачна променлива за врата на гараж - слайдер, ЛЕД
CloudSwitch switch5; // дефиниране на облачна променлива за завеси за хол - слайдер, ЛЕД
CloudSwitch switch6; // дефиниране на облачна променлива за сензор за пожар - ЛЕД
CloudSwitch switch7; // дефиниране на облачна променлива за сензор за наводнение - ЛЕД
CloudSwitch switch8; //дефиниране на облачна променлива за сензор за газ - ЛЕД
CloudTemperatureSensor temperature; //дефиниране на облачна променлива за температура
// инициализация --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void setup() {
Serial.begin(9600); // Инициализиране на сериен монитор
delay(1500);
initProperties(); // Дефиниране на thingProperties.h
dht.begin(); // иницииране на сензора за температура
irrecv.enableIRIn(); // Стартиране на инфраред ресийвъра
pinMode(RelayPin1, OUTPUT);
pinMode(RelayPin2, OUTPUT);
pinMode(RelayPin3, OUTPUT);
pinMode(ServoPin, OUTPUT);
pinMode(StepperPin1, OUTPUT);
pinMode(StepperPin2, OUTPUT);
pinMode(StepperPin3, OUTPUT);
pinMode(StepperPin4, OUTPUT);
pinMode(BuzzerPin, OUTPUT);
pinMode(wifiLed, OUTPUT);
pinMode(FirePin, INPUT);
pinMode(WaterPin, INPUT);
pinMode(GasPin, INPUT);
pinMode(SwitchPin1, INPUT_PULLUP);
pinMode(SwitchPin2, INPUT_PULLUP);
pinMode(SwitchPin3, INPUT_PULLUP);
pinMode(SwitchPin4, INPUT_PULLUP);
pinMode(SwitchPin5, INPUT_PULLUP);
// Иницииране на степер мотора --------------------------------------------------------------------------------------------------------------------------------------
ESP32PWM::allocateTimer(0);
ESP32PWM::allocateTimer(1);
ESP32PWM::allocateTimer(2);
ESP32PWM::allocateTimer(3);
tap_servo.setPeriodHertz(50); // определяне на частота 50 hz серво мотора
//tap_servo.attach(ServoPin, 1000, 2000); // иницииране на серво мотора
tap_servo.attach(ServoPin); // иницииране на серво мотора
myStepper.setSpeed(60); // инициализация на степер мотора и установяване на скорост от 60 оборота в минута
// Свързване към Arduino IoT Cloud --------------------------------------------------------------------------------------------------------------------------------------
WiFiConnectionHandler ArduinoIoTPreferredConnection(SSID, PASS);
ArduinoCloud.begin(ArduinoIoTPreferredConnection);
ArduinoCloud.addCallback(ArduinoIoTCloudEvent::CONNECT, doThisOnConnect);
ArduinoCloud.addCallback(ArduinoIoTCloudEvent::SYNC, doThisOnSync);
ArduinoCloud.addCallback(ArduinoIoTCloudEvent::DISCONNECT, doThisOnDisconnect);
setDebugMessageLevel(2);
ArduinoCloud.printDebugInfo();
//Иницииране на релетата за осветление --------------------------------------------------------------------------------------------------------------------------------------
digitalWrite(RelayPin1, LOW);
digitalWrite(RelayPin2, HIGH);
digitalWrite(RelayPin3, HIGH);
}
// Основна функция --------------------------------------------------------------------------------------------------------------------------------------
void loop()
{
ArduinoCloud.update();
manual_control();
ir_remote_control();
sendSensor();
}
// Дефиниране на функции ---------------------------------------------------------------------------------------------------------------------------------------------------------
// чете сензора за температура и влажност ----------------------------------------------------------------------------------------
void readSensor()
{
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
else {
humidity1 = h;
temperature = t;
Serial.println(temperature);
Serial.println(humidity1);
}
}
// чете сензора за вода -----------------------------------------------------------------------------------------------------------------
void WaterDetection() {
ValueSensorWater = digitalRead(WaterPin);
if (ValueSensorWater==0)
{
toggleState_7 = 1;
switch7 = 1;
Serial.println("Water, Water, Water");
digitalWrite(BuzzerPin, HIGH);
}
if (ValueSensorWater==1)
{
toggleState_7 = 0;
switch7 = 0;
Serial.println("No Water");
digitalWrite(BuzzerPin, LOW);
}
}
// чете сензора за газ -----------------------------------------------------------------------------------------------------------------
void SensorGas()
{
LPG_detected = digitalRead(GasPin);
Serial.println(LPG_detected);
if (LPG_detected == 1)
{
toggleState_8 = 0;
switch8 = 0;
Serial.println("No Gas");
digitalWrite(BuzzerPin, LOW);
}
else
{
toggleState_8 = 1;
switch8 = 1;
Serial.println("Gas, Gas, Gas");
digitalWrite(BuzzerPin, HIGH);
}
}
// чете сензора за огън -----------------------------------------------------------------------------------------------------------------
void FireDetection() {
flame_pin = digitalRead (FirePin);
if (flame_pin == LOW )
{
toggleState_6 = 1;
switch6 = 1;
Serial.println("Fire, Fire, Fire");
digitalWrite(BuzzerPin, HIGH);
}
else
{
toggleState_6 = 0;
switch6 = 0;
Serial.println("No Fire");
digitalWrite(BuzzerPin, LOW);
}
}
// чете стойностите на сензорите --------------------------------------------------------------------------------------------------------------
void sendSensor()
{
readSensor();
FireDetection();
SensorGas();
WaterDetection();
}
// чете дистанционното управление ----------------------------------------------------------------------------------------------------------------
void ir_remote_control(){
if (irrecv.decode(&results))
{
switch(results.value)
{
case 0x10EF629D: relayOnOff(1); switch1 = toggleState_1; break; //дефиниране на бутон за включване / изключване на осветление на хол
case 0x10EF9867: relayOnOff(2); switch2 = toggleState_2; break; //дефиниране на бутон за включване / изключване на освеление на кухня
case 0x10EFB04F: relayOnOff(3); switch3 = toggleState_3; break; //дефиниране на бутон за включване / изключване на осветление на спалня
case 0x10EFD22D: relayOnOff(4); switch4 = toggleState_4; break; //дефиниране на бутон за отваряне / затваряне на врата на гараж
case 0x10EFFA05: relayOnOff(5); switch5 = toggleState_5; break; //дефиниране на бутон за спускане / вдигане на завеси на хол
default : break;
}
Serial.println(results.value, HEX);
irrecv.resume();
}
}
// Управлява релетата и моторите чрез дистанционно управление и ръчни ключове
void relayOnOff(int relay) {
switch (relay)
{
case 1:
if (toggleState_1 == 0)
{
digitalWrite(RelayPin1, HIGH); // включване на осветление на хол
toggleState_1 = 1;
Serial.println("Осветлението на хола е включено");
}
else
{
digitalWrite(RelayPin1, LOW); // изключване на осветление на хол
toggleState_1 = 0;
Serial.println("Осветлението на хола е изключено");
}
delay(100);
break;
case 2:
if (toggleState_2 == 0)
{
digitalWrite(RelayPin2, LOW); // включване на осветление на кухня
toggleState_2 = 1;
Serial.println("Осветлението на кухнята е включено");
}
else
{
digitalWrite(RelayPin2, HIGH); // изключване на осветление на кухня
toggleState_2 = 0;
Serial.println("Осветлението на кухнята е изключено");
}
delay(100);
break;
case 3:
if (toggleState_3 == 0)
{
digitalWrite(RelayPin3, LOW); // включване на осветление на спалня
toggleState_3 = 1;
Serial.println("Осветлението на спалнята е включено");
}
else
{
digitalWrite(RelayPin3, HIGH); // изключване на осветление на спалня
toggleState_3 = 0;
Serial.println("Осветлението на спалнята е изключено");
}
delay(100);
break;
case 4:
if (toggleState_4 == 0)
{
tap_servo.write(tap_servo_position_open); // отваряне на вратата на гаража
toggleState_4 = 1;
Serial.println("Вратата на гаража е отворена");
}
else
{
tap_servo.write(tap_servo_position_close); // затваряне на вратата на гаража
toggleState_4 = 0;
Serial.println("Вратата на гаража е затворена");
}
delay(100);
break;
case 5:
if (toggleState_5 == 0)
{
Serial.println("движение по часовниковата стрелка");
myStepper.step(1600); // Спускане на завесите
toggleState_5 = 1;
Serial.println("Завесите са спуснати");
}
else
{
Serial.println("движение обратно на часовниковата стрелка");
myStepper.step(-1600); // вдигане на завесите
toggleState_5 = 0;
Serial.println("Завесите са вдигнати");
}
delay(100);
break;
default : break;
}
}
// управление от ръчни ключове ------------------------------------------------------------------------------
void manual_control() {
if (digitalRead(SwitchPin1) == LOW)
{
delay(200);
relayOnOff(1);
switch1 = toggleState_1;
}
else if (digitalRead(SwitchPin2) == LOW)
{
delay(200);
relayOnOff(2);
switch2 = toggleState_2;
}
else if (digitalRead(SwitchPin3) == LOW)
{
delay(200);
relayOnOff(3);
switch3 = toggleState_3;
}
else if (digitalRead(SwitchPin4) == LOW)
{
delay(200);
relayOnOff(4);
switch4 = toggleState_4;
}
else if (digitalRead(SwitchPin5) == LOW)
{
delay(200);
relayOnOff(5);
switch5 = toggleState_5;
}
}
// управление чрез облака ------------------------------------------------------------------------------
void onSwitch1Change()
{
if (switch1 == 1)
{
digitalWrite(RelayPin1, HIGH); //включване осветление хол
Serial.println("Осветлението на хола е включено");
toggleState_1 = 1;
}
else
{
digitalWrite(RelayPin1, LOW); // изключване осветление хол
Serial.println("Осветлението на хола е изключено");
toggleState_1 = 0;
}
}
void onSwitch2Change()
{
if (switch2 == 1)
{
digitalWrite(RelayPin2, LOW); // включване осветление кухня
Serial.println("Осветлението на кухнята е включено");
toggleState_2 = 1;
}
else
{
digitalWrite(RelayPin2, HIGH); //изключване осветление кухня
Serial.println("Осветлението на хола е изключено");
toggleState_2 = 0;
}
}
void onSwitch3Change()
{
if (switch3 == 1)
{
digitalWrite(RelayPin3, LOW); // включване осветление спалня
Serial.println("Осветлението на спалнята е включено");
toggleState_3 = 1;
}
else
{
digitalWrite(RelayPin3, HIGH); //изключване осветление спалня
Serial.println("Осветлението на спалнята е изключено");
toggleState_3 = 0;
}
}
void onSwitch4Change()
{
if (switch4 == 1)
{
tap_servo.write(tap_servo_position_open);
Serial.println("Вратата на гаража е отворена");
toggleState_4 = 1;
}
else
{
tap_servo.write(tap_servo_position_close);
Serial.println("Вратата на гаража е затворена");
toggleState_4 = 0;
}
}
void onSwitch5Change()
{
if (switch5 == 1)
{
Serial.println("движение по часовниковата стрелка");
myStepper.step(1600);
Serial.println("Завесите са спуснати");
toggleState_5 = 1;
}
else
{
Serial.println("движение обратно на часовниковата стрелка");
myStepper.step(-1600);
Serial.println("завесите са вдигнати");
toggleState_5 = 0;
}
}
// иницииращи дейности след успешно свързване с Arduino IoT Cloud ------------------------------------------------------------------
void doThisOnConnect()
{
/* възможност за допълнителен код при свързване към облака */
Serial.println("Успешно свързване към Arduino IoT Cloud");
digitalWrite(wifiLed, HIGH); //Включване на индикатор за свързване към Arduino IoT Cloud
}
// иницииращи дейности за сингронизиране с Arduino IoT Cloud ------------------------------------------------------------------
void doThisOnSync()
{
/* възможност за допълнителен код */
Serial.println("Настойките на Arduino IoT Cloud Thing са синхронизирани");
}
// иницииращи дейности след загуба на връзка с Arduino IoT Cloud ------------------------------------------------------------------
void doThisOnDisconnect()
{
/* възможност за допълнителен код */
Serial.println("Загубена е връзката с Arduino IoT Cloud");
digitalWrite(wifiLed, LOW); //Изключване на индикатор за свързване към Arduino IoT Cloud
}
void initProperties()
{
ArduinoCloud.setBoardId(DEVICE_LOGIN_NAME);
ArduinoCloud.setSecretDeviceKey(DEVICE_KEY);
ArduinoCloud.setThingId(THING_ID);
ArduinoCloud.addProperty(switch1, READWRITE, ON_CHANGE, onSwitch1Change);
ArduinoCloud.addProperty(switch2, READWRITE, ON_CHANGE, onSwitch2Change);
ArduinoCloud.addProperty(switch3, READWRITE, ON_CHANGE, onSwitch3Change);
ArduinoCloud.addProperty(switch4, READWRITE, ON_CHANGE, onSwitch4Change);
ArduinoCloud.addProperty(switch5, READWRITE, ON_CHANGE, onSwitch5Change);
ArduinoCloud.addProperty(switch6, READWRITE, ON_CHANGE, FireDetection);
ArduinoCloud.addProperty(switch7, READWRITE, ON_CHANGE, WaterDetection);
ArduinoCloud.addProperty(switch8, READWRITE, ON_CHANGE, SensorGas);
ArduinoCloud.addProperty(temperature, READ, 8 * SECONDS, NULL); //Update temperature value after every 8 seconds
}