Tải bản đầy đủ (.pdf) (19 trang)

báo cáo bài tập lớn kỹ thuật lập trình trong cơ điện tử đề tài smart home

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.64 MB, 19 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

ĐẠI H C BÁCH KHOA HÀ N I ỌỘTRƯỜNG CƠ KHÍ

Mơn: K thu t lỹậ ập trình trong Cơ điện tử Đề tài: Smart Home

Giáo viên hướng dẫn: TS. Dương Văn Lạc Nhóm sinh viên th c hiựện: Nhóm 2

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

Phân chia công vi c ệ

hợp, chỉnh sửa

Hoàn thành

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

Mục l c ụ

Chương 1: Đặ ấn đềt v ...

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 ...

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 ...

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

2 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.

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. ừ

2.1 Linh ki n ệ

2.1.1 Arduino Uno R3

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

Thông số cần lưu ý:

Chip điều khiển

chính <sup>ATmega328 h 8bit</sup><sup>ọ</sup>Nguồn nuôi mạch 5V từ cổng USB.

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

4 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ó ln 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

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

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)

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

6 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 ử

Giao di n ệ

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

Sơ đồ hoạt động:

Cảm bi n ế

Biểu di n s ễốliệu và đồ thị Biểu di n s ễố

liệu trên màn hình LCD

So sánh với n ng ồ

độ gas cho phép

Còi Lớn hơn

Nhỏ hơn

Cổng Serial Cổng Serial HIGH

LOW

HIGH Điều khiển

đèn, quạt

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

8 Sơ đồ nối mạch:

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

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 đó để ạng I2C có th ho mểạ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 ẽ được truy sề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. ệế

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

10

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 châ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 đó trong 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.

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

Chương 4: Winforms và code lập trình Code Arduino:

#include <MQ2.h> #include <DHT.h> #include <LiquidCrystal_I2C.h> #include <Wire.h>

LiquidCrystal_I2C lcd(0X27,16,2); const int DHTPIN = 2; const int DHTTYPE = DHT11; const int pin = A3; int led1 =3; int led2 =5; int coi =4; int val; int tt1=0; int tt2=0;

DHT dht(DHTPIN, DHTTYPE); MQ2 mq2(pin);

void setup() { Serial.begin(57600); lcd.init(); lcd.backlight(); pinMode(led1,OUTPUT); pinMode(coi,OUTPUT); pinMode(led2,OUTPUT); pinMode(6,INPUT_PULLUP); //led1 pinMode(7,INPUT_PULLUP); //led2 dht.begin();

mq2.begin(); } void loop() { int bled1=digitalRead(6); int bled2=digitalRead(7); while (Serial.available()) { val = Serial.read(); }

if(bled1 == LOW ) { if(tt1 == 0) {tt1 = 1;

digitalWrite(led1,HIGH); }

else {

digitalWrite(led1,LOW); tt1=0;

} }

if(bled2 == LOW ) { if(tt2 == 0) {tt2 = 1;

digitalWrite(led2,HIGH); }

else {

digitalWrite(led2,LOW); tt2=0;

} }

if (val == '1' ) { tt1 = 0;

digitalWrite(led1, LOW); } else if (val == '2' ) { tt1 = 1;

digitalWrite(led1, HIGH); }

if (val == '3') { digitalWrite(led2, LOW); } else if (val == '4') { digitalWrite(led2, HIGH); }

float t = dht.readTemperature(); float h = dht.readHumidity(); float ppm = mq2.readSmoke()/20000;

if(ppm > 0.005) digitalWrite(coi,HIGH); else digitalWrite(coi,LOW);

lcd.setCursor(0,0); lcd.print("Nhiet Do:"); lcd.print(t); lcd.print(" C"); lcd.setCursor(0,1); lcd.print("Do am: "); lcd.print(h); lcd.print(" %RH"); lcd.write(1);

delay(500);

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

publicpartialclassForm1 : 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);

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

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); }

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

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) {

(led == if false) {

serialPort1.Write("2"); button1.Text = "ON"; button1.BackColor = Color.Lime; led = true;

} else {

serialPort1.Write("1");

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

button1.BackColor = Color.Red; led = false;

} }

private void button2_Click(object sender, EventArgs e) {

(fan == if 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) {

} } }

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

16

Sản ph m: ẩ

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

Ứ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. ệả

</div>

×