极客秀
搜索

基于STM32的光强计设计与模块化处理

本期均是利用模块和开发板,想要源码的朋友可以在主页查看联系方式源码均会上传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;}
1.转载请保留原文链接谢谢!
2.本站所有资源文章出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。
3.本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户擦亮眼睛自行鉴别,做一个有主见和判断力的用户。
4.本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。
5.联系方式(#替换成@):pm#vimge.com

  相关内容