Image

Проект 7. Комплексно управление на устройства

В настоящето видео ще Ви покажем как да управлявате своите умни устройства по различни начини. За целта ще интегрираме управление от мобилен телефон, с гласов асистент Алекса, с дистанционно управление и с класически ключове. В проекта ще се демонстрира работата на осветление на стаите, отваряне и затваряне на гаражна врата и автоматизирано спускане и вдигане на завеси.

Резолюция: 1920x1080
Формат: MP4
Продължителност: 00:00:20

Лиценз

Безплатно за лично ползване и за образователни цели с некомерсиален елемент.
Моля посочвайте източникът при ползване!

Схема на проекта

Image

Необходими елементи

Проект 7. Комплексно управление на устройства
1. ESP32
2. Бредборд
3. Светодиоди - 3 броя
4. Степер мотор
5. Серво мотор
6. Свързващи кабели
7. Механични ключове - 5 броя
8. Инфрачервен ресийвър
9. Дистанционно управление (инфрачервено)
10. Релета - 3 броя
10. Мобилен телефон с Android и инсталирани приложения Alexa и Arduino IoT


Код на проекта

/**********************************************************************************

Проект: Комплексно управление на умен дом чрез 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

}