Bird
Raised Fist0
Arduinoprogramming~30 mins

State machine design for Arduino - Mini Project: Build & Apply

Choose your learning style10 modes available
State machine design for Arduino
📖 Scenario: You are building a simple traffic light controller using an Arduino. The traffic light has three states: Green, Yellow, and Red. Each state lasts for a specific time before switching to the next state in a cycle.This project will teach you how to design a state machine in Arduino code to control the traffic light.
🎯 Goal: Create an Arduino program that uses a state machine to cycle through the traffic light states: Green, Yellow, and Red. Each state should last a set amount of time, and the program should print the current state to the Serial Monitor.
📋 What You'll Learn
Create a variable to hold the current state of the traffic light
Create constants for the duration of each state in milliseconds
Use a state machine with a switch-case to change states based on elapsed time
Print the current state to the Serial Monitor
💡 Why This Matters
🌍 Real World
State machines are used in embedded systems like traffic lights, vending machines, and home appliances to control behavior step-by-step.
💼 Career
Understanding state machines is essential for embedded programming jobs, robotics, and IoT device development.
Progress0 / 4 steps
1
Set up the initial state and durations
Create an int variable called currentState and set it to 0 to represent the Green state. Also, create three const unsigned long variables called greenDuration, yellowDuration, and redDuration with values 5000, 2000, and 5000 respectively to represent the duration of each state in milliseconds.
Arduino
Hint

Use int currentState = 0; to start with Green. Use const unsigned long for durations in milliseconds.

2
Add a variable to track the last state change time
Add a unsigned long variable called lastChangeTime and set it to 0. This will store the time when the state last changed.
Arduino
Hint

Use unsigned long lastChangeTime = 0; to track when the state last changed.

3
Implement the state machine logic in loop()
Inside the loop() function, get the current time using millis() and check if the elapsed time since lastChangeTime is greater than the duration of the current state. Use a switch statement on currentState with cases 0, 1, and 2 for Green, Yellow, and Red respectively. When the time is up, update currentState to the next state (Green -> Yellow -> Red -> Green) and update lastChangeTime to the current time.
Arduino
Hint

Use switch (currentState) and check elapsed time with millis(). Change currentState and update lastChangeTime when duration ends.

4
Print the current state to the Serial Monitor
Inside the loop() function, after the switch statement, add a switch on currentState to print "Green Light", "Yellow Light", or "Red Light" to the Serial Monitor using Serial.println().
Arduino
Hint

Use a switch (currentState) and Serial.println() to print the current state.

Practice

(1/5)
1. What is the main purpose of using a state machine in an Arduino program?
easy
A. To organize the program into clear, manageable steps
B. To increase the speed of the Arduino processor
C. To reduce the power consumption automatically
D. To connect multiple Arduino boards together

Solution

  1. Step 1: Understand the concept of state machines

    A state machine breaks a program into distinct states or steps to manage behavior clearly.
  2. Step 2: Identify the main benefit in Arduino context

    This organization helps make the code easier to read, debug, and extend.
  3. Final Answer:

    To organize the program into clear, manageable steps -> Option A
  4. Quick Check:

    State machine purpose = organize steps [OK]
Hint: State machines organize code into clear steps [OK]
Common Mistakes:
  • Thinking state machines speed up the processor
  • Confusing power saving with state management
  • Assuming state machines connect multiple boards
2. Which of the following is the correct way to declare states in an Arduino state machine using enum?
easy
A. enum State {START, RUNNING, STOPPED};
B. enum State = {START, RUNNING, STOPPED};
C. enum State {START; RUNNING; STOPPED};
D. enum State (START, RUNNING, STOPPED);

Solution

  1. Step 1: Recall enum syntax in Arduino (C++)

    The correct syntax uses curly braces and commas to list states without assignment or semicolons.
  2. Step 2: Check each option for syntax errors

    enum State {START, RUNNING, STOPPED}; uses correct syntax: enum State {START, RUNNING, STOPPED}; Options B, C, and D have incorrect assignment, semicolons, or parentheses.
  3. Final Answer:

    enum State {START, RUNNING, STOPPED}; -> Option A
  4. Quick Check:

    Correct enum syntax = enum State {START, RUNNING, STOPPED}; [OK]
