模擬行人按下過馬路的按鈕後,汽車通行的紅綠燈與行人過馬路紅綠燈的動作

#include "Arduino.h"

#define CAR_R_PIN    2
#define CAR_Y_PIN    3
#define CAR_G_PIN    4
#define PASSERBY_R    5
#define PASSERBY_G    6
#define BUTTON        7

typedef enum
{
    STATE_POWERON,
    STATE_WAIT_KEYPRESS,
} TrafficSignalState_DefType;

typedef enum
{
    NO_EVENT,
    EVENT_KEPRESS,
} TrafficSignalEvent_DefType;

typedef struct
{
    TrafficSignalState_DefType state;
    TrafficSignalEvent_DefType event;
    void (*func)(void);

}TrafficSignal_DefType;

TrafficSignal_DefType trafficSignalTrans[]={
        {STATE_POWERON,NO_EVENT,turnOnTrafficLights},
        {STATE_WAIT_KEYPRESS,NO_EVENT,idle},
        {STATE_WAIT_KEYPRESS,EVENT_KEPRESS,changTraffic},
};

TrafficSignalState_DefType State = STATE_POWERON;
TrafficSignalEvent_DefType Event = NO_EVENT;

void getEvent(){
    Event = NO_EVENT;
    if(digitalRead(BUTTON) == HIGH)
    {
        Event = EVENT_KEPRESS;
    }
}

void idle(){

}

void changTraffic(){
    digitalWrite(CAR_R_PIN,LOW);
    digitalWrite(CAR_Y_PIN,HIGH);
    digitalWrite(CAR_G_PIN,LOW);
    digitalWrite(PASSERBY_R,HIGH);
    digitalWrite(PASSERBY_G,LOW);
    delay(1000);
    digitalWrite(CAR_R_PIN,HIGH);
    digitalWrite(CAR_Y_PIN,LOW);
    digitalWrite(CAR_G_PIN,LOW);
    digitalWrite(PASSERBY_R,LOW);
    digitalWrite(PASSERBY_G,HIGH);
    delay(5000);
    for(unsigned char i;i<20;i++){
        digitalWrite(PASSERBY_G,digitalRead(PASSERBY_G)^1);
        delay(250);
    }
    State = STATE_POWERON;
}

void turnOnTrafficLights()
{
    digitalWrite(CAR_R_PIN,LOW);
    digitalWrite(CAR_Y_PIN,LOW);
    digitalWrite(CAR_G_PIN,HIGH);
    digitalWrite(PASSERBY_R,HIGH);
    digitalWrite(PASSERBY_G,LOW);
    State = STATE_WAIT_KEYPRESS;
}

// the setup function runs once when you press reset or power the board
void setup() {
    pinMode(CAR_R_PIN, OUTPUT);
    pinMode(CAR_Y_PIN, OUTPUT);
    pinMode(CAR_G_PIN, OUTPUT);
    pinMode(PASSERBY_R, OUTPUT);
    pinMode(PASSERBY_G, OUTPUT);
    pinMode(BUTTON, INPUT);
}

// the loop function runs over and over again forever
void loop() {
    unsigned char i;
    getEvent();
    for (i = 0; i < sizeof(trafficSignalTrans)/sizeof(trafficSignalTrans[0]); i++)
    {
        if (trafficSignalTrans[i].state == State
                && trafficSignalTrans[i].event == Event)
        {
            trafficSignalTrans[i].func();
            break;
        }
    }
}
 

以上程式使用一種稱為State Machine來模擬紅綠燈的動作,在Coding的過程中有發現在Arduino的function帶有返回值參數的若是用typedef定義的會有錯。

arrow
arrow
    文章標籤
    arduino
    全站熱搜
    創作者介紹
    創作者 凱文先生的部落格 的頭像
    凱文先生的部落格

    凱文的八卦俱樂部小天地

    凱文先生的部落格 發表在 痞客邦 留言(0) 人氣()