Indicator — Esp32 Devkit C V4 simulation

An interactive Esp32 Devkit C V4 circuit simulation you can run free in your browser on Velxio, by tareq-neoaz.

Components

Sketch code

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// ===== PINS =====
#define OLED_SDA 21
#define OLED_SCL 4

#define TOUCH_LEFT 25
#define TOUCH_RIGHT 26
#define SWITCH_HAZARD 19

#define LEFT_IND 32
#define RIGHT_IND 33

// ===== OLED =====
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// ===== STATE =====
bool leftOn = false;
bool rightOn = false;
bool lastTouchL = false;
bool lastTouchR = false;
unsigned long lastBlink = 0;
bool blinkState = false;

void setup() {
  Serial.begin(115200);

  pinMode(TOUCH_LEFT, INPUT);
  pinMode(TOUCH_RIGHT, INPUT);
  pinMode(SWITCH_HAZARD, INPUT_PULLUP);
  pinMode(LEFT_IND, OUTPUT);
  pinMode(RIGHT_IND, OUTPUT);

  Wire.begin(OLED_SDA, OLED_SCL);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
}

void updateOLED(bool hazardOn) {
  display.clearDisplay();

  display.setCursor(0, 0);
  display.println("=== INDICATORS ===");

  display.setCursor(0, 20);
  display.print("Hazards: ");
  display.println(hazardOn ? "ON" : "OFF");

  display.setCursor(0, 36);
  display.print("Left: ");
  display.println(leftOn ? "ON" : "OFF");

  display.setCursor(0, 52);
  display.print("Right: ");
  display.println(rightOn ? "ON" : "OFF");

  display.display();
}

void loop() {
  bool touchL = digitalRead(TOUCH_LEFT);
  bool touchR = digitalRead(TOUCH_RIGHT);
  bool hazardOn = !digitalRead(SWITCH_HAZARD);

  // Toggle on rising edge
  if (touchL && !lastTouchL) leftOn = !leftOn;
  if (touchR && !lastTouchR) rightOn = !rightOn;

  lastTouchL = touchL;
  lastTouchR = touchR;

  // Blink timing
  if (millis() - lastBlink > 100) {
    blinkState = !blinkState;
    lastBlink = millis();
  }

  // Output
  bool leftActive = hazardOn || leftOn;
  bool rightActive = hazardOn || rightOn;

  digitalWrite(LEFT_IND, leftActive && blinkState ? HIGH : LOW);
  digitalWrite(RIGHT_IND, rightActive && blinkState ? HIGH : LOW);

  updateOLED(hazardOn);

  delay(20);
}

More projects by tareq-neoaz