1. 光敏电阻介绍通常,光敏电阻器都制成薄片结构,以便吸收更多的光能。当它受到光的照射时,半导体片(光敏层)内就激发出电子—空穴对,参与导电,使电路中电流增强。为了获得高的灵敏度,光敏电阻的电极常采用梳状图案,它是在一定的掩膜下向光电导薄膜上蒸镀金或铟等金属形的。用来检测有没有遮挡,比如门前有没有人来。
2. 板上资源
环境监测板上有一块光敏电阻,实物图和原理图如下图所示。
3. 代码逻辑
当光敏电阻被遮挡住时电阻变小,原理图中的Q2和Q4不导通,因此输出电位为5V高电平。
- /* get gpio5 Voltage */
- void GetGpio5Voltage(const char *param)
- {
- unsigned short data = 0;
- unsigned short vlt = 0;
- float voltage;
- float vltMax = 0;
- float vltMin = VLT_MIN;
- hi_unref_param(param);
- memset_s(g_gpio5AdcBuf, sizeof(g_gpio5AdcBuf), 0x0, sizeof(g_gpio5AdcBuf));
- for (int i = 0; i < ADC_TEST_LENGTH; i++) {
- // ADC_Channal_2 自动识别模式 CNcomment:4次平均算法模式 CNend
- unsigned int ret = AdcRead(IOT_ADC_CHANNEL_2, &data,
- IOT_ADC_EQU_MODEL_4, IOT_ADC_CUR_BAIS_DEFAULT, 0xF0);
- if (ret != HI_ERR_SUCCESS) {
- printf("ADC Read Failn");
- return HI_NULL;
- }
- g_gpio5AdcBuf[i] = data;
- }
- for (int i = 0; i < ADC_TEST_LENGTH; i++) {
- vlt = g_gpio5AdcBuf[i];
- voltage = (float)vlt * VOLTAGE_1_8_V *
- VOLTAGE_4_TIMES / ADC_CHANNAL_RANGE; /* vlt * 1.8* 4 / 4096.0为将码字转换为电压 */
- vltMax = (voltage > vltMax) ? voltage : vltMax;
- vltMin = (voltage < vltMin) ? voltage : vltMin;
- }
- if (vltMax > VOLTAGE_0_6_V && vltMax < VOLTAGE_1_V) { /* 电压最大值大于0.6小于1.0 */
- GpioKey1IsrFuncMode();
- } else if (vltMax > VOLTAGE_1_V && vltMax < VOLTAGE_1_5_V) { /* 电压最大值大于1.0小于1.5 */
- GpioKey2IsrFuncType();
- } else if (vltMax < VOLTAGE_0_6_V) { /* 电压最大值小于0.6 */
- printf("gpio9_led_light:vltMax=%0.2f, vltMin=%0.2frn", vltMax, vltMin);
- Gpio9LedLightFunc();
- }
- printf("key_5:vltMax=%0.2f, vltMin=%0.2frn", vltMax, vltMin);
- }
复制代码其中调用了AdcRead方法,定义如下。
- unsigned int AdcRead(IotAdcChannelIndex channel, unsigned const short *data, IotAdcEquModelSel equModel,
- IotAdcCurBais curBais, unsigned const short rstCnt)
- {
- return hi_adc_read((hi_adc_channel_index)channel, (hi_u16*)data, (hi_adc_equ_model_sel)equModel,
- (hi_adc_cur_bais)curBais, (hi_u16)rstCnt);
- }
复制代码
4. 实物演示
当光敏电阻被遮挡了,则led灯熄灭,否则led等亮起。如下视频。