Sensor程式碼框架

流水江湖發表於2024-05-02
#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定時器來實現延時
}

相關文章