



















Preview text:
Đ I H C BÁCH KHOA HÀ N I Ạ Ọ Ộ TRƯ
Ờ NG CƠ KHÍ
----- ----- BÁO CÁO BÀI T ẬP L N Ớ Môn: K ỹ thu t l n t
ậ ậ p trình trong Cơ đi ệ ử Đ tài: ề Smart Home Giáo viên hư ng d n: L c ớ ẫ TS. Dương Văn ạ Nhóm sinh viên th ực hi n Nhóm 2 ệ : STT H ọ và tên MSSV 1 Đ Ng c Nam 20195105 ỗ ọ 2 Lê Duy Thái 20195172 3 Tr ần Ng c 20195187 ọ Thao Hà N ội, 8 - 2022
Phân chia công việc Họ và Tên Công việc Đánh giá Đỗ Ngọc Nam
Thiết kế mô hình + chuẩn bị linh kiện Hoàn thành + tìm code Lê Duy Thái
Lập trình arduino, Winforms + tổng Hoàn thành hợp, chỉnh sửa Trần Ngọc Thao
Làm báo cáo + thiết kế mô hình + tìm Hoàn thành code Mục lục
Chương 1: Đặt vấn đề
........................................................................................................ 1.1 Giới thiệu chung
.................................................................................................... 1.2 Các yêu cầu cơ
bản ................................................................................................
1.3 Phương pháp, phạm vi và giới hạn nghiên cứu .......................................................
Chương 2: Linh kiện và phần cứng
....................................................................................
2.1 Linh kiện ................................................................................................................
2.1.1 Arduino Uno R3 ........................................................................................... 2.1.2
Cảm biến DHT11 ......................................................................................... 2.1.3 Cảm
biến MQ2 .............................................................................................
2.1.4 Màn hình LCD 16x2 (I2C) ...........................................................................
2.2 Sơ đồ khối, sơ đồ hoạt động
................................................................................... 2.3 Sơ đồ nối mạch
......................................................................................................
Chương 3: Giao tiếp giữa các linh kiện
..............................................................................
Chương 4: Winforms và Code lập trình
.............................................................................
Chương 5: Sản phẩm và ứng dụng
.....................................................................................
Chương 1: Đặt vấn đề
1.1 Giới thiệu chung
Ngày nay, các cụm từ "nhà thông minh" và "Internet vạn vật kết nối" thường xuyên
được nhắc đến như là một xu hướng tiên tiến, hướng con người đến với cuộc sống tiện
nghi và thoải mái do công nghệ mang lại. Đó không còn là những thứ trong tương lai
xa mà đã hiện diện ở khắp nơi trên thế giới và ngay cả ở Việt Nam cũng đang có một
thị trường cực kỳ sôi động.
Áp dụng những kiến thức đã học vào thực tế, nhóm chúng em đã lựa chọn đề tài: “Smart
Home”. Hệ thống này có khả năng ứng dụng để cảnh báo rò rỉ khí gas, thu thập và biểu diễn
bằng đồ thị các chỉ số về nhiệt độ - độ ẩm, đồng thời điều khiển được các thiết bị qua giao diện.
1.2 Các yêu cầu cơ bản
✓ Hệ thống phù hợp với nhu cầu của người tiêu dùng, hướng đến đối tượng là hộ gia đình.
✓ Hệ thống đảm bảo được độ chính xác.
✓ Giá thành phù hợp, kết cấu nhỏ gọn.
✓ Hoạt động ổn định trong các điều kiện khác nhau.
1.3 Phương pháp, phạm vi và giới hạn nghiên cứu
1.3.1 Phương pháp
❖ Phương pháp lý thuyết
Đề xuất và nghiên cứu các linh kiện đã có trong mạch qua các tài liệu trên Internet.
Đưa ra cách giao tiếp giữa giao diện winforms và Arduino.
❖ Phương pháp thực nghiệm
Tham khảo các mô hình trên Internet để cải tiến thiết kế và mục đích sử dụng.
1.3.2 Phạm vi đề tài và giới hạn nghiên cứu
Được sử dụng trong các hộ gia đình, có thể ứng dụng trong công nghiệp để phục vụ
an toàn và tiện lợi cho các hoạt động từ xa.
Chương 2: Linh kiện và phần cứng 2.1 Linh kiện
2.1.1 Arduino Uno R3
Thông số cần lưu ý: Chip điều khiển ATmega328 họ 8bit chính
Nguồn nuôi mạch 5V từ cổng USB.
Khuyên dùng 7-9V để đảm bảo mạch hoạt động tốt. Nếu bạn cắm 12V
Nguồn ngoài (cắm thì IC ổn áp rất dễ chết và gây hư hỏng mạch từ giắc tròn DC)
Dòng ra tối đa (5V) 500 mA Số chân Digital 14 (hỗ trợ 6 chân PWM) Số chân Analog 6 Dòng ra trên chân digital tối đa 40 mA Dòng ra trên chân 50 mA 3.3V
Dung lượng bộ nhớ 32 KB (ATmega328) Flash
0.5 KB được sử dụng bootloader SRAM 2 KB (ATmega328) EEPROM 1 KB (ATmega328) Tốc độ 16 MHz
Một số chân năng lượng:
• GND (Ground): cực âm của nguồn điện cấp cho Arduino UNO. Khi bạn dùng
các thiết bị sử dụng những nguồn điện riêng biệt thì những chân này phải được nối với nhau.
• 5V: cấp điện áp 5V đầu ra. Dòng tối đa cho phép ở chân này là 500mA
• 3.3V: cấp điện áp 3.3V đầu ra. Dòng tối đa cho phép ở chân này là 50mA.
• VIN (Voltage Input) : để cấp nguồn ngoài cho Arduino UNO, bạn nối cực
dương của nguồn với chân này và cực âm của nguồn với chân GND.
• IOREF : điện áp hoạt động của vi điều khiển trên Arduino UNO có thể được đo
ở chân này. Và dĩ nhiên nó luôn là 5V. Mặc dù vậy bạn không được lấy nguồn
5V từ chân này để sử dụng bởi chức năng của nó không phải là cấp nguồn.
• RESET: việc nhấn nút Reset trên board để reset vi điều khiển tương đương với
việc chân RESET được nối với GND qua 1 điện trở 10K. 2.1.2 Cảm biến DHT11
Các đặc tính kỹ thuật quan trọng:
• Nguồn điện 3,5v đến 5v.
• Mức tiêu thụ hiện tại 2,5mA.
• Tín hiệu đầu ra kỹ thuật số.
• Phạm vi nhiệt độ từ 0ºC đến 50ºC.
• Độ chính xác để đo nhiệt độ ở 25ºC, dao động khoảng 2ºC.
• Độ phân giải để đo nhiệt độ là 8-bit, 1ºC. Độ ẩm có thể đo từ 20% RH đến 90% RH.
• Độ ẩm chính xác 5% RH cho nhiệt độ từ 0-50ºC.
• Độ phân giải là 1% RH, nó không thể nhận các biến thể dưới mức đó.
Các chân của DHT11:
Gồm 2 chân cấp nguồn (VCC, GND) và 1 chân tín hiệu (DATA). Công dụng:
Dùng để đo nhiệt độ và độ ẩm với độ tin cậy và độ ổn định cao.
2.1.3 Cảm biến MQ2
Thông số kỹ thuật: Datasheets
Cảm biến khí ga MQ2 Chuẩn truyền
Số (digital) và Tương tự (ADC – Analog) Loại Module Series MQ2 Độ phân giải 10mV/°C Sai số 5% Dãy hoạt động 0 – 100% Chân 4 Công dụng
MQ2 là cảm biến khí, có thể phát hiện các loại khí (Metan, khói, …), khí có thể gây cháy.
Nguyên lý hoạt động
Cảm biến được cấu tạo từ chất bán dẫn SnO2. Chất này có độ nhạy cảm thấp với
không khí sạch. Nhưng khi trong môi trường có chất gây cháy, độ dẫn của nó thay đổi ngay.
Cảm biến khí gas MQ2 đưa ra chân A0 điện áp từ 0V đến 5V tương ứng với nồng độ
chất gây cháy trong không khí. Chúng ta có thể kết hợp với các bộ chuyển đổi để đọc
tín hiệu điện áp này và đo lường chất lượng không khí.
Ngoài ra, module được tích hợp bộ so sánh lm393 để đưa ra điện áp mức 0 hoặc mức
1. Biến trở điều chỉnh độ nhạy của cảm biến, khi tín hiệu từ chân A0 vượt quá giá trị mà
ta cài đặt ở biến trở. Module sẽ đưa ra mức 1 ở chân DO.
2.1.4 Màn hình LCD 16x2 (I2C)
Thông số kỹ thuật:
• LCD 16×2 có 16 chân trong đó 8 chân dữ liệu (D0 – D7) và 3 chân điều khiển (RS, RW, EN).
• 5 chân còn lại dùng để cấp nguồn và đèn nền cho LCD 16×2.
• Các chân điều khiển giúp ta dễ dàng cấu hình LCD ở chế độ lệnh hoặc chế độ dữ liệu.
• Chúng còn giúp ta cấu hình ở chế độ đọc hoặc ghi.
• LCD 16×2 có thể sử dụng ở chế độ 4bit hoặc 8bit tùy theo ứng dụng ta đang làm.
2.2 Sơ đồ khối và sơ đồ thuật toán
Sơ đồ khối: Kh ố i x ử lý trung tâm Kh ố i c ả m bi ế n Khối chấp hành Giao di ệ n
Sơ đồ hoạt động: C ả m bi ế n C ổ ng Serial HIGH Đi ề u khi ể n Arduino Uno R3 Giao di ệ n đèn, qu ạ t LOW C ổ ng Serial Bi ể u di ễ n s ố Bi ể u di ễ n s ố li ệ u trên màn li ệ u và đ ồ th ị hình LCD So sánh hơn v L Nh ỏ ớ ớ i n ồ ng n hơn Còi gas đ ộ cho phép HIGH
Sơ đồ nối mạch:
Chương 3: Giao tiếp giữa Module I2C và Arduino Uno R3 ✓ Hoạt động
I2C sử dụng 2 dây giao tiếp là SCL và SDA. Dây SCL (viết tắt của Serial Clock
Data) là dây truyền xung clock phát từ thiết bị master đồng bộ với việc truyền dữ
liệu. Dây SDA (Serial Data) là dây truyền dữ liệu.
Mạch vật lý I2C là mạch cực thu hở, do đó để mạng I2C có thể hoạt động được,
cần tối thiểu 2 cặp điện trở pull-up như trên hình, thông thường các giá trị điện trở
4k7 hoặc 1k2 được sử dụng, tùy thuộc vào tốc độ truyền và khoảng cách truyền.
✓ Truyền nhận bit trong I2C
Các dữ liệu được truyền trong I2C dạng các chuỗi 8 bit. Sau khi bit Start đầu tiên
được truyền, 8 bit tiếp theo chứa thông tin về địa chỉ của thiết bị sẽ được truyền
tiếp. Sau đó, một bit ACK sẽ được truyền để xác nhận việc truyền bit thành công.
Sau khi truyền bit ACK, 8 bit tiếp theo chứa thông tin địa chỉ thanh ghi nội của
thiết bị slave sẽ được truyền. Sau khi hoàn tất việc định địa chỉ với 8 bit này, một
bit ACK nữa sẽ được truyền để xác nhận. Sau đó, 8 bit Data sẽ được truyền tiếp
theo. Cuối cùng, quá trình truyền kết thúc với 1 bit ACK và 1 bit Stop xác nhận
việc truyền dữ liệu kết thúc.
✓ Sử dụng giao thức I2C V ớ
i màn hình LCD 16x2 có h ỗ tr ợ chu ẩ n giao ti ế p I2C thì s ẽ có 2 chân có tên SCL và
SDA, tương ứ ng v ớ i 2 dây SCL, SDA cho giao ti ế p I2C. V ớ i board Arduino Uno, châ n
A4 là chân SDA và chân A5 là chân SCL, 2 chân A4, A5 này cũng đư ợ c n ố i t ớ i 2 c hân SDA, SCL tương
ứ ng ở header s ử d ụ ng v ớ i OLED c ủ a board Arduino Uno. V ớ i các IC và vi đi
ề u khi ể n đư ợ c s ả n xu ấ t ngày nay đ ề u có h ỗ tr ợ đi ệ n tr ở n ộ i kéo lên do đó tron g vi ệ
c k ế t n ố i dây không c ầ n thêm đi ệ n tr ở n ộ i kéo lên. V ớ i các module h ỗ tr ợ I2C ch ỉ c ó 1 tính năng như
OLED SSD1306 , LCD 1602 đ ể hi ể n th ị , c ả m bi ế n AM2315 đ ể đ ọ c nhi ệ t đ
ộ , đ ộ ẩ m c ủ a môi trư ờ ng,… thư ờ ng ho ạ t đ ộ ng ở ch ế đ ộ slave và có 4 chân: SDA, SCL, GND và VCC.
Chương 4: Winforms và code lập trình
Code Arduino: #include #include #include #include else { LiquidCrystal_I2C digitalWrite(led1,LOW); lcd(0X27,16,2); tt1=0; } const int DHTPIN = 2; } const int DHTTYPE = if(bled2 == LOW ) { DHT11; const int pin = if(tt2 == 0) {tt2 = 1; A3; int led1 =3; int led2 digitalWrite(led2,HIGH); =5; int coi =4; int val; } int tt1=0; int tt2=0; else { digitalWrite(led2,LOW); tt2=0; } } if (val == '1' ) { tt1 = 0; digitalWrite(led1, DHT dht(DHTPIN,
LOW); } else if (val == '2' ) { DHTTYPE); tt1 = 1; digitalWrite(led1, MQ2 mq2(pin); HIGH); } if (val == '3') { void setup() {
digitalWrite(led2, LOW); } else Serial.begin(57600); if (val == '4') { lcd.init(); digitalWrite(led2, HIGH); lcd.backlight(); } pinMode(led1,OUTPUT); pinMode(coi,OUTPUT);
float t = dht.readTemperature(); float h = pinMode(led2,OUTPUT);
dht.readHumidity(); float ppm = pinMode(6,INPUT_PULLUP); mq2.readSmoke()/20000; //led1 pinMode(7,INPUT_PULLUP); //led2 dht.begin(); if(ppm > 0.005) mq2.begin(); digitalWrite(coi,HIGH); } else digitalWrite(coi,LOW); void loop() { int lcd.setCursor(0,0); bled1=digitalRead(6)
lcd.print("Nhiet Do:"); lcd.print(t); ; int
lcd.print(" C"); lcd.setCursor(0,1); bled2=digitalRead(7)
lcd.print("Do am: "); lcd.print(h); ; while
lcd.print(" %RH"); lcd.write(1); (Serial.available()) { val = Serial.read();
if(isnan(h) | isnan(t) | isnan(ppm) | isnan(tt1) | } isnan(tt2)) {return;} Serial.print("@"); if(bled1 == LOW ) {
Serial.print(t); Serial.print("A"); if(tt1 == 0) {tt1 = 1;
Serial.print(h); Serial.print("B"); digitalWrite(led1,HIGH
Serial.print(ppm); Serial.print("C"); );
Serial.print("\n"); delay(500); }
Lập trình Winforms bằng C#: - Code lập trình: using System;
using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using
System.Linq; using System.Text; using System.Threading.Tasks;
using System.Windows.Forms; using System.IO.Ports; namespace demosmh {
public partial class Form1 : Form //Xây dựng class trên nhiều form vật lí { //khai báo các biến
double temperature = 0, humidity = 0, ppm = 0;
bool updateData = false; bool led = false;
bool fan = false; double tt1; double tt2; public Form1() {
InitializeComponent(); //khởi tạo các đối tượng trên form }
private void Form1_Load(object sender, EventArgs e) {
button_open.Enabled = true; // khai báo true cho button open
button_close.Enabled = false; // khai báo false cho button close
chart1.Series["Temperature"].Points.AddXY(1, 1); //Lấy dữ liệu từ Tampertature cho đồ thị
chart1.Series["Humidity"].Points.AddXY(1, 1); //Lấy dữ liệu từ Humidity cho đồ thị
chart1.Series["PPM"].Points.AddXY(1, 1); }
private void comboBox_portLists_DropDown(object sender, EventArgs e) // Tạo chân Port {
string[] portLists = SerialPort.GetPortNames();
comboBox_portLists.Items.Clear();
comboBox_portLists.Items.AddRange(portLists); }
private void button_open_Click(object sender, EventArgs e) // Khi ấn nút kết nối { try {
serialPort1.PortName = comboBox_portLists.Text;
serialPort1.BaudRate = Convert.ToInt32(comboBox_baudRate.Text); serialPort1.Open(); button_open.Enabled = false; button_close.Enabled = true;
chart1.Series["Temperature"].Points.Clear();
chart1.Series["Humidity"].Points.Clear();
chart1.Series["PPM"].Points.Clear();
MessageBox.Show("Kết nối thành công !"); } catch (Exception error) {
MessageBox.Show(error.Message); } }
private void button_close_Click(object sender, EventArgs e) // Khi ấn nút ngắt kết nối { try { serialPort1.Close(); button_open.Enabled = true; button_close.Enabled = false;
MessageBox.Show("Ngắt kết nối !"); } catch (Exception error) {
MessageBox.Show(error.Message); } }
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { try { serialPort1.Close(); } catch (Exception error) {
MessageBox.Show(error.Message); } }
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
// Nhận dữ liệu từ Serial {
string dataIn = serialPort1.ReadTo("\n"); Data_Parsing(dataIn);
this.BeginInvoke(new EventHandler(Show_Data)); }
private void Show_Data(object sender, EventArgs e) // Hiển thị dữ liệu lấy từ Serial { if (updateData == true) {
label_temperature.Text = string.Format("Temperature = {0}°C", temperature.ToString());
label_humidity.Text = string.Format("Humidity = {0}%RH", humidity.ToString());
label_ppm.Text = string.Format("Smoke = {0} ppm", ppm.ToString());
chart1.Series["Temperature"].Points.Add(temperature);
chart1.Series["Humidity"].Points.Add(humidity);
chart1.Series["PPM"].Points.Add(ppm); } }
private void Data_Parsing(string data) // Giải mã dữ liệu {
sbyte indexOf_startDataCharacter = (sbyte)data.IndexOf("@");
sbyte indexOfA = (sbyte)data.IndexOf("A"); sbyte indexOfB =
(sbyte)data.IndexOf("B"); sbyte indexOfC = (sbyte)data.IndexOf("C");
if (indexOfA != -1 && indexOfB != -1 && indexOfC != -1 &&
indexOf_startDataCharacter != -1) { try {
string str_temperature = data.Substring(indexOf_startDataCharacter + 1,
(indexOfA - indexOf_startDataCharacter) - 1); //láy dữ liệu từ dãy mã hóa
string str_humidity = data.Substring(indexOfA + 1, (indexOfB - indexOfA) - 1);
string str_ppm = data.Substring(indexOfB + 1, (indexOfC - indexOfB) - 1);
temperature = Convert.ToDouble(str_temperature);
humidity = Convert.ToDouble(str_humidity); ppm = Convert.ToDouble(str_ppm); updateData = true; } catch (Exception) { } } else { updateData = false; } }
private void label3_Click(object sender, EventArgs e){}
private void button1_Click(object sender, EventArgs e) { if (led == false) { serialPort1.Write("2"); button1.Text = "ON";
button1.BackColor = Color.Lime; led = true; } else { serialPort1.Write("1"); button1.Text = "OFF";
button1.BackColor = Color.Red; led = false; } }
private void button2_Click(object sender, EventArgs e) { if (fan == false) { serialPort1.Write("4"); button2.Text = "ON";
button2.BackColor = Color.Lime; fan = true; } else { serialPort1.Write("3"); button2.Text = "OFF";
button2.BackColor = Color.Red; fan = false; } }
private void label_temperature_Click(object sender, EventArgs e){}
private void chart1_Click(object sender, EventArgs e){} private
void label_humidity_Click(object sender, EventArgs e){} private
void label5_Click(object sender, EventArgs e){}
private void comboBox_baudRate_SelectedIndexChanged(object sender, EventArgs e) { } } }
- Giao diện điều khiển trên Winforms C#:
Chương 5: Sản phẩm và ứng dụng Sản phẩm: Ứng dụng:
Sản phẩm được dùng để điều khiển các thiết bị trong nhà, cảnh báo rò rỉ khí gas, điều khiển
đèn và quạt qua màn hình, … giúp cho cuộc sống cảu mỗi gia đình trở nên thông minh và
hiện đại hơn, tạo cho người sử dụng cảm giác tiện nghi và thoải mái.