ESP32 — ESP32 simulation

An interactive ESP32 circuit simulation you can run free in your browser on Velxio, by stephan0-dotsenko2.

Components

Sketch code

#include <bitset>
const int LED_PIN = 2;
const int MODE_PIN = 4;
const int EMERGENCY_PIN = 5;


uint8_t state = 0;
unsigned long previousTime = 0;
bool previousClick = HIGH;
bool prevModeButtonClick = HIGH;

enum class Esp32Mode : uint8_t {
    IDLE       = 0b01,
    BLINK_SLOW = 0b10,
    BLINK_FAST = 0b11,
};

enum class Esp32Bit : uint8_t {
    EMERGENCY_MODE = 2,
    LED_STATE = 3,
};

int idle = static_cast<int>(Esp32Bits::IDLE);
int slow = static_cast<int>(Esp32Bits::BLINK_SLOW);
int fast = static_cast<int>(Esp32Bits::BLINK_FAST);
void toggleBit(int bit) 
{
  state  ^= bit;
}

void closeBit(Esp32Mode mode) 
{
  (state & mode) &= ~(mode);
}

void openBit(int bit) 
{
  state |= bit;
}

bool checkBit(int bit)
{
  return state & (bit);
}

int bitToInt(Esp32Bits bit) {
    return static_cast<int>(bit);
}
int ledState = bitToInt(Esp32Bits::LED_STATE);

void toggleLed()
{
  toggleBit(ledState);

  if(checkBit(ledState)){
    digitalWrite(LED_PIN, HIGH);
  } else {
    digitalWrite(LED_PIN, LOW);
  }
}

void changeLedMode()
{ 
  if(checkBit(idle)){
    closeBit(idle);
    openBit(slow);
  }

  else if(checkBit(slow)) {
    closeBit(slow);
    openBit(fast);
  } 
  
  else if(checkBit(fast)) {
  closeBit(fast);
  openBit(idle);

  closeBit(ledState);
  digitalWrite(LED_PIN, LOW);
}
}

void blinking(unsigned long currentTime)
{
  if(checkBit(slow)){
    if(currentTime - previousTime >= 700) {
      toggleLed();
      previousTime = currentTime;
    }
  }

  if(checkBit(fast)){
    if(currentTime - previousTime >= 150) {
      toggleLed();
      previousTime = currentTime;
    }
  }
}



void setup()
{
    Serial.begin(115200);
    pinMode(LED_PIN, OUTPUT);
    pinMode(MODE_PIN, INPUT_PULLUP);
    pinMode(EMERGENCY_PIN, INPUT_PULLUP);

    openBit(bitToInt(Esp32Bits::IDLE));
    closeBit(bitToInt(Esp32Bits::LED_STATE));

}



void loop()
{
    unsigned long currentTime = millis();
    int modeButtonClick = digitalRead(MODE_PIN);
    int emergencyBtnClick = digitalRead(EMERGENCY_PIN);
    Serial.println(std::bitset<8>(state).to_string().c_str());
    if(modeButtonClick == LOW && prevModeButtonClick == HIGH) {
      changeLedMode();
    }

    if(!checkBit(idle)){
      blinking(currentTime);
    }

    prevModeButtonClick = modeButtonClick;
}