Image

Автономна система за управление на умен дом (демонстрация)

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

Резолюция: 1280x720
Формат: MP4
Продължителност: 00:02:35

Лиценз

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

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

Image

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

Проект 7. Автономна система за управление на умен дом
1. Arduino Uno / Arduino Mega 2560
2. Бредборд
3. Фотосензор
4. Резистори 10 килоома
5. Светодиод
6. Сензор за движение (PIR сензор)
7. Сензор за дъжд
8. Серво мотори - 2 броя
9. Сензор за топлина (DHT 11)
10. Вентилатор на 12 волта
11. Външен адаптер 12 волта
12. Релета - 3 броя
13. Сензор за огън
14. Бъзер
15. RFID карта
16. RFID четец
17. Сензор за газ / дим
18. Бъзер
19. Светодиоди
20. Свързващи кабели


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

#include DHT.h
#include Servo.h
#include SPI.h
#include MFRC522.h
#include SoftwareSerial.h
#define SS_PIN 53 //дефиниране на пин за кард рийдър 53
#define RST_PIN 46 //дефиниране на пин за кард рийдър 46
#define DHTPIN 8 //дефиниране на пин за DHT сензор
#define DHTTYPE DHT11 //дефиниране на тип DHT сензор
int sensor_pin = 30; //дефиниране на пин за сензор за вода на покрив
int tap_servo_pin = 28; //дефиниране на пин за серво мотор на покрив
int my_servo_pin = 38; //дефиниране на пин за серво мотор за входна врата
int ValueSensorWater; //дефиниране на променлива за наличие на дъжд
int BUZZER = 14; //дефиниране на пин за бъзер
int led = 7; //дефиниране на пин за лед за аларма / контролен лед
int flame_sensor_pin = 27; //дефиниране на пин за сензор за огън
int flame_pin = HIGH; //дефиниране на променлива и начална стойност за сензора за огън
//int calibrationTime = 30; //дефиниране на време за калибрация на сензор за движение
int lowIn; //дефиниране на променлива за сензора за движение
int pause = 5000; //дефиниране на променлиза за продължителност на паузата
int pirPin = 24; //дефиниране на пин за сензор за движение
int LPG_sensor = 23; //дефиниране на дигитален пин за MQ-6 сензор
int LPG_sensorA = A2; //дефиниране на аналогов пин за MQ-6 сензор
int LPG_detected; //дефиниране на променлива за наличие на газ
int relay1 = 26; //дефиниране на пин за реле за лампа входна врата
int relay2 = 29; //дефиниране на пин за реле за вентилатор
int relay3 = 22; //дефиниране на пин за градинско осветление
int analogValue; //дефиниране на работна променлива
const int TEMP_THRESHOLD_UPPER = 37; //дефиниране на температура за включване на вентилатора
const int TEMP_THRESHOLD_LOWER = 25; //дефиниране на температура за изключване на вентилатора
const int LIGHT_SENSOR_PIN = A0; //дефиниране на аналогов пин за сензор за светлина
const int ANALOG_THRESHOLD = 400; //дефиниране на чувствителност на сензор за светлина
float temperature; //дефиниране на променлива за температуа в Целзий

// Създаване на обекти -----------------------------------------------------------------------------------------

MFRC522 mfrc522(SS_PIN, RST_PIN);
Servo myServo;
Servo tap_servo;

DHT dht(DHTPIN, DHTTYPE);

//Иницииране на функции -----------------------------------------------------------------------------------------
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(sensor_pin,INPUT);
pinMode(flame_sensor_pin, INPUT );
pinMode(pirPin, INPUT);
pinMode(LPG_sensor, INPUT);
pinMode(led, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
pinMode(relay3, OUTPUT);
tap_servo.attach(tap_servo_pin);
SPI.begin();
mfrc522.PCD_Init();
myServo.attach(my_servo_pin);
digitalWrite(pirPin, LOW);
digitalWrite(relay1, HIGH);
digitalWrite(relay2, HIGH);
digitalWrite(relay3, HIGH);
myServo.write(5);
tap_servo.write(80);

delay(10000);
}

//Основна функция ------------------------------------------------------------------------------------------------
void loop() {
FireDetection();
FanAndTemperature();
LightSensor();
PIRSensor();
Roof();
SensorGas();
FrontDoor();
delay(100);
}
// end void loop

//Дефиниране на функции -------------------------------------------------------------------------------------------

//Входна врата ----------------------------------------------------------------------------------------------------
void FrontDoor(){
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
Serial.println("Чете карта");
String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
content.toUpperCase();
Serial.println(content.substring(1));
if (content.substring(1) == "51 E6 52 49"){
delay(100);
myServo.write(120);
//LedOn();
Serial.println("Отворена входна врата");
delay(5000);
myServo.write(5);
Serial.println("Затворена входна врата");
//LedOff();
return;
}
else
{
delay(100);
return;
}
}

