enum ile Adlandırılmış Durumlar
Coddy'nin Arduino Journey'sinin delay() Kullanmadan Zamanlama bölümünün bir parçası. Ders 9 / 18.
0, 1 ve 2 olarak numaralandırılmış bir mod işe yarar, ancak if (mode == 2) ifadesi 2'nin ne anlama geldiğini söylemez. Bir enum, her sayıya bir ad verir:
enum State { READY, RUNNING, DONE };
State state = READY;İlk satır, tek değerleri READY, RUNNING ve DONE olan yeni bir tür, State, oluşturur. Altta hâlâ 0, 1 ve 2 olsalar da adları her birinin ne anlama geldiğini belirtir. İkinci satır bu türden bir değişken oluşturur.
Bir enum ile bir switch birlikte kullanılır: her durum için bir case.
switch (state) {
case READY:
// READY'nin ne yaptığı ve ne zaman bir sonraki duruma geçtiği
break;
case RUNNING:
// ...
break;
}Yeni bir duruma geçmek için state değerini ayarlayın ve ne zaman başladığını hatırlayın: state = DONE; stateStart = millis();. Böylece her durum kendi süresini millis() - stateStart ile ölçer. Bir taslağı bu şekilde yazmaya durum makinesi denir.
Görev
OrtaBir makinenin üç durumu vardır. READY sizin için yazılmıştır: yeşil LED yanar ve bir basış makineyi çalıştırır. Diğer iki durumu ekleyin:
RUNNING: sarı LED yanar. 2000 ms sonra LED'i kapatın veDONEdurumuna geçin.DONE: kırmızı LED yanar. 1000 ms sonra LED'i kapatın veREADYdurumuna geri dönün.
Her değişiklikte stateStart değerini kaydedin. Run'a basın, düğmeye basın, ardından Check'e basın.
Kendin dene
const int buttonPin = 2;
const int greenLed = 10;
const int yellowLed = 11;
const int redLed = 12;
enum State { READY, RUNNING, DONE };
State state = READY;
unsigned long stateStart = 0; // geçerli durumun başladığı zaman
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(greenLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(redLed, OUTPUT);
}
void loop() {
unsigned long now = millis();
switch (state) {
case READY:
digitalWrite(greenLed, HIGH);
if (digitalRead(buttonPin) == LOW) {
digitalWrite(greenLed, LOW);
state = RUNNING;
stateStart = now;
}
break;
// RUNNING durumunu ekle: sarı LED'i yak; 2000 ms sonra sarı LED'i söndür ve DONE durumuna geç
// DONE durumunu ekle: kırmızı LED'i yak; 1000 ms sonra kırmızı LED'i söndür ve READY durumuna dön
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
delay() Kullanmadan Zamanlama bölümündeki tüm dersler
Kendi başına pratik yap: Arduino playground