光敏传感器arduino实验_光敏传感器实验报告

光敏传感器arduino实验_光敏传感器实验报告使用STM32的HAL库,配置多通道ADC,用DMA采集,算数平均值滤波,把GL5528光敏电阻得到的数据,转为光照度Lux,其中有Matlab计算公式与函数拟合,数据处理。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

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

光敏传感器arduino实验_光敏传感器实验报告

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

 

计算光敏电阻值

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

光敏传感器arduino实验_光敏传感器实验报告

其中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;
    }
  }

Jetbrains全家桶1年46,售后保障稳定

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

光敏传感器arduino实验_光敏传感器实验报告

 

 

从电阻值到光照度

之前已经算出来了光敏电阻的电阻值,并且能够分出光照强度的等级,但是仍然无法计算出光照强度。光照强度是指单位面积上所接受可见光的能量,简称照度,单位勒克斯(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

GL5528

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)这三个点。

光敏传感器arduino实验_光敏传感器实验报告

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

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

拟合过程如图。

光敏传感器arduino实验_光敏传感器实验报告

 

 

编写代码算出光照度

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

光敏传感器arduino实验_光敏传感器实验报告

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

  //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的值。

光敏传感器arduino实验_光敏传感器实验报告

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

光敏传感器arduino实验_光敏传感器实验报告

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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/213659.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • HashMap扩容流程[通俗易懂]

    HashMap扩容流程[通俗易懂]文章目录为什么扩容?什么时候扩容?如何扩容?今天在和同时讨论HashMap的时候,提到了扩容和冲哈希的事情,然后我发现大家都是一种半懂不懂的状态。于是回去做了一番功课,写下这篇文章。HashMap的扩容,又被很多人叫rehash、重哈希,我本人是很反对这个叫法的,事实上HashMap扩容的时候,Node中存储的Key的hash值并没有发生变化,只是Node的位置发生了变化。首先说为什么需要扩…

    2022年9月15日
    0
  • Pycharm控制台乱码问题[通俗易懂]

    Pycharm控制台乱码问题[通俗易懂]Pycharm控制台出现乱码的解决方法

    2022年8月28日
    0
  • wptx64能卸载吗_Win10自带应用卸载教程(本人亲测)

    wptx64能卸载吗_Win10自带应用卸载教程(本人亲测)使用win10有一段时间了,其中也用过诸如腾讯电脑管家、软媒魔方等工具对开机启动项进行过优化,多数时候都没出现问题,但最近几次优化使系统出现了各种问题。现在来总结一下,win10的那些服务项目不能动,不能禁止开机启动,不能关闭后台驻留。CoreMessaging:重要进程,关键系统进程,禁用后无法进入系统,ctrl+alt+del键都无效;TaskScheduler:windows系统任务调度程序…

    2022年5月2日
    169
  • 在一台2010年的老电脑上安装黑群辉dsm5.2并完成外网访问与洗白操作

    在一台2010年的老电脑上安装黑群辉dsm5.2并完成外网访问与洗白操作背景我和媳妇的手机容量都快要满了,主要是手机存储了大量的照片和视频,所以考虑个解决方案给手机瘦身。方案要满足一下几个要求:1、数据非常重要,一定要保证数据的可靠性;2、自动完成照片的比较,然后上传;3、照片需要满足随时、随地查看;4、保证数据的安全及私密性,最好不使用公共网盘服务(怕开发商做恶)5、总投入费用不超过300块钱。方案对比方案1(最优雅):使用手机厂商自带的云存储服务,以appleicloud为例,50G的存储已经不够用了,需要升级到200G的方案,一个月就是21块钱,一年是252

    2022年6月12日
    52
  • Pycharm 2021年激活码【注册码】

    Pycharm 2021年激活码【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    70
  • 太极 免ROOT使用Xposed模块

    太极 免ROOT使用Xposed模块太极免ROOT使用Xposed模块什么是太极?能干什么?我这里就不说了,大家可以去关注虚拟框架公众号去了解一下,我这里只是讲解怎么用。一,下载太极最新版太极下载畅玩微信模块下载其他模块都可以在虚拟框架公众号中下载二,添加应用打开太极可以看到太极内核已激活,说明可以正常使用。点击右下角按钮展开可以看到创建应用,模块管理,下载模块,…

    2022年6月4日
    602

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号