//Аларма за газ ----------------------------------------------------------------------------------------------------
void SensorGas() {
LPG_detected = analogRead(LPG_sensorA);
Serial.print("Стойност на сензор за газ - аналогов пин");
Serial.print(LPG_sensorA);
Serial.println(LPG_detected);
LPG_detected = digitalRead(LPG_sensor);
Serial.print("Стойност на сензор за газ - дигитален пин");
Serial.print(LPG_sensor);
Serial.println(LPG_detected);
if (LPG_detected == 1)
{
Serial.println("Има изтичане на газ!!!!");
LedOn();
digitalWrite(BUZZER, HIGH);
}
else
{
Serial.println("Няма изтичане на газ.");
LedOff();
digitalWrite(BUZZER, LOW);
}
}

// ------------------------------------------------------------------------------------------------------------------

void LedOn() { digitalWrite(led,HIGH); } //Включване на лед на аларма
void LedOff() { digitalWrite(led,LOW); } //Изключване на лед на аларма
void BuzzerOn() { digitalWrite(BUZZER,HIGH); }// Включване на бъзер
void BuzzerOff() { digitalWrite(BUZZER,LOW); }// Изключване на бъзер
void JustOpenDoor() { myServo.write(120); } //отворена врата
void JustClosedDoor() { myServo.write(5); } //затворена врата

//Управление на прозореца на покрива ---------------------------------------------------------------------------------
void Roof() {
ValueSensorWater = digitalRead(sensor_pin);
if (ValueSensorWater==0)
{
tap_servo.write(180);
delay (100);
//LedOn(); // Включване на контролен ЛЕД
Serial.println ( "Прозореца на тавана е отворен" ) ;
}
if (ValueSensorWater==1)
{
tap_servo.write(80);
delay (100);
//LedOff(); // Изключване на контролен ЛЕД
Serial.println ( "Прозореца на тавана е затворен" ) ;
}
}

//Сензор за светлина - градинско осветление ---------------------------------------------------------------------------
void LightSensor() {
analogValue = analogRead(LIGHT_SENSOR_PIN); // read the input on analog pin
Serial.print ("Степента на осветеност е: ") ;
Serial.println (analogValue) ;
if(analogValue < ANALOG_THRESHOLD)
{
//LedOff(); // Изключване на контролен ЛЕД
Serial.println ( "Градинското осветление е изключено" ) ;
digitalWrite(relay3, HIGH);
}
else
{
//LedOn(); // Включване на контролен ЛЕД
Serial.println ( "Градинското осветление е включено" ) ;
digitalWrite(relay3, LOW);
delay (100);
}
}

//Бъзер бипинг функция ----------------------------------------------------------------------------------------------------
void BuzzerBiiping()
{
digitalWrite(BUZZER, HIGH);
delay(100);
digitalWrite(BUZZER, LOW);
delay(100);
digitalWrite(BUZZER, HIGH);
delay(100);
digitalWrite(BUZZER, LOW);
delay(100);
digitalWrite(BUZZER, HIGH);
delay(100);
digitalWrite(BUZZER, LOW);
delay(100);
}

//Аларма за огън ----------------------------------------------------------------------------------------------------
void FireDetection() {
flame_pin = digitalRead ( flame_sensor_pin ) ;

if (flame_pin == LOW )
{
Serial.println ( "Пожар, Пожар, Пожар !!!" ) ;
digitalWrite(BUZZER, HIGH);
LedOn();
}
else
{
Serial.println ( "Няма пожар." ) ;
digitalWrite(BUZZER, LOW);
LedOff();
}
}

//Управление на вентилатор ----------------------------------------------------------------------------------------------------
void FanAndTemperature() {
temperature = dht.readTemperature();
delay(100);
Serial.println(temperature);

if (isnan(temperature)) {
Serial.println("Има проблем с четенето на сензора за температура!!!");
}
else
{
if(temperature > TEMP_THRESHOLD_UPPER)
{ digitalWrite(relay2, LOW); }
else if(temperature < TEMP_THRESHOLD_LOWER)
{ digitalWrite(relay2, HIGH); }
}
}

//Сензор за движение ----------------------------------------------------------------------------------------------------
void PIRSensor() {
if(digitalRead(pirPin) == HIGH){
Serial.println("Засечено е движение!!!");
digitalWrite(relay1, LOW);
}
if(digitalRead(pirPin) == LOW){
delay(100); // Време за забавяне след приключване на движението
Serial.println("Няма засечено движение.");
digitalWrite(relay1, HIGH); // Изключва релето
}
}