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ý:
ĐỀ TÀI : ĐO ĐỘ ẨM BẰNG CẢM BIẾN DHT11 Hà Nội 2016 Lời nói đầu : Có nhiều cách để đo độ ẩm khơng khí dùng HS1101 hay dòng cảm biến SHT1x DHT11… Nhưng hơm sử dụng cảm biến DHT11 để đo độ ẩm cho khơng khí… cảm ơn bạn ý đọc ! Đề tài thực : Thực đo độ ẩm nhiệt độ 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 hình LCD Màn hình LCD 16x2 BreadBoard 20x5 Dây kết nối Cảm biến đo độ ẩm nhiệt độ DHT11 : DHT11 cảm biến đo độ ẩm nhiệt độ phức tạp với m ột đầu tín hiệu kỹ thuật số hiệu chỉnh Kỹ thuật công nghệ cảm biến nhiệt đ ộ đ ộ ẩm, đảm bảo độ tin cậy cao tính ổn định lâu dài tuyệt vời C ảm bi ến nhi ệt độ độ ẩm Nó đời sau sử dụng thay dòng SHT1x nh ững nơi khơng cần độ xác cao nhiệt độ độ ẩm a) Thông số kỹ thuật : o Đo độ ẩm 20% -95% o Đo nhiệt độ - 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 : Để giao tiếp với DHT11 theo chuẩn chân vi xử lý th ựchiện theo 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 với DHT11, Cảm biến g ửi l ại byte d ữ li ệu nhiệt độ đo - Bước 1: gửi tín hiệu Start : o MCU thiết lập chân DATA Output, kéo chân DATA xuống khoảng thời gian >18ms Trong Code để 25ms Khi DHT11 hiểu MCU muốn đo giá trị nhiệt độ độ ẩm o MCU đưa chân DATA lên 1, sau thiết lập lại chân đầu vào o Sau khoảng 20-40us, DHT11 kéo chân DATA xuống thấp Nếu >40us mà chân DATA ko kéo xuống thấp nghĩa ko giao tiếp v ới DHT11 o Chân DATA mức thấp 80us sau DHT11 kéo nên cao 80us Bằng việc giám sát chân DATA, MCU biết có giao tiếp với DHT11 ko Nếu tín hiệu đo DHT11 lên cao, hồn thiện trình giao tiếp MCU với DHT - Bước 2: đọc giá trị DHT11: DHT11 trả giá trị nhiệt độ độ ẩm dạng byte Trong đó: § Byte 1: giá trị phần ngun độ ẩm (RH%) § Byte 2: giá trị phần thập phân độ ẩm (RH%) § Byte 3: giá trị phần nguyên nhiệt độ (TC) § Byte : giá trị phần thập phân nhiệt độ (TC) § Byte : kiểm tra tổng ð Nếu Byte = (8 bit) (Byte1 +Byte2 +Byte3 + Byte4) giá tr ị đ ộ ẩm nhiệt độ xác, sai kết đo khơng có nghĩa - Đọc liệu: Sau giao tiếp với DHT11, DHT11 gửi liên tiếp 40 bit ho ặc MCU, tương ứng chia thành byte kết Nhiệt độ độ ẩm - Bit 0: - Bit 1: Sau tín hiệu đưa 0, ta đợi chân DATA MCU đ ược DHT11 kéo lên Nếu chân DATA khoảng 26 – 28 us 0, n ếu t ồn t ại 70 us Do lập trình ta bắt s ườn lên c chân Data sau delay khoảng 50 us Nếu giá trị đo ta đọc đ ược bit 0, n ếu giá tr ị đo ta đọc bít Cứ ta đọc bit c) Vi điều khiển : (sử dụng cho arduino UNO R3) Code arduino : // Gọi thư viện DHT11 #include "DHT.h" const int DHTPIN = 2; //Đọc liệu từ DHT11 chân mạch Arduino const int DHTTYPE = DHT11; //Khai báo loại cảm biến, có loại DHT11 DHT22 DHT dht(DHTPIN, DHTTYPE); void setup() { 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 giây 24 } Arduino UNO R3 Arduino UNO R3 cấp nguồn 5V thơng qua cổng USB cấp qua nguồn ngồi thông qua Adaptor với điện áp khuyên dùng – 12V DC giới hạn 6-20V Thường nên cấp nguồn Pin 9V hợp lý khơng có sẵn nguồn cấp từ cổng USB Nếu nguồn vượt qua ngưỡng làm hỏng Arduino UNO R3 GND ( ground) cực âm nguồn điện cấp cho Arduino UNO R3 Khi bạn dùng thiết bị sử dụng nguồn riêng biệt chân phải đ ược nối với 5V cấp điện áp 5V đầu Dòng tối đa cho phép chân 500mA 3.3V cấp điện áp 3.3V đầu Dòng tối đa cho phép chân 50mA Vin (voltage Input) để cấp nguồn cho Arduino, bạn nối c ực d ương nguồn với chân này, cực âm nguồn với chân GND Một vài thông số Arduino UNO R3 Vi điều khiển ATmega328 họ 8bit Điện áp hoạt động 5V DC (chỉ 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 (độ phân giải 10bit) Dòng tối đa chân I/O 30 mA Dòng tối đa (5V) 500 mA Dòng tối đa (3.3V) 50 mA Bộ nhớ flash 32 KB (ATmega328) với 0.5KB dùng bootloader SRAM KB (ATmega328) EEPROM 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 cẩn thận, kiểm tra cực âm – dương nguồn tr ước cấp cho Arduino UNO Việc làm chập mạch nguồn vào Arduino UNO biến thành miếng nhựa chặn giấy khuyên bạn nên dùng nguồn từ cổng USB Các chân 3.3V 5V Arduino chân dùng đ ể cấp nguồn cho thiết bị khác, chân cấp nguồn vào Vi ệc cấp nguồn sai vị trí làm hỏng board Điều khơng 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 6V làm hỏng board Cấp điện áp 13V vào chân RESET board làm hỏng vi điều khiển ATmega328 Cường độ dòng điện vào/ra tất chân Digital Analog Arduino UNO vượt 200mA làm hỏng vi điều khiển Cấp điệp áp 5.5V vào chân Digital Analog Arduino UNO làm hỏng vi điều khiển Cường độ dòng điện qua chân Digital Analog Arduino UNO vượt 40mA làm hỏng vi điều khiển Do n ếu khơng dùng để truyền nhận liệu, bạn phải mắc đ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 nhớ Flash: đoạn lệnh bạn lập trình lưu trữ nhớ Flash vi điều khiển Thường có khoảng vài KB số dùng cho bootloader đừng lo, bạn cần 20KB nhớ đâu 2KB cho SRAM (Static Random Access Memory): giá trị biến bạn khai báo lập trình lưu Bạn khai báo nhi ều bi ến cần nhiều nhớ RAM Tuy vậy, thực nhớ RAM lại trở thành thứ mà bạn phải bận tâm Khi điện, d ữ liệu SRAM bị 1KB cho EEPROM (Electrically Eraseble Programmable Read Only Memory): giống ổ cứng mini – nơi bạn đọc ghi liệu vào mà khơng phải lo bị cúp ện giống nh d ữ liệu SRAM ATMEGA328P-PU Vi điều khiển bit Atmega328 chíp vi điều khiển sản xuất bời hãng Atmel thuộc họ MegaAVR có sức mạnh hẳn Atmega 328 vi điều khiển bít dựa kiến trúc RISC nhớ chương trình 32KB ISP flash có th ể ghi xóa hàng nghìn lần, 1KB EEPROM, nhớ RAM vơ lớn giới vi xử lý bít (2KB SRAM) Với 23 chân sử dụng cho kết nối vào i/O, 32 ghi, b ộ timer/counter lập trình, có gắt nội ngoại (2 lệnh m ột vector ngắt), giao thức truyền thơng nối tiếp USART, SPI, I2C Ngồi có th ể sử dụng biến đổi số tương tự 10 bít (ADC/DAC) mở rộng tới kênh, kh ả lập trình watchdog timer, hoạt động với chế độ nguồn, có th ể s dụng tới kênh điều chế độ rộng xung (PWM), hỗ tr ợ bootloader [/col] Atemega328 có khả hoạt động dải điện áp rộng (1.8V – 5.5V), tốc độ thực thi (thông lượng) 1MIPS 1MHz Ngày vi điều khiển Atmega328 thực sử sử dụng phổ biến t d ự án nhỏ sinh viên, học sinh với giá thành rẻ, xử lý mạnh mẽ, tiêu t ốn lượng (chế độ hoạt động : 0.2 mA, chế độ ngủ: 0.1 μA, chế độ tích kiệm: 0.75 μA) hỗ trợ nhiệt tình cộng đồng người dùng AVR Và khơng thể không nhắc tới thành công Vi điều khiển Atmega328 dự án mã nguồn mở Arduino với modul Adruino Uno (R3), Arduino Nano, Arduino Pro mini sản phẩm dẫn dắt vào giới mã nguồn mở để hồn thành chương trình “nháy mắt” - Lập trình cho Arduino Các thiết bị dựa tảng Arduino lập trình ngơn riêng Ngôn ngữ dựa ngôn ngữ Wiring viết cho phần cứng nói chung Và Wiring lại biến thể C/C++ Một số người gọi Wiring, m ột s ố khác gọi C hay C/C++ Riêng gọi “ ngôn ngữ Arduino”, đội ngũ phát triển Arduino gọi Ngôn ngữ Arduino bắt nguồn từ C/C++ phổ biến dễ học, dễ hiểu Nếu học tốt ch ương trình Tin học 11 việc lập trình Arduino dễ th đối v ới bạn Để lập trình gửi lệnh nhận tín hiệu từ m ạch Arduino, nhóm phát triển dự án cấp đến cho người dùng m ột mơi tr ường l ập trình Arduino gọi Arduino IDE ( Intergrated Development Environment) hình Xuất hình LCD qua giao tiếp I2C : Mạch điều khiển hình 16x02 giao tiếp I2C sử dụng IC ều ển hình kí tự gồm 16 cột dòng giúp tiết kiệm dây n ối v ới vi ều ển (hoặc Arduino) cho khả hiển thị nhanh với nhiều chức - Mạch điều khiển dùng cho hình 16x02 Thơng thường, để điều khiển hiển thị kí tự từ vi điều ển xu ất hình 16x02 bạn cần tới 7-8 dây nối đến chân vi ều ển Điều gây nhiều phiền toái: sai dây, mạch rườm ra, khó viết code Những điều mạch điều khiển hình khắc phục hồn tồn s ố lượng dây tín hiệu giảm nhất: dây Bằng việc sử dụng giao tiếp I2C, việc điều khiển trực tiếp hình chuy ển sang cho IC x lý n ằm mạch Bạn việc gửi mã lệnh nội dung hi ển th ị, v ậy giúp vi điều khiển có nhiều thời gian để xử lý tiến trình phức tạp khác - Ưu điểm việc sử dụng giao tiếp I2C Giao tiếp I2C sử dụng dây tín hiệu: SDA SCL giúp ti ết kiệm chân vi điều khiển Tốc độ truyền liệu lên đến 400Kbps Dữ liệu truyền nhận đảm bảo tính tồn vẹn sử dụng chế ph ản hồi (ACK) byte liệu Có khả kết nối nhiều thiết bị với nhau: mạch có sẵn mối hàn A0, A1, A2 để thay đổi địa module Địa mặc định: 0x27, mắc vào I2C bus tối đa module (3bit address set) Điện áp hoạt động: 3V-6V Để điều khiển độ tương phản hình, bạn xoay biến tr màu xanh Kết nối module hình với Arduino Module hình LCD Arduino (16x2) GND GND Vcc 5V SDA A4 SCL A5 Sơ đồ nguyên lý DHT11 Arduino xuất hình LCD qua giao ti ếp I2C Lập trình #include #include LiquidCrystal_I2C lcd(0x27,16,2); void setup() { lcd.init(); //Khởi động hình lcd.backlight(); //Bật đèn lcd.print("Hello world"); //Xuất chữ Hello world, mặc định sau init trỏ cột hàng lcd.setCursor(0,1); //Đưa trỏ tới hàng 1, cột lcd.print("I love Arduino !"); } void loop() { } Kết hợp đọc nhiệt độ độ - độ ẩm xuất hình Bây bạn biết cách đọc nhiệt độ, độ ẩm biết xuất hình Vậy việc kết hợp lại đ ể đ ược đo ạn code này: #include #include #include 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 nhiệt độ cảm biến DHT11 sử dụng vi x lý Atmega 328 kit Arduino UNO R3 để đọc xuất d ữ liệu mạch đo lường đơn giản Từ mạch ta ứng dụng tồn đo lường nhiệt độ độ ẩm khơng khí, phát triển h ơn mạch để chế tạo đồng hồ đo nhiệt độ độ ẩm cố định Qua ta có th ể thấy bước làm mạch vi điều khiển để đo m ột đại lượng cần trải qua bước sau : - Xác định đề tài cần thực - Chọn cảm biến đo thích hợp với đề tài - Chọn linh kiện để xử lý tốn cần giải quy ết - Mơ phương pháp đo phần mềm mô (thường dùng Proteus 8.0) - Viết chương trình vi điều khiển mã code - Nạp code cho vi điều khiển - Lắp mạch hoàn chỉnh đo thử nghiệm ... vi điều khiển để đo m ột đại lượng cần trải qua bước sau : - Xác định đề tài cần thực - Chọn cảm biến đo thích hợp với đề tài - Chọn linh kiện để xử lý toán cần giải quy ết - Mô phương pháp đo