Tải bản đầy đủ (.docx) (16 trang)

Thiết kế mạch đo độ ẩm và nhiệt độ dùng cảm biến DHT11

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 (872.25 KB, 16 trang )

ĐỀ TÀI : ĐO ĐỘ ẨM BẰNG CẢM BIẾN DHT11

Hà Nội 2016
Lời nói đầu :
Có rất nhiều cách để đo độ ẩm của không khí như dùng HS1101 hay
dòng cảm biến SHT1x và DHT11…. Nhưng hôm nay mình sẽ sử dụng
cảm biến DHT11 để đo độ ẩm cho không khí… cảm ơn các bạn đã
chú ý đọc !
Đề tài thực hiện : Thực hiện đo độ ẩm và nhiệt độ bằng cảm
biến DHT11 sử dụng Arduino UNO R3 để xử lý số liệu.
Linh kiện cần thiết gồm:
 Cảm biến DHT11.
 Arduino UNO R3
 Modun điều khiển màn hình LCD
 Màn hình LCD 16x2
 BreadBoard 20x5
 Dây kết nối

1. Cảm biến đo độ ẩm và nhiệt độ DHT11 :


DHT11 là cảm biến đo độ ẩm và nhiệt độ 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à tính ổ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ế dòng SHT1x ở nh ững
nơi không cần độ chính xác cao về nhiệt độ và độ ẩm

a) Thông số kỹ thuật :
o Đo độ ẩm 20% -95%
o Đ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 :
o Sơ đồ kết nối vi xử lý:


o

Nguyên lý hoạt động :

Để có thể giao tiếp với DHT11 theo chuẩn 1 chân vi xử lý th ựchiện theo 2
bước:
B1. Gửi tin hiệu muốn đo (Start) tới DHT11, sau đó DHT11 xác nh ận l ại.
B2. 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.
- Đọ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à một trong khoảng 26 – 28 us thì là 0, còn n ếu t ồn t ại
70 us thì là 1. Do đó trong lập trình ta bắt s ườn lên c ủa chân Data sau đó
delay khoảng 50 us. Nếu giá trị đo được là 0 thì ta đọc đ ược bit 0, n ếu giá tr ị
đo được là 1 thì ta đọc được bít 1. Cứ thế ta đọc các bit tiếp theo.

c) Vi điều khiển : (sử dụng cho arduino UNO R3)
Code arduino :
// Gọi thư viện DHT11
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.

float h = dht.readHumidity(); //Đọc độ ẩm

15.

float t = dht.readTemperature(); //Đọc nhiệt độ

16.
17.


Serial.print("Nhiet do: ");


18.

Serial.println(t); //Xuất nhiệt độ

19.

Serial.print("Do am: ");

20.

Serial.println(h); //Xuất độ ẩm

21.
22.

Serial.println(); //Xuống hàng

23.

delay(1000); //Đợi 1 giây

24.

}

2. Arduino UNO R3


Arduino UNO R3 có thể được cấp nguồn 5V thông qua cổng USB hoặc
cấp qua 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 không có sẵn nguồn cấp từ cổng USB.
Nếu nguồn vượt qua ngưỡng 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 R3. Khi bạn
dùng các thiết bị sử dụng nguồ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, bạn nối c ực d ương
của nguồn với chân này, cực âm của nguồn với chân GND.
Một vài thông số của Arduino UNO R3
Vi điều khiển
ATmega328 họ 8bit
Điện áp hoạt động

5V DC (chỉ được cấp qua cổng USB)

Tần số hoạt động

16 MHz

Dòng tiêu thụ

khoảng 30mA

Điện áp vào khuyên dùng


7-12V DC

Điện áp vào giới hạn

6-20V DC

Số chân Digital I/O

14 (6 chân hardware 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.3V)

50 mA

Bộ nhớ flash


32 KB (ATmega328) với 0.5KB dùng bởi
bootloader

SRAM

2 KB (ATmega328)

EEPROM

1 KB (ATmega328)

Lưu ý:


 Arduino UNO không có bảo vệ cắm ngược nguồn vào. Do đó bạn ph ải
hết sức cẩn thận, kiểm tra các cực âm – dương của nguồn tr ước khi
cấp cho Arduino UNO. Việc làm chập mạch nguồn vào của Arduino
UNO sẽ biến nó thành một miếng nhựa chặn giấy. mình khuyên bạn
nên dùng nguồn từ cổng USB nếu có thể.
 Các chân 3.3V và 5V trên Arduino là các chân dùng đ ể cấp nguồn ra cho
các thiết bị khác, không phải là các chân cấp nguồn vào. Vi ệc cấp nguồn
sai vị trí có thể làm hỏng board. Điều này không được nhà sản xu ất
khuyến khích.
 Cấp nguồn ngoài không qua cổng USB cho Arduino UNO v ới điện áp
dưới 6V có thể làm hỏng board.
 Cấp điện áp trên 13V vào chân RESET trên board có thể làm hỏng vi
điều khiển ATmega328.
 Cường độ dòng điện vào/ra ở tất cả các chân Digital và Analog của
