Giao tiếp với cảm biến ánh sáng BH1750.

01. Giao tiếp với cảm biến ánh sáng BH1750.

  1. LÝ THUYẾT.
  2. Với BH1750 chúng ta có thể tạo được nhiều ứng dụng tiện lợi trong đời sống như bật tắt đèn ngoài sân khi trời tối, ứng dụng bật đèn cho nông nghiệp… , là ic dùng trong điện thoại, tivi. So với quang trở(điện trở thay đổi theo ánh sáng) thì BH1750 có độ chính xác và dải đo rộng hơn, tuy nhiên quá trình đo đạc cũng phức tạp hơn.

    BH1750 dùng chuẩn giao tiếp I2C, dải đo từ 1 – 65535 lux. Lux là đơn vị đo ánh sáng. Dành cho những bạn chưa biết về đơn vị lux : https://vi.wikipedia.org/wiki/Lux

    Một số tính năng của IC:

    • Giao tiếp bằng chuẩn I2C.
    • Dải quang phổ gần với tần số mắt người nhìn thấy.
    • Tín hiệu đầu ra là tín hiệu số.
    • Thang đo từ 1 – 65535 lux.
    • Mức độ tiêu thụ điện năng thấp.
    • Lọc nhiễu trong dải tần 50 – 60 Hz.
    • Mức logic giao tiếp có thể đến 1.8V.
    • Không cần các thiết bị bên ngoài để hỗ trợ chạy Ic như thạch anh …
    • Có thể tương thích với nhiều nguồn sáng như mặt trời, đèn led trắng, đèn halogen…
    • Có thể thay đổi địa chỉ giao tiếp(địa chỉ I2C).
    • Có thể config để đọc được giá trị nhỏ nhất là 0.23 lux.
    • Sai số nhỏ (20%).
    • Ảnh hưởng của tia hồng ngoại đến việc đo lường là nhỏ.

    Nếu bạn dùng module GY-30 BH1750 thì một số thông số đầu vào như sau:

    • VCC : chân cấp nguồn, điện áp đầu vào từ khoảng 3.3 -> 6VDC.
    • ADD: chân này là chân thay đổi địa chỉ nếu cần thiết, default nó sẽ là mức thấp: địa chỉ I2C sẽ là 0x23, nếu ở mức cao sẽ là 0x5C.
    • SCL : chân clock của giao tiếp I2C.
    • SDA: chân Data của giao tiếp I2C.
    • GND: chân nối mass của module.

    Một số command thông dụng khi giao tiếp với IC:

    • Power down(0x00) : Set IC ở chế độ không hoạt động.
    • Power on(0x01) : Set IC ở chế độ hoạt động.
    • Reset(0x07) : Reset giá trị các thanh ghi của IC. Command này không hoạt động khi IC ở mode Power down.
    • Continuously H-Resolution Mode(0x10): Cài đặt IC ở chế độ đo liên tục với độ phân giải là 1 lux. Thời gian đo cập nhật giá trị trung bình sẽ là 120ms.
    • Continuously H-Resolution Mode2(0x11): Cài đặt IC ở chế độ đo liên tục với độ phân giải là 0.5 lux. Thời gian đo cập nhật giá trị trung bình sẽ là 120ms.
    • Continuously L-Resolution Mode(0x13): Cài đặt IC ở chế độ đo liên tục với độ phân giải là 4 lux. Thời gian đo cập nhật giá trị trung bình sẽ là 16ms.
    • One Time H-Resolution Mode(0x20): Cài đặt IC ở chế độ đo 1 lần với độ phân giải là 0.5 lux, thời gian đo cập nhật giá trị trung bình sẽ là 120ms. Sau khi cập nhật giá trị IC sẽ chuyển sang power down, muốn đo lại thì chúng ta phải gửi command power on để tiếp tục.
    • One Time H-Resolution Mode2(0x21): Cài đặt IC ở chế độ đo 1 lần với độ phân giải là 0.5 lux, thời gian đo cập nhật giá trị trung bình sẽ là 120ms. Sau khi cập nhật giá trị IC sẽ chuyển sang power down, muốn đo lại thì chúng ta phải gửi command power on để tiếp tục.
    • One Time L-Resolution Mode(0x23): Cài đặt IC ở chế độ đo 1 lần với độ phân giải là 4 lux, thời gian đo cập nhật giá trị trung bình sẽ là 16ms. Sau khi cập nhật giá trị IC sẽ chuyển sang power down, muốn đo lại thì chúng ta phải gửi command power on để tiếp tục.
    • Change Measurement time(01000_MT[7,6,5], 011_MT[4,3,2,1,0]): Thay đổi độ phân giải trong quá trình đo lường, muốn tăng độ chính xác thì thời gian đo sẽ chậm hơn và ngược lại.

    Note : Nhà sản xuất khuyến cáo chúng ta nên sử dụng mode H-resolution Mode, Với những môi trường tối chúng ta có thể sử dụng H-resolution Mode2 thay cho H-resolution Mode hoặc có thể thay đổi độ phân giải để đo được các giá trị nhỏ hơn.

    Cách tính toán giá trị đo lường. Với H-resolution Mode và thanh ghi độ phân giải có giá trị mặc định.

    Output = Value_Read/1.2/Mode.

    • Output là giá trị của độ sáng đơn vị là lux.
    • Value_Read : là giá trị đọc ra từ command read, giá trị này có 16 bit.
    • 1.2 là hệ số mặc định trong datasheet.
    • Mode: với H-resolution Mode2 thì Mode = 0.5 còn H-resolution Mode thì Mode = 1.
  3. Code với MX cube.
  4. Lưu đồ giải thuật:

    Call function reset -> Set sensitive with default value(MTreg) -> Set mode sensor -> read and process data.

    Sơ đồ kết nối.

    1. Cấu hình dung Mx Cube:
      • Cấu hình xung clock:
      • Cấu hình chân debug.
      • Cấu hình I2C.
      • Cấu hình clock hệ thống.
      • Cấu hình và generate code.
    2. Modify code generate:
      • Copy file thư viện là bh1750.h và main.h từ thư mục download vào project mà các bạn vừa generate ra, tương tự với file bh1750.c và main.c. Link download mình sẽ để ở dưới.
      • Thêm file thư viện bh1750.c trước khi build.
      • Build code.
      • Download Firmware.
      • Debug to view change.
    3. Note:
      • Để debug, các bạn cần có mạnh nạp có chức năng debug và đã được cài driver để máy tính nhận được mạch nạp này.
      • Ở trên mình sử dụng MCU là STM32F103C8T6, khi sử dụng các loại MCU khác thì cần chú ý các define, import, các chân chức năng…
      • Chú ý chọn reset and run trong chế độ config mạch nạp + chọn đúng loại mạch nạp.
      • Ở đây mình chỉ hướng dẫn cách lấy data, tùy vào ứng dụng khác nhau mà các bạn có thể sử dụng linh hoạt.
      • Source code gốc mình lấy từ github và có chỉnh sửa. Link source code gốc : https://github.com/lamik/Light_Sensors_STM32.
      • Ở đây mình chỉ hướng dẫn một số bước để lấy thư viện và thực thi code, để hiểu rõ hơn về cảm biến và cách thức xử lí các bạn cần đọc hiểu datasheet đồng đời debug thêm trong code, chúc các bạn thành công. Nếu có thắc mắc gì các bạn cứ để comment mình sẽ trả lời nhanh nhất trong thời gian có thể.
  5. Một số link tham khảo.
    1. Một số link mua hàng các bạn có thể tham khảo.
    2. Link 1 Link 2 Link 3 Link 4
    3. Link download tài liệu.
    4. Link datasheet Link manual Link thư viện cảm biến