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
Trang 1MỤC LỤC
Contents
Mục lục 1
CHƯƠNG I: Tổng quan 2
1 Giới thiệu về hệ thống 2
2 Các giải pháp 2
3 Mô hình kiến trúc hệ thống 2
4 Kịch bản hoạt động 3
CHƯƠNG II: Xây dựng hệ thống 4
1 Xây dựng hệ thống phần cứng 4
a Module ESP32 4
b Cảm biến nhiệt độ và độ ẩm DHT11 5
c Đèn LED 6
d Dây dẫn 6
2 Phần mềm điều khiển 6
3 Chương trình nạp vào ESP32 7
CHƯƠNG III: Kết nối hệ thống 12
1 Giải pháp 12
2 Web 13
3 Phát triển 19
Trang 2CHƯƠNG I: TỔNG QUAN
1 Giới thiệu về hệ thống
Hệ thống thực hiện ý tưởng thiết kế và chế tạo mô hình nhà thông minh sử dụng ESP32 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à
2 Các giải pháp
Một số giải pháp về nhà thông minh tiêu biểu trên thị trường hiện nay:
3 Mô hình kiến trúc hệ thống
Trang 3Module ESP32
Web Sever
Cảm biến nhiệt
độ DHT11
Các nút ấn trên
Web Sever
Đèn LED
Các ô hiển thị giá trị cảm biến
Cảm biến vật
4 Kịch bản hoạt động
Hệ thống nhà thông minh được hoạt động với kịch bản như sau:
Cảm biến DHT11 đọc nhiệt độ và độ ẩm từ môi trường, chuyển tín hiệu này thành tín hiệu điện áp Tín hiệu điện áp được truyền đến ESP32 ESP chuyển tín hiệu điện áp thành tín hiệu digital và dựa trên thuật toán để gửi lên Web Server
ESP32 đọc trạng thái chân đèn LED và quạt Trạng thái được truyền tín hiệu liên tục lên Web Server để hiển thị Mỗi lần nhấn nút ON hoặc OFF trên Web Sever sẽ gửi các tín hiệu 1 hoặc 0 để bật tắt đèn tại các chân GPIO gắn với LED hoặt quạt
Cảm biến vật cản LM393 truyền tín hiêu digital 1 hoặc 0 đến ESP32 khi có người xuất hiện Khi có người xuất hiện, cảm biến sẽ xuất tín hiệu 0 và ngược lại khi không có người tín hiệu sẽ luôn hiển thị là 1
Dữ liệu được cập nhật liên tục có đỗ trễ rất thấp
Trang 4CHƯƠNG II: XÂY DỰNG HỆ THỐNG
1 Xây dựng hệ thống phần cứng
a Module ESP32
ESP32 là một hệ thống vi điều khiển trên chip (SoC) giá rẻ của Espressif Systems, nhà phát triển của ESP8266 SoC Nó là sự kế thừa của SoC ESP8266 và có
cả hai biến thể lõi đơn và lõi kép của bộ vi xử lý 32-bit Xtensa LX6 của Tensilica với Wi-Fi và Bluetooth tích hợp Điểm tốt về ESP32, giống như ESP8266 là các thành phần RF tích hợp của nó như bộ khuếch đại công suất, bộ khuếch đại nhận tiếng ồn thấp, công tắc ăng-ten, bộ lọc và Balun RF Điều này làm cho việc thiết kế phần cứng xung quanh ESP32 rất dễ dàng vì bạn cần rất ít thành phần bên ngoài Một điều quan trọng khác cần biết về ESP32 là nó được sản xuất bằng công nghệ 40 nm công suất cực thấp của TSMC Vì vậy, việc thiết kế các ứng dụng hoạt động bằng pin như thiết
bị đeo, thiết bị âm thanh, đồng hồ thông minh, , sử dụng ESP32 sẽ rất dễ dàng
ESP32 có nhiều tính năng hơn ESP8266 và rất khó để đưa tất cả các thông số
kỹ thuật vào bài này Vì vậy, Điện Tử Tương Lai đã lập danh sách một số thông số kỹ thuật quan trọng của ESP32 tại đây Nhưng để có bộ thông số kỹ thuật hoàn chỉnh, bạn nên tham khảo datasheet
Trang 5 Ethernet MAC cho giao tiếp mạng LAN vật lý (yêu cầu PHY bên ngoài).
/ SPI
b Cảm biến nhiệt độ và độ ẩm DHT11
DHT11 là cảm biến đo nhiệt độ, độ ẩm đầu ra số có hiệu chỉnh đảm bảo kết quả
đo có độ chính xác cao Kết quả đo được lưu trữ trong bộ nhớ Khi giao tiếp với DHT11 thì kết quả đo sẽ được đọc ra từ bộ nhớ, module có kích thước nhỏ gọn và được đóng gói với 3 chân kết nối rất thuận tiện và phù hợp với nhiều ứng dụng thực tiễn
Thông số kỹ thuật của cảm biến
lần truyền dữ liệu là 5ms
Trang 6 Dữ liệu truyền trên chân DATA bao gồm dữ liệu độ ẩm 16bits và dữ liệu nhiệt
độ 16bits
Khi MCU gửi tín hiệu start signal thì DHT11 thay đổi từ chế độ công suất thấp sang chế độ hoạt động Khi MCU giao tiếp với DHT11 thì cảm biến sẽ gửi tín hiệu đáp ứng của 40bits data chứa giá trị nhiệt độ và độ ẩm tới MCU Khi kết thúc cảm biến lại trở về chế độ công suất thấp
c Cảm biến vật cản hồng ngoại LM393
Hình 1: Cảm biến hồng ngoại LM393
Cảm biến vật cản hồng ngoại có khả năng thích nghi với môi trường, có một cặp truyền và nhận tia hồng ngoại Tia hồng ngoại phát ra một tần số nhất định, khi phát hiện hướng truyền có vật cản (mặt phản xạ), phản xạ vào đèn thu hồng ngoại, sau khi so sánh, đèn màu xanh sẽ sáng lên, đồng thời đầu cho tín hiệu số đầu ra (một tín hiệu bậc thấp)
Khoảng cách làm việc hiệu quả 2 ~ 5cm, điện áp làm việc là 3.3 V đến 5V Độ nhạy sáng của cảm biến vật cản hồng ngoại được điều chỉnh bằng chiết áp, cảm biến
dễ lắp ráp, dễ sử dụng,…
Có thể được sử dụng rộng rãi trong robot tránh chướng ngại vật, xe tránh chướng ngại vật và dò đường…
d Đèn LED
e Dây dẫn
5 Phần mềm điều khiển
Môi trường phát triển tích hợp Arduino IDE là một ứng dụng đa nền tảng được viết bằng Java, và được dẫn xuất từ IDE cho ngôn ngữ lập trình xử lý và các dự án lắp ráp Nó bao gồm một trình soạn thảo mã với các tính năng như làm nổi bật cú pháp,
Trang 7khớp dấu ngoặc khối chương trình, thụt đầu dòng tự động và cũng có khả năng biên dịch và tải lên các chương trình vào board mạch với một nhấp chuột duy nhất Một chương trình hoặc mã viết cho Arduino được gọi là "sketch"
Chương trình Arduino được viết bằng C hoặc C++ Arduino IDE đi kèm với một thư viện phần mềm được gọi là "Wiring" từ dự án lắp ráp ban đầu, cho hoạt động đầu vào/đầu ra phổ biến trở nên dễ dàng hơn nhiều Người sử dụng chỉ cần định nghĩa hai hàm để thực hiện một chương trình điều hành theo chu kỳ Khi các chúng ta bật điện bảng mạch Arduino, reset hay nạp chương trình mới, hàm setup() sẽ được gọi đến đầu tiên Sau khi xử lý xong hàm setup(), Arduino sẽ nhảy đến hàm loop() và lặp vô hạn hàm này cho đến khi tắt điện board mạch Arduino
Dưới đây là giao diện của phần mềm:
6 Chương trình nạp vào ESP32
#include <WiFi.h> // thư viện mạng
#include <WebServer.h>
#include "PageIndex.h" //input trang web
#include <DHT.h>
#define LED_1 18 // 2 chân led
#define LED_2 19
Trang 8#define LEDCB 21
#define cambien 22
int a = 0;
const int DHTTYPE = DHT11;
const char *ssid = "NHÀ THÔNG MINH"; //pass và tến wifi const char *password = "12345678";
IPAddress local_ip(192, 168, 2, 1);//kế9 t nố9 i wifi NHÀ THÔNG MINH, nhập 192.168.2.1 vào chrome là xong
IPAddress gateway(192, 168, 2, 1);
IPAddress subnet(255, 255, 255, 0);
WebServer server(80);
DHT dht(DHTPIN, DHTTYPE);
float nhietdo, doam;
void handleRoot()
{
server.send(200, "text/html", MAIN_page); //khở7 i tạo HTML
}
void handleLED_1() //hàm bật led1
{
String LightState = "OFF";
String t_state = server.arg("LEDState");
Serial.print("GPIO 18 | ");
Serial.print(t_state);
if (t_state == "1")
{
Trang 9digitalWrite(LED_1, LOW);
LightState = "OFF";
Serial.println(" | LED 1 OFF");
}
else
{
digitalWrite(LED_1, HIGH);
LightState = "ON";
Serial.println(" | LED 1 ON");
}
server.send(200, "text/plane", LightState);
}
void handleLED_2() //hàm bật led 2
{
String LightState = "OFF";
String t_state = server.arg("LEDState");
Serial.print("GPIO 19 | ");
Serial.print(t_state);
if (t_state == "1")
{
digitalWrite(LED_2, LOW);
LightState = "OFF";
Serial.println(" | LED 2 OFF");
}
else
{
digitalWrite(LED_2, HIGH);
LightState = "ON";
Serial.println(" | LED 2 ON");
}
server.send(200, "text/plane", LightState);
Trang 10void docdulieunhietdo() // hàm đọc dữ liệu nhiệt độ
{
nhietdo = dht.readTemperature();
String snhietdo = String(nhietdo);
if (isnan(nhietdo))
{
server.send(200, "text/plain", "Failed to read DHT11 Sensor");
}
else
{
server.send(200, "text/plain", snhietdo);
}
}
{
doam = dht.readHumidity();
String sdoam = String(doam);
if (isnan(doam))
{
server.send(200, "text/plain", "Failed to read DHT11 Sensor");
}
else
{
server.send(200, "text/plain", sdoam);
}
}
Trang 11void setup(void)
{
Serial.begin(115200);
delay(1000);
Serial.println("");
pinMode(LED_1, OUTPUT); //chân led out
pinMode(LEDCB, OUTPUT);
pinMode(LED_2, OUTPUT);
pinMode(cambien, INPUT);
dht.begin();
WiFi.softAP(ssid, password);
WiFi.softAPConfig(local_ip, gateway, subnet);
server.on("/", handleRoot);
server.on("/setLED1", handleLED_1);//gư7 i trạng thái led 1
server.on("/setLED2", handleLED_2);//gư7 i trạng thái led 2
server.on("/docnhietdo", docdulieunhietdo); //gư7 i
server.on("/docdoam", docdulieudoam); //gư7 i biế9 n độ â7 m vào web
server.begin();
Serial.println("HTTP server started");
}
void loop(void)
{
server.handleClient();
a = digitalRead(cambien);
if( a == 1)
Trang 12{
digitalWrite(LEDCB, LOW);
}
else{
digitalWrite(LEDCB, HIGH);
}
}
Trang 13CHƯƠNG III: KẾT NỐI HỆ THỐNG
1 Giải pháp
Chúng ta đang sống trong một thời đại với rất nhiều công nghệ hiện đại khiến cho cuộc sống của chúng ta trở nên dễ dàng hơn Trong vài năm trở lại đây, các bước tiến lớn về công nghệ đã khiến cho ngôi nhà của chúng ta ngập tràn các thiết bị công nghệ cao Nói một cách đơn giản thì các giải pháp công nghệ này cho phép có thể điều hành căn nhà của mình thông qua các thiết bị điều khiển từ xa, thường là điện thoại thông minh hoặc máy tính bảng Có thể kiểm soát các thiết bị điện chiếu sáng đến các thiết bị đảm bảo an ninh
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:
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ư sau
Cảm biến nhiệt độ
và độ ẩm bật Bắt đầu Cảm biến vật cản bật
Gửi dữ liệu nhiệt độ tín hiệu digital về ESP32
Gửi tín hiệu digital
về ESP32
Gửi tín hiệu 1 hoặc 0
về ESP32
Kiểm tra dữ liệu nhận được có phải dạng số nguyên không
In ra màn hình cảm biến hoạt động Gửi dữ liệu đến hàm Script của HTML
In ra màn hình cảm biến không hoạt động
Khởi tạo WebServer
Khởi tạo WebServer
Input co de HTML dưới dạng text, khởi chạy cấu hình trang web
Script nhận tín hiệu đúng địa chỉ đính kèm
Kiểm tra tín hiệu nhận được
Đèn tắt
Đèn sáng
Hiển thị lên trên Web Server Kết thúc
7 Web
Chương trình tạo giao diện trên Web:
Trang 14<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
href='https://use.fontawesome.com/releases/v5.7.2/css/all
integrity='sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpv LbHG9Sr' crossorigin='anonymous'>
<title>NHA THONG MINH</title>
<style>
html {
font-family: Arial;
display: inline-block;
margin: 0px auto;
text-align: center;
}
h1 { font-size: 3.0rem;}
p { font-size: 2.0rem; }
units {
font-size: 1.2rem;
}
dht-labels{
font-size: 1.5rem;
vertical-align:middle;
padding-bottom: 15px;
}
buttonON {
display: inline-block;
Trang 15padding: 15px 25px;
font-size: 24px;
font-weight: bold;
cursor: pointer;
text-align: center;
text-decoration: none;
outline: none;
color: #fff;
background-color: #4CAF50;
border: none;
border-radius: 15px;
box-shadow: 0 5px #999;
}
.buttonON:hover {background-color: #3e8e41}
.buttonON:active {
background-color: #3e8e41;
box-shadow: 0 1px #666;
transform: translateY(4px);
}
buttonOFF {
display: inline-block;
padding: 15px 25px;
font-size: 24px;
font-weight: bold;
cursor: pointer;
text-align: center;
text-decoration: none;
outline: none;
color: #fff;
background-color: #e74c3c;
border: none;
Trang 16border-radius: 15px;
box-shadow: 0 5px #999;
}
buttonOFF:hover {background-color: #c0392b}
buttonOFF:active {
background-color: #c0392b;
box-shadow: 0 1px #666;
transform: translateY(4px);
}
</style>
</head>
<body>
<div>
<h1>NHA THONG MINH</h1>
<p>
<span class='dht-labels'>NHIET DO: </span>
<span id="nhietdos">0</span>
<sup class='units'>°C</sup>
</p>
<p>
<span class='dht-labels'>DO AM: </span>
<span id="doams">0</span>
<sup class='units'>%</sup>
</p>
</div>
<div>
<p style="color:#2c3e50;font-weight:
id="LEDState1">NA</span></p>
</div>
Trang 17<div>
<button type="button" class="buttonON" onclick="sendDataLED1(0)">DEN BAT</button>
<button type="button" class="buttonOFF" onclick="sendDataLED1(1)">DEN TAT</button><BR>
</div>
<div>
<p style="color:#2c3e50;font-weight:
id="LEDState2">NA</span></p>
</div>
<div>
<button type="button" class="buttonON" onclick="sendDataLED2(0)">DEN BAT</button>
<button type="button" class="buttonOFF" onclick="sendDataLED2(1)">DEN TAT</button><BR>
</div>
<script>
setInterval(function()
{
getnhietdo();
getdoam();
}, 1000);
function getnhietdo() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
Trang 18if (this.readyState == 4 && this.status == 200) {
document.getElementById("nhietdos").innerHTML
= this.responseText;
}
};
xhttp.open("GET", "docnhietdo", true);
xhttp.send();
}
function getdoam() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("doams").innerHTML = this.responseText;
}
};
xhttp.open("GET", "docdoam", true);
xhttp.send();
}
function sendDataLED1(LED) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("LEDState1").innerHTM
L = this.responseText;
}
};