/* ESP32-C3 (Xiao) + HC-SR04 Ultrasonic + 1.3" OLED I2C ------------------------------------------------------- Board : Seeed Studio XIAO ESP32-C3 Sensor : HC-SR04 Ultrasonic Distance Sensor Display : 1.3" OLED SH1106 I2C HC-SR04 Wiring: HC-SR04 VCC → 5V HC-SR04 GND → GND HC-SR04 TRIG → D3 (GPIO3) HC-SR04 ECHO → D2 (GPIO2) via voltage divider (see below!) !! HC-SR04 ECHO outputs 5V — ESP32-C3 is NOT 5V tolerant !! !! Use a voltage divider on ECHO pin: !! !! ECHO → 1kΩ → D2 (GPIO2) !! !! └── 2kΩ → GND !! OLED I2C Wiring: OLED VCC → 3.3V OLED GND → GND OLED SDA → D4 (GPIO4) OLED SCL → D5 (GPIO5) Libraries needed: - U8g2 by oliver */ #include #include // ── Pin config ──────────────────────────────────────────────────────────────── #define TRIG_PIN D3 // D3 / GPIO3 #define ECHO_PIN D2 // D2 / GPIO2 (via voltage divider) #define MAX_DISTANCE_CM 400 // HC-SR04 max reliable range // ── Objects ─────────────────────────────────────────────────────────────────── U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE); // ── Helper: measure distance ─────────────────────────────────────────────────── float measureDistanceCM() { // Send 10us trigger pulse digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); // Measure echo pulse duration (timeout = max range in us) long duration = pulseIn(ECHO_PIN, HIGH, 30000); if (duration == 0) return -1; // No echo = out of range float distanceCM = (duration * 0.0343) / 2.0; if (distanceCM > MAX_DISTANCE_CM) return -1; return distanceCM; } // ── Setup ───────────────────────────────────────────────────────────────────── void setup() { Serial.begin(115200); while (!Serial) delay(10); pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); Serial.println("=== XIAO ESP32-C3 + HC-SR04 + 1.3 OLED ==="); u8g2.begin(); u8g2.clearBuffer(); u8g2.setFont(u8g2_font_ncenB08_tr); u8g2.drawStr(10, 30, "Initialising..."); u8g2.sendBuffer(); delay(500); } // ── Main Loop ───────────────────────────────────────────────────────────────── void loop() { float distCM = measureDistanceCM(); float distIN = distCM / 2.54; // ── Serial output ── if (distCM < 0) { Serial.println("Distance : out of range"); } else { Serial.print("Distance : "); Serial.print(distCM, 1); Serial.print(" cm / "); Serial.print(distIN, 1); Serial.println(" in"); } // ── OLED display ── u8g2.clearBuffer(); // Title u8g2.setFont(u8g2_font_ncenB08_tr); u8g2.drawStr(18, 12, "HC-SR04 Distance Fab"); u8g2.drawHLine(0, 15, 128); if (distCM < 0) { u8g2.setFont(u8g2_font_ncenB12_tr); u8g2.drawStr(10, 42, "Out of range"); } else { char lineCM[20], lineIN[20]; snprintf(lineCM, sizeof(lineCM), "%.1f cm", distCM); snprintf(lineIN, sizeof(lineIN), "%.1f in", distIN); u8g2.setFont(u8g2_font_ncenB18_tr); // big font for cm u8g2.drawStr(0, 42, lineCM); u8g2.setFont(u8g2_font_ncenB12_tr); // smaller for inches u8g2.drawStr(0, 62, lineIN); } u8g2.sendBuffer(); delay(200); // update 5x per second for smooth readings }