这个芯片还是挺好用的,我当时学iic通信,就是用这个芯片,亮度递增时,唯一奇怪的地方就是返回值从0lux增加到211lux左右就会归零,再开始从0lux开始递增,后来发现应该是和iic的函数有关,
不同人写的iic函数实现效果可能会有不同,用普中的iic函数可能会出现读取不了bh1750的问题(读字节函数那个地方电平没有拉低,我也找过其他人写的iic函数,有些也是有拉低,有些也是没有拉低的,这对于Bh1750是致命的,但对于eeprom的使用却似乎没有问题)。
中文摘要
基于BH1750FVI环境光传感器以及STM32G030F6P6微控制器的照度计制作。
Abstract
DIY a luxmeter using BH1750FVI ambient light sensor & STM32G030F6P6 microcontroller.
一、概述
去年读到虎哥文章《关于大幅提高室内照明亮度的设想》(https://www.kechuang.org/t/86169),并阅读一些相关文献后,我开始重视室内照明亮度。原先家中客厅使用72W的LED吊顶灯,主观感觉并不亮,于是更换为180W的LED灯,卧室、书房照明灯功率均加大到原先一倍以上,个人感觉可以较好满足日常需求。但升入高中后,感觉教室及宿舍照明亮度均较暗,加上同学们喜欢拉窗帘上课,于是有了购买/制作一个照度计的想法。但逛了一圈淘宝后,发现稍微像样的照度计都要100+,于是决定自己制作。年后有了一些空闲时间,遂自制了此照度计。
主要特性:
-量程0~65535lux;
-光谱响应与人眼近似(光谱响应曲线见附图1);
-0.96寸160*80 LCD显示屏,根据环境光亮度自动调节背光亮度;
-尺寸小(30*50*12mm),便于携带;
-250mAh锂聚合物电池,续航时间可达25h(最低背光亮度下),USB充电。
二、元器件介绍
此照度计核心元件为BH1750FVI环境光传感器,ADC有效位数16bit,对应0~65535lux照度值,光谱响应限于可见光波段,且与人眼近似。与微控制器采用I2C总线进行通信,驱动十分简单,且无需校准等操作,可直接读出照度值。
微控制器使用STM32G030F6P6。数据显示使用一块0.96" LCD屏幕,驱动IC为ST7735S,使用SPI总线与微控制器通信。
电源部分使用TP4054、SPX3819MX-3.3和锂聚合物电池,USB-Micro接口充电。
三、硬件设计
原理图
(R1实际使用10kΩ,R7、R8实际使用100kΩ,R10实际使用30kΩ)
使用SWD接口进行程序烧录与调试。
PCB Layout图、3D图、实物图
(Layout图中铺铜隐去)
PCB Gerber文件见附件一。
遇到的一些硬件问题
(1)BH1750FVI封装十分诡异,仅能通过封装上极微小的丝印字体辨别安装方向,焊接时需格外注意。
(2)由于忘记购买液晶屏背胶,屏幕临时采用AB胶固定,可靠性较低,以后使用类似设计时应加以注意。
(3)使用的直插式开关引脚对PCB底面有遮挡,被迫选择了更小的电池。
四、程序设计
使用STM32CubeMX生成初始化代码,KEIL μV5编写主要源码,基于STM32 HAL库开发。
大致思路:上电→MCU片上外设初始化→LCD及BH1750FVI初始化、校准ADC→以约8Hz速率循环读取照度值与电池电量值并显示在LCD上,并根据照度值调整背光亮度。
使用BH1750时有一点需要注意:BH1750FVI在默认情况下,输出值/实际照度值 = 1.2,此时量程为0~54612lux。若想要使量程达到0~65535lux,需将传感器MTreg寄存器的值改为0x3A。
LCD背光亮度值(Y,最大值499)与照度(E)的关系函数为$Y=20+2E$。
LCD驱动库文件参考厂商源码移植编写,BH1750FVI驱动库文件参考Datasheet自主编写。
全部源码见附件二。
部分诡异bug与修复措施:
(1)LCD实际显示的颜色与代码相反,修改RGB/BGR控制寄存器无法解决,使用另一块ST7735S驱动的1.8寸屏幕时无此问题。目前暂未修复,恳请了解此问题的大佬不吝赐教,谢谢!
(2)STM32G030硬件SPI在时钟频率高于16MHz时无法正常通信,且本人制作的其他STM32G030作为MCU的项目均如此。修复措施:排查发现GPIO口输出速率设置为“LOW”,改为"VERY HIGH"后可在32MHz下正常通信。
五、实际使用测试
完成制作后,本人用其测量了不同环境下的照度值:
(1)家中客厅桌面照度:约675lux(清晨,吊顶灯(180W LED)打开,自然采光照度约75lux,灯具正下方)。
(2)家中书桌面照度:约1500lux(清晨,吊顶灯关闭,台灯(6W LED)开最高亮度档,自然采光照度约115lux,灯具正下方)。
(3)家中卧室地面照度:约25klux~28klux(正午,灯具关闭,多云)或约47klux~52klux(正午,灯具关闭,晴天)。
和手机照度计APP测量结果基本一致。
开学后会把它拿到学校去测量教室、宿舍等处的照明亮度,并根据测量结果采取相应补充照明措施。(个人估计宿舍地面照明亮度在70~100lux左右,可能低于国家标准)
六、总结
这是我学习STM32后开发的第四个玩具(我的上一篇帖子介绍了第一个,另外两个是参加省科技创新大赛的项目,比赛结束后将开源并详细发布在科创),总的来说此玩具复杂度低,开发顺利且耗时短。开发过程中主要学习了STM32定时器PWM用法、BH1750FVI驱动方法TP4054使用方法以及一些PCB布线技巧。个人感觉有一定收获,虽然大佬们看来应该不算什么
。
附件:
附图:
BH1750FVI光谱响应曲线
-欢迎拍砖、讨论-
-THE END-
[修改于 4 个月前 - 2022-02-19 17:15:29]
这个芯片还是挺好用的,我当时学iic通信,就是用这个芯片,亮度递增时,唯一奇怪的地方就是返回值从0lux增加到211lux左右就会归零,再开始从0lux开始递增,后来发现应该是和iic的函数有关,
不同人写的iic函数实现效果可能会有不同,用普中的iic函数可能会出现读取不了bh1750的问题(读字节函数那个地方电平没有拉低,我也找过其他人写的iic函数,有些也是有拉低,有些也是没有拉低的,这对于Bh1750是致命的,但对于eeprom的使用却似乎没有问题)。
楼主家真亮。我给饭厅换了6只飞利普14W面板灯,才把正下方的饭桌的亮度提高到600Lx。原来使用2只国产面板灯,亮度只有100多Lx,且随着时间的推移越来越暗。而房屋最早原装的是2只国产环形荧光面板灯,估计照度不超过80Lx
但600Lx让所有人开始很不适应,纷纷抱怨亮得刺眼。特别是老年人,还严肃的教育我该亮度有害健康。经过大概一个星期,大家纷纷觉得就是这个亮度好,饭桌变成了读书写字桌。
其它房间由于改造施工太麻烦,只是把原有灯具内的灯泡换成能装进去的最大功率,照度普遍只有50-150Lx(只有一处位于灯下方的桌面接近300Lx)。这个房子是二十年前按照主流标准装修的,不难想象,那个时代的家庭装修,能暗到什么程度。说句缺乏科学依据的话,这代人的眼睛,就是省电省亮度搞坏的,可惜悔之晚矣。
需要注意的是,某宝上买到的国产大功率LED灯具,光谱大多很不好,而且衰减快。经过多次失败教训,现在只好买飞利浦,还得注意买他相对高端的系列,缺点就是贵,国货的三倍以上价格。
楼主可以考虑加个硅光电池测量频闪,或者看看这个照度传感器频率响应能力,直接程序测量频闪。市面上能够测量频闪的照度计很贵,这也是衡量led灯具质量的重要指标之一。至于显色光谱那些测起来成本太高了
STM32G系列,好耶!
可惜不是pin2pin兼容,不过终于解决没货问题了。
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |