STM3使用光敏传感器计算光照度Lux,而不是仅仅打印个电压值或者电阻值

本文主要是介绍STM3使用光敏传感器计算光照度Lux,而不是仅仅打印个电压值或者电阻值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

19b19058a2f8daf5623e6797ed504255.png点击上方蓝字关注我吧

最近项目中用到了光敏电阻。搜索资料,发现很多人都使用光敏电阻,只是用了AD读取了电压值,或者算出了电阻值,就发送给上位机或者服务器,美其名曰获取了光照度。

33fd6a9263911321c77767a481869231.png

搜索一番,也没找到用光敏电阻计算Lux的方法,于是自己做了一些研究,分享一下。

8870456d81bb5b088b1a32af850c956e.png

bf1711f0fbdd7c1b2b3adbda8bd51332.png

计算光敏电阻值

相信STM32的ADC读者应该会用,教程也一抓一大把,在此不表。接下来先计算电阻值。我的光敏电阻电路图如下:

54596c8c1ff02ec2523e297655babe91.png

其中PA6接单片机AD采集引脚,它最大只能输入3.6V电压,而光敏电阻的供电为5V,所以设计了R1与R2两个分压电阻,确保PA6的电压不超过3.6V。

设光敏电阻的阻值为xΩ,PA6的电压为y,可得以下公式:                     

y/1500=5/(x+2500)

STM32的ADC精度为12位,则最大值为4096。采集到的AD值与电压成线性对应关系,系统中最高的电压值为3.3V的电源电压,它与4096对应。假设PA6感受到的电压y对应的AD值为z,则:

y/z=3.3/4096

联立两式,消去y,得到关于x的表达式:

x=10240000/(1.1×z)-2500

使用ADC得到z以后,就可以根据上式算出光敏电阻的值了。

我的代码使用了DMA获取多通道AD值,并且取100个数据求算数平均值滤波,然后打印电阻值的代码如下:

//main.c  main()while (1){if(DMA_Flag){for(int i=0;i<ADC_CHANNEL_CNT;i++)printf("CH%d value = %d \n",i+2,ADC1_AVG_Buf[i] );uint32_t PhotoResistor = (uint32_t)(10240000/(1.1*ADC1_AVG_Buf[4]) - 2500);//串口打印采样结果printf("The AD value is %d,the PhotoResistor is %d .\r\n",ADC1_AVG_Buf[4],PhotoResistor);printf("The DMA count is %d .\r\n",DMA_CNT);DMA_Flag = 0;}}

现象是能够打印出光敏电阻值。

824f66996f461c7b82cdd9d1f66a6f72.png

d6c1eb7dbfb74c002ff738ed4cccf300.png

1d4083f98eb7801c1ac1f50f3409119b.png

从电阻值到光照度

之前已经算出来了光敏电阻的电阻值,并且能够分出光照强度的等级,但是仍然无法计算出光照强度。光照强度是指单位面积上所接受可见光的能量,简称照度,单位勒克斯(Lux或lx)。常见环境的光照强度值如表

场所/环境

光照强度(lux)

场所/环境

光照强度(lux)

晴天室内

100~1000

办公室/教室

300~500

阴天室内

5~50

餐厅

10~30

月圆夜室外

0.2

距60W台灯60cm

300

精确测量光照强度是比较困难的一件事情,使用简陋的光敏电阻测量光照强度则精度更难以保障。本节的重点是解决问题的思路,如何用较简单的方法获取相对准确的光照度。配套电路板中使用的光敏电阻型号为GL5528,它的主要参数如表

项目

最大电压

最大功耗

环境温度

光谱峰值

10Lux时亮电阻

暗电阻

γ值

上升时间

下降时间

单位

V

mW

nm

0.6

ms

ms

GL25528

500

500

-30~+70

560

10~20

2

0.6

20

30

其中的γ值表示10Lux电阻值与100Lux电阻值的比值的对数。

γ=lg⁡(R10/R100)

将γ=0.6带入,可得R10/R100≈4。即R10=4×R100,对于R10与R1关系仍然成立:R1=4×R10。手册中给出了一个对数坐标系的图,光照强度与Lux的对应关系并非一条直线,而是一个范围。为了简便计算,取范围中稍微靠下的一条直线,直线中包含(1,40),(10,10),(100,2.5)这三个点。

5a50e71c260957e15ce4886b375de20c.png


手册中给出的1到100范围太小了,常用光照度可到达1000Lux,因此要通过现有的关系推算出光照度与电阻值的关系式。虽然看上去光照度与电阻值的对应关系是一条直线,但是要注意坐标系是对数坐标系,不能套用一元一次方程。在MATLAB中拟合,拟合过程如图7-19所示。可得关系式为:

f(x)=(4e+0.4)×x^(-0.6021)

拟合过程如图。

a9b53484444597931ed6a529b2fef893.png

20803959aa478898a973a4afbfd39e72.png

4a17e81d676318769ef632ffc5de976a.png

编写代码算出光照度

在单片机内,用带指数的关系式计算,计算速度会很慢。可以使用查表法,无需计算,只遍历数组得到结果。根据拟合得到的函数,可以推导出Lux从1到1000,各自对应的电阻值,共1000对。观察数据,可以发现在Lux比较大的时候,对应的电阻值过于接近。此处仅要求粗略计算,无需这么多数据。将电阻值的个位数舍去,并删除重复电阻值,可得到281对数据。

6b778f85c0aa4051fca8603cca645e46.png

定义新的结构体数据如下。

//ADC.h
typedef struct
{unsigned short ohm;   //光敏电阻值unsigned short lux;   //流明
}PhotoRes_TypeDef;
//ADC.c
//GL5528光敏电阻的阻值与流明对应的关系
const  PhotoRes_TypeDef GL5528[281]=
{
{40000, 1},{26350, 2},{20640, 3},{17360, 4},{15170, 5},
{13590, 6},{12390, 7},{11430, 8},{10650, 9},{9990, 10},
{9440, 11},{8950, 12},{8530, 13},{8160, 14},{7830, 15},
......
{720, 773},{710, 791},{700, 809},{690, 829},{680, 849},
{670, 869},{660, 891},{650, 914},{640, 937},{630, 961},
{620, 987},
};

当得到电阻值以后,遍历数据,算出光照度,代码如下。

//ADC.c
/*** @brief 通过电阻值算出光照度* @param 光敏电阻值* @retval None*/    
unsigned short GetLux(uint32_t PhotoResistor)
{unsigned short lux = 0;//查表法,根据电阻值得出光照度for(int i = 0 ; i < 281 ; i++){if (PhotoResistor > GL5528[i].ohm){lux = GL5528[i].lux;break;}}return lux;
}

主函数中,打印光照度:

//main.c main() while(1)if(DMA_Flag){unsigned short lux = 0;for(int i=0;i<ADC_CHANNEL_CNT;i++)printf("CH%d value = %d \n",i+2,ADC1_AVG_Buf[i] );uint32_t PhotoResistor = (uint32_t)(10240000/(1.1*ADC1_AVG_Buf[4]) - 2500);//从电阻值计算光照度lux = GetLux(PhotoResistor);//串口打印采样结果printf("The AD value is %d,the PhotoResistor is %d .\r\n",ADC1_AVG_Buf[4],PhotoResistor);printf("The Lux is %d .\r\n",lux);printf("The DMA count is %d .\r\n",DMA_CNT);DMA_Flag = 0;}

下载程序,观察现象,应该看到如图7-19所示的现象,说明算出了Lux的值。

70907383bbdf02290b4286d45b76cc48.png

当然,这个计算结果也不会很精确,毕竟光照度与电阻的关系也不是一一对应的。聊胜于无吧。

d9da4af5d1224e18c0b659bbaddd65e7.png

关注公众号“yummy说电子”,后台回复关键字“光敏电阻”,获取配套源码、拟合数据与MATALAB代码。

别忘了点个在看哦!转发那就太好了!

faf05ace52879bb6449396485097293a.png

这篇关于STM3使用光敏传感器计算光照度Lux,而不是仅仅打印个电压值或者电阻值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/geek_monkey/article/details/128310542
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/239949

相关文章

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

Python验证码识别方式(使用pytesseract库)

《Python验证码识别方式(使用pytesseract库)》:本文主要介绍Python验证码识别方式(使用pytesseract库),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1、安装Tesseract-OCR2、在python中使用3、本地图片识别4、结合playwrigh

Python使用Code2flow将代码转化为流程图的操作教程

《Python使用Code2flow将代码转化为流程图的操作教程》Code2flow是一款开源工具,能够将代码自动转换为流程图,该工具对于代码审查、调试和理解大型代码库非常有用,在这篇博客中,我们将深... 目录引言1nVflRA、为什么选择 Code2flow?2、安装 Code2flow3、基本功能演示

使用vscode搭建pywebview集成vue项目实践

《使用vscode搭建pywebview集成vue项目实践》:本文主要介绍使用vscode搭建pywebview集成vue项目实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录环境准备项目源码下载项目说明调试与生成可执行文件核心代码说明总结本节我们使用pythonpywebv

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

Linux基础命令@grep、wc、管道符的使用详解

《Linux基础命令@grep、wc、管道符的使用详解》:本文主要介绍Linux基础命令@grep、wc、管道符的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录grep概念语法作用演示一演示二演示三,带选项 -nwc概念语法作用wc,不带选项-c,统计字节数-

SpringCloud中的@FeignClient注解使用详解

《SpringCloud中的@FeignClient注解使用详解》在SpringCloud中使用Feign进行服务间的调用时,通常会使用@FeignClient注解来标记Feign客户端接口,这篇文章... 在Spring Cloud中使用Feign进行服务间的调用时,通常会使用@FeignClient注解

MySQL的ALTER TABLE命令的使用解读

《MySQL的ALTERTABLE命令的使用解读》:本文主要介绍MySQL的ALTERTABLE命令的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、查看所建表的编China编程码格式2、修改表的编码格式3、修改列队数据类型4、添加列5、修改列的位置5.1、把列