本期均是利用模块和开发板,想要源码的朋友可以在主页查看联系方式源码均会上传QQ交流群。
前段时间利用STM32设计了一款光强计,其传感器为TI公司的OPT3001,并且自己制版已经各方面试验成功了。
但是可惜的是OPT3001并没有便宜的集成好的模块。
我很tm难以想象,一块成本一元多的芯片,几毛钱的外部电路,居然标价几十块钱。
不过我们可以寻找其他的光照传感器模块来替代,而(淘宝中)最常见的光强传感器可能要属BH1750这一类传感器了
其低廉的价格与足够的性能完全能满足我们的测量需求。 于是我们可以采用BH1750以模块的形式+开发板实现光强计的目的。
当然在此之前我还有一个光敏电阻的方案,不过由于假期没带走,所以也就不展示了。
BH1750的驱动代码及其简单,底层驱动采用STM32的硬件I2C只需要向BH1750写入上电命令即可。
#define BH1750_Addr 0x46
// BH1750指令#define POWER_OFF 0x00#define POWER_ON 0x01#define MODULE_RESET 0x07#define CONTINUE_H_MODE 0x10#define CONTINUE_H_MODE2 0x11#define CONTINUE_L_MODE 0x13#define ONE_TIME_H_MODE 0x20#define ONE_TIME_H_MODE2 0x21#define ONE_TIME_L_MODE 0x23
void BH1750_Init(void) { uint8_t cmd;
// 发送开机命令 cmd = POWER_ON; HAL_I2C_Master_Transmit(&hi2c1, BH1750_Addr, &cmd, 1, HAL_MAX_DELAY);
// 发送重置命令 cmd = RESET; HAL_I2C_Master_Transmit(&hi2c1, BH1750_Addr, &cmd, 1, HAL_MAX_DELAY);}
之后只需要直接读取光强数据,将数据转换为光强即可。
uint16_t BH1750_ReadLightIntensity(void) { uint8_t cmd = 0x10; // 连续高分辨率模式 uint16_t lux; // 发送启动测量命令 HAL_I2C_Master_Transmit(&hi2c1, BH1750_Addr, &cmd, 1, HAL_MAX_DELAY);
// 延迟以确保测量完成(根据模式不同需要不同的延迟时间) HAL_Delay(180); // 180ms 适用于高分辨率模式
// 读取测量结果(两个字节) HAL_I2C_Master_Receive(&hi2c1, BH1750_Addr, buffer, 2, HAL_MAX_DELAY);
// 将两个字节合成为一个16位的值 lux = (buffer[0] << 8) | buffer[1];
// 转换为实际的光强度值(1 lx = 1/1.2 lx) lux = lux / 1.2;
return lux;}