ESP32 Smart City Controller


Created 11 project docs

Project Specification — ESP32 Smart City Controller

View Document

Status: Review ESP32 DevKitC 38-pin carrier PCB for a smart-city demonstration with distance sensing, servo actuation, sound/sensitivity ana...

Power Budget — ESP32 Smart City Controller

View Document

| Rail | Load | Typical | Peak / Design Case | Basis | |---|---|---:|---:|---|

Firmware Starter — ESP32 DevKitC

View Document

MCU board: ESP32 DevKitC 38-pin / esp32dev Framework: Arduino

Board Bring-Up Plan — ESP32 Smart City Controller

View Document

Current-limited 5 V bench supply, multimeter, oscilloscope, USB cable, known HC-SR04, known servo, microphone module, 10 kΩ potentiometer, a...
Show 7 More
Created and verified the complete ESP32 Smart City Controller schematic, including HC-SR04 level shifting, servo stabilization, analog inputs, and six LED channels. Documentation: Project Specification, Power Budget, Firmware Starter, and Bring-Up Plan.
  • Open item: ERC reports U1:VP as an unpowered supply due to an incorrect library pin classification; VP is actually unused GPIO36 and is correctly marked no-connect.
  • Next: confirm the servo model/stall current, then configure the board and place components with antenna keepout and wide 5 V/ground paths.
hay un capacitor que no esta donde deveria estar ponlo en su lugar
Claro — necesito que me indiques cuál capacitor y dónde debería ir.
Puedes responder con algo como:
  • “C1 debe ir junto al conector del servo J3”
  • “C3 debe ir cerca del pin 5V del ESP32”
  • “El capacitor cerca de la esquina inferior derecha debe ir junto a U1”
Si puedes, selecciona el capacitor en Flux o dime su designador (C1, C2, C3, C4 o C5) y lo muevo a su lugar.
ya lo tengo seleccionado
Perfecto, revisaré el componente seleccionado y lo recolocaré donde corresponde según su función en el circuito.
Listo. Moví C1 junto al conector del servo J3, manteniendo el resto de los componentes en sus posiciones. Verifiqué que quedó dentro de la placa y sin solapamientos.
Revisar, enrutar y verificar
Revisar colocación completa
Enrutar placa
Ejecutar DRC
Revisar polaridad

R4
Resistance
220Ω
R3
Resistance
220Ω
R6
Resistance
220Ω
R7
Resistance
10kΩ
R8
Resistance
18kΩ
R1
Resistance
220Ω
R2
Resistance
220Ω
R5
Resistance
220Ω
R9
Resistance
470Ω
R10
Resistance
10kΩ
R11
Resistance
10kΩ
J5
J4
J3
U1
J10
J8
J1
C3
Capacitance
47uF
J7
J11
J2
J9
C4
Capacitance
100nF
C1
Capacitance
470uF
C5
Capacitance
100nF
C2
Capacitance
100nF
J6
Firmware Starter — ESP32 DevKitC
Platform & Toolchain
  • MCU board: ESP32 DevKitC 38-pin / esp32dev
  • Framework: Arduino
  • Build system: PlatformIO
  • Library: madhephaestus/ESP32Servo
Pin Mapping

Table


FunctionGPIODirectionSchematic connection
Ultrasonic TRIG4OutputJ2 pin 2
Ultrasonic ECHO5InputJ2 pin 3 through R7/R8 divider
Servo PWM13OutputR9 to J3 Data
Microphone ADC34InputJ4 pin 2
Sensitivity ADC35InputJ5 Output
LED 112OutputR1 to J6 P1; boot-strap pulldown R11
LED 214OutputR2 to J7 P1
LED 327OutputR3 to J8 P1
LED 426OutputR4 to J9 P1
LED 525OutputR5 to J10 P1
LED 633OutputR6 to J11 P1
platformio.ini

Ini


