模擬行人按下過馬路的按鈕後,汽車通行的紅綠燈與行人過馬路紅綠燈的動作
#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定義的會有錯。
留言列表