树莓派C++开发:如何使用Linux内核中的BH1750驱动支持?
在树莓派C++中使用Linux内核BH1750驱动的方法
一、确认并加载内核驱动
- 先检查BH1750驱动是否已加载:
若无输出,手动加载驱动:lsmod | grep bh1750sudo modprobe bh1750 - 确保树莓派I2C总线已启用:通过
raspi-config的Interfacing Options开启I2C,或编辑/boot/config.txt添加dtparam=i2c_arm=on后重启系统。
二、通过设备树声明BH1750设备
内核需要知道BH1750连接的I2C总线和地址,可通过设备树overlay实现:
- 创建设备树描述文件
bh1750-overlay.dts:
/dts-v1/; /plugin/; / { compatible = "brcm,bcm2835"; fragment@0 { target = <&i2c1>; // 树莓派默认I2C总线为i2c-1(GPIO2/3) __overlay__ { #address-cells = <1>; #size-cells = <0>; bh1750@23 { compatible = "rohm,bh1750"; reg = <0x23>; // BH1750默认地址,ADDR接VCC则改为0x5c }; }; }; };
- 编译overlay文件:
dtc -I dts -O dtb -o bh1750.dtbo bh1750-overlay.dts
- 部署并启用overlay:
编辑sudo cp bh1750.dtbo /boot/overlays//boot/config.txt添加dtoverlay=bh1750,保存后重启系统。
三、通过IIO子系统读取数据
BH1750内核驱动属于IIO子系统,无专属头文件,可直接通过sysfs节点读取数据:
- 查看BH1750对应的IIO设备路径:
输出类似ls /sys/bus/iio/devices/iio:device0,即为目标设备路径。 - 测试读取光照值:
输出数值单位为lux,直接对应环境光照强度。cat /sys/bus/iio/devices/iio:device0/in_illuminance_raw
四、C++代码实现读取
通过标准文件IO读取sysfs节点即可,无需额外依赖:
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { // 替换为你的IIO设备实际路径 const string illuminance_path = "/sys/bus/iio/devices/iio:device0/in_illuminance_raw"; ifstream illuminance_file(illuminance_path); if (!illuminance_file.is_open()) { cerr << "无法访问光照传感器节点" << endl; return 1; } int lux_value; illuminance_file >> lux_value; cout << "当前光照强度: " << lux_value << " lux" << endl; illuminance_file.close(); return 0; }
编译运行:
g++ bh1750_reader.cpp -o bh1750_reader ./bh1750_reader
排查问题
若驱动加载后无法识别设备,可查看内核日志排查:
dmesg | grep bh1750
常见问题包括I2C总线未启用、设备地址配置错误、硬件连接松动等。
内容的提问来源于stack exchange,提问作者jiandingzhe
相关产品推荐
相关产品推荐

