Professional Documents
Culture Documents
Mục lục
LỜI MỞ ĐẦU...........................................................................................4
1
PHẦN I : LẬP KẾ HOẠCH THỰC HIỆN PHẦN MỀM........................5
I. LẬP KẾ HOẠCH..............................................................................5
1. Khởi tạo dự án...............................................................................5
2. Phân tích tính khả thi.....................................................................5
II. LỊCH BIỂU DIỄN CÔNG VIỆC....................................................5
1. Thành viên.................................................................................5
2. Thời gian tổng thể......................................................................6
PHẦN 2: PHÂN TÍCH HỆ THỐNG........................................................7
1. SƠ ĐỒ THIẾT KẾ.......................................................................7
2. LINH KIỆN SỬ DỤNG...............................................................7
Sơ Đồ Kết Nối Của Màn Hình LCD1602:.....................................11
3. LẬP TRÌNH ADRUINO............................................................13
4. LẬP TRÌNH GIAO DIỆN C#....................................................17
PHẦN 3: THỬ NGHIỆM VÀ KẾT LUẬN............................................19
1. THỬ NGHIỆM........................................................................19
2. KẾT LUẬN.............................................................................20
Phần 4: Bài học kinh nghiệm:.................................................................20
1. Về triển khai kế hoạch bài tập lớn...........................................20
2. Về thiết kế hệ thống.................................................................20
3. Về lập trình Arduino................................................................20
4. Về lập trình GUI......................................................................21
LỜI CẢM ƠN.........................................................................................22
Không tìm thấy mục nhập nào của bảng hình minh họa.
2
LỜI MỞ ĐẦU
Những năm gần đây, khoa học công nghệ phát triển nhanh như vũ bão, đặc biệt là
lĩnh vực công nghệ thông tin. Có thể nói, công nghệ thông tin đã len lỏi vào hầu hết
tất cả mọi lĩnh vực trong cuộc sống của chúng ta. Trong đó, công nghệ phần mềm
luôn luôn đóng vai trò tiên phong, dẫn đầu trong quá trình đó. Các phần mềm đã
đang và sẽ được ứng dụng ngày càng nhiều trong công việc cũng như cuộc sống
thường ngày của con người.
Nắm bắt được xu hướng đó, trong khuôn khổ nội dung của chương trình học học
phần Kĩ thuật lập trình trong Cơ điện tử, nhóm chúng em đã quyết định tìm hiểu và
xây dựng một đề tài đơn giản và gần gũi với thực tế: Hệ thống quản lí tiền điện của
một xã.
Qua quá trình tìm hiểu và xây dựng phần mềm trên thực tế, cùng với những kiến
thực được học trên giảng đường, chúng em mới thực sự cảm nhận được những khó
khăn khi xây dựng và phát triển một phần mềm hoàn chỉnh. Để có thể xây dựng được
một phần mềm hoàn thiện, không chỉ đơn thuần là lập trình, mà còn rất nhiều công
việc khác cần phải thực hiện. Các công việc này được sắp xếp trong các pha với trình
tự rất hợp lí, khoa học.
Phần mềm này được nhóm em xây dựng nhằm hỗ trợ cho người sử dụng có thể
nhanh chóng dễ dàng hơn trong việc cập nhật tình hình nhiệt độ, độ ẩm tại môi
trường xác định và trong thời gian thực một cách nhanh chóng và dễ dàng lưu trữ
thông số đo đạt được với độ chính xác cao mà rất tiện lợi.
Đây là phần mềm đầu tiên mà nhóm em xây dựng nên không thể tránh khỏi những
hạn chế và thiếu sót, kính mong cô giáo và các bạn bổ sung, góp ý để phần mềm
ngày càng hoàn thiện và thực sự hữu ích với người sử dụng.
Chúng em xin chân thành cảm ơn!
3
PHẦN I : LẬP KẾ HOẠCH THỰC HIỆN PHẦN MỀM
I. LẬP KẾ HOẠCH
1. Khởi tạo dự án
Mong muốn có một sản phẩm có thể quản lí nhiệt độ, độ ẩm nhằm
nâng cao hiệu quả quản lý để đạt được những yêu cầu đầu ra của đối
tượng, nhóm sinh viên chúng em đã nghiên cứu và xây dựng đề tài X để
hỗ trợ các người quản lý và nhân viên của họ trong công việc quản lý
nhiệt độ, độ ẩm một cách hiện đại và chuyên nghiệp. Sản phẩm sẽ giúp
tiết kiệm một lượng lớn thời gian đo đạc thủ công cũng như thống kê
khảo sát tình hình của môi trường trong thời gian thực.
1. Thành viên
STT Tên MSSV Lớp
1 Trần Quang Trung (TN) 20134191 KT ĐT-TT 06 K58
2 Trịnh Hữu Trường 20134237 KT ĐT-TT 07 K58
3 Nguyễn Đăng Anh Tú 20136796 CN-Điện tử TT 02 K58
4 Nguyễn Thị Cẩm Tú 20134495 KT ĐT-TT 09 K58
4
5 Phạm Mạnh Tuấn 20134328 KT ĐT-TT 06 K58
5
PHẦN 2: PHÂN TÍCH HỆ THỐNG
1. SƠ ĐỒ THIẾT KẾ
6
Thông số kỹ thuật Adruino Uno R3
Vi điều khiển ATmega328 họ 8bit
Điện áp hoạt động 5 - 12V DC ( khuyên dùng )
Tần số hoạt động 16 MHz
Dòng tiêu thụ Khoảng 30mA
Điện áp vào giới hạn 19V DC
Số chân Digital I/O 14 ( 6 chân PWM )
Số chân Analog 6 ( độ phân giải 10bit )
Dòng tối đa trên mỗi chân I/O 30 mA
Dòng ra tối đa ( 5V ) 500 mA
Dòng ra tối đa ( 3.3 ) 50 mA
Bộ nhớ Flash 32 KB ( ATmega328 ) với 0.5 KB dùng
bởi bootloader
SRAM 2 KB
EEPROM 1KB
Khối lượng 25 gram
7
b) Cảm biến nhiệt độ, độ ẩm DHT11
8
Thông số kỹ thuật Cảm biến nhiệt độ độ ẩm DHT 11
Nguồn: 3 -> 5 VDC.
Dòng sử dụng: 2.5mA max (khi truyền dữ liệu).
Khoảng đo độ ẩm: 20%-90% RH (sai số 5%RH)
Khoảng đo nhiệt độ: 0-50°C (sai số 2°C)
Tần số lấy mẫu tối đa: 1Hz (1 giây / lần)
Kích thước 15mm x 12mm x 5.5mm.
9
LCD 16×2 được sử dụng để hiển thị trạng thái hoặc các thông số.
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ế độ 4 bit hoặc 8 bit tùy theo ứng dụng ta
đang làm.
LCD có quá nhiều nhiều chân gây khó khăn trong quá trình đấu nối và
chiếm dụng nhiều chân trên vi điều khiển.
Module I2C LCD ra đời và giải quyết vấn để này cho bạn.
Thay vì phải mất 6 chân vi điều khiển để kết nối với LCD 16×2 (RS,
EN, D7, D6, D5 và D4) thì module IC2 bạn chỉ cần tốn 2 chân (SCL,
SDA) để kết nối.
Module I2C hỗ trợ các loại LCD sử dụng driver HD44780(LCD 16×2,
LCD 20×4, …) và tương thích với hầu hết các vi điều khiển hiện nay.
10
Ưu điểm
Tiết kiệm chân cho vi điều khiển.
Dễ dàng kết nối với LCD.
Thông số kĩ thuật
Điện áp hoạt động: 2.5-6V DC.
Hỗ trợ màn hình: LCD1602,1604,2004 (driver HD44780).
Giao tiếp: I2C.
Địa chỉ mặc định: 0X27 (có thể điều chỉnh bằng ngắn mạch
chân A0/A1/A2).
Tích hợp Jump chốt để cung cấp đèn cho LCD hoặc ngắt.
Tích hợp biến trở xoay điều chỉnh độ tương phản cho LCD.
Để sử dụng màn hình LCD giao tiếp I2C sử dụng Arduino thì ta cần cài
đặt thư viện Liquidcrystal_I2C
11
- Sử dụng ngôn ngữ lập trình C/C++ thân thiện với các
lập trình viên
- Hỗ trợ lập trình tốt cho bo mạch Arduino
- Thư viện hỗ trợ phong phú (~700 thư viện)
- Giao diện đơn giản dễ sử dụng
- Hỗ trợ đa nền tảng như Windows, MacOS, Linux
Arduino IDE là một phần mềm được phân phối chính hãng, tải
miễn phí và giao diện thân thiện với người dùng. Phần mềm liên tục
được nhà phát hành cập nhật dưới sự giúp đỡ của Cộng đồng người dùng
Arduino đông đảo nên độ bảo mật là rất cao. Arduino IDE là phần mềm
nên sử dụng nhất để tải code vào bo mạch Arduino.
12
o Nhược điểm:
- C# là chỉ chạy trên nền tảng Windows và có cài .NET
Framework. Nên đây được xem là nhược điểm lớn nhất của
C#
- Thao tác với phần cứng hầu hết phải dựa vào Windows
C#, QT là một trong những phần mềm thông dụng để lập trình
giao diện GUI trên Windows. Với những sự thừa kế của các ngôn
ngữ lập trình tiền than, C# rất than thiện với người lập trình.
Phần code C#:
13
PHẦN 3: THỬ NGHIỆM VÀ KẾT LUẬN
1. THỬ NGHIỆM
a. Sơ đồ mạch
b. Giao diện điều khiển
(1)
(3)
(2)
14
2. KẾT LUẬN
a. Kết quả đạt được:
- Linh kiện hệ thống rẻ, dễ dàng mua được
- Hệ thống Cơ điện tử đã được hoàn thiện
- Giao diện được thiết kế thông qua Visual Studio dựa
theo kiến thức học được
- Sản phẩm được chạy bình thường và theo yêu cầu đề
ra
b. Khó khăn:
- Độ nhạy của cảm biến chưa thực sự cao
c. Phương hướng phát triển:
- Có thể ứng dụng vào trong công nghiệp như đo nhiệt
độ, độ ẩm trong môi trường khép kín
- Thêm thiết bị điều khiển nhiệt độ, độ ẩm như máy
sưởi, quạt, máy phun sương để đạt được yêu cầu
nhiệt độ độ ẩm mong muốn
- Thay thế cảm biến tốt hơn để tăng tốc độ xử lý
- Thay thế bộ vi xử lí để giảm giá thành, tăng bộ nhớ
2. Về thiết kế hệ thống
Cần phải chỉn chu hơn nữa để có thể tối ưu đường dây dẫn, nhìn
khoa học hơn, bắt mắt hơn.
15
nghiệm sản phẩm mà độ hiệu quả mang lại khá tốt. Có thể thử trước
khi quyết định thêm một linh kiện để xem tính khả thi của nó như thế
nào.
16
LỜI CẢM ƠN
Chúng em xin chân thành cảm ơn thầy Dương Văn Lạc đã tận tình hướng dẫn , giải đáp thắc
mắc và chỉ bảo nhóm em trong suốt thời gian nhóm em hoàn thành bài tập lớn .
Mặc dù đã cố gắng hoàn thành đề tài tốt nhất nhưng do thời gian và kiến thức còn có hạn
nên chúng em sẽ không thể tránh khỏi những thiếu sót nhất định, rất mong nhận được sự cảm
thông, chia sẻ và tận tình đóng góp chỉ bảo của thầy cũng như các bạn.
17
CODE lập trình arduino
LiquidCrystal_I2C lcd(0x27,16,2);
byte degree[8] = {
0B01110,
0B01010,
0B01110,
0B00000,
0B00000,
0B00000,
0B00000,
0B00000
};
int state = 0;
long time_now = 0;
long time_start = 0;
float gettemp();
float data = 0;
18
void setup() {
Serial.begin(9600);
dht.begin();
lcd.init();
lcd.backlight();
lcd.print("Nhiet do: ");
lcd.setCursor(0,1);
lcd.print("Do am: ");
lcd.createChar(1, degree);
pinMode(2,OUTPUT);
}
void loop()
{
// Điều khiển Arduino qua giá trị của biến state
if(Serial.available())
{
char temp = Serial.read();
if(temp == '0')
state = 0;
if(temp == '1')
state = 1;
if(temp == '2')
state = 2;
}
// Thực thi các trường hợp với các giá trị của biến state
19
switch(state)
{
// state = 0: dừng Arduino
case 0:
break;
case 1:
gettemp();
Serial.print(time_now);
Serial.print("|");
Serial.println(round(data));
break;
// state = 2: Reset dữ liệu và thời gian về 0
case 2:
data = 0;
time_now = 0;
state = 0;
break;
}
float h = dht.readHumidity();
float t = dht.readTemperature();
if (t > 33)
{
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
}
else
{
digitalWrite(2,LOW);
20
digitalWrite(3,HIGH);
}
if (isnan(t) || isnan(h)) {
}
else {
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(" %");
}
}
float gettemp()
{
time_start = millis();
data = dht.readTemperature();
delay(100);
time_now = time_now + millis() - time_start;
}
21
Code lập trình giao diện
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;
using System.IO.Ports;
using System.Xml;
using ZedGraph;
namespace GraphRealTime
{
public partial class Form1 : Form
{
string SDatas = String.Empty; // Khai báo chuỗi để lưu dữ liệu cảm biến gửi qua Serial
string SRealTime = String.Empty; // Khai báo chuỗi để lưu thời gian gửi qua Serial
int status = 0; // Khai báo biến để xử lý sự kiện vẽ đồ thị
double realtime = 0; //Khai báo biến thời gian để vẽ đồ thị
double datas = 0; //Khai báo biến dữ liệu cảm biến để vẽ đồ thị
public Form1()
{
InitializeComponent();
}
private
void Form1_Load(object sender, EventArgs e)
{
22
comboBox1.DataSource = SerialPort.GetPortNames(); // Lấy nguồn cho comboBox là tên
của cổng COM
comboBox1.Text = Properties.Settings.Default.ComName;
myPane.XAxis.Scale.Min = 0;
myPane.XAxis.Scale.Max = 30;
myPane.XAxis.Scale.MinorStep = 1;
myPane.XAxis.Scale.MajorStep = 5;
myPane.YAxis.Scale.Min = -100;
myPane.YAxis.Scale.Max = 100;
myPane.AxisChange();
}
23
{
progressBar1.Value = 100;
Draw();
Data_Listview();
status = 0;
}
}
// Hàm này lưu lại cổng COM đã chọn cho lần kết nối
private
void SaveSetting()
{
Properties.Settings.Default.ComName = comboBox1.Text;
Properties.Settings.Default.Save();
}
24
}
catch
{
return;
}
}
// Vẽ đồ thị
private
void Draw()
{
if (zedGraphControl1.GraphPane.CurveList.Count <= 0)
25
return;
if (curve == null)
return;
if (list == null)
return;
26
}
zedGraphControl1.AxisChange();
zedGraphControl1.Invalidate();
zedGraphControl1.Refresh();
}
// Xóa đồ thị, với ZedGraph thì phải khai báo lại như ở hàm Form1_Load, nếu không sẽ
không hiển thị
private
void ClearZedGraph()
{
zedGraphControl1.GraphPane.CurveList.Clear(); // Xóa đường
zedGraphControl1.GraphPane.GraphObjList.Clear(); // Xóa đối tượng
zedGraphControl1.AxisChange();
zedGraphControl1.Invalidate();
myPane.XAxis.Scale.Min = 0;
myPane.XAxis.Scale.Max = 30;
myPane.XAxis.Scale.MinorStep = 1;
myPane.XAxis.Scale.MajorStep = 5;
myPane.YAxis.Scale.Min = -100;
myPane.YAxis.Scale.Max = 100;
27
zedGraphControl1.AxisChange();
}
// Đặt tên cho hai ô A1. B1 lần lượt là "Thời gian (s)" và "Dữ liệu", sau đó tự động dãn độ
rộng
Microsoft.Office.Interop.Excel.Range rg =
(Microsoft.Office.Interop.Excel.Range)ws.get_Range("A1", "B1");
ws.Cells[1, 1] = "Thời gian (s)";
ws.Cells[1, 2] = "Dữ liệu";
28
rg.Columns.AutoFit();
29
serialPort1.BaudRate = 9600; // Baudrate là 9600, trùng với baudrate của Arduino
try
{
serialPort1.Open();
btConnect.Text = "Ngắt kết nối";
btExit.Enabled = false;
}
catch
{
MessageBox.Show("Không thể mở cổng" + serialPort1.PortName, "Lỗi",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
30
SaveToExcel(); // Thực thi hàm lưu ListView sang Excel
}
}
31
if (traloi == DialogResult.OK)
{
if (serialPort1.IsOpen)
{
serialPort1.Write("2"); //Gửi ký tự "2" qua Serial
listView1.Items.Clear(); // Xóa listview
32