#include <stdio.h>
// 定义一个枚举类型来表示光电开关的状态
typedef enum {
SWITCH_OPEN,
SWITCH_CLOSED
} SwitchState;
// 定义一个结构体来记录光电开关传感器的状态
typedef struct {
SwitchState currentState; // 当前状态
SwitchState lastState; // 上次获取的状态
unsigned int stateChangeTime; // 获取状态的时间(例如,可以使用滴答定时器的计数值)
} SwitchSensor;
// 函数声明
SwitchState readSwitchState(); // 假设这是一个读取当前开关状态的函数
void delayMs(unsigned int ms); // 延时函数
int main(void) {
// 初始化传感器状态结构体
SwitchSensor sensor = {SWITCH_OPEN, SWITCH_OPEN, 0};
SwitchState stableState = SWITCH_OPEN; // 初始化稳定状态
int stableCount = 0; // 用于计数连续相同的读数
// 主循环
while(1) {
// 读取当前状态
sensor.currentState = readSwitchState();
// 如果状态改变,重置稳定计数器,并记录时间
if (sensor.currentState != sensor.lastState) {
stableCount = 0;
sensor.stateChangeTime = // 获取当前时间,例如使用HAL_GetTick();
} else {
// 如果状态未改变,增加稳定计数器
stableCount++;
// 如果连续3次读数相同,我们认为它已经稳定
if (stableCount >= 3) {
stableState = sensor.currentState;
printf("Switch is stable: %s\n", stableState == SWITCH_OPEN ? "Open" : "Closed");
// 这里可以执行进一步的操作,例如设置标志位等
// 重置稳定计数器以继续监控状态变化
stableCount = 0;
}
}
// 更新上次状态
sensor.lastState = sensor.currentState;
// 延时,以便不会过快地读取状态
delayMs(100);
}
}
// 假设的读取状态函数,需要根据实际硬件连接进行实现
SwitchState readSwitchState() {
// 这里应该有读取传感器状态的代码
// 比如读取GPIO的输入状态
// 返回 SWITCH_OPEN 或 SWITCH_CLOSED
}
// 延时函数,需要根据系统时钟进行适配
void delayMs(unsigned int ms) {
// 使用HAL库或者直接操作SysTick定时器来实现延时
}
标签:状态,框架,Sensor,代码,SwitchState,SWITCH,OPEN,sensor,stableCount From: https://www.cnblogs.com/icaowu/p/18169995