Arduino UNO nếu vượt quá 200mA sẽ làm hỏng vi điều khiển.
 Cấp điệp áp trên 5.5V vào các chân Digital hoặc Analog của Arduino

UNO sẽ làm hỏng vi điều khiển.
 Cường độ dòng điện qua một chân Digital hoặc Analog bất kì của
Arduino UNO vượt quá 40mA sẽ làm hỏng vi điều khiển. Do đó n ếu
không dùng để truyền nhận dữ liệu, bạn phải mắc một điện trở h ạn
dòng.
Bộ nhớ
Vi điều khiển Atmega328 tiêu chuẩn cung cấp cho người dùng:
 32KB bộ nhớ Flash: những đoạn lệnh bạn lập trình sẽ được lưu trữ
trong bộ nhớ Flash của vi điều khiển. Thường thì sẽ có khoảng vài KB
trong số này sẽ được dùng cho bootloader nhưng đừng lo, bạn hiếm khi
nào cần quá 20KB bộ nhớ này đâu.
 2KB cho SRAM (Static Random Access Memory): giá trị các biến bạn
khai báo khi lập trình sẽ lưu ở đây. Bạn khai báo càng nhi ều bi ến thì
càng cần nhiều bộ nhớ RAM. Tuy vậy, thực sự thì cũng hiếm khi nào bộ


nhớ RAM lại trở thành thứ mà bạn phải bận tâm. Khi mất điện, d ữ liệu
trên SRAM sẽ bị mất.
 1KB cho
EEPROM (Electrically Eraseble Programmable Read Only Memory): đây
giống như một chiếc ổ cứng mini – nơi bạn có thể đọc và ghi dữ liệu
của mình vào đây mà không phải lo bị mất khi cúp đi ện giống nh ư d ữ
liệu trên SRAM.
ATMEGA328P-PU Vi điều khiển 8 bit
Atmega328 là một chíp vi điều khiển được sản xuất bời hãng Atmel thuộc họ
MegaAVR có sức mạnh hơn hẳn. Atmega 328 là một bộ vi điều khiển 8 bít
dựa trên kiến trúc RISC bộ nhớ chương trình 32KB ISP flash có th ể ghi xóa
hàng nghìn lần, 1KB EEPROM, một bộ nhớ RAM vô cùng lớn trong thế giới vi
xử lý 8 bít (2KB SRAM)
Với 23 chân có thể sử dụng cho các kết nối vào hoặc ra i/O, 32 thanh ghi, 3 b ộ

timer/counter có thể lập trình, có các gắt nội và ngoại (2 lệnh trên m ột
vector ngắt), giao thức truyền thông nối tiếp USART, SPI, I2C. Ngoài ra có th ể
sử dụng bộ biến đổi số tương tự 10 bít (ADC/DAC) mở rộng tới 8 kênh, kh ả
năng lập trình được watchdog timer, hoạt động với 5 chế độ nguồn, có th ể s ử
dụng tới 6 kênh điều chế độ rộng xung (PWM), hỗ tr ợ bootloader.
[/col]


Atemega328 có khả năng hoạt động trong một dải điện áp rộng (1.8V –
5.5V), tốc độ thực thi (thông lượng) 1MIPS trên 1MHz
Ngày nay vi điều khiển Atmega328 thực sử được sử dụng phổ biến t ừ các d ự
án nhỏ của sinh viên, học sinh với giá thành rẻ, xử lý mạnh mẽ, tiêu t ốn ít
năng lượng (chế độ hoạt động : 0.2 mA, chế độ ngủ: 0.1 μA, chế độ tích
kiệm: 0.75 μA) và sự hỗ trợ nhiệt tình của cộng đồng người dùng AVR. Và
không thể không nhắc tới sự thành công của Vi điều khiển Atmega328 trong
dự án mã nguồn mở Arduino với các modul Adruino Uno (R3), Arduino
Nano, Arduino Pro mini những sản phẩm dẫn dắt chúng ta vào thế giới mã
nguồn mở để hoàn thành một chương trình trong “nháy mắt”.
- Lập trình cho Arduino
Các thiết bị dựa trên nền tảng Arduino được lập trình bằng ngôn riêng. Ngôn
ngữ này dựa trên ngôn ngữ Wiring được viết cho phần cứng nói chung. Và
Wiring lại là một biến thể của C/C++. Một số người gọi nó là Wiring, m ột s ố
khác thì gọi là C hay C/C++. Riêng mình thì gọi nó là “ ngôn ngữ Arduino”, và
đội ngũ phát triển Arduino cũng gọi như vậy. Ngôn ngữ Arduino bắt nguồn từ
C/C++ phổ biến hiện nay do đó rất dễ học, dễ hiểu. Nếu học tốt ch ương
trình Tin học 11 thì việc lập trình Arduino sẽ rất dễ th ở đối v ới bạn.


Để lập trình cũng như gửi lệnh và nhận tín hiệu từ m ạch Arduino, nhóm phát
triển dự án này đã cũng cấp đến cho người dùng m ột môi tr ường l ập trình

Arduino được gọi là Arduino IDE ( Intergrated Development Environment)
như hình dưới đây.

3. Xuất màn hình LCD qua giao tiếp I2C :


