daniel iot project — ESP32 simulation

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

Components

Sketch code

#define TRIG_PIN 18
#define ECHO_PIN 19

#define REDLED_PIN 25
#define YELLOWLED_PIN 26
#define GREENLED_PIN 27
#define BUZZER_PIN 14

#define DANGER_DISTANCE 20
#define WARNING_DISTANCE 50
#define SAFE_DISTANCE 100

#define BUZZER_FREQ 2000

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

  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);

  pinMode(REDLED_PIN, OUTPUT);
  pinMode(YELLOWLED_PIN, OUTPUT);
  pinMode(GREENLED_PIN, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);

  digitalWrite(TRIG_PIN, LOW);
  digitalWrite(REDLED_PIN, LOW);
  digitalWrite(YELLOWLED_PIN, LOW);
  digitalWrite(GREENLED_PIN, LOW);
  noTone(BUZZER_PIN);

  Serial.println("Reverse Parking System Started");
}

long measureCm() {
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);

  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  long duration = pulseIn(ECHO_PIN, HIGH, 30000UL);

  if (duration == 0) {
    return -1;
  }

  return (long)(duration * 0.0343 / 2.0);
}

void turnOffLEDs() {
  digitalWrite(REDLED_PIN, LOW);
  digitalWrite(YELLOWLED_PIN, LOW);
  digitalWrite(GREENLED_PIN, LOW);
}

void updateWarning(long cm) {
  turnOffLEDs();
  noTone(BUZZER_PIN);

  if (cm < 0 || cm > 400) {
    Serial.println("SENSOR ERROR");
    return;
  }

  // 0-20 cm: Danger
  if (cm <= DANGER_DISTANCE) {
    digitalWrite(REDLED_PIN, HIGH);
    tone(BUZZER_PIN, BUZZER_FREQ);

    Serial.println("TOO CLOSE! STOP!");
  }

  // 21-50 cm: Too close
  else if (cm <= WARNING_DISTANCE) {
    digitalWrite(REDLED_PIN, HIGH);

    // Beep quickly
    if (millis() % 400 < 200) {
      tone(BUZZER_PIN, BUZZER_FREQ);
    }

    Serial.println("TOO CLOSE!");
  }

  // 51-100 cm: Slow down
  else if (cm <= SAFE_DISTANCE) {
    digitalWrite(YELLOWLED_PIN, HIGH);

    // Beep slowly
    if (millis() % 800 < 200) {
      tone(BUZZER_PIN, BUZZER_FREQ);
    }

    Serial.println("SLOW DOWN!");
  }

  // Over 100 cm: Normal
  else {
    digitalWrite(GREENLED_PIN, HIGH);
    noTone(BUZZER_PIN);

    Serial.println("NORMAL");
  }
}

void loop() {
  long cm = measureCm();

  if (cm >= 0 && cm <= 400) {
    Serial.printf("Distance: %ld cm\n", cm);
  }

  updateWarning(cm);

  delay(50);
}

More projects by avovilienko