[文章]【HarmonyOS HiSpark Wi-Fi IoT 套件试用连载】通过Ad采样读取光敏传感器结果

阅读量0
0
0
1. 光敏电阻介绍
通常,光敏电阻器都制成薄片结构,以便吸收更多的光能。当它受到光的照射时,半导体片(光敏层)内就激发出电子—空穴对,参与导电,使电路中电流增强。为了获得高的灵敏度,光敏电阻的电极常采用梳状图案,它是在一定的掩膜下向光电导薄膜上蒸镀金或铟等金属形的。用来检测有没有遮挡,比如门前有没有人来。
2. 板上资源

环境监测板上有一块光敏电阻,实物图和原理图如下图所示。
20220625165048.png
20220625165419.jpg
3. 代码逻辑
当光敏电阻被遮挡住时电阻变小,原理图中的Q2和Q4不导通,因此输出电位为5V高电平。
  1. /* get gpio5 Voltage */
  2. void GetGpio5Voltage(const char *param)
  3. {
  4.     unsigned short data = 0;
  5.     unsigned short vlt = 0;
  6.     float voltage;
  7.     float vltMax = 0;
  8.     float vltMin = VLT_MIN;

  9.     hi_unref_param(param);
  10.     memset_s(g_gpio5AdcBuf, sizeof(g_gpio5AdcBuf), 0x0, sizeof(g_gpio5AdcBuf));
  11.     for (int i = 0; i < ADC_TEST_LENGTH; i++) {
  12.         // ADC_Channal_2  自动识别模式  CNcomment:4次平均算法模式 CNend
  13.         unsigned int ret = AdcRead(IOT_ADC_CHANNEL_2, &data,
  14.                                    IOT_ADC_EQU_MODEL_4, IOT_ADC_CUR_BAIS_DEFAULT, 0xF0);
  15.         if (ret != HI_ERR_SUCCESS) {
  16.             printf("ADC Read Failn");
  17.             return  HI_NULL;
  18.         }
  19.         g_gpio5AdcBuf[i] = data;
  20.     }

  21.     for (int i = 0; i < ADC_TEST_LENGTH; i++) {
  22.         vlt = g_gpio5AdcBuf[i];
  23.         voltage = (float)vlt * VOLTAGE_1_8_V *
  24.             VOLTAGE_4_TIMES / ADC_CHANNAL_RANGE; /* vlt * 1.8* 4 / 4096.0为将码字转换为电压 */
  25.         vltMax = (voltage > vltMax) ? voltage : vltMax;
  26.         vltMin = (voltage < vltMin) ? voltage : vltMin;
  27.     }
  28.     if (vltMax > VOLTAGE_0_6_V && vltMax < VOLTAGE_1_V) { /* 电压最大值大于0.6小于1.0 */
  29.         GpioKey1IsrFuncMode();
  30.     } else if (vltMax > VOLTAGE_1_V && vltMax < VOLTAGE_1_5_V) { /* 电压最大值大于1.0小于1.5 */
  31.         GpioKey2IsrFuncType();
  32.     } else if (vltMax < VOLTAGE_0_6_V) { /* 电压最大值小于0.6 */
  33.         printf("gpio9_led_light:vltMax=%0.2f, vltMin=%0.2frn", vltMax, vltMin);
  34.         Gpio9LedLightFunc();
  35.     }
  36.     printf("key_5:vltMax=%0.2f, vltMin=%0.2frn", vltMax, vltMin);
  37. }
复制代码
其中调用了AdcRead方法,定义如下。
  1. unsigned int AdcRead(IotAdcChannelIndex channel, unsigned const short *data, IotAdcEquModelSel equModel,
  2.     IotAdcCurBais curBais, unsigned const short rstCnt)
  3. {
  4.     return hi_adc_read((hi_adc_channel_index)channel, (hi_u16*)data, (hi_adc_equ_model_sel)equModel,
  5.         (hi_adc_cur_bais)curBais, (hi_u16)rstCnt);
  6. }
复制代码

4. 实物演示
当光敏电阻被遮挡了,则led灯熄灭,否则led等亮起。如下视频。


回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友