Project 1.2 — 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 <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// ===== PINS =====
#define IR_PIN 15

#define EN1 25
#define IN1 26
#define IN2 27
#define EN2 13
#define IN3 14
#define IN4 12

#define TRIG_F 5
#define ECHO_F 34
#define TRIG_B 18
#define ECHO_B 35

#define BUZZER 17
#define LEFT_IND 32
#define RIGHT_IND 33
#define BRAKE 16
#define REVERSE 19
#define HEADLIGHT 23

// ===== IR CODES (from your scan) =====
#define CODE_FORWARD   0xFF40BF
#define CODE_BACK      0xFF19E6
#define CODE_LEFT      0xFF07F8
#define CODE_RIGHT     0xFF09F6
#define CODE_STOP      0xFF15EA
#define CODE_HEADLIGHT 0xFF43BC
#define CODE_LEFT_IND  0xFF16E9
#define CODE_RIGHT_IND 0xFF0DF2

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

// ===== IR =====
IRrecv irrecv(IR_PIN);
decode_results results;

// ===== STATE =====
char action = 'S';
bool headlightOn = false;
bool manualLeftInd = false;
bool manualRightInd = false;
int speedLevel = 0;
unsigned long lastBlink = 0;
bool blinkState = false;

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

  // Motors
  pinMode(EN1, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
  pinMode(EN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);

  // Ultrasonic
  pinMode(TRIG_F, OUTPUT); pinMode(ECHO_F, INPUT);
  pinMode(TRIG_B, OUTPUT); pinMode(ECHO_B, INPUT);

  // Lights + buzzer
  pinMode(BUZZER, OUTPUT);
  pinMode(LEFT_IND, OUTPUT); pinMode(RIGHT_IND, OUTPUT);
  pinMode(BRAKE, OUTPUT); pinMode(REVERSE, OUTPUT); pinMode(HEADLIGHT, OUTPUT);

  // OLED
  Wire.begin(21, 4);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);

  // IR
  irrecv.enableIRIn();

  Serial.println("Car ready. IR remote active.");
}

int getDistance(int trig, int echo) {
  digitalWrite(trig, LOW);
  delayMicroseconds(5);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  long duration = pulseIn(echo, HIGH, 30000);
  return duration * 0.034 / 2;
}

void driveMotors(char cmd, int speed) {
  int pwm = map(speed, 0, 3, 0, 255);
  switch (cmd) {
    case 'F':
      digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
      digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
      analogWrite(EN1, pwm); analogWrite(EN2, pwm);
      break;
    case 'B':
      digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
      digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
      analogWrite(EN1, pwm); analogWrite(EN2, pwm);
      break;
    case 'L':
      digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
      digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
      analogWrite(EN1, pwm); analogWrite(EN2, pwm);
      break;
    case 'R':
      digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
      digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
      analogWrite(EN1, pwm); analogWrite(EN2, pwm);
      break

More projects by tareq-neoaz