NE-WX1 Atmospheric Measurement System
Six-channel atmospheric measurement instrument purpose-built for motorsports. Feeds real-time environmental
data into the NumberEdge CIPM-2007 prediction pipeline at 1 Hz. Dual connectivity (WiFi + USB-C), integrated
IPS display, aspirated sensor enclosure. Track surface temperature estimated via solar load model or manual entry.
The data layer that makes everything else possible.
Measurement Specifications
| Channel | Sensor | Accuracy | Range |
| Temperature | Sensirion SHT45 | ±0.1°C (±0.18°F) | -40 to +125°C |
| Relative Humidity | Sensirion SHT45 | ±1.0% RH | 0–100% RH |
| Barometric Pressure | Bosch BMP390 | ±3 Pa relative (±0.001 inHg) | 300–1250 hPa |
| Wind Speed | Davis 6410 | ±5% or 1 mph | 1–200 mph |
| Wind Direction | Davis 6410 | ±7° | 0–360° |
| Track Surface Temp (Est.) | Solar load model + manual | Model-dependent | — |
| Ambient Light | Vishay VEML7700 | 16-bit resolution | 0–120,000 lux |
Derived Outputs (Computed at 1 Hz)
All derived atmospheric values are computed both on the instrument and in the NumberEdge Race Deck using metrological-grade formulas (CIPM-2007, Buck-1996, Hardy-1998):
- NHRA Correction Factor — Standard drag racing air density correction
- SAE J1349 Correction Factor — SAE horsepower correction standard
- CIPM-2007 Air Density — Metrological-grade density via virial equation of state
- Air Density Ratio (ADR) — Percentage of standard-day density
- Density Altitude — Standard atmosphere equivalent altitude
- Pressure Altitude — Altitude from pressure alone (no temperature correction)
- Vapor Pressure — Partial pressure of water vapor (inHg)
- Humidity Grains — Grains of moisture per pound of dry air
- Dew Point — Alduchov & Eskridge (1996) formulation
- Wet Bulb Temperature — Stull (2011) approximation
- Headwind / Crosswind — Decomposed from track heading
- Estimated Track Surface Temp — Solar load model from air temp + lux + time of day, or manual IR gun entry
Connectivity
WiFi (802.11 b/g/n, 2.4 GHz)
- Connects to any standard WiFi network
- WebSocket data stream at 1 Hz to the Race Deck and all connected clients
- HTTP REST API for integration with external systems
- mDNS discovery (
numberedge-wx.local)
- Concurrent client support — driver, crew chief, and tuner all receive simultaneous feeds
- OTA firmware deployment over WiFi
USB-C (Serial, 115200 baud)
- Direct wired connection to any laptop — no network required
- JSON data stream at 1 Hz over USB CDC serial
- Simultaneous battery charging during operation
- Zero configuration — connect and acquire
Both interfaces operate simultaneously. The Race Deck auto-detects the connection method and prioritizes USB when both are available.
WiFi is not required for operation — the instrument functions fully over USB-C and the integrated display.
Integrated Display
2.0″ IPS TFT (240×320), sunlight-readable with wide viewing angles. Displays CF and Density Altitude as primary readouts with secondary
metrics on rotation. Operates independently of any external device — the instrument is fully functional standalone.
- Primary: Correction Factor (color-coded by magnitude) + Density Altitude
- Secondary: Rotating readout of temperature, humidity, barometer, wind, grains, VP, dew point, wet bulb
- Status: WiFi signal, battery level, connection state, sensor health
Sensor Enclosure
Aspirated multi-plate radiation shield with forced airflow. Engineered for accurate measurement in direct sunlight,
radiant heat from track surfaces, and proximity to engine exhaust.
- Aspiration: 40mm brushless fan, PWM-controlled, drawing ambient air across the SHT45 element
- Shield: Stacked louver plates (Stevenson screen geometry), white UV-resistant housing
- Display window: Flush-mounted IPS panel visible from outside the enclosure
- Track temp: Estimated from ambient air temp + solar load (lux) + time of day. Manual override via IR gun reading in Race Deck.
- Light sensor: VEML7700 mounted with clear sky view for solar load measurement
- Wind mast: Davis 6410 anemometer and vane mounted above enclosure, unobstructed
- Mounting: Tripod, canopy pole, or trailer awning support at 4–5 ft above grade
Competitive Position
The Computech RaceAir Pro ($749) has been the industry standard since the early 2000s. It measures three atmospheric
variables on a 10-second cycle over a proprietary serial link. The NE-WX1 measures six variables at 10x the sample
rate with higher accuracy on every channel, estimates track surface temperature via solar load model, and feeds directly
into a prediction engine that turns weather data into actionable race intelligence.
| Specification | Computech RaceAir Pro | NumberEdge NE-WX1 |
| Temperature | ±1.0°F (thermistor) | ±0.18°F (CMOSens) |
| Humidity | ±2% RH (capacitive) | ±1% RH (CMOSens) |
| Pressure | ±0.01 inHg | ±0.001 inHg (relative) |
| Wind | Cup + vane (add-on) | Cup + vane (integrated) |
| Track Surface Temp | IR probe (add-on) | Solar load model + manual IR gun |
| Ambient Light | None | 16-bit lux sensor |
| Sample Rate | 0.1 Hz (10 sec) | 1 Hz (1 sec) |
| Display | Reflective LCD | IPS TFT + any browser |
| Interface | RS-232 (1 client) | WiFi + USB-C (unlimited) |
| CF Computation | NHRA standard | NHRA + CIPM-2007 + SAE J1349 |
| Prediction Pipeline | None | Progressive regression model |
| Remote Updates | None | OTA firmware deployment |
Data Integration
NumberEdge Dial Lab
The NE-WX1 is the primary data source for NumberEdge Dial Lab. Dial Lab ingests raw
sensor data and applies the full CIPM-2007 atmospheric model to compute CF, density altitude, and predicted ET.
The prediction engine learns each vehicle's specific response to atmospheric conditions through progressive
regression (naive → linear CF → multivariate → full stepwise), delivering predictions that improve
with every run logged.
REST API
GET /api/weather # Current readings + system state (JSON)
GET /api/status # Diagnostics: sensor health, heap, calibration, clients
POST /api/calibrate # Apply measurement offsets (persisted to flash)
WS ws://:81/ # 1 Hz JSON push to all connected clients
JSON Payload
{
"temp_f": 62.3, "humidity_pct": 48.0,
"pressure_inhg": 30.120,
"wind_speed_mph": 3.2, "wind_direction_deg": 185,
"sunlight_lux_k": 42.5,
"est_track_temp_f": 118.4,
"temp_c": 16.83, "pressure_hpa": 1020.1,
"battery_pct": 87, "battery_v": 3.92,
"uptime_sec": 3600, "firmware": "2.0.0",
"rssi": -45, "ip": "192.168.1.100"
}
Failed sensors return null. The system degrades gracefully — each channel operates independently.
USB Serial Stream
Identical JSON payload transmitted at 1 Hz over USB CDC (115200/8N1). Each frame is a complete JSON object terminated by newline.
Calibration
All sensors ship factory-calibrated. Field calibration offsets can be applied to match a reference standard (e.g., Kestrel 5500, laboratory hygrometer, NIST-traceable barometer).
Procedure
- Co-locate the NE-WX1 and reference instrument in a shielded, equilibrated environment for a minimum of 10 minutes
- Record simultaneous readings from both instruments
- Compute offset:
offset = reference − NE-WX1
- Apply via API:
POST /api/calibrate
{"temp_offset_f": 0.3, "humidity_offset": -0.5, "pressure_offset_inhg": 0.002}
- Offsets persist in non-volatile storage across power cycles
Barometric pressure from airport METAR/AWOS is sea-level corrected. Station pressure (absolute) is required.
Convert: P_station = P_altimeter × (1 - 6.8753×10&supmin;&sup5; × elevation_ft)^5.2559
Power
- USB-C: 5V, 300mA typical draw (WiFi + display + fan + all sensors active). Simultaneous data streaming and charging.
- Battery: Internal 3.7V 2000mAh LiPo. 8–10 hours runtime. Auto-charges on USB-C connection. Level reported in telemetry.
- Compatible sources: Laptop USB, phone charger, portable battery pack. Any 5V USB-C source with 500mA+ capacity.
Component Procurement
Every component required to build one NE-WX1 unit. All parts listed are the exact manufacturer SKUs used in our production units. Order everything before starting assembly.
Core Electronics
| Component | Part Number | Qty | Price | Source |
| Microcontroller — Seeed Studio XIAO ESP32-S3 | XIAO-ESP32S3 | 1 | $7.49 | seeedstudio.com |
| Temperature / Humidity — Adafruit SHT45 (STEMMA QT) | Adafruit #5665 | 1 | $12.50 | adafruit.com |
| Barometric Pressure — Adafruit BMP390 (STEMMA QT) | Adafruit #4816 | 1 | $10.95 | adafruit.com |
| Ambient Light — Adafruit VEML7700 (STEMMA QT) | Adafruit #4162 | 1 | $4.95 | adafruit.com |
| IPS Display — Adafruit 2.0″ 320x240 TFT (ST7789) | Adafruit #4311 | 1 | $19.95 | adafruit.com |
Wind Sensor
| Component | Part Number | Qty | Price | Source |
| Anemometer + Wind Vane — Davis 6410 | Davis 6410 | 1 | $240.00 | Amazon / Davis Direct |
The Davis 6410 includes the cup anemometer, wind vane, and 40 ft (12 m) of cable with an RJ-11 connector. Do not substitute with Davis 7911 (incompatible pinout).
Wiring & Interconnects
| Component | Part Number | Qty | Price | Source |
| STEMMA QT Cable — 100mm (JST SH 4-pin) | Adafruit #4210 | 3 | $0.95 ea | adafruit.com |
| STEMMA QT Cable — 200mm (longer run for light sensor) | Adafruit #4401 | 1 | $1.25 | adafruit.com |
| 10kΩ Resistor (wind speed pullup) | any 10k 1/4W | 2 | $0.10 | Any electronics supplier — Adafruit 220-pack $7.95 |
| N-Channel MOSFET — IRLZ44N (fan control) | IRLZ44N | 1 | $1.50 | Amazon |
| Half-size breadboard | Adafruit #4539 | 1 | $5.00 | adafruit.com |
| Jumper wires (male/male + male/female assortment) | Adafruit #1957 | 1 | $1.95 | adafruit.com |
| RJ-11 Breakout Board (optional — avoids cutting Davis cable) | generic | 1 | $3.00 | Amazon |
Power
| Component | Part Number | Qty | Price | Source |
| 3.7V 2000mAh LiPo Battery (JST PH 2-pin) | Adafruit #2011 | 1 | $12.50 | adafruit.com |
| JST PH to JST SH Battery Adapter Cable | Adafruit #4714 | 1 | $0.75 | adafruit.com |
| USB-C Cable (data capable, 6 ft) | any USB-C data cable | 1 | $8.00 | Amazon — must be data-capable, not charge-only |
Enclosure & Mounting
| Component | Part Number | Qty | Price | Source |
| 40mm 5V Brushless Fan — Noctua NF-A4x10 5V | NF-A4x10 5V | 1 | $15.95 | Amazon |
| Radiation shield / Stevenson screen | Ambient Weather SRS100LX or 3D-printed | 1 | $25.00 | Amazon |
| Tripod mount (camera tripod, 4–5 ft) | any standard ¼″-20 tripod | 1 | $20.00 | Amazon |
| Velcro cable ties + foam tape (battery/board mounting) | — | 1 | $5.00 | Amazon |
| Waterproof project enclosure (120×80×55mm or similar) | — | 1 | $8.00 | Amazon |
Tools Needed
| Tool | Price | Notes |
| Computer with USB-C port | — | Mac, Windows, or Linux |
| Arduino IDE 2.x | Free | arduino.cc/en/software |
| Soldering iron + solder | $25–40 | Amazon — only needed for MOSFET fan circuit (optional — can use pre-wired fan) |
| Wire strippers | $8 | Amazon — for Davis 6410 cable leads |
| Small Phillips screwdriver | $3 | For terminal blocks if used |
| Multimeter (optional) | $15 | Amazon — helpful for verifying connections |
Total Build Cost
| Core Electronics (MCU + 3 sensors + display) | $55.84 |
| Wind Sensor (Davis 6410) | $240.00 |
| Wiring & Interconnects | $13.65 |
| Power (battery + adapter + USB-C cable) | $21.25 |
| Enclosure & Mounting | $73.95 |
| Total (everything, ready to build) | $404.69 |
| Tools (if you don't already own them) | +$51–66 |
Prices as of April 2026. All components available with standard shipping. Order from Adafruit + Amazon and have everything in 2–3 days.
Assembly Guide
Step-by-step instructions for building one NE-WX1 unit from the component list above. Every connection is described in detail.
If you have never built electronics before, you can do this — most of the build is plugging cables into connectors.
Before you start: Unbox everything and lay it out on a clean, flat surface. Make sure you have all components listed above.
Read through the entire guide once before doing anything. Work in a well-lit area. Static electricity can damage components —
touch a metal object (like a doorknob or the USB port of your laptop) before handling circuit boards to discharge yourself.
Step 1: Identify Your Parts
Lay everything out and match each item to this list. Every sensor board has text printed on it telling you what it is.
- XIAO ESP32-S3 — Tiny green board, about the size of a postage stamp. Has a USB-C port on one end. This is the brain.
- SHT45 board — Small purple Adafruit board, says "SHT4x" on it. Has two small white connectors (STEMMA QT ports) on each end. Measures temperature and humidity.
- BMP390 board — Small purple Adafruit board, says "BMP390" on it. Has two STEMMA QT ports. Measures barometric pressure.
- VEML7700 board — Small purple Adafruit board, says "VEML7700". Has two STEMMA QT ports. Measures ambient light.
- TFT display — 2-inch color screen. Has pins along one edge. This is the built-in display.
- STEMMA QT cables — Thin black cables with tiny white 4-pin connectors on each end. These connect the sensor boards together. You should have three 100mm (short) and one 200mm (long).
- Davis 6410 — The wind sensor assembly with cups and a vane. Has a long cable ending in an RJ-11 (phone jack style) plug.
- LiPo battery — Flat rectangular pouch battery with a small red JST connector.
- Fan — Small 40mm square fan with two wires.
- Breadboard or proto board — Plastic board with rows of holes for making electrical connections.
Step 2: Connect the XIAO ESP32-S3 to Your Computer
Before building anything, let's make sure the microcontroller works.
- Take the XIAO ESP32-S3 board and plug the USB-C cable into it.
- Plug the other end of the USB-C cable into your computer.
- A small LED on the board may blink or glow. This means it has power.
- Open Arduino IDE on your computer.
- Go to File → Preferences. In the "Additional Boards Manager URLs" field, paste:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Click OK.
- Go to Tools → Board → Boards Manager. Search for "esp32". Install "esp32 by Espressif Systems" (version 3.x).
- Go to Tools → Board and select "XIAO_ESP32S3" (under ESP32S3 Dev Module if XIAO isn't listed).
- Go to Tools → Port and select the port that appeared when you plugged in the board (on Mac it looks like
/dev/cu.usbmodem..., on Windows it's COM3 or similar).
- Go to Tools → USB CDC On Boot and set it to "Enabled". This is critical for serial communication.
- If the port doesn't appear: try a different USB-C cable (some cables are charge-only and don't carry data). Also try pressing the tiny "RST" button on the XIAO board while plugging it in.
Step 3: Plug In the I2C Sensor Chain (No Soldering)
This is the easiest part. Three of the four sensor boards (SHT45, BMP390, VEML7700) have STEMMA QT connectors — small white rectangular
sockets. The cables snap in with a satisfying click. The connectors are keyed so you cannot plug them in backwards.
- Connect XIAO → SHT45:
The XIAO ESP32-S3 does not have a built-in STEMMA QT port, so you need to use jumper wires for this first connection. Take a STEMMA QT cable and cut ONE end off.
You'll see 4 wires inside: Red (3V3), Black (GND), Blue (SDA / data), Yellow (SCL / clock).
Strip about 3mm of insulation from each cut wire end and connect them to the XIAO pins using the breadboard:
• Red wire → XIAO pin labeled 3V3
• Black wire → XIAO pin labeled GND
• Blue wire (SDA) → XIAO pin labeled D3 (this is GPIO5)
• Yellow wire (SCL) → XIAO pin labeled D4 (this is GPIO6)
Plug the intact STEMMA QT end into either port on the SHT45 board. You'll hear/feel a click.
- Connect SHT45 → BMP390:
Take a 100mm STEMMA QT cable. Plug one end into the other (unused) STEMMA QT port on the SHT45 board. Plug the other end into either port on the BMP390 board. Click, click. Done.
- Connect BMP390 → VEML7700:
Take the 200mm (longer) STEMMA QT cable. Plug one end into the unused port on the BMP390 board, the other end into either port on the VEML7700 board. Use the longer cable here because the light sensor will be mounted with a clear sky view, away from other components.
That's it for three of the four sensors. They are now daisy-chained on a shared I2C data bus. Power, ground, and both data lines run through every cable.
Step 4: Wire the TFT Display (SPI Connection)
The display uses SPI, which is a different communication protocol from I2C. It needs its own dedicated wires to the XIAO.
- The TFT display has labeled pins along one edge. Use jumper wires to connect each pin to the XIAO as follows:
| TFT Pin | XIAO Pin |
| VIN (or VCC) | 3V3 |
| GND | GND |
| SCK (Clock) | D5 (GPIO7) |
| MOSI (Data In / SI) | D7 (GPIO9) |
| CS (Chip Select) | D8 (GPIO8) |
| DC (Data/Command / RS) | D9 (GPIO10) |
| RST (Reset) | 3V3 (tie high) |
| BL (Backlight) | 3V3 (always on) or a GPIO for dimming |
- Double-check every connection. The display will show nothing (blank/white) until the firmware drives it. A wrong connection won't damage it but it won't work either.
Step 5: Wire the Davis 6410 Wind Sensor
The Davis 6410 cable terminates in an RJ-11 plug. You need to either cut the plug off and wire directly, or use an RJ-11 breakout board.
- Option A — Cut the RJ-11 plug and wire directly:
Cut the plug off the end of the cable. Strip about 5mm of each wire. The Davis 6410 uses 4 wires:
| Wire Color | Function | Connect To |
| Red | Wind speed signal (reed switch closure) | XIAO D0 (GPIO2) + 10kΩ pullup to 3V3 |
| Black | Ground (shared) | XIAO GND |
| Green | Wind direction (potentiometer wiper) | XIAO D1 (GPIO3) — ADC input |
| Yellow | Direction reference voltage | XIAO 3V3 |
- Install the 10kΩ pullup resistor:
The wind speed signal is a reed switch that connects to ground when the cups spin. The XIAO needs a pullup resistor to detect this.
On the breadboard, connect one leg of a 10kΩ resistor to the 3V3 rail and the other leg to the same row as the wind speed wire (XIAO D0 / GPIO2). This ensures the pin reads HIGH normally and gets pulled LOW on each cup rotation.
- Option B — Use an RJ-11 breakout:
If you don't want to cut the cable, get an RJ-11 breakout board (search "RJ-11 breakout" on Adafruit or Amazon). Plug the Davis cable in and wire from the breakout screw terminals using the same pin mapping above.
Step 6: Wire the Fan Circuit
The aspirating fan keeps air moving over the SHT45 sensor for accurate temperature readings. The fan requires more current than the XIAO GPIO can provide directly, so we use a MOSFET as a switch.
- MOSFET wiring (IRLZ44N or 2N7000):
The MOSFET has three legs. Hold it with the flat side facing you and the legs pointing down:
• Left leg (Gate) → connect to XIAO D0 (GPIO1) via a jumper wire. This is the control signal.
• Middle leg (Drain) → connect to the NEGATIVE (black) wire of the fan.
• Right leg (Source) → connect to GND on the breadboard.
Then connect the POSITIVE (red) wire of the fan directly to the 5V pin on the XIAO (labeled "5V" or "VBUS" — this is the USB 5V rail).
- How it works: When the XIAO sets GPIO1 HIGH, the MOSFET allows current to flow through the fan. The firmware runs the fan at full speed by default. The fan will start spinning once the firmware is loaded.
Pin check: GPIO1 is labeled D0 on the XIAO ESP32-S3. Do NOT confuse this with GPIO2 (D1) which is used for wind speed.
The XIAO's silk-screen labels (D0, D1, D2...) do NOT match GPIO numbers. Always refer to the GPIO allocation table below.
Step 7: Connect the Battery (Optional)
The LiPo battery allows the NE-WX1 to run untethered for 8–10 hours.
- The XIAO ESP32-S3 has a small battery connector on the bottom side of the board (JST SH 1.25mm, 2-pin).
- The Adafruit #2011 battery has a JST PH 2.0mm connector, which is a different size. You need either:
- A JST PH-to-SH adapter cable, OR
- Cut the battery connector and solder on a JST SH 1.25mm plug (available from Adafruit #4208), OR
- Solder the battery wires directly to the battery pads on the XIAO board (labeled BAT+ and BAT-).
- IMPORTANT: Verify polarity before connecting. Red wire = positive. Black wire = negative. Reversed polarity will destroy the board.
- Once connected, the battery charges automatically whenever USB-C is plugged in.
Step 8: Install Arduino Libraries
Before flashing firmware, install all required libraries in Arduino IDE.
- Open Arduino IDE.
- Go to Sketch → Include Library → Manage Libraries.
- Search for and install each of these (click "Install" for each one):
ArduinoJson by Benoit Blanchon — version 7.x
Adafruit SHT4x Library by Adafruit
Adafruit BMP3XX Library by Adafruit
Adafruit VEML7700 Library by Adafruit
WebSockets by Markus Sattler (links2004)
TFT_eSPI by Bodmer
- When prompted to install dependencies (like "Adafruit Unified Sensor"), click "Install All".
TFT_eSPI configuration: After installing TFT_eSPI, you must edit its User_Setup.h file to match our pin assignments.
Find the library folder (usually ~/Arduino/libraries/TFT_eSPI/) and edit User_Setup.h:
• Set #define ST7789_DRIVER
• Set #define TFT_WIDTH 240 and #define TFT_HEIGHT 320
• Set pin defines: #define TFT_MOSI 9, #define TFT_SCLK 7, #define TFT_CS 8, #define TFT_DC 10, #define TFT_RST -1
Step 9: Flash the Firmware
- Open the firmware file:
numberedge-wx.ino from the tools/weather-station/firmware/numberedge-wx/ directory.
- Verify these settings in Tools menu:
- Board: XIAO_ESP32S3
- USB CDC On Boot: Enabled
- Upload Speed: 921600
- Port: your XIAO's port
- Click the Upload button (right arrow icon). Wait for compilation and upload to complete. This takes 1–2 minutes.
- When you see "Hard resetting via RTS pin..." in the console, the upload is complete.
Step 10: Verify Sensor Detection
After flashing, open the Serial Monitor (Tools → Serial Monitor, set baud to 115200).
- Press the RST button on the XIAO (or unplug/replug USB).
- Within 5 seconds, you'll see the boot sequence. Look for initialization messages for each sensor:
[SHT45] OK 0x44 ← Temperature/Humidity detected
[BMP390] OK 0x77 ← Barometric Pressure detected
[VEML7700] OK 0x10 ← Ambient Light detected
[TFT] ST7789 240x320
[Wind] GPIO2 pulse / GPIO3 ADC
[WiFi] Scanning...
- If a sensor shows FAIL: That sensor's wiring has a problem. Check the specific cable connection for that board. Common issues:
- STEMMA QT cable not fully clicked in — push harder, you'll feel/hear the click
- Cut wires touching each other (short circuit) — separate and re-strip
- The TFT display should light up and show the NumberEdge splash screen, then begin displaying CF and DA values.
Step 11: Configure WiFi
- With the Serial Monitor open, press RST on the XIAO.
- Within the first 5 seconds after boot, type the letter
c and press Enter.
- The firmware enters configuration mode. It will prompt you:
Enter WiFi SSID:
Type your WiFi network name and press Enter.
Enter WiFi Password:
Type your WiFi password and press Enter.
- The credentials are saved to flash memory and persist across reboots.
- The device will connect and display its IP address on both the serial monitor and the TFT screen.
- Important: The ESP32-S3 only supports 2.4 GHz WiFi. If your network is 5 GHz only, it will not connect. Most routers broadcast both — connect to the 2.4 GHz network (often has "2G" or "2.4" in the name).
Step 12: Verify the Web Dashboard
- On any phone or computer connected to the same WiFi network, open a browser.
- Navigate to
http://numberedge-wx.local — or use the IP address shown on the TFT display (e.g., http://192.168.1.100).
- You should see the NE-WX1 atmospheric dashboard with live-updating values for CF, DA, temperature, humidity, pressure, and all derived metrics.
- Breathe on the SHT45 sensor — you should see temperature and humidity spike upward within 1 second. This confirms the full data path from sensor to browser is working.
Step 13: Connect to NumberEdge Dial Lab
- Open NumberEdge Dial Lab on your laptop.
- Dial Lab auto-detects the NE-WX1 on the local network via mDNS.
- If auto-discovery fails, enter the IP address manually in Dial Lab's weather source settings.
- Live weather data now flows at 1 Hz into the full CIPM-2007 prediction pipeline. CF, DA, ADR, vapor pressure, grains, dew point, wet bulb, SAE CF, and all other derived values appear in the Race Deck's weather panel.
Step 14: Final Assembly into Enclosure
- Radiation shield: Mount the SHT45 and BMP390 inside the aspirated radiation shield (Stevenson screen). The fan should draw air in from the bottom and exhaust out the top, pulling ambient air across both sensors.
- Light sensor: Mount the VEML7700 on top of the enclosure with a clear view of the sky. Avoid shadowing from the wind sensor mast.
- Display: Mount the TFT in a window cut into the enclosure, visible from outside. The display face should be protected from rain and direct water contact.
- Wind sensor: Mount the Davis 6410 on a mast above the enclosure, as high and unobstructed as possible. Align the vane to match your track heading configuration.
- Microcontroller + breadboard: Secure the XIAO and breadboard inside the enclosure. Route the USB-C port to an accessible opening for charging and wired data connection.
- Battery: Secure the LiPo battery inside the enclosure with foam tape or a velcro strap. Keep it away from direct heat sources.
You're done. The NE-WX1 is now fully assembled and operational. Mount it at 4–5 feet above grade on a tripod, canopy pole, or trailer
awning support. Allow 5–10 minutes for thermal equilibration after power-on before using data for race decisions.
Technical Reference
Pin assignments, bus addresses, and library versions for firmware development and troubleshooting.
I2C Bus
| Module | Address | Interface |
| SHT45 (Temp/RH) | 0x44 | I2C, fixed address |
| BMP390 (Pressure) | 0x77 | I2C, 0x76 alternate |
| VEML7700 (Light) | 0x10 | I2C, fixed address |
All three I2C modules use JST SH 4-pin connectors in a daisy-chain topology. No address conflicts.
GPIO Allocation
| Function | Pin | Mode |
| I2C SDA | GPIO5 | I2C data |
| I2C SCL | GPIO6 | I2C clock |
| Wind speed | GPIO2 | Interrupt (pulse count) |
| Wind direction | GPIO3 | ADC input |
| Fan PWM | GPIO1 | PWM output (25 kHz) |
| TFT MOSI | GPIO9 | SPI data |
| TFT SCK | GPIO7 | SPI clock |
| TFT CS | GPIO8 | SPI chip select |
| TFT DC | GPIO10 | SPI data/command |
| Status LED | GPIO21 | Digital output |
Library Dependencies
| Library | Version | Purpose |
| ArduinoJson | 7.x | JSON serialization |
| Adafruit SHT4x | latest | Temperature + humidity driver |
| Adafruit BMP3XX | latest | Barometric pressure driver |
| Adafruit VEML7700 | latest | Ambient light driver |
| TFT_eSPI | latest | Display rendering (ST7789) |
| WebSockets (links2004) | latest | WebSocket server |
Verification
After assembly, verify sensor initialization via serial output:
[SHT45] OK 0x44 [BMP390] OK 0x77
[VEML7700] OK 0x10
[TFT] ST7789 240x320
[Wind] GPIO2 pulse / GPIO3 ADC
[WiFi] Connected 192.168.1.100 -42 dBm
Validate derived outputs against reference conditions:
| Reference Condition | Expected CF | Expected DA |
| 60°F / 0% RH / 29.92 inHg | 1.0000 | 0 ft (±50) |
| 90°F / 60% RH / 29.50 inHg | 1.08+ | 3,000+ ft |
| 40°F / 20% RH / 30.30 inHg | <0.97 | Negative |
Troubleshooting
Sensor Initialization Failure
- Verify I2C bus continuity (SDA, SCL, 3V3, GND) at each connector in the daisy-chain
- Confirm expected addresses with a bus scan (0x10, 0x44, 0x77)
- Firmware probes both 0x77 and 0x76 for the BMP390 automatically
- Each sensor initializes independently — a single failure does not block the system
Network
- WiFi credentials are configured via serial console at boot (type
c within 5 seconds of reset)
- 2.4 GHz networks only (802.11 b/g/n). 5 GHz is not supported.
- mDNS may not resolve on all network configurations — use IP address as fallback (displayed on TFT and serial output)
- If WiFi is unavailable, the instrument operates fully over USB-C
Measurement Drift
- Apply calibration offsets against a traceable reference (see Calibration above)
- Ensure the aspirated shield is functioning — fan failure causes thermal bias from solar loading
- Allow 5–10 minutes thermal equilibration after power-on before recording data
Wind Sensor
- Speed channel uses a reed switch closure — requires 10k pullup on the interrupt pin
- Direction uses a potentiometer with stable reference voltage — ADC noise manifests as directional jitter
- Cable runs to 50+ feet are acceptable without signal degradation