Nghiên cứu Khoa học

Xây dựng nhà thông minh dùng Arduino

  • 16/10/2021
  • Nghiên cứu Khoa học

Hệ thống này thực hiện ý tưởng thiết kế và chế tạo mô hình nhà thông minh sử dụng Arduino. Bộ điều khiển thiết kế có khả năng bật tắt các thiết bị một cách linh hoạt bằng các thiết bị di động có kết nối mạng wifi hoặc mạng viễn thông di động. Các trạng thái của thiết bị cũng có thể được cập nhật tức thời lên các thiết bị này nhằm kiểm soát sự hoạt động của ngôi nhà. Ngoài ra, thông qua các cảm biến được bố trí trong ngôi nhà, bộ điều khiển có khả năng tự động điều chỉnh các thiết bị phù hợp với nhu cầu sử dụng. Mô hình thiết kế là một giải pháp hoàn thiện cho nhà thông minh với khả năng điều khiển mềm dẻo và giá thành thấp so với các sản phẩm khác trên thị trường.

Giới thiệu về bộ điều khiển: Cấu trúc đơn giản, dễ điều khiển

Mô hình nhà thông minh được thiết kế với các chức năng như sau:

- Điều khiển các thiết bị từ xa và biết được trạng thái của các thiết bị.

- Đo nhiệt độ, độ ẩm trong nhà hiển thị lên LCD và điện thoại..

- Hệ thống tưới cây dựa vào độ ẩm đất.

- Tự động bật tắt bóng đèn khi có chuyển động

- Tự động bật đèn khi trời tối

Với các chức năng thiết kế nêu trên, sơ đồ khối của hệ thống được thiết kế như hình

Chức năng và nhiệm vụ các khối trong sơ đồ hình 3.1 như sau:

undefined

-  Khối nguồn là khối cung cấp nguồn cho bộ điều khiển hệ thống và các khối mạch khác hoạt động. Yêu cầu đối với khối nguồn là tính ổn định và giá trị điện áp cung cấp phải phù hợp với các khối chức năng khác của bộ điều khiển. Ở đây sử dụng nguồn 5V-2A

- Bộ điều khiển sử dụng Arduino Mega 2560 là khối xử lý trung tâm của hệ thống, thực hiện việc tiếp nhận, xử lý thông tin và giao tiếp với các thiết bị bên ngoài. Các nhiệm vụ chính như nhận giá trị nhiệt độ, độ ẩm, cường độ ánh sáng từ các cảm biến, giao tiếp với module wifi ESP8266 để truyền dữ liệu tới người sử dụng và nhận lệnh điều khiển trực tiếp từ ngưới sử dụng, xử lý dữ liệu, thực hiện các phép toán logic tạo tín hiệu điều khiển tới Relay để điều khiển các thiết bị.

- Khối cảm biến ánh sáng dùng cảm biến ánh sáng thực hiện việc đo giá trị cường độ ánh sáng và truyền kết quả trực tiếp tới relay điều khiển thiết bị.

- Khối cảm biến nhiệt độ độ ẩm ở đây sử dụng cảm biến DHT11 là module tích hợp việc đo giá trị nhiệt độ và độ ẩm kết quả đo được được chuyển về bộ xử lý trung tâm.

- Khối hiển thị sử dụng màn hình LCD 16x2 để hiển thị các giá trị nhiệt độ, độ ẩm từ cảm biến gửi về bộ xử lý.

-Khối truy cập mạng sử dụng module ESP8266. Nó là thiết bị trung gian truyền nhận dữ liệu giữa người sử dụng và bộ điều khiển trung tâm.

- Khối Relay là mạch điều khiển đóng ngắt thiết bị nhận lệnh từ bộ xử lý để điều khiển các cơ cấu chấp hành.

-Khối cảm biến hồng ngoại dùng phát hiện có người hay không có người để điều khiển thiết bị.

- Khối cảm biến chuyển động dựa trên sự chuyển động để đưa ra các lệnh điều khiển thích hợp.

- Khối cảm biến độ ẩm đất đo phân tích độ ẩm của đất rồi gửi tín hiệu điều khiển.

-Khối chấp hành là các thiết bị cần điều khiển, trong nhà kính đó là các thiết bị như: quạt thông gió, đèn chiếu sáng …

Chương trình cho Arduino Meg

#define BLYNK_PRINT Serial

#include <ESP8266_Lib.h>