[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
lib_deps =
  madhephaestus/ESP32Servo@^3.0.6
build_flags =
  -DCORE_DEBUG_LEVEL=1
src/main.cpp

Cpp


#include <Arduino.h>
#include <WiFi.h>
#include <ESP32Servo.h>

constexpr uint8_t PIN_US_TRIG = 4;
constexpr uint8_t PIN_US_ECHO = 5;
constexpr uint8_t PIN_SERVO = 13;
constexpr uint8_t PIN_MIC = 34;
constexpr uint8_t PIN_SENSITIVITY = 35;
constexpr uint8_t LED_PINS[] = {12, 14, 27, 26, 25, 33};
constexpr size_t LED_COUNT = sizeof(LED_PINS) / sizeof(LED_PINS[0]);

const char *WIFI_SSID = "YOUR_SSID";
const char *WIFI_PASSWORD = "YOUR_PASSWORD";

Servo cityServo;
unsigned long lastSampleMs = 0;
unsigned long lastWiFiRetryMs = 0;

float readDistanceCm() {
  digitalWrite(PIN_US_TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(PIN_US_TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(PIN_US_TRIG, LOW);

  const unsigned long pulseUs = pulseIn(PIN_US_ECHO, HIGH, 30000UL);
  if (pulseUs == 0) return NAN;
  return static_cast<float>(pulseUs) * 0.0343f * 0.5f;
}

void setBuildingLevel(uint8_t activeChannels) {
  if (activeChannels > LED_COUNT) activeChannels = LED_COUNT;
  for (size_t i = 0; i < LED_COUNT; ++i) {
    digitalWrite(LED_PINS[i], i < activeChannels ? HIGH : LOW);
  }
}

void connectWiFi() {
  if (strcmp(WIFI_SSID, "YOUR_SSID") == 0) {
    Serial.println("Wi-Fi credentials not configured; continuing offline.");
    return;
  }
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Connecting to Wi-Fi");
  for (int i = 0; i < 20 && WiFi.status() != WL_CONNECTED; ++i) {
    delay(500);
    Serial.print('.');
  }
  if (WiFi.status() == WL_CONNECTED) {
    Serial.printf("\nWi-Fi connected: %s\n", WiFi.localIP().toString().c_str());
  } else {
    Serial.println("\nWi-Fi unavailable; continuing offline.");
  }
}

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

  pinMode(PIN_US_TRIG, OUTPUT);
  digitalWrite(PIN_US_TRIG, LOW);
  pinMode(PIN_US_ECHO, INPUT);

  for (uint8_t pin : LED_PINS) {
    pinMode(pin, OUTPUT);
    digitalWrite(pin, LOW); // GPIO12 must remain low during startup
  }

  analogReadResolution(12);
  analogSetPinAttenuation(PIN_MIC, ADC_11db);
  analogSetPinAttenuation(PIN_SENSITIVITY, ADC_11db);

  ESP32PWM::allocateTimer(0);
  cityServo.setPeriodHertz(50);
  cityServo.attach(PIN_SERVO, 500, 2400);
  cityServo.write(90);

  connectWiFi();
  Serial.println("Smart City Controller initialized.");
}

void loop() {
  const unsigned long now = millis();

  if (now - lastSampleMs >= 250) {
    lastSampleMs = now;

    const float distanceCm = readDistanceCm();
    const int micRaw = analogRead(PIN_MIC);
    const int sensitivityRaw = analogRead(PIN_SENSITIVITY);

    const uint8_t activeBuildings = map(sensitivityRaw, 0, 4095, 0, LED_COUNT + 1);
    setBuildingLevel(activeBuildings);

    int servoAngle = 90;
    if (!isnan(distanceCm)) {
      servoAngle = constrain(map(static_cast<long>(distanceCm), 5, 100, 0, 180), 0, 180);
      cityServo.write(servoAngle);
    }

    Serial.printf("distance_cm=%s mic=%d sensitivity=%d leds=%u servo=%d wifi=%s\n",
                  isnan(distanceCm) ? "timeout" : String(distanceCm, 1).c_str(),
                  micRaw, sensitivityRaw, activeBuildings, servoAngle,
                  WiFi.status() == WL_CONNECTED ? "connected" : "offline");
  }

  if (WiFi.status() != WL_CONNECTED &&
      strcmp(WIFI_SSID, "YOUR_SSID") != 0 &&
      now - lastWiFiRetryMs >= 30000) {
    lastWiFiRetryMs = now;
    WiFi.disconnect();
    connectWiFi();
  }

  delay(1);
}
Build & Flash

Bash


pio run
pio run -t upload
pio device monitor
Use the DevKitC onboard USB interface. Do not connect external J1 power and USB power simultaneously until the exact DevKit board revision/backfeed behavior is confirmed.
  • Platform & Toolchain

  • Pin Mapping

  • `platformio.ini`

  • `src/main.cpp`

  • Build & Flash