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 : Đo nhiệt độ và độ ẩm sử dụng
DHT11
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
b
o
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
Nguyên lý hoạt động :
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
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.
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 đó hồn thiện
q 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.
Vi điều khiển : (sử dụng cho arduino UNO R3)
c
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 ngồ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 khun 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 ngồ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. Ngồ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 Arduino 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 hồn tồ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 tồ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 (16x2) Arduino
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(0x3F,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(0x3F,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 tồ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 tố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.