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.. Vin Voltage Input: Để cấp nguồn ngoài cho Arduino UNO, bạn nối cực dương của ngu
Trang 1TRƯỜ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
SVTH: Huỳnh Văn Phúc
MSSV: 13138154
Lớp: DH13TD
Trang 2B 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
Trang 3IOREF: Đ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
Trang 4
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
Trang 5b) 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
Trang 6o 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ị độ
Trang 7ẩ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:
Trang 8Sau 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 }
Trang 913 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
Trang 10+ 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
Cây phân cấp lớp các đối tượng DAO được
thể hiện như sau:
Workspaces
Databases
RecordSets
Trang 11TableDefs
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
Trang 12Private 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
Trang 13Case 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
Trang 14Private 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
Trang 15Private 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
Trang 16End If
End Sub
Kêt quả nhận được :