WiFi & Bluetooth Sensor Node

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 demo is finished. It didn't use any ACUs. You can now continue working with this project like normal.

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

USB-C WiFi BLE TH Sensor

USB-C WiFi BLE TH Sensor thumbnail
Consumer USB-C powered environmental sensor node with Wi-Fi, BLE 5.x, digital temperature/humidity sensing, protected 5 V input, and a 3.3 V low-power MCU/sensor rail.

Properties

WiFi

USB-C

Consumer IoT

5

V

Bluetooth

Pricing & Availability

Distributor

Qty 1

Arrow

$3.90–$6.53

Digi-Key

$0.00

HQonline

$3.72–$3.82

LCSC

$5.53–$5.70

Mouser

$26.67

TME

$1.00

Verical

$5.02–$8.14

Controls