GIỚI THIỆU LÝ THUYẾT
Arduino Uno R3
Arduino được thành lập vào năm 2005 tại Viện thiết kế tương tác Ivrea, Italy, như một dự án dành cho sinh viên Tên gọi "Arduino" xuất phát từ một quán bar ở Ivrea, nơi các nhà sáng lập thường gặp gỡ Các thiết bị Arduino được lập trình bằng ngôn ngữ riêng, dựa trên Wiring - một ngôn ngữ phát triển cho phần cứng và là biến thể của C/C++ Sau khi hoàn thiện nền tảng Wiring, các nhà nghiên cứu, trong đó có David Cuarlielles, đã hợp tác để làm cho nó nhẹ hơn, rẻ hơn và dễ tiếp cận hơn cho cộng đồng mã nguồn mở.
Nhà thiết kế của Arduino hướng đến việc cung cấp một phương pháp dễ dàng và tiết kiệm cho người yêu thích, sinh viên và chuyên gia trong việc tạo ra các thiết bị tương tác với môi trường thông qua cảm biến và cơ cấu chấp hành Thông tin về thiết kế phần cứng được công khai, cho phép mọi người tự tay chế tạo mạch Arduino theo mã nguồn mở.
Tính đến giữa năm 2011, ước tính có hơn 300.000 mạch Arduino chính thức được sản xuất thương mại, và con số này đã tăng lên khoảng 700.000 vào năm 2013 nhờ công ty Italy Smart Projects Ngoài ra, một số board dẫn xuất từ Arduino cũng được thiết kế bởi SparkFun Electronics, một công ty Mỹ Nhiều phiên bản Arduino đã được sản xuất để phục vụ cho nhiều mục đích sử dụng khác nhau.
Arduino Uno, có nghĩa là "một" trong tiếng Ý, được phát hành để đánh dấu phiên bản Arduino 1.0 và trở thành phiên bản tài liệu tham khảo cho các nền tảng Arduino Là board mới nhất trong dòng sản phẩm Arduino, Uno dựa trên vi điều khiển ATmega328 với 14 chân đầu vào/đầu ra, 6 đầu vào analog, và hoạt động ở tần số 16 MHz Board này được trang bị kết nối USB, jack cắm điện, tiêu đề ICSP và nút reset, cung cấp mọi thứ cần thiết để hỗ trợ vi điều khiển; chỉ cần kết nối với máy tính qua cáp USB hoặc cấp nguồn để bắt đầu sử dụng.
Uno khác với các phiên bản trước ở chỗ không sử dụng chip FTDI để điều khiển USB-to-serial, mà thay vào đó sử dụng Atmega 16U2 làm công cụ chuyển đổi Phiên bản 2 (R2) của Uno sử dụng Atmega8U2 với điện trở kéo dòng HWB xuống đất, giúp dễ dàng đưa vào chế độ DFU Phiên bản 3 (R3) của Uno có thêm nhiều tính năng mới.
Thêm SDA và SCL gần với pin Aref và hai chân mới được đặt gần với pin
RESET, các IOREF cho phép thích ứng với điện áp cung cấp
Đặt lại mạch khỏe mạnh hơn
2.1.3 Cấu trúc, thông số a.Vi điều khiển & bộ nhớ
Arduino UNO sử dụng 3 vi điều khiển 8bit AVR: ATmega8, ATmega168 và ATmega328 Bộ vi điều khiển này có khả năng thực hiện các tác vụ đơn giản như điều khiển đèn LED nhấp nháy, xử lý tín hiệu cho xe điều khiển từ xa, và tạo ra trạm đo nhiệt độ - độ ẩm hiển thị trên màn hình LCD.
Hình 2.3: Vi điều khiển Atmega328 tiêu chuẩn
32KB bộ nhớ Flash: những đoạn lệnh lập trình sẽ được lưu trữ trong bộ nhớ
Flash của vi điều khiển thường có khoảng vài KB được sử dụng cho bootloader, nhưng bạn không cần lo lắng vì hiếm khi nào cần vượt quá 20KB bộ nhớ này.
SRAM (Static Random Access Memory) có dung lượng 2KB, nơi lưu trữ giá trị các biến được khai báo trong lập trình Số lượng biến khai báo càng nhiều thì yêu cầu bộ nhớ RAM càng lớn Tuy nhiên, bộ nhớ RAM thường không phải là vấn đề đáng lo ngại Cần lưu ý rằng khi mất điện, dữ liệu trên SRAM sẽ bị mất.
EEPROM (Bộ nhớ chỉ đọc có thể lập trình và xóa điện tử) 1Kb hoạt động như một ổ cứng mini, cho phép đọc và ghi dữ liệu mà không lo mất mát khi mất điện, khác với dữ liệu trên SRAM.
Một board Arduino đời đầu gồm một cổng giao tiếp RS-232 (góc phía trênbên trái) và một chip Atmel ATmega8 (màu đen, nằm góc phải-phía dưới); 14 chân
I/O số nằm ở phía trên và 6 chân analog đầu vào ở phía đáy
Board Arduino cung cấp hầu hết các chân I/O của vi điều khiển cho các mạch ngoài Các phiên bản như Diecimila, Duemilanove và Uno đều có 14 chân I/O kỹ thuật số, trong đó 6 chân có khả năng tạo xung PWM (điều chế độ rộng xung) và 6 chân input analog có thể sử dụng như 6 chân I/O số Những chân này được thiết kế nằm ở phía trên mặt board, kết nối qua các header cái 0.10-inch.
Các board Arduino Nano, Bare Bones Board tương thích với Arduino, và Boarduino đều có chân header đực ở mặt trên, cho phép kết nối dễ dàng với breadboard Kích thước tối đa của PCB Uno lần lượt là 2,7 mm về chiều dài và chiều rộng.
Kích thước 2,1 inch đi kèm với kết nối USB và jack điện mở rộng, giúp mở rộng không gian sử dụng Bốn lỗ vít cho phép dễ dàng gắn thiết bị vào bề mặt khác.
Hình 2.5: Các lỗ vít giúp cố định vị trí Arduino c Vị trí & chức năng các chân
Nếu không có nguồn từ cổng USB, Arduino UNO có thể được cấp nguồn bằng bộ chuyển đổi AC→DC hoặc pin Bộ chuyển đổi cần được kết nối qua jack cắm 2.1mm với cực dương ở giữa Lưu ý rằng việc cung cấp nguồn vượt quá mức cho phép có thể gây hư hỏng cho Arduino UNO.
GND (Ground) là cực âm của nguồn điện cung cấp cho Arduino UNO Khi sử dụng các thiết bị có nguồn điện riêng biệt, các chân GND này cần được kết nối với nhau để đảm bảo hoạt động ổn định.
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 ở chân này là 50mA
Vin (Voltage Input): để cấp nguồn ngoài cho Arduino UNO, ta nối cực dương của nguồn với chân này và cực âm với chân GND
Chân IOREF trên Arduino UNO cho phép đo điện áp hoạt động của vi điều khiển, luôn ổn định ở mức 5V Tuy nhiên, không nên sử dụng chân này để cấp nguồn 5V, vì chức năng chính của nó không phải là cung cấp điệ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Ω
Hình 2.6: Các ngõ vào/ngõ ra của Arduino
Arduino UNO 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 tối đa trên mỗi chân là 40mA
Một số chân digital có các chức năng đặc biệt như sau:
Module chuyển đổi I2C cho LCD
I2C, viết tắt của "Inter-Integrated Circuit", là một giao thức giao tiếp do Philips Semiconductors phát triển, cho phép truyền dữ liệu giữa một thiết bị master và nhiều thiết bị slave trên cùng một bo mạch chỉ với hai đường tín hiệu.
Giao thức này được sử dụng phổ biến trong việc giao tiếp giữa vi điều khiển và các thiết bị như mảng cảm biến, thiết bị hiển thị, thiết bị IoT, và EEPROMs nhờ vào tính đơn giản của nó.
I2C chỉ sử dụng 2 dây để truyền dữ liệu:
- SDA (Serial Data): dây truyền nhận dữ liệu giữa master và slave
SCL (Serial Clock) là dây mang tín hiệu đồng hồ trong giao thức giao tiếp nối tiếp đồng bộ Giao thức này cho phép truyền dữ liệu từng bit một theo khoảng thời gian đều đặn, được điều khiển bởi tín hiệu đồng hồ từ thiết bị chủ (master).
Hoạt động của I2C: dữ liệu được truyền theo gói tin Gói tin được chia thành các khung dữ liệu như sau:
Start condition: đường SDA chuyển từ mức điện áp cao xuống thấp trước khi đường SCL chuyển cao xuống thấp
Stop condition: đường SDA chuyển từ mức điện áp thấp lên cao trước khi đường
SCL chuyển thấp lên cao
Data frame: 8 bits dữ liệu cần truyền nhận giữa master và slave
Address frame: khung chứa địa chỉ của slave cần kết nối gồm 7 hoặc 10 bit nhị phân
Read/ Write bit: bit xác nhận quá trình là master gửi dữ liệu hay nhận dữ liệu từ slave
ACK/NACK (xác nhận/không xác nhận) là cơ chế thông báo trong truyền thông dữ liệu Khi khung địa chỉ hoặc khung dữ liệu được nhận thành công, thiết bị nhận sẽ gửi lại 1 bit ACK đến thiết bị gửi để xác nhận.
2.3.2 Quá trình truyền nhận dữ liệu
Bắt đầu: Thiết bị Master sẽ gửi đi 1 xung Start bằng cách kéo lần lượt các đường SDA, SCL từ mức 1 xuống 0
Tiếp theo đó, Master gửi đi 7 bit địa chỉ tới Slave muốn giao tiếp cùng với bit
Slave sẽ so sánh địa chỉ vật lý với địa chỉ nhận được Nếu trùng khớp, Slave xác nhận bằng cách kéo đường SDA xuống 0 và thiết lập bit ACK/NACK thành ‘0’ Ngược lại, nếu không trùng khớp, SDA và bit ACK/NACK sẽ mặc định là ‘1’.
Thiết bị Master sẽ gửi hoặc nhận khung bit dữ liệu Nếu Master gửi đến Slave thì bit Read/Write ở mức 0 Ngược lại nếu nhận thì bit này ở mức 1
Nếu như khung dữ liệu đã được truyền đi thành công, bit ACK/NACK được set thành mức 0 để báo hiệu cho Master tiếp tục
Sau khi dữ liệu được gửi thành công đến các Slave, Master sẽ phát tín hiệu Stop để thông báo rằng quá trình truyền đã hoàn tất, bằng cách chuyển SDA từ mức 0 lên 1 và SCL từ mức 1 xuống 0.
2.3.3 I2C sử dụng hai đường truyền tín hiệu:
Một đường xung nhịp đồng hồ(SCL) chỉ do Master phát đi ( thông thường ở 100kHz và 400kHz Mức cao nhất là 1Mhz và 3.4MHz)
Một đường dữ liệu(SDA) theo 2 hướng
Bus I2C cho phép kết nối nhiều thiết bị mà không gây nhầm lẫn, nhờ vào địa chỉ duy nhất cho mỗi thiết bị và mối quan hệ chủ/tớ Mỗi thiết bị có thể hoạt động như thiết bị nhận, truyền dữ liệu hoặc cả hai, tùy thuộc vào vai trò của nó là chủ (master) hay tớ (slave) Thiết bị chủ nắm quyền điều khiển, tạo xung đồng hồ và quản lý địa chỉ của thiết bị tớ trong quá trình giao tiếp, trong khi thiết bị tớ giữ vai trò bị động I2C sử dụng 7 bit để định địa chỉ, cho phép kết nối tối đa 128 thiết bị, và quy định cách đọc (0) hoặc ghi (1) dữ liệu Ưu điểm của I2C nằm ở hiệu suất và sự đơn giản, cho phép một khối điều khiển trung tâm quản lý toàn bộ mạng thiết bị chỉ với hai lối ra điều khiển Ngoài ra, I2C còn hỗ trợ chế độ 10 bit địa chỉ, tương đương với 1024 địa chỉ.
1008 thiết bị có thể kết nối, còn lại 16 địa chỉ sẽ dùng để sử dụng mục đích riêng.
Phần mềm IDE
Đây là phần mềm dùng để lập trình nạp code vô kit ARDUINO - UNO
2.4.1 Cấu trúc một chương trình trong phần mềm IDE:
Phần 1 : Khai báo biến Đây là phần khai báo kiểu biến, tên các biến, định nghĩa các chân trên board một số kiểu khai báo biến thông dụng:
Từ "define" có nghĩa là định nghĩa, trong khi hàm #define được sử dụng để gán tên cho một chân hoặc ngõ ra cụ thể Ví dụ, #define led có thể được sử dụng để định nghĩa một chân LED trong lập trình.
Chú ý: sau #define thì không có dấu “,” (dấy phẩy)
*Khai báo các kiểu biến khác như: int (kiểu số nguyên), float,…
Các chúng ta có thể tham khảo thêm các kiểu biến cũng như công dụng tại arduino.cc
Phần 2 : Thiết lập (void setup())
Phần này dùng để thiết lập cho chương trình, cần nhớ rõ cấu trúc của nó:
Cấu trúc của chương trình bắt buộc phải có dấu ngoặc nhọn ở đầu và ở cuối; nếu thiếu, chương trình sẽ báo lỗi khi kiểm tra Phần này được sử dụng để thiết lập tốc độ truyền dữ liệu cũng như xác định kiểu chân là chân ra hay chân vào.
Serial.begin(9600); Dùng để truyền dữ liệu từ board Arduino lên máy tính pinMode(biến, kiểu vào hoặc ra); Dùng để xác định kiểu chân là vào hay ra
Ví dụ: pinMode(ChanDO, INPUT);
Dùng để viết các lệnh trong chương trình để mạch Arduino thực hiện các nhiệm vụ mà chúng ta mong muốn, thường bắt đầu bằng: void loop()
Một số câu lệnh, cấu trúc thường gặp:
Dấu // được sử dụng để chú thích, giúp giải thích nội dung trên cùng một dòng Khi kiểm tra chương trình, phần mềm sẽ bỏ qua phần chú thích này, không thực hiện kiểm tra hay biên dịch nó.
#define: Dùng để định nghĩa một chân nào đó, hay gán biến tới 1 chân, địa chỉ ghi đọc tín hiệu Ví dụ: #define LED, 13
2.4.2 Hàm nhập xuất Digital I/O: a digitalWrite(): Miêu tả: Viết một giá trị HIGH hoặc một LOW cho một chân số của arduino
Khi chân được cấu hình làm OUTPUT bằng hàm pinMode(), điện áp của chân sẽ được thiết lập tương ứng: 5V (hoặc 3.3V cho 3.3V) khi ở trạng thái HIGH và 0V khi ở trạng thái LOW.
Khi chân được cấu hình là INPUT, hàm digitalWrite() sẽ cho phép bật (HIGH) hoặc tắt (LOW) pullup nội bộ trên chân đầu vào Do đó, nên thiết lập pinMode() thành INPUT_PULLUP để kích hoạt các điện trở kéo lên bên trong.
Cú pháp: digitalWrite(pin, value);
Thông số: pin: Số của chân digital mà bạn muốn thiết đặt value: HIGH hoặc LOW
Mã làm cho pin kỹ thuật số 13 OUTPUTvà chuyển đổi nó bằng cách luân phiên giữa HIGHvà LOWở tốc độ một giây
Ví dụ: int led ; void setup()
{ pinMode(led, OUTPUT); // led được nối với chân số 13
{ digitalWrite(led, HIGH); // bật led delay(1000); // dừng chương trình 1 giây digitalWrite(led, LOW); // tắt led delay(1000); // dừng chương trình 1 giây
Miêu tả: Đọc giá trị từ một Chân số đã được chỉ định, hoặc là HIGH hoặc LOW
Thông số: pin: số chân digital bạn muốn đọc
HIGH hoặc là LOW c pinMode():
Cấu hình 1 pin quy định hoạt động như là một đầu vào (INPUT) hoặc đầu ra (OUTPUT)
Cú pháp: pinMode(pin, mode)
Thông số: pin: số chân có chế độ bạn muốn thiết lập mode: INPUT, OUTPUT, Hoặc INPUT_PULLUP
Ví dụ: pinMode (12, OUTPUT); // chân số 12 là đầu ra
{ digitalWrite (12, HIGH); delay(1000); digitalWrite (12, LOW); delay(1000);
2.4.3 Hàm nhập xuất Analog I/O: a analogRead()
Hàm analogRead() có nhiệm vụ đọc giá trị điện áp từ chân Analog (ADC) trên board Node MCU, với pin A0 tương ứng Board này có 1 pin A0, trong khi các board khác như UNO R3 có 5 pin, Mini và Nano có 8 pin, và Mega có 16 pin Bộ chuyển đổi tương tự 10-bit sang số cho phép lập bản đồ điện áp đầu vào từ 0 đến 5 volts thành các số nguyên từ 0 đến 1023, tạo ra độ phân giải giữa các lần đọc là 5 volts chia cho 1024 đơn vị, tương đương với 0,0049 volt (4,9 mV) trên mỗi đơn vị Dải đầu vào và độ phân giải có thể được điều chỉnh bằng cách sử dụng các phương pháp thích hợp.
Hàm analogRead() cần 100 micro giây để thực hiện Khi người ta nói "đọc tín hiệu analog", bạn có thể hiểu đó chính là việc đọc giá trị điện áp
Lệnh analogWrite() trên mạch Arduino cho phép xuất tín hiệu analog từ một chân, thường được sử dụng để điều chỉnh độ sáng của đèn LED hoặc tốc độ của động cơ Tín hiệu PWM có tần số khoảng 490 Hz trên hầu hết các chân của Arduino, trong khi trên board Node MCU và các board tương tự, tần số này đạt khoảng 980 Hz.
Trên mạch Arduino, bạn không cần sử dụng hàm pinMode() để thiết lập chân phát xung PWM ở chế độ OUTPUT Để phát xung PWM, bạn chỉ cần sử dụng cú pháp: analogWrite([chân phát xung PWM], [giá trị xung PWM]); với giá trị xung PWM nằm trong khoảng từ 0 đến 255.
0 đến 255, tương ứng với mức duty cycle từ 0% đến 100% Trả về
Ví dụ: Đoạn code dưới có chức năng làm sáng dần một đèn LED được kết nối vào chân số 2 trên mạch Arduino int led = 2; void setup() {}
Tạm dừng chương trình cho khoảng thời gian (tính bằng mili giây) được chỉ định là tham số (Có 1000 mili giây = 1 giây.)
Thông số ms: số mili giây để tạm dừng ( unsigned long)
Trả về: Không có int ledPin = 13; // LED pin 13 void setup()
{digitalWrite(ledPin, HIGH); delay(1000);digitalWrite(ledPin, LOW); delay(1000);
Module DHT11
Cảm biến DHT11 là một trong những module cảm biến độ ẩm và nhiệt độ phổ biến hiện nay nhờ chi phí thấp và khả năng lấy dữ liệu dễ dàng qua giao tiếp 1 wire Với bộ tiền xử lý tín hiệu tích hợp, DHT11 cung cấp dữ liệu chính xác mà không cần tính toán phức tạp Tuy nhiên, so với DHT22, DHT11 có khoảng đo và độ chính xác kém hơn đáng kể.
Điện áp đầu vào từ 3 đến 5VDC
Đo tốt ở dải nhiệt độ từ 0 đến 55 độ C với sai số +- 2 độ C
Đo tốt ở độ ẩm 20 - 90 % RH với sai số 5%
Tần số lấy mẫu tối đa 1%
Dùng đo nhiệt đô và độ ẩm
Dùng để nghiên cứu học tập bộ môn điện tử
Dùng đo nhiệt độ môi trường xung quanh
Dùng đo độ ẩm xung quanh
Tương thích với nhiều dòng vi điều khiển như 8051 - Pic - AVT Kết nối cảm biến DHT11 với mạch arduino hoặc node mcu
NỘI DUNG THỰC HIỆN VÀ MÔ HÌNH
Đọc và hiển thị giá trị nhiệt độ và độ ẩm hiển thị màn hình LDC qua cảm biến DHT 11 giao tiếp Arduino Uno R3
3.2 Phần mền cần chuẩn bị
Cài đặt phần mềm arduino IDE
3.3 Phần cứng cần chuẩn bị:
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 (hoặc tương đương)
DHT11 đã được tích hợp trong một mạch duy nhất, bạn chỉ việc nối Dây nguồn (Vcc, GND) và dây tín hiệu (Signal) vào mạch Arduino là xong
Điện áp hoạt động: 3-5.5V DC
Sai số nhiệt độ: ± 2oC
Kết nối cảm biến DHT11 với mạch Arduino
LiquidCrystal_I2C lcd(0x27,16,2); const int DHTPIN = 5;//Chân Out của cảm biến nối chân số 5 Arduino const int DHTTYPE = DHT11; // Khai báo kiểu cảm biến là DHT11
//const int DHTTYPE = DHT22; // DHT 22
//const int DHTTYPE = DHT21; // DHT 21
DHT dht(DHTPIN, DHTTYPE); //Khai báo thư viện chân cảm biến và kiểu cảm biến void setup()
Serial.begin(9600); dht.begin(); //Khởi động cảm biến lcd.init(); //Khởi động LCD lcd.backlight(); //Mở đèn lcd.setCursor(0,0); lcd.print("DO AM:"); lcd.setCursor(0,1); lcd.print("C|F:");
{ float doam = dht.readHumidity(); //Đọc độ ẩm float doC = dht.readTemperature(); //Đọc nhiệt độ C float doF = dht.readTemperature(true); //Đọc nhiệt độ F
// Kiểm tra cảm biến có hoạt động hay không if (isnan(doam) || isnan(doC) || isnan(doF))
Serial.println("Không có giá trị trả về từ cảm biến DHT"); return;
Serial.print(doam); lcd.setCursor(7,0); //con trỏ vị trí số 7, hiện ô số 8 lcd.print(doam); lcd.setCursor(12,0); //Con trở ở vị trí 12, hiện ô 13 lcd.print("%");
Serial.println("°F"); lcd.setCursor(5,1); lcd.print(doC); lcd.setCursor(10,1); lcd.print("|"); lcd.setCursor(11,1); lcd.print(doF);
Màn hình LCD Hiển thị giá trị nhiệt độ và độ ẩm trong căn phòng
NỘI DUNG THỰC HIỆN VÀ MÔ HÌNH
Mục tiêu
Đọc và hiển thị giá trị nhiệt độ và độ ẩm hiển thị màn hình LDC qua cảm biến DHT 11 giao tiếp Arduino Uno R3
3.2 Phần mền cần chuẩn bị
Cài đặt phần mềm arduino IDE
3.3 Phần cứng cần chuẩn bị:
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 (hoặc tương đương)
DHT11 đã được tích hợp trong một mạch duy nhất, bạn chỉ việc nối Dây nguồn (Vcc, GND) và dây tín hiệu (Signal) vào mạch Arduino là xong
Điện áp hoạt động: 3-5.5V DC
Sai số nhiệt độ: ± 2oC
Kết nối cảm biến DHT11 với mạch Arduino
LiquidCrystal_I2C lcd(0x27,16,2); const int DHTPIN = 5;//Chân Out của cảm biến nối chân số 5 Arduino const int DHTTYPE = DHT11; // Khai báo kiểu cảm biến là DHT11
//const int DHTTYPE = DHT22; // DHT 22
//const int DHTTYPE = DHT21; // DHT 21
DHT dht(DHTPIN, DHTTYPE); //Khai báo thư viện chân cảm biến và kiểu cảm biến void setup()
Serial.begin(9600); dht.begin(); //Khởi động cảm biến lcd.init(); //Khởi động LCD lcd.backlight(); //Mở đèn lcd.setCursor(0,0); lcd.print("DO AM:"); lcd.setCursor(0,1); lcd.print("C|F:");
{ float doam = dht.readHumidity(); //Đọc độ ẩm float doC = dht.readTemperature(); //Đọc nhiệt độ C float doF = dht.readTemperature(true); //Đọc nhiệt độ F
// Kiểm tra cảm biến có hoạt động hay không if (isnan(doam) || isnan(doC) || isnan(doF))
Serial.println("Không có giá trị trả về từ cảm biến DHT"); return;
Serial.print(doam); lcd.setCursor(7,0); //con trỏ vị trí số 7, hiện ô số 8 lcd.print(doam); lcd.setCursor(12,0); //Con trở ở vị trí 12, hiện ô 13 lcd.print("%");
Serial.println("°F"); lcd.setCursor(5,1); lcd.print(doC); lcd.setCursor(10,1); lcd.print("|"); lcd.setCursor(11,1); lcd.print(doF);
Màn hình LCD Hiển thị giá trị nhiệt độ và độ ẩm trong căn phòng
Phần cứng cần chuẩn bị
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 (hoặc tương đương)
DHT11 đã được tích hợp trong một mạch duy nhất, bạn chỉ việc nối Dây nguồn (Vcc, GND) và dây tín hiệu (Signal) vào mạch Arduino là xong
Điện áp hoạt động: 3-5.5V DC
Sai số nhiệt độ: ± 2oC
Lắp mạch nguyên lý
Kết nối cảm biến DHT11 với mạch Arduino
Code chương trình
LiquidCrystal_I2C lcd(0x27,16,2); const int DHTPIN = 5;//Chân Out của cảm biến nối chân số 5 Arduino const int DHTTYPE = DHT11; // Khai báo kiểu cảm biến là DHT11
//const int DHTTYPE = DHT22; // DHT 22
//const int DHTTYPE = DHT21; // DHT 21
DHT dht(DHTPIN, DHTTYPE); //Khai báo thư viện chân cảm biến và kiểu cảm biến void setup()
Serial.begin(9600); dht.begin(); //Khởi động cảm biến lcd.init(); //Khởi động LCD lcd.backlight(); //Mở đèn lcd.setCursor(0,0); lcd.print("DO AM:"); lcd.setCursor(0,1); lcd.print("C|F:");
{ float doam = dht.readHumidity(); //Đọc độ ẩm float doC = dht.readTemperature(); //Đọc nhiệt độ C float doF = dht.readTemperature(true); //Đọc nhiệt độ F
// Kiểm tra cảm biến có hoạt động hay không if (isnan(doam) || isnan(doC) || isnan(doF))
Serial.println("Không có giá trị trả về từ cảm biến DHT"); return;
Serial.print(doam); lcd.setCursor(7,0); //con trỏ vị trí số 7, hiện ô số 8 lcd.print(doam); lcd.setCursor(12,0); //Con trở ở vị trí 12, hiện ô 13 lcd.print("%");
Serial.println("°F"); lcd.setCursor(5,1); lcd.print(doC); lcd.setCursor(10,1); lcd.print("|"); lcd.setCursor(11,1); lcd.print(doF);
Màn hình LCD Hiển thị giá trị nhiệt độ và độ ẩm trong căn phòng