#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定時器來實現延時
}