TRƯỜNG ĐẠI HỌC NÔNG LÂM TP HCM
CƠ KHÍ- CÔNG NGHỆ
BÁO CÁO MÔN HỌC : ĐO LƯỜNG ĐIỀU KHIỂN
BẰNG MÁY TÍNH
Đề tài : Đọc nhiệt độ - độ ẩm ghi nhận vào máy tính qua
mạch arduino
GVHD : ThS .Lê Văn Phận
SVTH: Huỳnh Văn Phúc
MSSV: 13138154
Lớp: DH13TD
B Giới thiệu:
1.Arduino :
Arduino UNO R3 có thể được cấp nguồn 5V thông qua cổng USB hoặc cấp
nguồn ngoài thông qua Adaptor với điện áp khuyên dùng là 7-12V DC và
giới hạn là 6-20V. Thường thì nên cấp nguồn bằng pin 9V là hợp lý nhất nếu
bạn không có sẵn nguồn từ cổng USB.
Nếu cấp nguồn vượt quá ngưỡng giới hạn như trên sẽ làm hỏng Arduino
UNO R3.
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. Nó có thể luôn là 5V. Chú ý 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: Khi 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Ω.
Các chân vào ra của Arduino Uno R3:
Arduino UNO R3 có 14 chân digital dùng để đọc hoặc xuất tín hiệu. Chúng
chỉ có 2 mức điện áp là 0V và 5V với dòng vào/ra tối đa trên mỗi chân là
40mA. Ở mỗi chân đều có các điện trở pull-up từ được cài đặt ngay trong vi
điều khiển ATmega328 (mặc định thì các điện trở này không được kết nối).
Một số chân digital có các chức năng đặc biệt như sau:
2 chân Serial 0 (RX) và 1 (TX): dùng để gửi (Transmit – TX) và nhận
(Receive – RX) dữ liệu TTL Serial. Arduino Uno có thể giao tiếp với
thiết bị khác thông qua 2 chân này. Kết nối bluetooth có thể nói là kết
nối Serial không dây. Nếu không cần giao tiếp Serial bạn không nên
sử dụng 2 chân này nếu không cần thiết
Chân PWM (~): 3, 5, 6, 9, 10, và 11: Cho phép bạn xuất ra xung
PWM với độ phân giải 8bit (giá trị từ 0 → 28-1 tương ứng với 0V →
5V) bằng hàm analogWrite(). Nói một cách đơn giản, bạn có thể điều
chỉnh được điện áp ra ở chân này từ mức 0V đến 5V thay vì chỉ cố
định ở mức 0V và 5V như những chân khác.
Chân giao tiếp SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13
(SCK). Ngoài các chức năng thông thường, 4 chân này còn dùng để
truyền phát dữ liệu bằng giao thức SPI với các thiết bị khác.
LED 13: trên Arduino UNO có 1 đèn led màu cam (kí hiệu chữ L).
Khi bấm nút Reset, bạn sẽ thấy đèn này nhấp nháy để báo hiệu. Nó
được nối với chân số 13. Khi chân này được người dùng sử dụng,
LED sẽ sáng.
Arduino UNO có 6 chân analog (A0 → A5) cung cấp độ phân giải tín
hiệu 10bit để đọc giá trị điện áp trong khoảng 0V → 5V. Với
chân AREF trên board, bạn có thể để đưa vào điện áp tham chiếu khi
sử dụng các chân analog. Tức là nếu bạn cấp điện áp 2.5V vào chân
này thì bạn có thể dùng các chân analog để đo điện áp trong khoảng từ
0V → 2.5V với độ phân giải vẫn là 10bit.
Đặc biệt, Arduino UNO có 2 chân A4 (SDA) và A5 (SCL) hỗ trợ giao
tiếp I2C/TWI với các thiết bị khác.
2.Cảm biến đo nhiệt độ,độ ẩm ( DHT11 ):
DHT11 là cảm biến nhiệt độ và độ ẩm phức tạp với một đầu ra tín hiệu kỹ thuật
số hiệu chỉnh. Kỹ thuật và công nghệ cảm biến nhiệt độ và độ ẩm, nó đảm bảo độ
tin cậy cao và ổn định lâu dài tuyệt vời. Cảm biến nhiệt độ và độ ẩm. Nó ra đời sau
và được sử dụng thay thế cho dòng SHT1x ở những nơi không cần độ chính xác
cao về nhiệt độ và độ ẩm
DHT11 có cấu tạo 4 chân như hình. Nó sử dụng giao tiếp số theo chuẩn 1 dây.
a)
Thông số kỹ thuật :
o Do độ ẩm: 20%--95%
o Nhiệt độ: 0-50ºC
o Sai số độ ẩm ±5%
o Sai số nhiệt độ: ±2ºC
b)
Nguyên lý hoạt động:
- Sơ đồ kết nối vi xử lý:
- Nguyên lý hoạt động:
Để có thể giao tiếp với DHT11 theo chuẩn 1 chân vi xử lý thực hiện
theo 2 bước:
o Gửi tin hiệu muốn đo (Start) tới DHT11, sau đó DHT11 xác nhận
lại.
o Khi đã giao tiếp được với DHT11, Cảm biến sẽ gửi lại 5 byte dữ liệu
và nhiệt độ đo được.
+Bước 1: gửi tín hiệu Start
o MCU thiết lập chân DATA là Output, kéo chân DATA xuống 0 trong
khoảng thời gian >18ms. Trong Code mình để 25ms. Khi đó DHT11
sẽ hiểu MCU muốn đo giá trị nhiệt độ và độ ẩm.
o MCU đưa chân DATA lên 1, sau đó thiết lập lại là chân đầu vào.
o Sau khoảng 20-40us, DHT11 sẽ kéo chân DATA xuống thấp. Nếu
>40us mà chân DATA ko được kéo xuống thấp nghĩa là ko giao tiếp
được với DHT11.
o Chân DATA sẽ ở mức thấp 80us sau đó nó được DHT11 kéo nên cao
trong 80us. Bằng việc giám sát chân DATA, MCU có thể biết được có
giao tiếp được với DHT11 ko. Nếu tín hiệu đo được DHT11 lên cao,
khi đó hoàn thiện quá trình giao tiếp của MCU với DHT.
+ Bước 2: đọc giá trị trên DHT11
- DHT11 sẽ trả giá trị nhiệt độ và độ ẩm về dưới dạng 5 byte. Trong
đó:
- Byte 1: giá trị phần nguyên của độ ẩm (RH%)
- Byte 2: giá trị phần thập phân của độ ẩm (RH%)
- Byte 3: giá trị phần nguyên của nhiệt độ (TC)
- Byte 4 : giá trị phần thập phân của nhiệt độ (TC)
- Byte 5 : kiểm tra tổng.
- Nếu Byte 5 = (8 bit) (Byte1 +Byte2 +Byte3 + Byte4) thì giá trị độ
ẩm và nhiệt độ là chính xác, nếu sai thì kết quả đo không có nghĩa.
o Đọc dữ liệu:
Sau khi giao tiếp được với DHT11, DHT11 sẽ gửi liên tiếp 40 bit 0
hoặc 1 về MCU, tương ứng chia thành 5 byte kết quả của Nhiệt độ và
độ ẩm.
§ Bit 0:
§ Bit 1:
Sau khi tín hiệu được đưa về 0, ta đợi chân DATA của MCU được
DHT11 kéo lên Nếu chân DATA là 1 trong khoảng 26-28 us thì là 0,
còn nếu tồn tại 70us là 1. Do đó trong lập trình ta bắt sườn lên của
chân DATA, sau đó delay 50us. Nếu giá trị đo được là 0 thì ta đọc
được bit 0, nếu giá trị đo được là 1 thì giá trị đo được là . Cứ như thế
ta đọc các bit tiếp theo.
Vi điều khiển (sử dụng arduino uno R3)
+ code arduino :
1. #include "DHT.h"
2.
3. const int DHTPIN = 2; //Đọc dữ liệu từ DHT11 ở chân 2 trên mạch Arduino
4. const int DHTTYPE = DHT11; //Khai báo loại cảm biến, có 2 loại là DHT11 và DHT22
5.
6. DHT dht(DHTPIN, DHTTYPE);
7.
8. void setup() {
9. Serial.begin(9600);
10. dht.begin(); // Khởi động cảm biến
11. }
12.
13. void loop() {
14. int doam;
15. int nhietdo;
//dieu khien và nhận tín hiệu từ arduino :
16. byte kt;
17. kt=Serial.read();
18. if(kt=='1'){
19 nhietdo = dht.readTemperature();
20. Serial.print(nhietdo);
}
21. if (kt=='0'){
22. doam = dht.readHumidity();
23. Serial.print(doam);
}
24 delay(900);
}
3.lập trình điều khiển với visual basic 6.0
a.
Lập trình kết nối CSDL
Có 3 phương pháp lập trình trên VB kết nối CSDL:
+ DAO – các đối tượng truy cập dữ liệu
+ RDO – các đối tượng truy cập dữ liệu từ xa
+ ADO- các đối tượng dữ liệu ActiveX
•
Ở đây em sử dụng kỹ thuật DAO :
- DAO được dùng chủ yếu để thao tác trên dữ liệu trong một CSDL
đã có. Thi hành truy vấn, cập nhập mẫu tin và thi hành các hoạt
động bảo trì.
Mặc dù mô hình đối tượng DAO rất rộng, ta có thể thiết lập giải pháp
dùng DAO ngay khi ta chỉ mới hiệu một vài thuộc tính và phương thức
của những đối tượng quan trọng nhất đối với DAO: Database, Recordset,
field
- Dùng đối tượng Database để kết nối với một CSDL
- Để thực hiện, ta thực hiện theo các bước sau:
1. Từ menu Project, chọn References
2. Hộp thoại References xuất hiện, chọn “Microsoft DAO 3.51/3.6
Object Library”Nhấn OK
*Lớp đối tượng DAO.
Cây phân cấp lớp các đối tượng DAO được
thể hiện như sau:
Workspaces
Databases
RecordSets
QueryDefs
TableDefs
Relations
Trong đó:
• Workspaces – định nghĩa tập hợp các
vùng làm việc.
• Databases - định nghĩa tập hợp các
CSDL Access cần làm việc trên một dự
án;
• RecordSets- định nghĩa các tập hợp bản
ghi (Records) cần làm việc;
• QueryDefs - định nghĩa tập hợp các
Query để làm việc. Querydefs và
• Recordsets là khả năng truy xuất, xử lý dữ
liệu (Data Manipulation) của
• DAO;
• TableDefs - định nghĩa tập hợp các bảng
(Table) cần làm việc. Đây là khả năng định
nghĩ dữ liệu (Data-Definition Language);
• Relations - định nghĩa tập hợp các quan
hệ (Relationship) cần làm việc;
- Databases sẽ bao gồm tất cả các CSDL
đang được mở trong vùng làm việc hiện
tại;
- RecordSets sẽ bao gồm tập hợp tất cả các
Recordset đang được mở trên CSDL hiện
tại.
Code :
Dim db As Database
Dim rs As Recordset
Private Sub cmdAdd_Click()
Data1.Recordset.AddNew
End Sub
Private Sub cmdDelete_Click()
'this may produce an error if you delete the last
'record or the only record in the recordset
Data1.Recordset.Delete
Data1.Recordset.MoveNext
End Sub
Private Sub cmdRefresh_Click()
'this is really only needed for multi user apps
Data1.Refresh
End Sub
Private Sub cmdUpdate_Click()
Data1.UpdateRecord
Data1.Recordset.Bookmark = Data1.Recordset.LastModified
End Sub
Private Sub cmdClose_Click()
Unload Me
End Sub
Private Sub Data1_Error(DataErr As Integer, Response As Integer)
'This is where you would put error handling code
'If you want to ignore errors, comment out the next line
'If you want to trap them, add code here to handle them
MsgBox "Data error event hit err:" & Error$(DataErr)
Response = 0 'throw away the error
End Sub
Private Sub Data1_Reposition()
Screen.MousePointer = vbDefault
On Error Resume Next
'This will display the current record position
'for dynasets and snapshots
Data1.Caption = "Record: " & (Data1.Recordset.AbsolutePosition + 1)
'for the table object you must set the index property when
'the recordset gets created and use the following line
'Data1.Caption = "Record: " & (Data1.Recordset.RecordCount *
(Data1.Recordset.PercentPosition * 0.01)) + 1
End Sub
Private Sub Data1_Validate(Action As Integer, Save As Integer)
'This is where you put validation code
'This event gets called when the following actions occur
Select Case Action
Case vbDataActionMoveFirst
Case vbDataActionMovePrevious
Case vbDataActionMoveNext
Case vbDataActionMoveLast
Case vbDataActionAddNew
Case vbDataActionUpdate
Case vbDataActionDelete
Case vbDataActionFind
Case vbDataActionBookmark
Case vbDataActionClose
End Select
Screen.MousePointer = vbHourglass
End Sub
B, chương trình chính của visual basic 6.0
Code :
Dim db As Database
Dim rs As Recordset
Dim doam As Integer
Dim nhietdo As Integer
Private Sub Cmdthuchien_Click()
'Timer1.Enabled = True
Timer2.Enabled = False
Timer1.Enabled = True
Timer1.Interval = 100
End Sub
Private Sub cmdketnoi_Click()
'Timer1.Interval = 1000
'MSComm1.CommPort = 4
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputMode = comInputModeText
'MSComm1.PortOpen = True
MSComm1.RThreshold = 1
MSComm1.InputLen = 1
If Cmdketnoi.Caption = "ket noi" Then
Cmdketnoi.Caption = "huy ket noi"
MSComm1.PortOpen = True
'Timer1.Enabled = True
'Timer2.Enabled = True
Set db = OpenDatabase("E:\phuc13td\codevb\ketquado2.mdb")
MsgBox " Da ket Noi Thanh voi bo mach va co so du lieu " & db.Name
Set rs = db.OpenRecordset("giatrinhanduoc")
Else
Cmdketnoi.Caption = "ket noi"
MSComm1.PortOpen = False
'MSComm1.CommPort = 1
Timer1.Enabled = False
Timer2.Enabled = False
MsgBox " Da Huy ket Noi voi bo mach va co so du lieu " & db.Name
End If
'MSComm1.CommPort = 4
'MSComm1.InBufferSize = 16
MSComm1.InputLen = 10
MSComm1.DTREnable = False
'MSComm1.PortOpen = True
End Sub
Private Sub Cmddoam_Click()
'Timer2.Enabled = True
Timer1.Enabled = False
Timer2.Enabled = True
Timer2.Interval = 1000
End Sub
Private Sub Cmdthoat_Click()
End
End Sub
Private Sub Cmdxemketqua_Click()
frmgiatrinhanduoc.Show
End Sub
Private Sub Timer1_Timer()
'Set rs = db.OpenRecordset("ketqua")
rs.AddNew
rs.Fields("nhiet do") = nhietdo
rs.Update
If Cmdketnoi.Caption = "huy ket noi" Then
MSComm1.Output = "1"
If MSComm1.InBufferCount <> 0 Then
nhietdo = MSComm1.Input
List2.AddItem nhietdo & "*C"
End If
End If
Timer1.Enabled = False
Timer2.Enabled = True
Timer2.Interval = 900
End Sub
Private Sub Timer2_Timer()
rs.AddNew
rs.Fields("do am") = doam
rs.Update
If Cmdketnoi.Caption = "huy ket noi" Then
MSComm1.Output = "0"
If MSComm1.InBufferCount <> 0 Then
doam = MSComm1.Input
List1.AddItem doam & "%"
Timer2.Enabled = False
Timer1.Enabled = True
Timer1.Interval = 100
End If
End If
End Sub
Kêt quả nhận được :