Mạch điều khiển màn hình 16x02 giao tiếp I2C sử dụng IC đi ều khi ển màn
hình kí tự gồm 16 cột và 2 dòng giúp tiết kiệm dây n ối v ới vi đi ều khi ển
(hoặc Arduino) cho khả năng hiển thị nhanh với nhiều chức năng.
- Mạch điều khiển dùng cho màn hình 16x02

Thông thường, để điều khiển và hiển thị được kí tự từ vi điều khi ển xu ất ra
màn hình 16x02 bạn cần tới 7-8 dây nối đến chân vi đi ều khi ển. Điều này gây
ra rất nhiều phiền toái: đi sai dây, mạch rườm ra, khó viết code...
Những điều này được mạch điều khiển màn hình khắc phục hoàn toàn vì s ố
lượng dây tín hiệu giảm còn duy nhất: 2 dây. Bằng việc sử dụng giao tiếp
I2C, việc điều khiển trực tiếp màn hình được chuy ển sang cho IC x ử lý n ằm


trên mạch. Bạn chỉ việc gửi các mã lệnh cùng nội dung hi ển th ị, do v ậy
giúp vi điều khiển có nhiều thời gian để xử lý các tiến trình phức tạp khác .
- Ưu điểm của việc sử dụng giao tiếp I2C
 Giao tiếp I2C chỉ sử dụng duy nhất 2 dây tín hiệu: SDA và SCL giúp ti ết
kiệm chân trên vi điều khiển.
 Tốc độ truyền dữ liệu lên đến 400Kbps.
 Dữ liệu truyền nhận đảm bảo tính toàn vẹn vì sử dụng cơ chế ph ản
hồi (ACK) trên mỗi byte dữ liệu.
 Có khả năng kết nối nhiều thiết bị với nhau: trên mạch có sẵn các mối
hàn A0, A1, A2 để thay đổi địa chỉ của module.
 Địa chỉ mặc định: 0x27, có thể mắc vào I2C bus tối đa 8 module (3bit

address set)
 Điện áp hoạt động: 3V-6V
 Để điều khiển độ tương phản của màn hình, bạn xoay biến tr ở màu
xanh.
Kết nối module màn hình với Arduino
Module màn hình LCD
Arduino
(16x2)
GND
GND
Vcc
5V
SDA
A4
SCL
A5
Sơ đồ nguyên lý của DHT11 và Arduino xuất màn hình LCD qua giao ti ếp
I2C


Lập trình
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
void setup() {
lcd.init();

//Khởi động màn hình.

lcd.backlight();

//Bật đèn nền
lcd.print("Hello world"); //Xuất ra chữ Hello world, mặc định
sau khi init thì con trỏ tại cột 0 hàng 0


lcd.setCursor(0,1); //Đưa con trỏ tới hàng 1, cột 0
lcd.print("I love Arduino !");

}
void loop() {
}

6. Kết hợp đọc nhiệt độ độ - độ ẩm và xuất ra màn hình
Bây giờ bạn đã biết cách đọc nhiệt độ, độ ẩm rồi và cũng đã biết xuất ra màn
hình. Vậy bây giờ chúng ta chỉ việc kết hợp cả 2 lại đ ể đ ược một đo ạn code
như thế này:
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
const int DHTPIN = 2;
const int DHTTYPE = DHT11;
DHT dht(DHTPIN, DHTTYPE);
byte degree[8] = {
0B01110,
0B01010,
0B01110,
0B00000,
0B00000,
0B00000,

0B00000,
0B00000
};
void setup() {
lcd.init();
lcd.backlight();
lcd.print("Nhiet do: ");
lcd.setCursor(0,1);
lcd.print("Do am: ");
lcd.createChar(1, degree);
}

dht.begin();

void loop() {
float h = dht.readHumidity();


float t = dht.readTemperature();
if (isnan(t) || isnan(h)) { // Kiểm tra xem thử việc đọc giá trị
có bị thất bại hay không.
}
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(" %");
}

}

Lời Kết : Mạch đo độ ẩm và nhiệt độ bằng cảm biến DHT11 sử dụng vi x ử lý
Atmega 328 của kit Arduino UNO R3 để đọc và xuất d ữ liệu là một mạch đo
lường rất đơn giản. Từ mạch này ta có thể ứng dụng nó trong các bài toàn đo
lường nhiệt độ và độ ẩm không khí, cũng có thể phát triển h ơn về mạch này
để chế tạo ra một đồng hồ đo nhiệt độ và độ ẩm cố định. Qua đây ta có th ể
thấy được các bước làm một mạch vi điều khi khiển để đo được m ột đại
lượng nào đó cần trải qua các bước như sau :
- Xác định đề tài cần thực hiện
- Chọn cảm biến đo thích hợp với đề tài
- Chọn linh kiện để xử lý các bài toán cần giải quy ết
- Mô phỏng phương pháp đo trên phần mềm mô phỏng (thường dùng
là Proteus 8.0)
- Viết chương trình vi điều khiển bằng mã code
- Nạp code cho vi điều khiển
- Lắp mạch hoàn chỉnh và đo thử nghiệm.



×