Nó là một giao thức giao tiếp được phát triển bởi Philips Semiconductors để truyền dữ liệu giữa một bộ xử lý trung tâm với nhiều IC trên cùng một board mạch chỉ sử dụng hai đường truyền
Trang 1Học viện Công nghệ Bưu chính Viễn thông
Đề tài: Đo độ ẩm, nhiệt độ trong phòng
hiển thị qua LCD
Sinh viên thực hiện: Nguyễn Quang Quân
Trần Minh Tú Phạm Hồng Sơn Phạm Xuân Trường
B17DCDT146 B17DCDT198 B17DCDT162 B17DCDT194
Hà Nội, 2021
Trang 2Mục lục
I Giới thiệu 3
II Nội dung chính 3
III Phần cứng cần thiết 3
IV Thông số chi tiết các linh kiện 3
1 Giới thiệu LCD 16×2 3
2 Module I2C Arduino 4
3 Giới thiệu giao thức I2C 6
4 Arduino UNO R3 6
5 Cảm biến nhiệt độ, độ ẩm DHT11 9
V Sơ đồ mạch 10
VI Code 10
VII Kết quả demo 11
Trang 3I Giới thiệu
Sự bùng nổ của công nghệ ngành điện tử ngày càng phát triển một cách mạnh mẽ Những ứng dụng của nó giúp con người ngày càng có cuộc sống nâng cao Sự khảo sát về nhiệt độ ,độ ẩm môi trường với con người trước kia luôn gặp khó khăn do phải đo đạc và tính toán một cách khá phức tạp Do đó chúng em đã lựa chọn đề tài đo nhiệt độ độ ẩm môi trường để ứng dụng vào nhiều công việc khác nhau
Đề tài giúp học được cách đo nhiệt độ - độ ẩm từ cảm biến và xuất ra màn hình LCD Hiểu được Arduino tạo cho người dùng một sự đơn giản và tiện lợi đến mức nào
II Nội dung chính
Đọc dữ liệu từ cảm biến nhiệt độ - độ ẩm DHT11
Sử dụng màn hình LCD để xuất thông tin
III Phần cứng cần thiết
• Màn hình LCD 16 x 2
• Mạch điều khiển màn hình LCD sử dụng giao tiếp I2C
• Cảm biến nhiệt độ - độ ẩm DHT11
• Arduino UNO R3
IV Thông số chi tiết các linh kiện
1 Giới thiệu LCD 16×2
Trang 4 Thông số kỹ thuật LCD 16×2:
- LCD 16×2 được sử dụng để hiển thị trạng thái hoặc các thông số.
LCD 16×2 có 16 chân trong đó 8 chân dữ liệu (D0 – D7) và 3 chân điều khiển (RS, RW, EN)
5 chân còn lại dùng để cấp nguồn và đèn nền cho LCD 16×2
Các chân điều khiển giúp ta dễ dàng cấu hình LCD ở chế độ lệnh hoặc chế độ dữ liệu
Chúng còn giúp ta cấu hình ở chế độ đọc hoặc ghi
- LCD 16×2 có thể sử dụng ở chế độ 4 bit hoặc 8 bit tùy theo ứng dụng ta đang làm
2 Module I2C Arduino
- LCD có quá nhiều nhiều chân gây khó khăn trong quá trình đấu nối và chiếm dụng nhiều chân trên vi điều khiển
- Module I2C LCD ra đời và giải quyết vấn để này
Thay vì phải mất 6 chân vi điều khiển để kết nối với LCD 16×2 (RS, EN, D7, D6, D5
và D4) thì module IC2 bạn chỉ cần tốn 2 chân (SCL, SDA) để kết nối
Module I2C hỗ trợ các loại LCD sử dụng driver HD44780(LCD 16×2, LCD 20×4,
…) và tương thích với hầu hết các vi điều khiển hiện nay
Ưu điểm
Tiết kiệm chân cho vi điều khiển
Dễ dàng kết nối với LCD
Thông số kĩ thuật
Điện áp hoạt động: 2.5-6V DC
Trang 5 Hỗ trợ màn hình: LCD1602,1604,2004 (driver HD44780).
Giao tiếp: I2C
Địa chỉ mặc định: 0X27 (có thể điều chỉnh bằng ngắn mạch chân A0/A1/A2)
Tích hợp Jump chốt để cung cấp đèn cho LCD hoặc ngắt
Tích hợp biến trở xoay điều chỉnh độ tương phản cho LCD
Các lỗi thường gặp khi sử dụng I2C LCD
- Hiển thị một dãy ô vuông
- Màn hình chỉ in ra một ký tự đầu
- Màn hình nhấp nháy
Module I2C LCD 16×2 Arduino UNO
Sơ đồ đấu nối
3 Giới thiệu giao thức I2C
Trang 6I2C là tên viết tắt của cụm từ tiếng anh “Inter-Integrated Circuit” Nó là một giao thức giao tiếp được phát triển bởi Philips Semiconductors để truyền dữ liệu giữa một bộ
xử lý trung tâm với nhiều IC trên cùng một board mạch chỉ sử dụng hai đường truyền tín hiệu
Do tính đơn giản của nó nên loại giao thức này được sử dụng rộng rãi cho giao tiếp giữa
vi điều khiển và mảng cảm biến, các thiết bị hiển thị, thiết bị IoT, EEPROMs, v.v …
Đây là một loại giao thức giao tiếp nối tiếp đồng bộ Nó có nghĩa là các bit dữ liệu được truyền từng bit một theo các khoảng thời gian đều đặn được thiết lập bởi một tín hiệu đồng hồ tham chiếu
Đặc điểm
- Sau đây là một số đặc điểm quan trọng của giao thức giao tiếp I2C:
Chỉ cần có hai đường bus (dây) chung để điều khiển bất kỳ thiết bị / IC nào trên mạng I2C
Không cần thỏa thuận trước về tốc độ truyền dữ liệu như trong giao tiếp
UART Vì vậy, tốc độ truyền dữ liệu có thể được điều chỉnh bất cứ khi nào cần thiết
Cơ chế đơn giản để xác thực dữ liệu được truyền
Sử dụng hệ thống địa chỉ 7 bit để xác định một thiết bị / IC cụ thể trên bus I2C
Các mạng I2C dễ dàng mở rộng Các thiết bị mới có thể được kết nối đơn giản với hai đường bus chung I2C
4 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)
Trang 7Dò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
Các chân năng lượng
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 Và dĩ nhiên nó luôn là 5V Mặc dù 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: việc 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 cổng vào/ra
Trang 8- Arduino UNO có 14 chân digital dùng để đọc hoặc xuất tín hiệu 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
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()
Chân giao tiếp SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK 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 (0 → 210-1) để đọ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
- Đặ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
5 Cảm biến nhiệt độ, độ ẩm DHT11
- Cảm biến độ ẩm và nhiệt độ DHT11 là cảm biến rất thông dụng hiện nay vì chi
phí rẻ và rất dễ lấy dữ liệu thông qua chuẩn giao tiếp 1 wire (Chuẩn giao tiếp 1 wire là dùng 1 chân Digital để truyền dữ liệu)
Trang 9- Bộ tiền xử lý tín hiệu được tích hợp trong cảm biến giúp bạn có thể đọc dữ liệu chính xác mà không phải qua bất kỳ tính toán nào
.
Thông số kỹ thuật của cảm biến:
Điện áp hoạt động: 3V – 5V (DC)
Dải độ ẩm hoạt động: 20% – 90% RH, sai số ±5%RH
Dải nhiệt độ hoạt động: 0°C ~ 50°C, sai số ±2°C
Khoảng cách truyển tối đa: 20m
Cách nối với Arduno
Arduino Uno Cảm biến nhiệt độ, độ ẩm DHT11
V Sơ đồ mạch
Trang 10VI Code
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);// chú ý LCD có 2 đ a ch ( 0x3F ho c 0x27)ịa chỉ ( 0x3F hoặc 0x27) ỉ ( 0x3F hoặc 0x27) ặc 0x27)
#include <LiquidCrystal.h>
const int DHTPIN = 9; //Đ c d li u t DHT11 chân 2 trên m ch ọc dữ liệu từ DHT11 ở chân 2 trên mạch ữ liệu từ DHT11 ở chân 2 trên mạch ệu từ DHT11 ở chân 2 trên mạch ừ DHT11 ở chân 2 trên mạch ở chân 2 trên mạch ạch
Arduino
const int DHTTYPE = DHT11; //Khai báo lo i c m bi n, có 2 lo i là DHT11/ạch ảm biến, có 2 loại là DHT11/ ến, có 2 loại là DHT11/ ạch DHT22 /DHT21 -thay vao
DHT dht(DHTPIN, DHTTYPE);
void setup()
{
dht.begin();
lcd.init();
Arduino R3
Trang 11lcd.backlight();
Serial.begin(9600); // giao ti p Serial v i baudrate 9600ến, có 2 loại là DHT11/ ới baudrate 9600
lcd.print(" WELCOME");
// put your setup code here, to run once:
delay(1500);
lcd.setCursor(0,0);
lcd.println(" ");
}
void loop()
{
// put your main code here, to run repeatedly:
int h = dht.readHumidity();
int t = dht.readTemperature();
lcd.setCursor(0,0);
lcd.print(" NHIET DO:");
lcd.print(t);
lcd.write(0xdf);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print(" DO AM :");
lcd.print(h);
lcd.print("%");
Serial.print("Nhhiet do : ");Serial.println(t);
Serial.print("Do am : ");Serial.println(h);
}
Trang 12VII Kết quả demo