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

J5
J4
J3
J10
J8
R4
Resistance
220Ω
J1
C3
Capacitance
47uF
R3
Resistance
220Ω
J7
R6
Resistance
220Ω
J11
J2
J9
R7
Resistance
10kΩ
R8
Resistance
18kΩ
C4
Capacitance
100nF
R1
Resistance
220Ω
C1
Capacitance
470uF
R2
Resistance
220Ω
R5
Resistance
220Ω
C5
Capacitance
100nF
C2
Capacitance
100nF
R9
Resistance
470Ω
R10
Resistance
10kΩ
J6
R11
Resistance
10kΩ
U1
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