Phase 0 edge nodes — context. SenseCAP P1-Pro and RAK WisBlock are the correct hardware for solar/battery outdoor edge nodes at every phase. The mini-rack lab schema (Lab / compute) processes the data they produce — it does not replace them.
01
Ground node specifications
NODE A — FRONT YARD · FULL SUN
| Body (recommended) | SenseCAP Solar Node P1-Pro ~$100 |
| Body (DIY alt.) | RAK WisBlock Starter Kit ~$60 |
| Protocol / firmware | Meshtastic · 915 MHz (US) · SF7–SF12 |
| T / RH / pressure | BME280 · ±0.5°C · ±3% RH · I²C 0x76 |
| PAR / lux | TSL2591 · ~320–1100 nm corrected |
| UV index | VEML6075 · UV-A 315–400 nm · UV-B 280–315 nm |
| Soil moisture | Capacitive SEN0308 · MCP3008 ADC · SPI |
| Soil temperature | DS18B20 waterproof probe · 10 cm depth · 1-Wire |
| Wind | Anemometer + vane · Davis-compatible reed switch |
| Precipitation | Tipping rain gauge · 0.2 mm/tip typical |
| Antenna | External 3 dBi LoRa whip — mandatory |
| Power | 5–7 W solar + 18650 pack (2–4 cells) |
| Publish interval | Every 5–15 min · LoRa → Meshtastic → hub MQTT |
| Enclosure | IP65 junction box · Stevenson screen for BME280 |
NODE B — BACKYARD · UNDER CANOPY
| Body (recommended) | SenseCAP Solar Node P1-Pro ~$100 |
| Body (DIY alt.) | RAK WisBlock Starter Kit ~$60 |
| Protocol / firmware | Meshtastic · same channel + PSK as Node A |
| T / RH / pressure | BME280 — identical to Node A |
| PAR / lux | TSL2591 — canopy attenuation is the key datum |
| UV index | VEML6075 — UV reduction under canopy is measurable |
| Soil moisture | Capacitive SEN0308 |
| Soil temperature | DS18B20 waterproof probe |
| CO₂ — canopy key | MH-Z19C NDIR · ±50 ppm · UART 9600 · 5 V required |
| Wind / rain | Omit at ⅛ acre — Node A covers site |
| Antenna | External 3 dBi · elevate above canopy on mast |
| Solar panel | Orient to canopy gap — assess insolation before mounting |
| Purpose | Identical hardware to A — the contrast IS the experiment |
| Enclosure | IP65 · shade-mount for thermal accuracy |
SenseCAP vs RAK WisBlock: SenseCAP ships with solar, 18650 cells, IP65 enclosure, Grove I²C ports — sensors plug in without soldering. RAK WisBlock is more flexible at lower component cost but needs more assembly, custom enclosures, and soldering. Use SenseCAP for reliability on first deployment; RAK if you need sensors outside the Grove ecosystem.
Meshtastic 256-byte payload limit: At SF10/BW125, ~70–80 bytes usable per packet. 8–10 averaged sensor values fit comfortably. Do not bundle raw ADC streams or high-res profiles.
MH-Z19C CO₂ accuracy: ±50 ppm. Canopy differentials of 20–80 ppm above ~420 ppm ambient are close to noise floor. Consider SCD30 (±30 ppm) or SCD41 as alternatives. verify with expected delta before committing
TSL2591 saturation: Max ~88,000 lux. Full southern-latitude sun can exceed this. Check Node A initial readings — add ND filter if saturating. check first deployment
02
Field-scale node types — future reference
Met station / repeater — Phase 2+ field role
| SDR | RTL-SDR v3 (RX) or HackRF (TX/RX) |
| Met sensors | T/RH · wind · baro · rain · UV · PAR · lightning opt. |
| Tx power | +20–30 dBm · LOS range 5–15 km at SF12 |
| Mount | 3–6 m mast · IP67 pole-mount |
| Phase 0 equiv. | Node A + Node B (SenseCAP P1-Pro) |
Soil / edge sensor — Phase 2+ field role
| MCU | ESP32-S3 + SX1262 or RAK WisBlock nRF52840 |
| Sensors | NPK · pH · VWC · EC · CO₂ flux · soil temp |
| Sampling | 5–60 min · duty-cycled deep sleep |
| Battery life | 6–18 months unattended on LiPo + solar patch |
| Phase 0 equiv. | Soil sensors on Nodes A + B |
Gateway / backhaul — Phase 2+ field role
| SDR | USRP B205mini-i or LimeSDR Mini 2 |
| Backhaul | LTE-M · NB-IoT · Starlink (site-dependent) |
| Power | Solar + LiFePO₄ 100 Ah · 48 h autonomy target |
| Phase 0 equiv. | Hub Pi 4 #1 + RTL-SDR → Rack 1 Node 4 (target) |
Drone relay / sync — Phase 2+ field role
| SDR drone-mounted | PlutoSDR or USRP B200 |
| Protocol | MAVLink / OpenHD / ExpressLRS |
| Time sync | GPS-disciplined GPSDO · PPS |
| Video | 5.8 GHz OFDM adaptive bitrate |
| Phase 0 equiv. | Heltec V3 on DJI Mini — LoRa relay only, no MAVLink |
Hub — current vs target. Pi 4 testbed is active. Mini-rack target: Lab / compute. Pi #1 and Pi #2 migrate to specific Rack 1 nodes — not discarded.
01
Current hub — Phase 0 Pi testbed
HUB #1 — DATA BACKBONE · Pi 4 4 GB
| OS | Raspberry Pi OS Lite 64-bit · bookworm |
| MQTT broker | Mosquitto 2.x · port 1883 · local LAN only |
| Time-series DB | InfluxDB 2.7 — primary data store |
| Dashboards | Grafana 10+ · climate panels · A vs B delta |
| Mesh routing | Reticulum Network Stack (rnsd) as systemd service |
| Meshtastic GW | Heltec V3 or RAK Mini via USB → Python MQTT bridge |
| SDR hardware | RTL-SDR v3 Blog dongle via USB |
| 433 MHz decode | rtl_433 → MQTT · one dongle = one freq at a time |
| NOAA WX | rtl_fm · 162.400–162.550 MHz · separate dongle if concurrent |
| APRS | Direwolf 1.7 · 144.390 MHz (US) |
| ADS-B | dump1090-fa · 1090 MHz · optional |
| ETL | Node-RED + Python scripts |
| HA layer | Optional UI only — not primary store |
| Rack 1 target | Migrates to Node 4 (SDR) + Node A (orchestration) |
HUB #2 — SPATIAL + INGEST · Pi 4
| OS | Raspberry Pi OS Lite 64-bit · bookworm |
| Photogrammetry | OpenDroneMap (WebODM · Docker) |
| ODM process time | 200 photos ≈ 4–12 hrs on Pi 4 — use x86 if available |
| Image transfer | USB-C from DJI · or microSD reader |
| 3D viewer | Potree Converter + viewer · Node.js served on LAN |
| GIS | QGIS · georeference nodes · USDA soils overlay |
| API ingest | Python venv: open-meteo · noaa-ncei · usda-wss |
| Satellite NDVI | NASA Earthdata / Sentinel Hub free tier verify access |
| Elevation | OpenTopoData API · 1 m DEM (coverage varies) |
| Phase 2 viz | BlenderGIS (any x86) · UE5+Cesium (GPU required) |
| Rack 1 target | ODM → Node 2 compute. API ingest → Node A. |
RTL-SDR simultaneous receive limitation: One dongle = one frequency at a time. For concurrent rtl_433 + NOAA + APRS, use separate dongles on separate USB buses.
02
Rack 1 node mapping (target)
| Current Pi role | Rack 1 target node | Notes |
|---|---|---|
| Pi #1 — Mosquitto + InfluxDB + Grafana | Node A (orchestration) | Same roles, faster hardware |
| Pi #1 — Reticulum rnsd | Node 4 (SDR head) or Node A | systemd service, runs alongside SDR |
| Pi #1 — RTL-SDR + rtl_433 | Node 4 (SDR head) | Physically isolated from switching PSUs |
| Pi #2 — OpenDroneMap | Node 2 (compute) | x86 + more RAM = dramatically faster ODM |
| Pi #2 — Potree viewer + API ingest | Node A or Node 2 | Light workloads — flexible placement |
| Pi #1 + #2 post-migration | Edge-only (repurposed) | Firmware flashing, remote field nodes, solar relays |
Mini 2 SE payload note: No accessory port. External camera mounts add ~80–120 g pushing above 249 g. Mini 3 is preferred for any external payload. Verify AUW before every flight. FAA Part 107 may apply to data collection use even at sub-249 g. verify locally
01
Drone airframe + relay payload
DRONE + RELAY — TIER 3 AERIAL LAYER
| Airframe (budget) | DJI Mini 2 SE · ~$299 · sub-249 g base |
| Airframe (preferred) | DJI Mini 3 (non-Pro) · ~$469 · better payload |
| Camera Phase 0 | Stock 4K RGB · SfM photogrammetry via ODM |
| Multispectral | MAPIR Survey3W OCN ~$300 Mini 3 preferred |
| Thermal | Infiray P2 Pro on Android · walked survey · not mounted |
| LiDAR Phase 0 | Reject — SfM adequate for ⅛ acre |
| PX4 / Pixhawk | Phase 2+ only |
| ADS-B check | B4UFly before each flight. dump1090 on Pi #1 for traffic awareness. |
| Relay hardware | Heltec WiFi LoRa 32 V3 · 3D-printed mount · ~$22 |
| Relay protocol | Meshtastic · same channel + PSK as ground nodes |
| Relay mass | ~45–55 g · monitor AUW vs local limit |
| Relay function | Extends LoRa mesh LOS at altitude · relays Node A/B packets past obstructions |
| DJI telemetry | OcuSync/O3 · 2.4/5.8 GHz to Android GCS in real-time |
| GCS → hub | Android Wi-Fi → Pi #1 MQTT topic: drone/telem |
| Flight planning | Dronelink or Litchi (Android) |
| Grid overlap | 80% fwd · 75% side for SfM |
| AGL altitude | 25–40 m · ~200 photos for ⅛ acre |
| Imagery transfer | USB-C or microSD to hub after landing — physical only |
02
Two data paths — do not conflate
Telemetry — radio, real-time
| Transport | DJI OcuSync/O3 · 2.4 GHz proprietary |
| Carries | Position · altitude · battery · speed · mode |
| Destination | Android GCS in real-time |
| Hub bridge | Android Wi-Fi → MQTT → InfluxDB |
| LoRa involvement | None — Heltec V3 carries mesh packets, not DJI telemetry |
| Bandwidth | Kilobits — negligible |
Imagery — physical, post-flight
| Storage | Drone internal or microSD during flight |
| Transfer | USB-C cable or card reader after landing |
| Destination | Pi #2 now · Rack 1 Node 3 NAS target |
| Processing | WebODM → point cloud → Potree · QGIS |
| Volume | ~1–3 GB for ⅛ acre at 80% overlap |
| LoRa involvement | None — never streams over LoRa mesh |
These two paths are structurally independent. Telemetry is radio. Data is physical. This distinction holds at swarm scale — LoRa carries control forever, payload grows to fibre and mmWave.
Platform note: SenseCAP connects via Grove I²C — no soldering for BME280, TSL2591, VEML6075. MH-Z19C requires direct UART wiring. GPIO pinouts are Raspberry Pi BCM numbering.
01
Sensor wiring
BME280 — T · RH · barometric pressure
| Pin | Signal | MCU |
|---|---|---|
| VCC | 3.3 V | 3.3 V rail |
| GND | GND | GND |
| SCL | I²C clock | GPIO 3 (BCM) |
| SDA | I²C data | GPIO 2 (BCM) |
| CSB | Mode | 3.3 V → forces I²C |
| SDO | Addr sel | GND → 0x76 · 3V3 → 0x77 |
TSL2591 — lux · PAR · ~320–1100 nm range corrected
| Pin | Signal | MCU |
|---|---|---|
| VCC | 3.3 V | 3.3 V rail |
| GND | GND | GND |
| SCL | I²C clock | GPIO 3 — shared |
| SDA | I²C data | GPIO 2 — shared |
| INT | Interrupt | NC for basic use |
| Address | Fixed 0x29 |
VEML6075 — UV-A · UV-B
| Pin | Signal | MCU |
|---|---|---|
| VDD | 3.3 V | 3.3 V rail |
| GND | GND | GND |
| SCL | I²C clock | GPIO 3 — shared |
| SDA | I²C data | GPIO 2 — shared |
| Address | Fixed 0x10 | |
| Mount | Open sky · no glass (absorbs UV-B) |
MH-Z19C — CO₂ NDIR · Node B 5 V required
| Pin | Signal | MCU |
|---|---|---|
| Vin | 5 V | 5 V rail — not 3.3 V |
| GND | GND | GND |
| Tx | UART TX→MCU RX | GPIO 15 (RXD) |
| Rx | UART RX←MCU TX | GPIO 14 (TXD) |
| Baud | 9600 · 8N1 | |
| Warm-up | 180 s before valid readings |
DS18B20 — soil temperature · 1-Wire
| Wire | Signal | MCU |
|---|---|---|
| Red | 3.3–5 V | 3.3 V rail |
| Black | GND | GND |
| Yellow/white | 1-Wire data | GPIO 4 · 4.7 kΩ pull-up to 3.3 V |
| Depth | 10 cm into soil | |
| Multi-probe | Shared bus · unique 64-bit ROM each |
SEN0308 — capacitive soil moisture · via MCP3008 SPI
| Pin | Signal | MCU |
|---|---|---|
| VCC | 3.3–5 V | 3.3 V rail |
| GND | GND | GND |
| AOUT | Analog 0–3 V | MCP3008 CH0 via SPI |
| MCP3008 SPI | MOSI=10 · MISO=9 · CLK=11 · CS=8 | |
| Calibrate | Dry air = max count · saturated = min |
02
I²C bus address map
| Sensor | Bus | Address | Configurable | Notes |
|---|---|---|---|---|
| BME280 | I²C | 0x76 / 0x77 | Yes — SDO pin | Default 0x76 (SDO to GND) |
| TSL2591 | I²C | 0x29 | No | Fixed — no conflict with others |
| VEML6075 | I²C | 0x10 | No | Fixed — no conflict |
| MH-Z19C | UART | — | — | Dedicated UART · 5 V · not on I²C bus |
| DS18B20 | 1-Wire | 64-bit ROM | — | GPIO 4 · pull-up required |
| SEN0308 | Analog→SPI | — | — | MCP3008 via SPI · no I²C |
01
Bill of materials — Phase 0 field hardware
Field sensor BOM only. Lab/compute hardware → Lab / compute. Prices approximate — verify current listings.
| Item | Purpose | Est. cost | Notes |
|---|---|---|---|
| Owned — no new spend | |||
| Raspberry Pi 4 (4 GB) × 2 | Hub #1 data · Hub #2 spatial | $0 | Phase 0 hub. Repurpose to edge as Rack 1 deployed. |
| Android phone (S25 Ultra) | Meshtastic · drone GCS · Infiray | $0 | Must run Dronelink or DJI Fly |
| Sensor nodes | |||
| SenseCAP Solar Node P1-Pro × 2 | Node A + Node B | ~$200 | Recommended. Solar, enclosure, LoRa pre-integrated. |
| — or — RAK WisBlock Starter × 2 | DIY alternative | ~$120 | More flexibility. Add enclosure + solar separately. |
| BME280 × 2 | T / RH / pressure | ~$10 | I²C. Included in SenseCAP Grove kit. |
| TSL2591 × 2 | PAR / lux · ~320–1100 nm | ~$14 | Fixed 0x29. Mount exposed. |
| VEML6075 UV × 2 | UV-A + UV-B | ~$14 | Fixed 0x10. No glass cover. |
| MH-Z19C CO₂ × 1 | Canopy CO₂ — Node B | ~$25 | UART. 5 V. 180 s warm-up. |
| Capacitive soil moisture × 2 | VWC | ~$20 | Capacitive only — resistive corrodes in soil. |
| DS18B20 waterproof × 2 | Soil temp · 10 cm | ~$10 | 1-Wire. 4.7 kΩ pull-up required. |
| Anemometer + vane × 1 | Wind — Node A only | ~$25 | Davis-compatible. One node sufficient at ⅛ acre. |
| Tipping rain gauge × 1 | Precip — Node A only | ~$25 | 0.2 mm/tip. |
| External 3 dBi LoRa whip × 2 | Mesh link quality | ~$16 | Mandatory. Check SMA vs RP-SMA on your node. |
| MCP3008 SPI ADC × 2 | Analog soil → digital | ~$8 | Only needed for RAK WisBlock build. |
| Hub additions | |||
| RTL-SDR v3 Blog dongle | Primary: rtl_433 decode | ~$35 | USB to Pi #1. One freq at a time. |
| RTL-SDR v3 Blog dongle (2nd) | NOAA WX + APRS concurrent | ~$35 | Recommended. Separate USB bus. |
| Meshtastic gateway node | Mesh → MQTT bridge | ~$28 | Heltec V3 or RAK4631 Mini. |
| microSD 64 GB high-endurance × 2 | Pi OS + working data | ~$18 | Samsung Pro Endurance. Not for long-term drone storage. |
| Drone | |||
| DJI Mini 2 SE | Budget aerial photogrammetry | ~$299 | Sub-249 g base. Limited payload. 31 min. |
| — or — DJI Mini 3 (non-Pro) | Preferred for external payload | ~$469 | Better frame for MAPIR mounting. |
| Heltec V3 + 3D-printed mount | Drone LoRa relay | ~$22 | ~50 g. Monitor AUW. |
| MAPIR Survey3W OCN | NDVI multispectral — optional | ~$300 | Mini 3 preferred. Verify AUW before flying. |
| Infrastructure | |||
| IP65 enclosures × 2 | Node housing | ~$20 | Junction box + Stevenson screen for BME280. |
| 5 W solar + MPPT + cells × 2 | Node power | ~$40 | Included in SenseCAP P1-Pro. |
| Cables, SMA adapters, resistors | Assembly | ~$30 | Check SMA vs RP-SMA before ordering antennas. |
| Baseline — Mini 2 SE · SenseCAP × 2 · 1 dongle · no MAPIR | ~$786 | Minimum viable Phase 0 | |
| Full Phase 0 — Mini 3 · SenseCAP × 2 · 2 dongles · MAPIR | ~$1,327 | Concurrent radio + NDVI | |
Hub first — always. Prove the entire pipeline indoors. Every outdoor deployment is a verifiable addition to a working system.
1
Hub #1 — full pipeline proven indoors
Pi OS Lite 64-bit. Install Mosquitto (port 1883), InfluxDB 2 (org + bucket "mesh"), Grafana (InfluxDB datasource via Flux). Write dummy Python MQTT publisher every 30 s. Verify: publish → broker → InfluxDB → Grafana renders. Install Reticulum (rnsd systemd). Plug RTL-SDR, install rtl_433 with
-F mqtt://localhost — verify decoded packets in MQTT. Do not proceed until every stage works.2
Hub #2 — spatial pipeline proven indoors
Install Docker. Deploy WebODM (
webodm.sh start). Confirm LAN web UI. Install Potree Converter + Node.js. Install QGIS. Python venv with open-meteo-requests + influxdb-client. Test Open-Meteo ingest — verify regional data in InfluxDB on Pi #1 via MQTT. Grafana shows regional data alongside dummy sensor data.3
Node A — front yard assembly and deployment
Assemble SenseCAP P1-Pro with BME280, TSL2591, VEML6075, SEN0308, DS18B20, anemometer, rain gauge. Fit 3 dBi LoRa whip. Flash Meshtastic. Set channel + PSK to match hub gateway. Connect gateway node USB to Pi #1, run bridge. Deploy. Verify ALL sensor fields in Grafana within 15 min — not just temperature.
4
Node B — backyard canopy deployment
Identical plus MH-Z19C (UART, 5 V). Elevate antenna on mast above canopy. Confirm hop. Within hours the differential appears in Grafana: lower UV, higher CO₂ (canopy respiration), higher RH, lower temp variance. Verify CO₂ baseline (~420 ppm ambient — check current). Canopy readings elevated during daylight, peak pre-dawn. This is the Phase 0 proof of concept.
5
Drone survey — baseline spatial model
Dronelink or Litchi. Grid: 25–35 m AGL, 80% fwd / 75% side. Heltec V3 relay mounted. Fly (~8–14 min). Transfer imagery to Pi #2 via USB-C or microSD. WebODM — 4–12 hrs on Pi 4 (30–60 min on x86 laptop with 16+ GB RAM). Potree serves point cloud. QGIS: import orthomosaic, pin Node A and B GPS. This is the spatial base layer for all future overlays.
6
External data integration + climate profile
Schedule Open-Meteo, NOAA NCEI, USDA WSS ingest at 15-min intervals. Build Grafana panels: daily T range (A vs B vs regional), humidity, CO₂ diurnal cycle, UV differential, soil moisture divergence, microclimate offset from nearest NOAA station. Add APRS via Direwolf on second dongle. System is now fully operational as Phase 0 testbed generating baseline data for all subsequent hardware decisions.