Hint: Use curly braces and commas for enum states [OK]
Common Mistakes:
  • Using '=' sign after enum name
  • Separating states with semicolons instead of commas
  • Using parentheses instead of braces
3. What will be the output on the Serial Monitor when running this Arduino code snippet?
enum State {IDLE, PROCESS, DONE};
State currentState = IDLE;

void setup() {
  Serial.begin(9600);
  switch(currentState) {
    case IDLE:
      Serial.println("Waiting");
      break;
    case PROCESS:
      Serial.println("Working");
      break;
    case DONE:
      Serial.println("Finished");
      break;
  }
}
medium
A. Finished
B. Working
C. Waiting
D. No output

Solution

  1. Step 1: Identify the initial state value

    The variable currentState is set to IDLE before setup() runs.
  2. Step 2: Follow the switch-case logic

    Switch checks currentState; since it is IDLE, it prints "Waiting" to Serial Monitor.
  3. Final Answer:

    Waiting -> Option C
  4. Quick Check:

    State IDLE prints "Waiting" [OK]
Hint: Check initial state value to predict output [OK]
Common Mistakes:
  • Assuming PROCESS or DONE prints without state change
  • Thinking setup() runs multiple times
  • Ignoring break statements in switch
4. Identify the error in this Arduino state machine code snippet:
enum State {START, RUNNING, STOPPED};
State currentState = START;

void loop() {
  switch(currentState) {
    case START:
      Serial.println("Start");
      currentState = RUNNING
      break;
    case RUNNING:
      Serial.println("Running");
      break;
    case STOPPED:
      Serial.println("Stopped");
      break;
  }
}
medium
A. Incorrect enum declaration
B. Serial not initialized in setup()
C. Missing break in RUNNING case
D. Missing semicolon after currentState = RUNNING

Solution

  1. Step 1: Check syntax line by line

    Look at the line: currentState = RUNNING without a semicolon at the end.
  2. Step 2: Identify the error type

    Missing semicolon causes a compile error. Other parts are correct or not critical for this snippet.
  3. Final Answer:

    Missing semicolon after currentState = RUNNING -> Option D
  4. Quick Check:

    Missing semicolon = syntax error [OK]
Hint: Check each statement ends with a semicolon [OK]
Common Mistakes:
  • Ignoring missing semicolon errors
  • Assuming enum declaration is wrong
  • Forgetting to initialize Serial in setup()
5. You want to design a state machine for an Arduino traffic light with states: RED, GREEN, YELLOW. Which approach correctly updates the state to cycle through RED -> GREEN -> YELLOW -> RED inside loop()?
hard
A. Use a while loop inside loop() to cycle states infinitely
B. Use a switch on currentState and set currentState to the next state in each case
C. Use if statements comparing currentState to integers 0,1,2 and increment currentState by 1
D. Use delay() to wait and then reset currentState to RED always

Solution

  1. Step 1: Understand state machine cycling

    Using a switch-case on currentState allows clear, readable transitions between states.
  2. Step 2: Evaluate each option's suitability

    Use a switch on currentState and set currentState to the next state in each case correctly updates currentState to the next state inside each case. Use if statements comparing currentState to integers 0,1,2 and increment currentState by 1 uses integers but lacks clarity and safe cycling. Use a while loop inside loop() to cycle states infinitely with while loop inside loop() blocks Arduino's main loop. Use delay() to wait and then reset currentState to RED always resets state always to RED, not cycling properly.
  3. Final Answer:

    Use a switch on currentState and set currentState to the next state in each case -> Option B
  4. Quick Check:

    Switch-case for cycling states = Use a switch on currentState and set currentState to the next state in each case [OK]
Hint: Use switch-case to update states clearly [OK]
Common Mistakes:
  • Using while loops inside loop() causing freezes
  • Resetting state without cycling
  • Using integers without clear state names
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard