WiFi & Bluetooth Sensor Node


Worked for 3 mins 18 sec
6/6 Run schematic/design checks and fix actionable issues

Rename project, create specification, and record initial requirements/power budget

Select library parts for MCU, T/RH sensor, USB-C input, regulator, and protection

Add main components and supporting passives to the schematic

Wire USB-C power/protection, 3.3 V rail, MCU boot/debug, USB data, I2C sensor, and indicators

Create firmware/regulatory/bring-up project files

Run schematic/design checks and fix actionable issues

Thought for 46 sec
Reading project docs.
Getting a BOM overview.
Completed 11 design checks — found 114 issues.
Thought for 42 sec — Verifying eFuse features
Read U2, TPS259530DSGT datasheets.
Thought for a moment
Searching for eFuse solutions
I need to address the issue with TPS2596 that requires fixing since the user needs the reverse. It looks like I have to replace or add an ideal diode. To do that, I should search for a part with back-to
Implemented the schematic for the USB-C powered Wi‑Fi/BLE temperature/humidity node. It uses a SiWG917 Wi‑Fi/BLE 5.4 module, SHT41 T/RH sensor, USB-C sink input, TPS25940 true reverse-blocking eFuse with OVP/UVLO/OCP/soft-start, MP28301 3.3 V buck regulator, ESD protection, reset/ISP/SWD debug, I2C pull-ups, and status LED.
Created project files:
Open items:
  • PCB layout/routing is not done yet, so airwire DRC errors are expected.
  • Generic passives still need final manufacturer MPNs before manufacturing export.
  • Layout must enforce the SiWG917 antenna keepout and thermal isolation around the SHT41.
Suggested next steps:
  1. Set board size/stackup and move into PCB placement.
  2. Place U1 at the board edge with antenna keepout and U4 away from heat sources.
  3. Route power, buck, I2C, SWD/UART, and USB-C protection paths.
  4. Assign final passive MPNs and run full DRC/manufacturing checks.
Place route and MPNs
Start PCB placement
Assign passive MPNs
Route the PCB
Run full review

Demo Complete

The guided demo is finished. You watched Flux replay a real design session in this read-only project. Sign up to build your own project.


Firmware Starter — SiWG917 USB-C WiFi/BLE T/RH Sensor
Platform & Toolchain
  • MCU module: U1 — SIWG917Y111MGABAR, Silicon Labs SiWG917 Wi-Fi 6 + BLE 5.4 module
  • Recommended SDK: Silicon Labs WiSeConnect SDK / Simplicity Studio for SiWx917
  • Programming/debug: J2 SWD plus UART ISP pins; SW2 pulls SWO_ISP low for ISP entry
  • Sensor: U4 — SHT41-AD1B-R2 at I2C address 0x44
Pin Mapping

Table


FunctionSchematic Pin / NetConnected ToDirectionNotes
I2C SDAU1:ULP_GPIO_0 / I2C_SDAU4 SDA, R9 10 kΩ pull-upBidirectionalSHT41 address 0x44
I2C SCLU1:ULP_GPIO_1 / I2C_SCLU4 SCL, R10 10 kΩ pull-upOutputShort on-board bus
Status LEDU1:ULP_GPIO_8 / STATUS_LEDR11 1 kΩ → LED1 → GNDOutputDrive high to turn on
eFuse faultU1:UULP_VBAT_GPIO_3 / EFUSE_FLT_NU2 FLT, R7 pull-upInputActive-low fault
Power-goodU1:UULP_VBAT_GPIO_2 / PWR_PGOODU3 PG1, R8 pull-upInputActive-high/open-drain good via pull-up
SWDIOU1:JTAG_TMS_SWDIO / SWDIOJ2 pin 2DebugSWD data
SWCLKU1:JTAG_TCK_SWCLK / SWCLKJ2 pin 4DebugSWD clock
UART RX MCUU1:GPIO_8 / UART_RX_MCUJ2 pin 7InputISP UART RX
UART TX MCUU1:GPIO_9 / UART_TX_MCUJ2 pin 8OutputISP UART TX
ResetU1:POC_IN, RESET_NSW1, J2 pin 10Input/resetPOC_IN reset button, RESET_N monitor/debug
Example Project Configuration
Use a SiWx917 WiSeConnect SDK example project as the base, then add the SHT41 driver below. In Simplicity Studio, create a SiWx917 SoC Wi-Fi station example, enable I2C/ULP I2C, and map the board pin macros to the schematic nets.

C


// app_pinmap.h — map these to the SDK GPIO/port macros for your selected SiWx917 board support package.
#pragma once

#define PIN_I2C_SDA_NET        "ULP_GPIO_0"   // schematic net I2C_SDA
#define PIN_I2C_SCL_NET        "ULP_GPIO_1"   // schematic net I2C_SCL
#define PIN_STATUS_LED_NET     "ULP_GPIO_8"   // schematic net STATUS_LED
#define PIN_EFUSE_FLT_N_NET    "UULP_VBAT_GPIO_3"
#define PIN_PWR_PGOOD_NET      "UULP_VBAT_GPIO_2"
#define SHT41_I2C_ADDR         0x44u
#define SENSOR_INTERVAL_MS     5000u
Complete Firmware Source

C


#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>

#include "sl_status.h"
#include "sl_sleeptimer.h"
#include "sl_wifi.h"
#include "sl_net.h"
#include "app_pinmap.h"

// Replace these three low-level functions with the SiWx917 SDK I2C/GPIO calls selected in the project configurator.
extern sl_status_t board_i2c_write(uint8_t addr, const uint8_t *data, uint16_t len);
extern sl_status_t board_i2c_read(uint8_t addr, uint8_t *data, uint16_t len);
extern void board_gpio_write_status_led(bool on);
extern bool board_gpio_read_efuse_fault_n(void);
extern bool board_gpio_read_pwr_pgood(void);
extern void board_platform_init(void);
extern uint32_t board_millis(void);

static uint8_t sht4x_crc8(const uint8_t *data, uint8_t len) {
  uint8_t crc = 0xFF;
  for (uint8_t i = 0; i < len; i++) {
    crc ^= data[i];
    for (uint8_t bit = 0; bit < 8; bit++) {
      crc = (crc & 0x80) ? (uint8_t)((crc << 1) ^ 0x31) : (uint8_t)(crc << 1);
    }
  }
  return crc;
}

static sl_status_t sht41_read(float *temp_c, float *rh_pct) {
  const uint8_t cmd = 0xFD; // high precision T/RH measurement
  uint8_t rx[6] = {0};
  sl_status_t st = board_i2c_write(SHT41_I2C_ADDR, &cmd, 1);
  if (st != SL_STATUS_OK) return st;

  sl_sleeptimer_delay_millisecond(10);
  st = board_i2c_read(SHT41_I2C_ADDR, rx, sizeof(rx));
  if (st != SL_STATUS_OK) return st;

  if (sht4x_crc8(&rx[0], 2) != rx[2] || sht4x_crc8(&rx[3], 2) != rx[5]) {
    return SL_STATUS_FAIL;
  }

  uint16_t t_ticks = ((uint16_t)rx[0] << 8) | rx[1];
  uint16_t rh_ticks = ((uint16_t)rx[3] << 8) | rx[4];
  *temp_c = -45.0f + 175.0f * ((float)t_ticks / 65535.0f);
  *rh_pct = -6.0f + 125.0f * ((float)rh_ticks / 65535.0f);
  if (*rh_pct > 100.0f) *rh_pct = 100.0f;
  if (*rh_pct < 0.0f) *rh_pct = 0.0f;
  return SL_STATUS_OK;
}

static void wifi_start_station(void) {
  // Start from a Silicon Labs SiWx917 Wi-Fi station example and fill credentials in the SDK config.
  // Keep this call non-fatal: the sensor node should still report over UART/debug if Wi-Fi is unavailable.
  sl_wifi_init(NULL, NULL, NULL);
}

void app_init(void) {
  board_platform_init();
  board_gpio_write_status_led(false);
  wifi_start_station();
  printf("SiWG917 T/RH sensor node starting\n");
}

void app_process_action(void) {
  static uint32_t last_ms = 0;
  uint32_t now = board_millis();
  if ((now - last_ms) < SENSOR_INTERVAL_MS) return;
  last_ms = now;

  bool power_good = board_gpio_read_pwr_pgood();
  bool efuse_ok = board_gpio_read_efuse_fault_n();
  if (!power_good || !efuse_ok) {
    printf("Power warning: PGOOD=%u EFUSE_FLT_N=%u\n", power_good, efuse_ok);
  }

  float temp_c = 0.0f, rh = 0.0f;
  sl_status_t st = sht41_read(&temp_c, &rh);
  if (st == SL_STATUS_OK) {
    board_gpio_write_status_led(true);
    printf("T=%.2f C RH=%.2f %%\n", temp_c, rh);
    // TODO: publish over Wi-Fi HTTP/MQTT or expose over BLE GATT characteristic.
    board_gpio_write_status_led(false);
  } else {
    printf("SHT41 read failed: 0x%08lx\n", (unsigned long)st);
  }
}
Build & Flash Instructions
  1. Create/import a Silicon Labs SiWx917 SoC Wi-Fi station example in Simplicity Studio.
  2. Add the source above as app.c and implement the board-specific I2C/GPIO wrappers using the SDK configurator.
  3. Build with Simplicity Studio or slc generate && make if using the command-line Silicon Labs flow.
  4. Flash using SWD on J2: pin 1 = 3V3, pin 2 = SWDIO, pin 3/5/9 = GND, pin 4 = SWCLK, pin 10 = RESET_N.
  5. To enter UART ISP mode, hold SW2 during reset and use J2 pin 7/8 for MCU UART RX/TX.
  • Platform & Toolchain

  • Pin Mapping

  • Example Project Configuration

  • Complete Firmware Source

  • Build & Flash Instructions