#include <BlynkSimpleShieldEsp8266.h>

char auth[] = "423f1259dbef4a93b9186e25fe051703";

char ssid[] = "Sy Phuc";

char pass[] = "12341234";

#define EspSerial Serial1

#define ESP8266_BAUD 115200

ESP8266 wifi(&EspSerial);

#include <DHT.h>

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

const int DHTPIN = A15;

const int DHTTYPE = DHT11;

DHT dht(DHTPIN, DHTTYPE);

byte degree[8] = {

0B01110,

0B01010,

0B01110,

0B00000,

0B00000,

0B00000,

0B00000,

0B00000

};

int virtualPin;

int flag=0;

int flag1=0;

int flag2=0;

BLYNK_WRITE(V0)

{

virtualPin = param.asInt();

flag = 1;

}

BLYNK_WRITE(V1)

{

virtualPin = param.asInt();

flag1 = 1;

}

BLYNK_WRITE(V2)

{

virtualPin = param.asInt();

flag2 = 1;

}

 

BLYNK_CONNECTED(){

Blynk.syncVirtual(V0); 

Blynk.syncVirtual(V1);

 Blynk.syncVirtual(V2);

  }

void setup() {

Serial.begin(9600);

delay(5);

EspSerial.begin(ESP8266_BAUD);

delay(5);

Blynk.begin(auth, wifi, ssid, pass);

lcd.init(); 

lcd.backlight();

lcd.print("Nhiet do: ");

lcd.setCursor(0,1);

lcd.print("Do am   : ");

lcd.createChar(1, degree);

dht.begin(); 

pinMode(A10,OUTPUT);

pinMode(A11,OUTPUT);

pinMode(A12,OUTPUT);

pinMode(A2, OUTPUT);

pinMode(A3, OUTPUT);

pinMode(A1, OUTPUT);

pinMode(A8, INPUT_PULLUP);

pinMode(A9, INPUT_PULLUP);

pinMode(A7, INPUT_PULLUP);

}

void loop() {

Blynk.run();

float h = dht.readHumidity();

float t = dht.readTemperature();

lcd.setCursor(10,0);

lcd.print(round(t));

lcd.print(" ");

lcd.write(1);

lcd.print("C");

lcd.setCursor(10,1);

lcd.print(round(h));

lcd.print(" %"); 

Blynk.virtualWrite(V6, t);

if(flag == 1){

  if(virtualPin == 0){

    digitalWrite(A2, LOW);

    }

    else digitalWrite(A2, HIGH);

    while(digitalRead(A7) == LOW);

    int ledStatus = digitalRead(A2);

    if(ledStatus == 0){

      digitalWrite(A2, HIGH);

      Blynk.virtualWrite(V0,1);

      }

      else {

      digitalWrite(A2, LOW);

      Blynk.virtualWrite(V0,0);

      }

    }

  flag = 0;

if(flag1 == 1){

  if(virtualPin == 0){

    digitalWrite(A3, LOW);

    }

    else digitalWrite(A3, HIGH);

    }

  if(digitalRead(A8) == LOW){

    while(digitalRead(A8) == LOW);

    int ledStatus = digitalRead(A3);

    if(ledStatus == 0){

      digitalWrite(A3, HIGH);

      Blynk.virtualWrite(V1,1);

      }

      else {

      digitalWrite(A3, LOW);

      Blynk.virtualWrite(V1,0);

      }

    }

  flag1 = 0;

if(flag2 == 1){

  if(virtualPin == 0){

    digitalWrite(A1, LOW);

    }

    else digitalWrite(A1, HIGH);

  }

  if(digitalRead(A9) == LOW){

    while(digitalRead(A9) == LOW);

    int ledStatus = digitalRead(A1);

    if(ledStatus == 0){

      digitalWrite(A1, HIGH);

      Blynk.virtualWrite(V2,1);

      }

      else {

      digitalWrite(A1, LOW);

      Blynk.virtualWrite(V2,0);

      }

    }

  flag2 = 0;

if ((t==28)||(t==29)||(t==30)){

  digitalWrite(A10,0);}

else {

  digitalWrite(A10,1);}

if((t==31)||(t==32)||(t==33)){

  digitalWrite(A11,0);}

else {

  digitalWrite(A11,1);}

if(t>=34){

  digitalWrite(A12,0);}

else {

  digitalWrite(A12,1 );}

}

 

Các tin khác