韦东山hal库 使用光敏传感器控制蜂鸣器
光敏传感器和蜂鸣器原理图
光敏电阻

它的原理图为:

LM393 是比较器,它的“+”极接到光敏电阻,“-”极接到可调电阻。当“+”极的电压大于“-”极的电压时,DO 输出高电平,LED 被熄灭;当“+”极的电压小于“-”极的电压时,DO 输出低电平,LED 被点亮。
调整可调电阻,就是调整“-”极的电压,也就是调整比较器的参考电压。
当光照比较强烈时,光敏电阻阻值下降,“+”极电压下降低于“-”极电压时,DO 输出低电平,LED 被点亮。
当光照比较弱时,光敏电阻阻值上升,“+”极电压上升高于“-”极电压时,DO 输出高电平,LED 被熄灭。

有源蜂鸣器
有源蜂鸣器样子如下:

目标
当比较暗的时候,点亮 LED、发出声音。
源文件:
https://wwyz.lanzoul.com/ivX7O2f7lk5g
代码分析
韦东山, 蜂鸣器和光敏电阻器件结合调试思路。
我们定义功能,
手遮挡器件, 然后触发 蜂鸣器响, 小灯亮
我们首先了解光敏电阻, 光照强度强, 电阻变小, V+ < V-(我理解是电压引入地下) , 所以输出电平变成了, 低电平
光照强度强, 电阻变小, V+ > V-(我理解是电压被电阻挡着了) , 所以输出电平变成了, 高电平
所以, 触发开关, 就是光照强度低, 端口输出 高电平
光敏电阻:
高电平 = 开
低电平 = 关
/**************************************************
函数名: static int isDark(void);
功 能: 当手遮挡的时候, 触发开关,
光照强度强(手没有遮挡): 低电平 (电阻阻值下降, 正极的电压导入了地下, 所以 + 下降, -上升, 所以低电平)
光照强度弱(手遮挡): do, 高电平 (电阻阻值升高, 正极的电压被阻挡, 所以 + > - , 电压上升, 高电平)
参 数:
返回值:
**************************************************/
static int isDark(void)
{
return (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_11) == GPIO_PIN_SET);
}
然后我们通过判断这个电平, 来控制 蜂鸣器
if(触发/高电平/遮挡)
{
//开小灯
//小灯根据插得方式, 进行控制电平, 同时也要考虑, 初始的时候, 电平是高电平, 还是低电平, 记得, 咱们想要的逻辑吻合
//比如平时, 想要让led灭, 手遮挡时候, 亮, 然后小灯, 正极是电源, 负极是io口, 那么小灯平时io口,就需要高电平, 被遮挡, io口是低电平, 对应的代码
static void LedControl(int on)
{
if (on)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
}
//开蜂鸣器(同理)这里蜂鸣器正极连io口, 负极连地
static void BeepControl(int on)
{
if (on)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
}
}