BH1750 là một cảm biến số cường độ ánh sáng 16 bit. Trong bài viết này, Điện Tử Việt sẽ hướng dẫn các bạn cách giao tiếp giữa cảm biến cường độ ánh sáng BH1750 với Arduino. Cảm biến giao tiếp với vi điều khiển bằng chuẩn giao tiếp I2C.
Qua nội dụng của bài viết, bạn sẽ học cách kết nối cảm biến BH1750 với Arduino, cài đặt các thư viện cần thiết và viết chương trình đơn giản để hiển thị kết quả đo cường độ ánh sáng của cảm biến lên Serial Monitor.
Xem thêm bài viết: Giới thiệu các loại cảm biến và hoạt động của chúng
Giới thiệu cảm biến cường độ ánh sáng BH1750
BH1750 là một IC cảm biến số 16 bit dùng để đo cường độ ánh sáng môi trường xung quanh giao tiếp qua giao thức I2C. IC này là thích hợp nhất để lấy dữ liệu ánh sáng xung quanh để điều chỉnh công suất đèn nền của màn hình LCD và bàn phím của điện thoại di động. Cảm biến có thể đo cường độ ánh sáng trong phạm vi rộng với độ phân giải cao (1 lux – 65535 lux).
Module cảm biến cường độ ánh sáng BH1750 được chế tạo với hình dạng khác nhau. Cả hai module cảm biến bên dưới đều sử dụng cảm biến BH1750.
Thông số cảm biến BH1750
Dưới đây là các thông số kỹ thuật của cảm biến BH1750. Để biết thêm thông tin, hãy tham khảo datasheet của cảm biến BH1750.
- Điện áp hoạt động: 2,4V – 3,6VDC
- Chuẩn giao tiếp: I2C
- Dải đo ánh sáng: 1 – 65535 lx
- Đặc điểm độ nhạy phổ: Độ nhạy cực đại với bước sóng 560nm
- Khả năng phát hiện các nguồn sáng như: đèn sợi đốt, đèn huỳnh quang, đèn LED trắng, đèn huỳnh quang,..
- Kích thước: 2,6 x 2,8 cm
Các chế độ đo
Cảm biến hỗ trợ hai chế độ đo khác nhau: chế độ đo liên tục và chế độ đo một lần. Mỗi chế độ hỗ trợ ba chế độ phân giải khác nhau.
Chế độ đo | Thời gian do | Độ phân giải |
Chế độ độ phân giải thấp | 16 ms | 4 lux |
Chế độ độ phân giải cao | 120 ms | 1 lux |
Chế độ độ phân giải cao 2 | 120 ms | 0,5 lux |
Ở chế độ đo liên tục, cảm biến liên tục đo các giá trị ánh sáng xung quanh. Trong chế độ đo một lần, cảm biến đo giá trị ánh sáng xung quanh một lần, sau đó chuyển sang chế độ tắt nguồn.
Ứng dụng
BH1750 là một cảm biến đo cường độ ánh sáng xung quanh nên nó có thể được sử dụng trong nhiều dự án khác nhau. Ví dụ:
- để phát hiện xem đó là ngày hay đêm;
- để điều chỉnh hoặc bật / tắt độ sáng của đèn LED cho phù hợp với ánh sáng xung quanh;
- để điều chỉnh màn hình LCD và độ sáng của màn hình;
- để phát hiện xem đèn LED có sáng không;
- …
Sơ đồ chân của BH1750
Bảng bên dưới mô tả chứng năng các chân của cảm biến BH1750:
VCC | Điện áp cung cấp (3,3V hay 5V) |
GND | Chân nối đất |
SCL (Clock) | Chân SCL cho giao tiếp I2C |
SDA (Data) | Chân SDA cho tiao tiếp I2C |
ADDR | Chọn địa chỉ |
Chân ADDR được sử dụng để đặt địa chỉ cảm biến I2C. Nếu điện áp trên chân này nhỏ hơn 0,7xVCC (chân này để thả nổi hoặc được nối với GND), địa chỉ I2C là 0x23. Nhưng, nếu điện áp cao hơn 0,7xVCC (chân được kết nối với VCC), địa chỉ là 0x5C. Tóm tắt:
- Chân ADDR thả nổi hoặc kết nối với GND → địa chỉ: 0x23
- Chân ADDR kết nối với VCC → địa chỉ: 0x5C
Giao tiếp cảm biến BH1750 với Arduino
Cảm biến cường độ ánh sáng BH1750 hỗ trợ giao tiếp I2C.
Bạn có thể kết nối cảm biến BH1750 với Arduino bằng các chân I2C mặc định. Bảng mô tả kết nối cảm biến với Arduino dưới đây là dành cho Arduino UNO, nếu bạn đang sử dụng Arduino phiên bản khác, hãy kiểm tra các chân I2C để đảm bảo việc kết nối được chính xác:
BH1750 | Arduino Uno |
SCL | A5 |
SDA | A4 |
Đo cường độ ánh sáng dùng cảm biến BH1750 và Arduino
Bây giờ bạn đã quen thuộc hơn với cảm biến BH1750, hãy cùng làm mạch ứng dụng để hiểu rõ hơn về loại cảm biến này. Trong phần này, chúng ta sẽ xây dựng một dự án đơn giản đo cường độ ánh sáng xung quanh và hiển thị kết quả đo lên Serial Monitor trong Arduino IDE.
Linh kiện cần thiết
Để hoàn tất được phần hướng dẫn này, bạn cần sử dụng các linh kiện sau đây:
- Cảm biến cường độ ánh sáng BH1750
- Arduino Uno
- Breadboard (tùy chọn)
- Dây cắm breadboard
Sơ đồ kết nối BH1750 với Arduino
Nối các chân của cảm biến BH1750 vào các chân Arduino Uno như sơ đồ mạch bên dưới.
Bạn có thể xem bảng mô tả kết nối dưới đây:
BH1750 | Arduino |
VCC | 5V |
GND | GND |
SCL (Clock) | A5 |
SDA (Data) | A4 |
ADDR | Không kết nối |
Chân ADDR không được kết nối, tức là chúng ta đang chọn địa chỉ I2C 0x23. Kết nối chân này với 3,3V sẽ chọn địa chỉ 0x5C.
Cài đặt thư viện BH1750
Có một số thư viện được dùng để đọc cường độ ánh sáng từ cảm biến BH1750. Chúng ta sẽ sử dụng thư viện BH1750 của Christopher Laws. Thư viện này tương thích với ESP32, ESP8266 và Arduino.
Mở phần mềm Arduino IDE và chọn menu Sketch >> Include Library > Manage Libraries. Cửa sổ Library Manager sẽ mở ra.
Bạn nhập từ khóa “BH1750” vào hộp tìm kiếm, sau đó chọn Install để cài đặt thư viện này.
Chương trình
Bạn hãy copy đoạn code bên dưới vào phần mềm IDE Arduino. Chương trình này chỉ đơn giản là đọc ánh sáng xung quanh theo lux và hiển thị các giá trị trên Serial Monitor. Đây là chương trình kiểm tra cảm biến có tên BH1750test (bạn có thể mở file bằng cách vào trong File > Examples > BH1750 > BH1750test).
/*
Example of BH1750 library usage.
This example initialises the BH1750 object using the default high resolution
continuous mode and then makes a light level reading every second.
Connections
– VCC to 3V3 or 5V
– GND to GND
– SCL to SCL (A5 on Arduino Uno, Leonardo, etc or 21 on Mega and Due, on
esp8266 free selectable)
– SDA to SDA (A4 on Arduino Uno, Leonardo, etc or 20 on Mega and Due, on
esp8266 free selectable)
– ADD to (not connected) or GND
ADD pin is used to set sensor I2C address. If it has voltage greater or equal
to 0.7VCC voltage (e.g. you’ve connected it to VCC) the sensor address will be
0x5C. In other case (if ADD voltage less than 0.7 * VCC) the sensor address
will be 0x23 (by default).
*/
#include <BH1750.h>
#include <Wire.h>
BH1750 lightMeter;
void setup() {
Serial.begin(9600);
// Initialize the I2C bus (BH1750 library doesn’t do this automatically)
Wire.begin();
// On esp8266 you can select SCL and SDA pins using Wire.begin(D4, D3);
// For Wemos / Lolin D1 Mini Pro and the Ambient Light shield use
// Wire.begin(D2, D1);
lightMeter.begin();
Serial.println(F(“BH1750 Test begin”));
}
void loop() {
float lux = lightMeter.readLightLevel();
Serial.print(“Light: “);
Serial.print(lux);
Serial.println(” lx”);
delay(1000);
}
Giải thích chương trình
Chúng ta bắt đầu bằng cách khai báo các thư viện cần thiết. Thư viện Wire.h sử dụng cho giao thức truyền thông I2C và thư viện BH1750.h để đọc cường độ ánh sáng từ cảm biến.
#include <Wire.h>
#include <BH1750.h>
Sau đó, chúng ta tạo một đối tượng BH1750 được gọi là lightMeter.
BH1750 lightMeter;
Trong phần setup (), khởi chạy Serial Monitor với tốc độ truyền là 9600.
Serial.begin (9600);
Khởi tạo giao thức truyền thông I2C. Cảm biến sẽ giao tiếp theo chuẩn I2C với các chân I2C mặc định của vi điều khiển. Nếu bạn muốn sử dụng các chân I2C khác nhau, hãy chuyển chúng sang phương thức begin () như Wire.begin (SDA, SCL) này.
Wire.begin ();
Khởi tạo cảm biến bằng phương thức begin () trên đối tượng BH1750 (lightMeter).
lightMeter.begin ();
Trong phần loop (), chúng ta tạo một biến gọi là lux, để lưu các giá trị độ sáng. Để lấy giá trị, bạn chỉ cần gọi hàm readLightLevel () trên đối tượng BH1750 (lightMeter).
float lux = lightMeter.readLightLevel ();
Cuối cùng, hiển thị kết quả đo trên Serial Monitor.
Serial.print (“Light:”);
Serial.print (lux);
Serial.println (“lx”);
Cảm biến đo và hiện thị kết quả sau mỗi giây.
delay(1000);
Bây giờ, bạn có thể nạp chương trình vào board Arduino. Đầu tiên, kết nối board Arduino với máy tính của bạn. Sau đó, chọn menu Tools >> Board và chọn loại board Arduino mà bạn đang sử dụng. Chọn Tools >> Port và chọn cổng COM mà board Arduino của bạn được kết nối. Cuối cùng, bấm vào nút Upload để nạp chương trình.
Sau khi nạp chương trình thành công, hãy mở Serial Monitor với tốc độ truyền là 9600.
Kết quả đọc độ sáng sẽ được hiện thị trên Serial Monitor.
Lời kết
Qua nội dung của bài viết này, các bạn đã học được cách giao tiếp giữa cảm biến ánh sáng xung quanh BH1750 với Arduino Uno. Cảm biến này rất dễ sử dụng. Nó sử dụng giao thức truyền thông I2C, giúp việc đi dây trở nên đơn giản và thư viện cung cấp các phương pháp để dễ dàng nhận được các kết quả đọc.
Tôi hy vọng bạn thấy hướng dẫn này hữu ích. Hãy cho tôi biết trong phần bình luận bên dưới, bạn sẽ sử dụng cảm biến BH1750 vào trong dự án nào nhé.