目录
一、光敏/热释电模块
(1)资源介绍
🔅原理图
🔅AS312
🌙简介
🌙特性
🔅LDR
(2)STM32CubeMX 软件配置
(3)代码编写
(4)实验现象
二、光敏/热释电模块接口函数封装
三、踩坑日记
(1)引脚配置
(2)光敏电阻
一、光敏/热释电模块
(1)资源介绍
🔅原理图
蓝桥杯物联网竞赛实训平台提供了一个拓展接口 CN2,所有拓展模块均可直接安装在 Lora 终端上使用;
光敏/热释电模块电路原理图如下所示:
通过两张电路图连接可知,引脚资源配置情况为:
PHOTO | MCU |
---|---|
AIN(光敏) | PB1 |
AS312(热释电) | PB6 |
🔅AS312
(以下资料来源于C90465_热释电红外线传感器手册)
🌙简介
该系列产品是将数字智能控制电路与人体探测敏感元都集成在电磁屏蔽罩内的热释电红外传感器。人体探测敏感元将感应到的人体移动信号通过甚高阻抗差分输入电路耦合到数字智能集成电路芯片上,数字智能集成电路将信号转化成15位ADC数字信号,当PIR信号超过选定的数字阈值时就会有REL电平输出。时间参数通过电阻设置,用以控制用电器持续工作的延时时间。所有的信号处理都在芯片上完成。
🌙特性
- 数字信号处理;
- 二路差分甚高阻抗传感器输入;
- 特别内置红外传感器的二阶巴特沃斯带通滤波器,屏蔽其他频率的输入干扰;
- 电源抑制比高,抗射频干扰;
- 具有定时时间、灵敏度施密特REL输出;
- 低电压、低功耗,启动后瞬间工作;
⭐当传感器检测到人体活动时,若信号超过阈值,会在REL端输出高电平,反之输出低电平;
🔅LDR
光敏电阻是一种基于内光电效应的半导体元件,它的阻值依赖于入射光强的变化。入射光强增加,光敏电阻的阻值减小,入射光减弱,光敏电阻阻值增大。
在电路中的体现是:
- 当入射光强增加时,光敏电阻阻值减小,AIN端测得的电压减小;
- 当入射光强减弱时,光敏电阻阻值增大,AIN端测得的电压增大;
(2)STM32CubeMX 软件配置
🔅“工程建立、时钟树配置、Debug 串行线配置、代码生成配置” 在下文中有讲解,这里不再赘述❗️
【蓝桥杯——物联网设计与开发】基础模块1- GPIO输出https://blog.csdn.net/m0_63116406/article/details/135604705?spm=1001.2014.3001.5502
1️⃣点击引脚 PB6 → 选择 GPIO_Input 模式;
点击"System Core" → 选择"GPIO"一栏 → 点击引脚"PB6" → 将"GPIO Pull-up/Pull-down"一栏修改为"Pull-up";(即设置PB6引脚为带上拉电阻的输入模式)
2️⃣配置引脚PC15,默认输出高电平;
3️⃣配置引脚PB1,为AD采样通道9;
4️⃣配置OLED;
5️⃣生成代码即可;
(3)代码编写
🟢️main 函数
/* USER CODE BEGIN PV */
uint8_t puc_oled[17]; // OLED显示缓存区
uint16_t pui_adc; // AD采集值
uint8_t state_ir; // 热释电状态变量
/* USER CODE END PV */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC_Init();
MX_I2C3_Init();
/* USER CODE BEGIN 2 */
OLED_Init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* 光敏采集 */
HAL_ADC_Start(&hadc);
if(HAL_ADC_PollForConversion(&hadc, 10) == HAL_OK)
pui_adc = HAL_ADC_GetValue(&hadc);
pui_adc = pui_adc * 330 / 4095;
/* 热释电采集 */
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6) == 1)
{
state_ir = 1;
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET); // 检测到人体活动LD5亮
}
else
{
state_ir = 0;
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET); // 未检测到人体活动LD5灭
}
/* OLED 显示 */
sprintf((char*)puc_oled, "Light:%.2fV", pui_adc / 100.0);
OLED_ShowString(0, puc_oled);
if(state_ir)
sprintf((char*)puc_oled, " OPEN ");
else
sprintf((char*)puc_oled, " OFF ");
OLED_ShowString(2, puc_oled);
HAL_Delay(200);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
(4)实验现象
- 用手捂住光敏电阻时,测得的电压增加;放开手后,测得的电压减小;
- 人体活动时,OLED屏上显示"OPEN",LD5亮;人体静止时,OLED屏上显示"OFF",LD5灭;
二、光敏/热释电模块接口函数封装
该模块还没有在比赛题中出现过,下面是对该模块应用场景的一个考点推断。
模拟场景:当室内处于黑暗状态时,若有人经过,则自动打开灯光。
解析:使用LDR实时测环境光强,假定1.25V以上为黑暗场景,其他为正常场景。当处于黑暗场景时,启动AS312扫描人体活动,反之屏蔽AS312的所有信号。
🟡️功能函数
void Task_Colt(void)
{
/* 200ms 进入一次 */
if(cnt_colt < 200) return;
cnt_colt = 0;
/* 先进行环境光采集 */
ADC_Read(&pui_adc);
pui_adc = pui_adc * 330 / 4095;
/* 环境判断 */
if(pui_adc > 125)
state_dark = 1; // 黑暗环境
else
state_dark = 0; // 正常环境
/* 如果处于黑暗环境,判别AS312的信号 */
if(state_dark)
{
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6) == 1)
{
state_ir = 1;
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET); // 检测到人体活动,开灯
}
else
{
state_ir = 0;
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET); // 未检测到人体活动,灭灯
}
}
/* 处于正常环境,屏蔽AS312的信号 */
else
{
state_ir = 0;
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET);
}
}
三、踩坑日记
(1)引脚配置
🔅引脚PB6配置为输入模式,带上拉电阻;(此为官方例程所给)
🔅实际测试,带下拉电阻的效果会更好;
(2)光敏电阻
🔅光敏电阻:光强越大,电阻越小;
🔅在该模块的电路上体现是:光强越强,电阻越小,那么采集到的电压趋近于地即0V;光强越暗,电阻越大,分压越大;