ESP32 Smart City Controller

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
U1 IO12 - R1 P1
R9 P2 - R10 P1
R7 P2 - R8 P1
U1 IO12 - R1 P1
R9 P2 - R10 P1
U1 IO25 - R5 P1
R1 P2 - J6 P1
U1 IO25 - R5 P1
R5 P2 - J10 P1
J4 Pin_2 - U1 IO34
J1 PIN1 - U1 5V
J4 Pin_2 - U1 IO34
U1 3V3 - J4 Pin_1
U1 IO26 - R4 P1
U1 IO13 - R9 P1
U1 IO14 - R2 P1
U1 IO13 - R9 P1
U1 IO26 - R4 P1
J5 Output - U1 IO35
U1 IO14 - R2 P1
U1 IO4 - J2 Pin_2
J1 PIN1 - U1 5V
J1 PIN1 - U1 5V
J1 PIN1 - U1 5V
J1 PIN1 - U1 5V
J1 PIN1 - U1 5V
R4 P2 - J9 P1
U1 3V3 - J4 Pin_1
R7 P2 - R8 P1
U1 IO27 - R3 P1
R2 P2 - J7 P1
U1 IO4 - J2 Pin_2
R7 P2 - R8 P1
J1 PIN1 - U1 5V
U1 3V3 - J4 Pin_1
R6 P2 - J11 P1
J1 PIN1 - U1 5V
R3 P2 - J8 P1
J2 Pin_3 - R7 P1
R4 P2 - J9 P1
U1 IO33 - R6 P1
J5 Output - U1 IO35
J2 Pin_3 - R7 P1
R6 P2 - J11 P1
R2 P2 - J7 P1
U1 IO27 - R3 P1
U1 IO12 - R1 P1
R3 P2 - J8 P1
R1 P2 - J6 P1
R9 P2 - R10 P1
U1 3V3 - J4 Pin_1
U1 IO33 - R6 P1
R5 P2 - J10 P1
J5
GND
GND
U1 GND_3 - R8 P2
U1 GND_3 - R8 P2
GND
J4
U1 GND_3 - R8 P2
GND
GND
U1 GND_3 - R8 P2
GND
GND
GND
U1 GND_3 - R8 P2
J3
GND
U1 GND_3 - R8 P2
GND
GND
U1 GND_3 - R8 P2
U1 GND_3 - R8 P2
GND
GND
U1 GND_3 - R8 P2
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Ω
U1
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Ω

Refine this doc
Ask about this doc
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

ESP32 Smart City Controller thumbnail
ESP32 DevKitC 38-pin carrier PCB for ultrasonic sensing, servo control, analog microphone and potentiometer inputs, and six LED building channels from a regulated 5V supply.

Properties

V

Pricing & Availability

Distributor

Qty 1

Digi-Key

$11.00

LCSC

$12.68

Controls