ESP32 Sensor Project
Table
| Function | GPIO | Schematic Net | Connected To | Direction | Notes |
|---|---|---|---|---|---|
| I2C SDA | 21 | I2C_SDA | U4 MPU6050 SDA, R2 pull-up | Bidirectional | Pull-up to 3V3. |
| I2C SCL | 22 | I2C_SCL | U4 MPU6050 SCL, R3 pull-up | Output/open-drain | Pull-up to 3V3. |
| HX711 DOUT | 32 | HX711_DOUT | U3 DAT | Input | Load cell ADC data. |
| HX711 SCK | 33 | HX711_SCK | U3 CLK | Output | Load cell ADC clock. |
| DS18B20 DQ | 4 | DS18B20_DQ | U5 DQ, R1 pull-up | Bidirectional | 4.7 kΩ pull-up to 3V3. |
| UART U1 TX | 25 | UART_U1_TX_TO_R4 / UART_U1_TO_U2 | U1 IO25 -> R4 -> U2 IO26 | Output | Optional inter-board link. |
| UART U1 RX | 26 | UART_U2_TO_U1 | U2 IO25 -> R5 -> U1 IO26 | Input | Optional inter-board link. |
platformio.ini:Ini
[platformio] default_envs = esp32_u1_sensor [env] platform = espressif32 board = esp32dev framework = arduino monitor_speed = 115200 lib_deps = bogde/HX711@^0.7.5 adafruit/Adafruit MPU6050@^2.2.6 adafruit/Adafruit Unified Sensor@^1.1.14 paulstoffregen/OneWire@^2.3.8 milesburton/DallasTemperature@^3.11.0 [env:esp32_u1_sensor] build_flags = -DDEVICE_U1_SENSOR [env:esp32_u2_receiver] build_flags = -DDEVICE_U2_RECEIVER
src/main.cpp:Cpp
#include <Arduino.h> #include <Wire.h> #include <HX711.h> #include <Adafruit_MPU6050.h> #include <Adafruit_Sensor.h> #include <OneWire.h> #include <DallasTemperature.h> #define I2C_SDA_PIN 21 #define I2C_SCL_PIN 22 #define HX711_DOUT_PIN 32 #define HX711_SCK_PIN 33 #define DS18B20_DQ_PIN 4 #define ESP32_LINK_TX_PIN 25 #define ESP32_LINK_RX_PIN 26 #define SENSOR_INTERVAL_MS 1000UL #define LINK_BAUD 115200 #define DEBUG_BAUD 115200 HardwareSerial LinkSerial(2); #ifdef DEVICE_U1_SENSOR HX711 scale; Adafruit_MPU6050 mpu; OneWire oneWire(DS18B20_DQ_PIN); DallasTemperature ds18b20(&oneWire); unsigned long lastReadMs = 0; float readLoadCellRaw() { if (scale.is_ready()) { return (float)scale.read_average(5); } Serial.println("HX711 not ready"); return NAN; } bool readMpu(float &ax, float &ay, float &az, float &gx, float &gy, float &gz, float &tempC) { sensors_event_t accel, gyro, temp; if (!mpu.getEvent(&accel, &gyro, &temp)) { return false; } ax = accel.acceleration.x; ay = accel.acceleration.y; az = accel.acceleration.z; gx = gyro.gyro.x; gy = gyro.gyro.y; gz = gyro.gyro.z; tempC = temp.temperature; return true; } float readDs18b20C() { ds18b20.requestTemperatures(); float t = ds18b20.getTempCByIndex(0); if (t == DEVICE_DISCONNECTED_C) { Serial.println("DS18B20 disconnected"); return NAN; } return t; } void setupU1() { Serial.begin(DEBUG_BAUD); delay(300); Serial.println("U1 sensor node starting"); LinkSerial.begin(LINK_BAUD, SERIAL_8N1, ESP32_LINK_RX_PIN, ESP32_LINK_TX_PIN); Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN); if (!mpu.begin(0x68, &Wire)) { Serial.println("MPU6050 not found at 0x68; check wiring/pull-ups"); } else { mpu.setAccelerometerRange(MPU6050_RANGE_8_G); mpu.setGyroRange(MPU6050_RANGE_500_DEG); mpu.setFilterBandwidth(MPU6050_BAND_21_HZ); Serial.println("MPU6050 initialized"); } scale.begin(HX711_DOUT_PIN, HX711_SCK_PIN); scale.set_scale(); scale.tare(10); ds18b20.begin(); Serial.println("Init complete"); } void loopU1() { unsigned long now = millis(); if (now - lastReadMs < SENSOR_INTERVAL_MS) return; lastReadMs = now; float loadRaw = readLoadCellRaw(); float ax = NAN, ay = NAN, az = NAN, gx = NAN, gy = NAN, gz = NAN, mpuTemp = NAN; bool mpuOk = readMpu(ax, ay, az, gx, gy, gz, mpuTemp); float surfaceTemp = readDs18b20C(); String msg = "{\"load_raw\":" + String(loadRaw, 0) + ",\"mpu_ok\":" + String(mpuOk ? 1 : 0) + ",\"ax\":" + String(ax, 3) + ",\"ay\":" + String(ay, 3) + ",\"az\":" + String(az, 3) + ",\"gx\":" + String(gx, 3) + ",\"gy\":" + String(gy, 3) + ",\"gz\":" + String(gz, 3) + ",\"surface_temp_c\":" + String(surfaceTemp, 2) + "}"; Serial.println(msg); LinkSerial.println(msg); } #endif #ifdef DEVICE_U2_RECEIVER void setupU2() { Serial.begin(DEBUG_BAUD); delay(300); Serial.println("U2 receiver starting"); LinkSerial.begin(LINK_BAUD, SERIAL_8N1, ESP32_LINK_RX_PIN, ESP32_LINK_TX_PIN); } void loopU2() { while (LinkSerial.available()) { String line = LinkSerial.readStringUntil('\n'); line.trim(); if (line.length() > 0) { Serial.print("From U1: "); Serial.println(line); } } } #endif void setup() { #ifdef DEVICE_U1_SENSOR setupU1(); #elif defined(DEVICE_U2_RECEIVER) setupU2(); #else Serial.begin(DEBUG_BAUD); Serial.println("Define DEVICE_U1_SENSOR or DEVICE_U2_RECEIVER in build_flags"); #endif } void loop() { #ifdef DEVICE_U1_SENSOR loopU1(); #elif defined(DEVICE_U2_RECEIVER) loopU2(); #else delay(1000); #endif }
Bash
pio run -e esp32_u1_sensor pio run -e esp32_u1_sensor -t upload pio device monitor -b 115200 pio run -e esp32_u2_receiver pio run -e esp32_u2_receiver -t upload pio device monitor -b 115200
Platform & Toolchain
Pin Mapping
Dependencies & Project Setup
Complete Firmware Source
Build & Flash Instructions