USB-C Wi-Fi/BLE Sensor Design
0:24
Thought for a moment
12:14
Thought for 6 sec
1/5 Inspect existing schematic and identify safe way to add control-panel subsystem without disturbing prior sensor-node design
Thought for 11 sec
Read schematic.
Found 10 results for Find Flux library components for industrial control panel schematic using generic terminal block 2 pin or 3 pin, generic PLC input output block, AC DC SMPS 220VAC to 24VDC, solid state relay SSR AC load, DC relay coil, normally open pushbutton, pump motor, alarm buzzer, RS485 2 pin terminal header. Prefer generic schematic blocks or terminal headers if exact parts are unavailable..
Found 10 results for Terminal Block 2 Pin.
Found 2 results for Generic IC.
Found 10 results for Relay SPST NO.
Found 10 results for Solid State Relay SSR.
Thought for 12 sec
2/5 Find/add terminal blocks, generic PLC blocks, SMPS, relays, SSRs, pushbuttons, pumps, alarm, and RS-485 header
Thought for 5 sec
Found 1 results for Header 1x06.
Found 10 results for Terminal Block 6 Pin.
Found 4 results for normally open contact.
Found 10 results for DC Motor.
Found 10 results for buzzer.
Thought for 54 sec
Thought for a moment
Read IRM-30-24 datasheet for pin description input output 24V AC DC c.
Read CX240D5 datasheet for pin description solid state relay input .
Read RB105-DE datasheet for pin description 24VDC relay coil normall.
Thought for 26 sec
Thought for 10 sec
Read schematic.
Thought for a moment
Thought for 6 sec
Read schematic.
Thought for 18 sec
4/5 Add wire-color documentation notes to project files
Thought for 40 sec
Thought for a moment
5/5 Run schematic review and fix/justify issues
Thought for 7 sec
Completed design checks — found 126 issues.
Completed design checks — found 126 issues.
Completed design checks — found 126 issues.
Thought for 13 sec
5/5 tasks completed.
Thought for a moment
Finished working
Pin Mapping
| Function | GPIO / Pin | Connected To | Direction | Notes |
|---|---|---|---|---|
| I2C_SDA | GPIO4 | U4 SDA, R_SDA 4.7 kΩ pull-up | Bidirectional | SHT40 data line |
| I2C_SCL | GPIO5 | U4 SCL, R_SCL 4.7 kΩ pull-up | Output | SHT40 clock line |
| STATUS_LED | GPIO10 | R_LED then LED1 | Output | Active high LED |
| USB_D_N | GPIO18 | J1 DN1/DN2 through ESD D1 | USB | Native USB D- |
| USB_D_P | GPIO19 | J1 DP1/DP2 through ESD D1 | USB | Native USB D+ |
| ESP_BOOT_IO9 | GPIO9 | Boot button to GND, 10 kΩ pull-up | Input/strap | Hold BOOT while resetting to enter download mode |
| ESP_EN | EN | Reset button, 10 kΩ pull-up, 1 µF to GND | Reset | Pull low to reset |
platformio.iniIni
[env:esp32-c3-devkitm-1] platform = espressif32 board = esp32-c3-devkitm-1 framework = arduino monitor_speed = 115200 upload_speed = 460800 build_flags = -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=1 lib_deps = adafruit/Adafruit SHT4x Library@^1.0.5 h2zero/NimBLE-Arduino@^1.4.2
src/main.cppCpp
#include <Arduino.h> #include <Wire.h> #include <WiFi.h> #include <HTTPClient.h> #include <Adafruit_SHT4x.h> #include <NimBLEDevice.h> // Pin definitions from schematic #define I2C_SDA_PIN 4 #define I2C_SCL_PIN 5 #define STATUS_LED_PIN 10 #define BOOT_BUTTON_PIN 9 // SHT40 default I2C address is 0x44. The Adafruit driver handles this internally. #define SENSOR_READ_INTERVAL_MS 10000UL #define WIFI_RETRY_INTERVAL_MS 30000UL const char* WIFI_SSID = "YOUR_WIFI_SSID"; const char* WIFI_PASSWORD = "YOUR_WIFI_PASSWORD"; const char* HTTP_ENDPOINT = "http://example.local/environment"; Adafruit_SHT4x sht4; unsigned long lastSensorRead = 0; unsigned long lastWifiAttempt = 0; bool sensorReady = false; NimBLEServer* bleServer = nullptr; NimBLECharacteristic* envCharacteristic = nullptr; static void setStatusLed(bool on) { digitalWrite(STATUS_LED_PIN, on ? HIGH : LOW); } static void initI2CAndSensor() { Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN, 400000); sensorReady = sht4.begin(&Wire); if (!sensorReady) { Serial.println("ERROR: SHT40 not found on I2C address 0x44"); return; } sht4.setPrecision(SHT4X_HIGH_PRECISION); sht4.setHeater(SHT4X_NO_HEATER); // Keep heater off for low-power normal operation. Serial.println("SHT40 initialized"); } static void initWiFi() { WiFi.mode(WIFI_STA); WiFi.setSleep(true); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); lastWifiAttempt = millis(); Serial.print("Connecting to WiFi"); } static void maintainWiFi() { if (WiFi.status() == WL_CONNECTED) { return; } unsigned long now = millis(); if (now - lastWifiAttempt >= WIFI_RETRY_INTERVAL_MS) { Serial.println("Retrying WiFi connection"); WiFi.disconnect(true); delay(50); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); lastWifiAttempt = now; } } static void initBLE() { NimBLEDevice::init("EnvNode-C3"); NimBLEDevice::setPower(ESP_PWR_LVL_N0); // Conservative BLE TX power for consumer node. bleServer = NimBLEDevice::createServer(); NimBLEService* service = bleServer->createService("181A"); // Environmental Sensing service envCharacteristic = service->createCharacteristic( "2A6E", // Temperature characteristic UUID NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::NOTIFY); envCharacteristic->setValue("0.00 C, 0.00 %RH"); service->start(); NimBLEAdvertising* adv = NimBLEDevice::getAdvertising(); adv->addServiceUUID("181A"); adv->setScanResponse(true); adv->start(); Serial.println("BLE environmental service advertising"); } static bool readSHT40(float& temperatureC, float& humidityPercent) { if (!sensorReady) { return false; } sensors_event_t humidity; sensors_event_t temp; bool ok = sht4.getEvent(&humidity, &temp); if (!ok) { Serial.println("ERROR: SHT40 read failed"); return false; } temperatureC = temp.temperature; humidityPercent = humidity.relative_humidity; return true; } static void publishWiFi(float temperatureC, float humidityPercent) { if (WiFi.status() != WL_CONNECTED) { Serial.println("WiFi not connected; skipping HTTP publish"); return; } HTTPClient http; http.begin(HTTP_ENDPOINT); http.addHeader("Content-Type", "application/json"); String payload = "{\"temperature_c\":" + String(temperatureC, 2) + ",\"humidity_percent\":" + String(humidityPercent, 2) + "}"; int code = http.POST(payload); Serial.printf("HTTP POST %d: %s\n", code, payload.c_str()); http.end(); } static void publishBLE(float temperatureC, float humidityPercent) { if (envCharacteristic == nullptr) { return; } char payload[48]; snprintf(payload, sizeof(payload), "%.2f C, %.2f %%RH", temperatureC, humidityPercent); envCharacteristic->setValue((uint8_t*)payload, strlen(payload)); envCharacteristic->notify(); } void setup() { pinMode(STATUS_LED_PIN, OUTPUT); pinMode(BOOT_BUTTON_PIN, INPUT_PULLUP); setStatusLed(false); Serial.begin(115200); delay(500); Serial.println("USB-C WiFi/BLE Environmental Sensor Node booting"); initI2CAndSensor(); initBLE(); initWiFi(); } void loop() { maintainWiFi(); unsigned long now = millis(); if (now - lastSensorRead >= SENSOR_READ_INTERVAL_MS) { lastSensorRead = now; float temperatureC = 0.0f; float humidityPercent = 0.0f; if (readSHT40(temperatureC, humidityPercent)) { setStatusLed(true); Serial.printf("T=%.2f C, RH=%.2f %%\n", temperatureC, humidityPercent); publishBLE(temperatureC, humidityPercent); publishWiFi(temperatureC, humidityPercent); delay(25); setStatusLed(false); } else { for (int i = 0; i < 3; ++i) { setStatusLed(true); delay(80); setStatusLed(false); delay(80); } } } delay(10); }
Bash
pio run pio run -t upload pio device monitor
pio run -t upload.SENSOR_READ_INTERVAL_MS to reduce Wi-Fi activity.Welcome 👋
Flux helps you build PCBs faster with an AI teammate!
Create your account to collaborate, stay updated, fork your own version, and get instant answers from our AI agent.