FritzeEngineering
Published

Part 4 - Moore vs. Mealy

Digital technology using Arduino. Understanding digital technology with Arduino – explained practically.

IntermediateWork in progress1 hour51
Part 4 - Moore vs. Mealy

Things used in this project

Hardware components

Arduino Nano R3
Arduino Nano R3
×1
resistor 1k5
×3
LED, Low Current
LED, Low Current
red, yellow and green
×3

Software apps and online services

Arduino IDE
Arduino IDE

Hand tools and fabrication machines

Breadboard, Plastic
Breadboard, Plastic

Story

Read more

Schematics

Arduino simulates traffic lights

Code

Traffic lights

Arduino
// -----------------------------
// Traffic lights (FSM, non-blocking)
// -----------------------------
enum State { KFZ_GRUEN, KFZ_GELB, KFZ_ROT, KFZ_ROT_GELB };
State state = KFZ_GRUEN;

// Pinzuordnung
const int KFZ_RED = 2;
const int KFZ_YEL = 3;
const int KFZ_GRN = 4;

// Zeiten (ms)
const unsigned long KFZ_GRUEN_TIME = 8000UL;
const unsigned long KFZ_GELB_TIME = 2000UL;
const unsigned long KFZ_ROT_TIME = 5000UL;
const unsigned long KFZ_ROT_GELB_TIME = 2000UL;

// Laufvariablen
unsigned long stateStart = 0;

void setup() {
  pinMode(KFZ_RED, OUTPUT);
  pinMode(KFZ_YEL, OUTPUT);
  pinMode(KFZ_GRN, OUTPUT);
}

void loop() {
  unsigned long now = millis();

  switch(state) {
    case KFZ_GRUEN:
        // Normalzustand: Strae grn, Fugnger rot
        digitalWrite(STR_GRN, HIGH);
        digitalWrite(STR_RED, LOW);
        digitalWrite(STR_YEL, LOW);
        if (now - stateStart >= KFZ_GRUEN_TIME) {
          stateStart = millis();
          state = KFZ_GELB;
        }
      break;

    case KFZ_GELB:
      digitalWrite(STR_GRN, LOW);
      digitalWrite(STR_YEL, HIGH);
      if (now - stateStart >= KFZ_GELB_TIME) {
        stateStart = millis();
        state = KFZ_ROT;
      }
      break;

    case KFZ_ROT:
      digitalWrite(STR_YEL, LOW);
      digitalWrite(STR_RED, HIGH);
      if (now - stateStart >= KFZ_ROT_TIME) {
        stateStart = millis();
        state = KFZ_ROT_GELB;
      }
      break;

    case KFZ_ROT_GELB:
      digitalWrite(KFZ_GELB, HIGH);
      if (now - stateStart >= KFZ_ROT_GELB_TIME) {
        stateStart = millis();
        state = KFZ_GRUEN;
      }
      break;
  }
  if (A && B) {
// Aktion
}
}

Credits

FritzeEngineering
4 projects • 0 followers
Hard- and software engineer specialised in embedded systems. Circuit design, PCB layouts and PLC programming.

Comments