Xây dựng giao diện hiển thị và cơ sở dữ liệu cho hệ thống đo thông số nhiệt độ, ánh sáng sử dụng vi điều khiển Arduino Uno R3, cảm biến nhiệt độ LM35 và cảm biến ánh sáng BH 1750 .......................................................................
Trang 1CHƯƠNG 1 PHÂN TÍCH CÔNG NGHỆ THIẾT KẾ 1.1 Yêu cầu công nghệ
1.1.1 Yêu cầu bài toán
ĐỀ BÀI : Xây dựng giao diện hiển thị và CSDL cho hệ thống đo thông số nhiệt độ, ánh sáng.
1.1.2 Ý tưởng thực hiện
+ Xây dựng giao diện điều khiển thiết bị trên WinForm
+ Ghép nối cảm biến nhiệt độ, cảm biến ánh sáng với vi điều khiển Arduino Uno R3 + Xây dựng cơ sở dữ liệu trên SQL Sever
+ Viết chương trình điều khiển và lưu dữ liêu điều khiển vào SQL
+ Viết chương trình nhận lệnh và thực thi lệnh cho Arduino
• Tổng quát về vi điều khiển Arduino Uno R3
• Giới thiệu về Arduino
Hình 1.1 Arduino Uno R3.
1 Arduino là một board mạch vi xử lý, nhằm xây dựng các ứng dụng tương tác với nhau hoặc
với môi trường được thuận lợi hơn Phần cứng bao gồm một board mạch nguồn mở được thiết kế
Trang 2trên nền tảng vi xử lý AVR Atmel 8bit, hoặc ARM Atmel 32-bit Những Model hiện tại được trang bị gồm 1 cổng giao tiếp USB, 6 chân đầu vào analog, 14 chân I/O kỹ thuật số tương thích với nhiều board mở rộng khác nhau.
• Được giới thiệu vào năm 2005, Những nhà thiết kế của Arduino cố gắng mang đến một phương thức dễ dàng, không tốn kém cho những người yêu thích, sinh viên và giới chuyên nghiệp để tạo ra những thiết bị có khả năng tương tác với môi trường thông qua các cảm biến và các cơ cấu chấp hành Những ví dụ phổ biến cho những người yêu thích mới bắt đầu bao gồm các robot đơn giản, điều khiển nhiệt độ và phát hiện chuyển động Đi cùng với nó là một môi trường phát triển tích hợp (IDE) chạy trên các máy tính cá nhân thông thường và cho phép người dùng viết các chương trình cho Aduino bằng ngôn ngữ C hoặc C++.
• Giá của các board Arduino dao động xung quanh €20, hoặc $27 hoặc 574 468VNĐ, nếu được "làm giả" thì giá có thể giảm xuống thấp hơn $9 Các board Arduino có thể được đặt hàng ở dạng được lắp sẵn hoặc dưới dạng các kit tự-làm-lấy Thông tin thiết kế phần cứng được cung cấp công khai để những ai muốn tự làm một mạch Arduino bằng tay có thể tự mình thực hiện được (mã nguồn mở) Người ta ước tính khoảng giữa năm 2011 có trên 300 ngàn mạch Arduino chính thức đã được sản xuất thương mại, và vào năm 2013 có khoảng
700 ngàn mạch chính thức đã được đưa tới tay người dùng.
1.2.1.2 Sơ đồ các chân của Arduino Uno R3
+ Sơ đồ chân của Arduino :
Hình 1.2 Sơ đồ các chân Arduino
Trang 3+ Sơ đồ nguyên lí của Arduino :
Hình 1.2 Sơ đồ nguyên lý của Arduino
1.2.1.3 Thông số kĩ thuật
Arduino Uno được xây dựng với phân nhân là vi điều khiển ATmega328P sử dụng thạch anh có chu kì dao động là 16 MHz Với vi điều khiển này, ta có tổng cộng 14 pin (ngõ) ra / vào được đánh số từ 0 tới 13 (trong đó có 6 pin PWM, được đánh dấu ~ trước mã số của pin) Song song đó, ta có thêm 6 pin nhận tín hiệu analog được đánh kí hiệu từ A0 - A5, 6 pin này
cũng có thể sử dụng được như các pin ra / vào bình thường (như pin 0 - 13) Ở các pin được đề
cập, pin 13 là pin đặc biệt vì nối trực tiếp với LED trạng thái trên board.
Trên board còn có 1 nút reset, 1 ngõ kết nối với máy tính qua cổng USB và 1 ngõ cấp nguồn sử dụng jack 2.1mm lấy năng lượng trực tiếp từ AC-DC adapter hay thông qua ắc-quy nguồn.
Khi làm việc với Arduino board, một số thuật ngữ sau cần được lưu ý:
• Flash Memory : bộ nhớ có thể ghi được, dữ liệu không bị mất ngay cả khi tắt điện Về vai trò, ta có thể hình dung bộ nhớ này như ổ cứng để chứa dữ liệu trên board Chương trình được viết cho Arduino sẽ được lưu ở đây Kích thước của vùng nhớ này thông thường dựa vào vi điều khiển được sử dụng, ví dụ như ATmega8 có 8KB flash memory Loại bộ
Trang 4nhớ này có thể chịu được khoảng 10,000 lần ghi / xoá.
• RAM : tương tự như RAM của máy tính, sẽ bị mất dữ liệu khi ngắt điện nhưng bù lại tốc
độ đọc ghi xoá rất nhanh Kích thước nhỏ hơn Flash Memory nhiều lần.
• EEPROM : một dạng bộ nhớ tương tự như Flash Memory nhưng có chu kì ghi / xoá cao hơn - khoảng 100,000 lần và có kích thước rất nhỏ Để đọc / ghi dữ liệu ta có thể dùng thư viện EEPROM của Arduino.
Ngoài ra, board Arduino còn cung cấp cho ta các pin khác nhau như pin cấp nguồn 3.3V, pin cấp nguồn 5V, pin GND
Thông số kỹ thuật của Arduino board được tóm tắt trong bảng sau:
Digital I/O pin 14 (trong đó 6 pin có khả năng băm xung)
Cường độ dòng điện trên mỗi I/O pin 20 mA
Cường độ dòng điện trên mỗi 3.3V pin 50 mA
Flash Memory 32 KB (ATmega328P) 0.5 KB được sử dụng bởi bootloader
Trang 5Bước 1: Kết nối Arduino UNO R3 vào máy tính
Bước 2: Tìm cổng kết nối của Arduino Uno R3 với máy tính
Khi Arduino Uno R3 kết nối với máy tính, nó sẽ sử dụng một cổng COM (Communication port cổng dữ liệu ảo) để máy tính và bo mạch có thể truyền tải dữ liệu qua lại thông qua
-cổng này Windows có thể quản lí đến 256 -cổng COM Để tìm được -cổng COM đang được sử dụng để máy tính và mạch Arduino UNO R3 giao tiếp với nhau, bạn phải mở chức năng Device Manager của Windows.
Bạn mở cửa sổ Run và gõ lệnh mmc devmgmt.msc.
Trang 6Sau đó bấm Enter, cửa sổ Device Manager sẽ hiện lên.
Mở mục Ports (COM & LPT), bạn sẽ thấy cổng COM Arduino Uno R3 đang kết nối
Cổng kết nối ở đây là COM3.
Thông thường, trong những lần kết nối tiếp theo, Windows sẽ sử dụng lại cổng COM3 để kết nối nên bạn không cần thực hiện thêm thao tác tìm cổng COM này nữa.
Trang 7Bước 3: Khởi động Arduino IDE
Bước 4: Cấu hình phiên làm việc cho Arduino IDE
Vào menu Tools -> Board -> chọn Arduino Uno
Trang 8Vào menu Tools -> Serial Port -> chọn cổng Arduino đang kết nối với máy tính Ở máy của
mình là COM3.
Trang 9Xác nhận cổng COM của Arduino IDE ở góc dưới cùng bên phải cửa sổ làm việc
Trang 10Vào menu Tools -> Programmer -> chọn AVR ISP
Trang 11Bước 5: Mở và nạp mã nguồn chương trình mẫu
Nạp một chương trình mẫu bằng cách vào menu File -> Examples -> 01.Basics -> chọn Blink
Bạn sẽ thấy Arduino IDE mở một cửa sổ mới chứa mã nguồn Blink Mã này có chức năng là
điều khiển đèn LED màu cam trên mạch Arduino Uno R3 nhấp nháy với chu kì 1 giây.
Trang 12Bấm tổ hợp phím Ctrl + U để tải chương trình lên mạch Arduino Uno R3 Bạn sẽ thấy IDE xác
nhận đã lập trình thành công như hình dưới.
Trang 131.2.2 : Cảm biến đo nhiệt độ và ánh sáng
Cảm biến nhiệt độ: thông thường thì nhiệt độ bên ngoài môi trường được thiết bị
cảm biến đo được và truyền về kết quả cho người sử dụng là một đại lượng điện nào đó
và độ chính xác của kết quả phụ thuộc vào loại cảm biến bên trong Trong các ngành công nghiệp nó thường được ứng dụng để đo nhiệt độ trong không khí, nước, hóa chất,
độ ẩm, tùy vào nhiệt độ môi trường cần đo là như thế nào để lựa chọn chất liệu và loại cảm biến cho phù hợp để đảm bảo được độ chính xác và độ bền sản phẩm khi sử dụng.
Cảm biến ánh sáng: các thiết bị chứa đựng cảm biến ánh sáng có nhiều công dụng
trong các ứng dụng khoa học và đời sống hằng ngày Một cảm biến ánh sáng đơn giản
có thể là một phần của một thiết bị an ninh, thiết bị cảnh báo an toàn, chẳng hạn như một báo động chống trộm hoặc mở cửa gara Các thiết bị này thường hoạt động bằng cách chiếu một chùm ánh sáng phát ra từ một cảm biến này đến cảm biến khác, nếu
Trang 14ánh sáng bị gián đoạn, một âm thanh báo động hoặc cửa gara sẽ tác động theo đúng yêu cầu cài đặt
Mô hình cụ thể của hê thống đo thông số nhiệt độ và ánh sáng
Trang 15CHƯƠNG 2 THỰC THI THIẾT KẾ SẢN PHẨM
2.1 Mô tả hệ thống
Chức năng : Hệ thống điều khiển các thiết bị điện được sử dụng rộng rãi trong cuộc sống hằng
ngày, chúng ta có thể thấy nó ở rất nhiều nơi như trong nhà, ở trường học, trong các công ty, xí nghiệp.
* Yêu Cầu:
- Đảm bảo cho thiết bị làm việc đúng, chắc chắn
- Tác động nhanh vào thiết bị điều khiển
- Độ nhạy của các thiết bị điều khiển phải đạt yêu cầu
- Tính kinh tế : phải thoả mãn các yêu cầu kỹ thuật, đồng thời phải được lắp đặt sao cho rẻ nhất đến mức có thể.
2.1.1 Sơ đồ khối
KHỐI NGUỒN
MÁY TÍNH
KHỐI XỬ LÝ TRUNG TÂM
KHỐI CẢM
BIẾN
NHIỆT ĐỘ
KHỐI CẢM BIẾN ÁNH SÁNG
Trang 162.1.2 Chức năng từng khối
* Chức năng của khối nguồn : chuyển đồi nguồn từ 220V AC thành 5V DC và cung
cấp nguồn điện cho các khối xử lí trung tâm ,khối cảm biến và khối chấp hành
* Chức năng của khối chấp hành : nhận tín hiệu điều khiển từ Arduino thực hiện quay
sevor theo tín hiệu, và bật tắt còi theo tín hiệu nhận được
* Khối cảm biến : đọc thông số đo được và gửi mã lên khối xử lí trung tâm
* Chức năng của khối xử lí trung tâm :
- Nhận dữ liệu nhiệt độ, ánh sáng từ khối cảm biến gửi lên, xử lí dữ liệu , đóng gói khung truyền và gửi lên máy tính
- Nhận lệnh điều khiển từ máy tính và thực hiện điều khiển khối chấp hành (động
cơ sevor,đèn led và còi )
* Chức năng máy tính :
- nhận dữ liệu cảm biến được gửi lên từ arduino,phân tích và xử lí dữ liệu
sau đó lưu vào cơ sở dữ liệu
- nhận lệnh điều khiển từ người quản lí, xử lí lệnh điều khiển thực hiện mã hóa dữ liệu và gửi lệnh điều khiển xuống cho khối xử lí trung tâm
Trang 17lm7805 và ra chân 3.Điện áp khi ra sẽ ở trong khoảng 5vol.Chân GND được nối với chân âm của cầu chỉnh lưu.Sau khi ra 5v lại được tụ lọc nguồn và cuối cùng ra điện áp ổn định là 5v
2.2.2 Khối cảm biến nhiệt độ và ánh sáng
*Mạch nguyên lý
*Nguyên lý hoạt động : Khi có nguồn điện cấp vào Arduino, Nguồn điện sẽ truyền thẳng vào
các cảm biến được đọc từ chân A1 và A2 của Arduino Và khi đó thông số độ ẩm và ánh sáng sẽ được hiển thị mô phỏng trên Virtual qua 2 chân TXD và RXD nối với Arduino Uno R3.
2.2.3 Khối xử lý trung tâm
*Mạch nguyên lý
Hình 2.2 Mạch nguyên lý khối xử lý trung tâm
Trang 18*Nguyên lý hoạt động: Arduino Uno được xây dựng với phân nhân là vi điều khiển
ATmega328P sử dụng thạch anh có chu kì dao động là 16 MHz Với vi điều khiển này, ta có tổng cộng 14 pin (ngõ) ra / vào được đánh số từ 0 tới 13 (trong đó có 6 pin PWM, được đánh dấu
~ trước mã số của pin) Song song đó, ta có thêm 6 pin nhận tín hiệu analog được đánh kí hiệu từ
A0 - A5, 6 pin này cũng có thể sử dụng được như các pin ra / vào bình thường (như pin 0 - 13)
Ở các pin được đề cập, pin 13 là pin đặc biệt vì nối trực tiếp với LED trạng thái trên board.
Trên board còn có 1 nút reset, 1 ngõ kết nối với máy tính qua cổng USB và 1 ngõ cấp nguồn sử dụng jack 2.1mm lấy năng lượng trực tiếp từ AC-DC adapter hay thông qua ắc-quy nguồn
2.2.4 Sơ đồ nguyên lý hệ thống
Hình 2.2.4 Mô phỏng đo thông số nhiệt độ và ánh sáng trên Proteus
Trang 19Hình 2.2.4 Giao diện hiển thị thông số nhiệt độ ánh sáng trên Visual Studio
*Nguyên lý làm việc :
Trên giao diện hệ thống người sử dụng có thể đo thông số độ ẩm, ánh sáng được gửi về Chọn cổng COM, Baud Rate, Data, Stop và Paraty tương ứng với mạch nguyên lý Khi nhấn kết nối cổng COM, dữ liệu từ Arduino sẽ thông qua cổng COM truyền và gửi lên Visual dữ liệu Độ Ẩm
và Ánh Sáng đo được Hơn nữa, sẽ hiển thị thông số đó lên biểu đồ dạng sóng.
2.2.5 Sơ đồ mạch in
Trang 20Hình 2.2.5 Sơ đồ mạch in 2.3 Thiết kế giao diện
Những đối tượng sử dụng để thiết kế giao diện :
- Các label để hiển thị như : COM, Baud Rate, Data, Stop, Paraty, Nhiệt Độ , Ánh Sáng, Mã,
Thời Gian, Địa Điểm, lbtime
- Các nút bấm button được sử dụng là : Connect, Disconnect, Xóa CSDL, Xác Nhận
- Textbox được sử dụng để hiển thị Mã ,Thời Gian, Nhiệt Độ, Ánh Sáng, Địa Điểm
- các Combobox sử dụng là : cbbcom, cbbbaud, cbbdata, cbbstop, cbbparaty
- Datagridview được sử dụng để hiển thị bảng dữ liệu trong CSDL
- Ngoài ra còn sử dụng timer 1
2.4 Lưu đồ thuật toán Arduino
Trang 21CHƯƠNG 3 KẾT QUẢ
3.1 Hướng dấn Sử dụng :
- Bước 1: kết nối arduino với máy tính.
Trang 22Bước 2: Mở phần mềm
Trang 23- Bước 3: Lựa chọn cổng COM, tốc độ Baud, Data , Stop, Paraty
Sau khi chọn , ta ấn “Kết nối ” để thức hiện kết nối với Arduino
- Bước 4: Thực hiện đo giá trị nhiệt độ, ánh sáng
Giá trị đo được từ cảm biến sẽ hiển thị lên các textbox và biểu đồ rồi lưu vào
cơ sở dữ liệu
Trang 24Bước 5: Xóa dữ liệu và ngắt kết nối
Chọn một giá trị cần xóa rồi ấn " Xóa CSDL " và ấn " Xác Nhận "
Sau khi xóa xong ta ấn " Disconnect " để kết thúc
SqlConnection conn = new SqlConnection(@"Data Source=WIN-ET05901LS6D\SQLEXPRESS;Initial Catalog=detai;Integrated Security=True"); // khở8i tạo đổ9i tượng
delegate void SetTextCallback(string text); // khai báo delegate SetTextCallBack với tham sổ9 string
public Form1()
Trang 25{
InitializeComponent();
this.port.DataReceived += new
System.IO.Ports.SerialDataReceivedEventHandler(this.DataReceived);
string[] ports = SerialPort.GetPortNames(); // ma8ng port chứa các cổ8ng com trến máy tính
cbbcom.Items.AddRange(ports); // thếm các cổ8ng comvào cbbcom
string[] baud = { "1200", "2400", "4800", "9600", "19200", "38400",
"57600", "115200" }; // thếm ma8ng chứa tổ9c độ baud
cbbbaud.Items.AddRange(baud); // thếm các tổ9c độ baud vào combobox baud rate
string[] data = { "7", "8", "9" }; // thếm ma8ng chứa data
cbbdata.Items.AddRange(data); // thếm các data vào cbbdata
string[] stop = { "1", "1.5", "2" }; // thếm ma8ng chứa stop
cbbstop.Items.AddRange(stop); // thếm các biế9n stopvào cbbstop
string[] paraty = { "none", "old", "even" }; // thếm ma8ng chứa paraty
cbbparaty.Items.AddRange(paraty); // thếm các paraty vào cbbparaty
//chart1.DataSource = dt;
//chart1.Series["Nhiệt Độ"].YValueMembers = "nhietdo";
//chart1.Series["Ánh Sáng"].YValueMembers = "anhsang";
sql.CommandType = CommandType.StoredProcedure;
sql.Parameters.Add(new SqlParameter("m", SqlDbType.Char)).Value =
DateTime.Now.ToString("MMHHmmss");
sql.Parameters.Add(new SqlParameter("tgian",
SqlDbType.DateTime)).Value = DateTime.Now;
Trang 26sql.Parameters.Add(new SqlParameter("nhiet",
SqlDbType.NVarChar)).Value = nhietdo;
sql.Parameters.Add(new SqlParameter("sang",
SqlDbType.NVarChar)).Value = anhsang;
sql.Parameters.Add(new SqlParameter("dia", SqlDbType.NVarChar)).Value
Trang 27MessageBox.Show("Lổli khổng kế9t nổ9i được", "Thư8 lại",
MessageBoxButtons.OK, MessageBoxIcon.Error);
Control.CheckForIllegalCrossThreadCalls = false;
this.port.DataReceived += new
System.IO.Ports.SerialDataReceivedEventHandler(this.DataReceived);
Control.CheckForIllegalCrossThreadCalls = false;
string indata = port.ReadLine();
if (indata != string.Empty && indata != null)
Trang 28arr[0] = float.Parse(nhiet);
chart1.Series["Nhiệt Độ"].YValueMembers = nhiet;
chart1.Series["Nhiệt Độ"].Points.DataBindY(arr);
chart1.Series["Nhiệt Độ"].Points.ResumeUpdates();
chart1.Series["Nhiệt Độ"].LegendText = "NHIỆT ĐỘ:" + nhiet +
SetTextCallback dt = new SetTextCallback(setdata);
this.Invoke(dt, new object[] { data});
end = data.IndexOf("&");
anhsang = data.Substring(start + 1, end - start - 1);
them(nhietdo,anhsang);
Trang 29string xoa = "xoa";
SqlCommand sql = new SqlCommand(xoa, conn);
sql.CommandType = CommandType.StoredProcedure;
sql.Parameters.Add(new SqlParameter("ma", SqlDbType.Char)).Value = txbxoacsdl.Text;