/*******************************************************************************
* 文件名称: sketch.ino
* 项目名称: 基于STM32F103C8T6的蚊子检测系统 (Wokwi在线仿真版)
* 芯片型号: STM32F103C8T6 (Blue Pill)
* 开发环境: Wokwi Online Simulator (Arduino Framework)
*
* 功能描述:
* 本系统通过红外传感器(按钮模拟)检测蚊虫活动,并通过LED和蜂鸣器
* 进行声光报警。系统采用数字滤波算法提高抗干扰能力。
*
* 硬件连接:
* - PA0: 红外传感器输入(按钮模拟)
* - PA1: LED输出(通过220Ω限流电阻)
* - PA2: 蜂鸣器输出(Wokwi仿真中直接驱动)
*
* 作者: [您的姓名]
* 日期: 2026-02-28
******************************************************************************/
// 引脚定义
#define SENSOR_PIN PA0 // 红外传感器输入引脚
#define LED_PIN PA1 // LED输出引脚
#define BUZZER_PIN PA2 // 蜂鸣器输出引脚
// 滤波算法参数
#define FILTER_COUNT 5 // 连续检测次数阈值(5次确认)
#define SAMPLE_DELAY_MS 10 // 采样间隔10ms(总响应时间50ms)
// LED闪烁参数
#define LED_BLINK_PERIOD_MS 500 // LED闪烁周期500ms
// 全局变量
uint8_t g_mosquito_detected = 0; // 蚊虫检测标志位
unsigned long g_led_last_toggle = 0; // LED上次翻转时间
uint8_t g_led_state = LOW; // LED当前状态
/*******************************************************************************
* 函数名称: setup
* 功能描述: Arduino初始化函数,配置GPIO引脚
******************************************************************************/
void setup() {
// 配置引脚模式
pinMode(SENSOR_PIN, INPUT_PULLDOWN); // 传感器输入,下拉模式
pinMode(LED_PIN, OUTPUT); // LED输出
pinMode(BUZZER_PIN, OUTPUT); // 蜂鸣器输出
// 初始状态:LED常亮,蜂鸣器关闭
digitalWrite(LED_PIN, HIGH);
digitalWrite(BUZZER_PIN, LOW);
// 初始化串口(用于调试,可选)
Serial.begin(115200);
Serial.println("STM32 Mosquito Detection System Started");
Serial.println("Press the button to simulate mosquito detection");
}
/*******************************************************************************
* 函数名称: loop
* 功能描述: Arduino主循环函数
******************************************************************************/
void loop() {
// 读取传感器状态(带数字滤波)
g_mosquito_detected = sensorReadFiltered();
if (g_mosquito_detected) {
// 场景1:检测到蚊虫(传感器高电平)
digitalWrite(BUZZER_PIN, HIGH); // 蜂鸣器发声
// LED闪烁控制(使用millis()精准计时)
if (millis() - g_led_last_toggle >= LED_BLINK_PERIOD_MS) {
g_led_state = !g_led_state; // 翻转LED状态
digitalWrite(LED_PIN, g_led_state);
g_led_last_toggle = millis(); // 更新时间戳
}
} else {
// 场景2:无蚊虫(传感器低电平)
digitalWrite(LED_PIN, HIGH); // LED常亮
digitalWrite(BUZZER_PIN, LOW); // 蜂鸣器静音
g_led_state = HIGH;
g_led_last_toggle = millis(); // 重置时间戳
}
}
/*******************************************************************************
* 函数名称: sensorReadFiltered
* 功能描述: 带数字滤波的传感器读取函数(连续检测计数法)
* 返回值: 1 - 检测到蚊虫(高电平)
* 0 - 无蚊虫(低电平)
*
* 算法原理:
* 采用"连续检测计数法"进行数字滤波,只有当传感器连续FILTER_COUNT次
* (默认5次)检测到高电平时,才确认为真实的蚊虫信号。
*
* 性能指标:
* - 采样间隔: 10ms
* - 确认次数: 5次
* - 总响应时间: 5 × 10ms = 50ms < 100ms(满足设计要求)
* - 抗干扰能力: 能过滤持续时间<50ms的干扰信号
******************************************************************************/
uint8_t sensorReadFiltered() {
static uint8_t high_count = 0; // 高电平连续计数器
static uint8_t low_count = 0; // 低电平连续计数器
// 读取传感器当前状态
uint8_t current_state = digitalRead(SENSOR_PIN);
if (current_state == HIGH) { // 检测到高电平
high_count++;
low_count = 0; // 清零低电平计数
// 连续FILTER_COUNT次检测到高电平,确认为蚊虫信号
if (high_count >= FILTER_COUNT) {
high_count = FILTER_COUNT; // 防止溢出
delay(SAMPLE_DELAY_MS); // 采样间隔延时
return 1; // 确认检测到蚊虫
}
} else { // 检测到低电平
low_count++;
high_count = 0; // 清零高电平计数
// 连续FILTER_COUNT次检测到低电平,确认为无蚊虫
if (low_count >= FILTER_COUNT) {
low_count = FILTER_COUNT; // 防止溢出
delay(SAMPLE_DELAY_MS); // 采样间隔延时
return 0; // 确认无蚊虫
}
}
// 未达到确认次数,保持上一次的状态
delay(SAMPLE_DELAY_MS); // 采样间隔延时
return g_mosquito_detected; // 返回上次的检测结果
}
/*******************************************************************************
* 文件结束
******************************************************************************/
Loading
stm32-bluepill
stm32-bluepill