Propane LPG Tank Fill Telemetry

This reference application is intended to provide inspiration and help you get started quickly. It uses specific hardware choices that may not match your own implementation. Focus on the sections most relevant to your use case. If you'd like to discuss your project and whether it's a good fit for Blues, feel free to reach out.
This project is a truck roll reduction reference design that gives propane dealers per-tank fill telemetry across their entire delivery territory — replacing fixed-schedule routes with demand-driven dispatch and projecting days-until-empty for every tank in the fleet. A level sensor at the tank's existing gauge port and a temperature probe on the tank shell turn each tank into a self-reporting asset; a single Notecard for Skylo (one module carrying cellular, WiFi, and Skylo satellite radios that fails over between them automatically) carries the data from the tank three minutes outside town just as readily as from the remote mountain cabin beyond any cell tower. One SKU and one firmware image cover every site type in the territory.
1. Project Overview
The problem. Most propane dealers still run their delivery routes on a fixed calendar: every six weeks, every tank gets a truck. That schedule exists not because it matches demand, but because dealers have no way to know which tanks actually need filling. The result is trucks rolling to tanks that are at 60% and tanks at remote farm properties that run dry between scheduled visits. Neither failure is exotic — they're structural consequences of not having fill-level data.
The root cause is infrastructure. A propane tank sits in a field, on a farm, at a cabin, at a rural business — almost never near a WiFi access point the dealer can use, and often in areas where cellular is marginal to nonexistent. The tank itself is a sealed pressure vessel with no native communication capability. Retrofitting telemetry means solving a connectivity problem that varies by site, a sensor problem specific to LP (liquefied petroleum) gas vessels, and a data problem — turning raw fill readings into actionable dispatch intelligence.
This project solves all three. A weatherproof electronics enclosure mounted on a post or bracket outside the AHJ-defined classified area, connected by field wiring to a 4-20 mA LP gauge-port float transmitter at the tank's existing dip-tube gauge port and a DS18B20 temperature probe strapped to the tank shell. The device wakes every 15 minutes, reads the transmitter current and tank temperature, converts the transmitter's linear 4–20 mA output directly to fill percentage, updates a smoothed daily consumption rate, and reports a daily summary to the Blues Notehub cloud service. When fill drops below a configurable low-fill threshold, an alert fires immediately. The dealer's dispatch system sees fill %, gallons remaining, and projected days-until-empty for every tank in the fleet — enough to replace the calendar with a demand-driven route that only rolls a truck when a tank actually needs it.
Why Notecard for Skylo. Propane tanks are at farms, cabins, rural businesses, and residential properties — most with no customer WiFi the dealer can use, and many in areas where cellular coverage is spotty to nonexistent. A dealer network spans all of these site types and can't afford a different hardware solution for each one. Notecard for Skylo (NOTE-NBGLWX) carries three radios on one M.2 module — cellular (LTE-M / NB-IoT / GPRS), WiFi, and satellite over the Skylo non-terrestrial network (NTN) — and selects among them automatically. The firmware sets a single card.transport preference of wifi-cell-ntn: prefer WiFi where a provisioned AP happens to be in range (the rare residential tank), fall back to cellular (the de-facto primary across the bulk of the territory), and fall back again to Skylo satellite at remote sites. Failover is handled by the Notecard; the host firmware never branches on which network is live. That collapses what used to be a two-device decision — a cellular Notecard for in-coverage tanks plus a separate satellite add-on for the rest — into a single part number, a single antenna kit, and a single firmware image that deploys unchanged across the entire fleet. Notecard for Skylo ships with an active global SIM including 500 MB of cellular data and 10 years of service, plus 10 KB of bundled Skylo satellite data — no activation fees and no monthly per-SIM commitment. There is nothing to swap when a site turns out to have weaker coverage than the survey suggested: the same board that runs on cellular near town automatically reaches the Skylo network at the cabin.
New to Blues?
Learn what we do in this 3-minute video that walks you through how we simplify wireless connectivity.
Learn what we do in this 3-minute video that walks you through how we simplify wireless connectivity.
Deployment scenario. A weatherproof NEMA 4X enclosure mounted on a separate post, wall, or bracket outside the AHJ-defined classified area (see the safety notice in §4), powered by a solar-charged 12 V sealed lead-acid battery. A 4-20 mA LP gauge-port float transmitter (Rochester Sensors M6300-LP Magnetel® gauge + R6315-12 transmitter, or equivalent) connects at the tank's existing 1¼″ NPT dip-tube gauge port; field wiring from the transmitter runs to the electronics enclosure outside the hazardous boundary. A waterproof DS18B20 temperature probe is clamped to the tank shell and logged in daily summary Notes for seasonal demand analytics. Notecard for Skylo's antenna cables exit the enclosure to outdoor-mounted antennas with a clear sky view — the same Skylo-certified antenna carries both cellular and satellite, so where cellular coverage is absent the board falls back to the Skylo NTN satellite network automatically over the same Notehub project, with no antenna swap and no firmware changes. No modifications to the tank itself, no on-site internet infrastructure, and no OEM cooperation required.
2. System Architecture
Device-side responsibilities. Inside the post-mounted enclosure, the Cygnet STM32 host on the Notecarrier CX wakes every sample_interval_min (default 15 minutes), reads the 4-20 mA float transmitter and the DS18B20 shell probe, converts the linear current straight to fill percentage and gallons remaining, and updates a smoothed consumption-rate estimate. If a threshold trips, it queues an alert Note right then; otherwise it just goes back to sleep. Once per report_interval_hr (default 24 hours) it ships a templated summary carrying current fill %, fill gallons, minimum fill seen in the window, window-averaged temperature, daily consumption rate, and projected days-until-empty. Between wakes the host is cut entirely via card.attn and Notecard for Skylo idles at ~8 µA — every queued Note travels over I²C with no JSON hand-rolling and no AT commands.
Notecard responsibilities. Notecard for Skylo runs the same playbook regardless of which radio is live: hold Notes in its on-device queue, open a session on the hub.set outbound cadence, and push any sync:true alert through immediately. The card.transport wifi-cell-ntn preference set at boot decides the path automatically — WiFi where a provisioned AP is reachable, cellular at the bulk of sites, and Skylo satellite at remote sites — with no firmware branching. Either way, the same module pulls environment variables from Notehub on every inbound sync, so a dispatcher can retune transmitter calibration or alert thresholds for any tank in the fleet without anyone driving out to it.
Notehub responsibilities. Events land in Notehub from whatever transport carried them, where they're ingested, stored, and fanned out through project-level routes. Per-fleet environment variables are how a single firmware image services tanks of every capacity — the tank size and sensor calibration live in Notehub, not in compiled constants. Smart Fleets make it easy to group tanks by territory, capacity class, or customer type so the right calibration values flow to the right tanks automatically.
Routing to the cloud (high level). Notehub supports HTTP, MQTT, AWS, Azure, GCP, Snowflake, and several other destinations; route setup is project-specific. See the Notehub routing docs — this reference design does not ship any specific downstream endpoint. The natural downstream targets for a propane dealer are a route-optimization or ERP system (routed via HTTP webhook) and a time-series database for trend analysis (routed to a cloud data store of the dealer's choosing).
3. Technical Summary
Clone this repository, build the firmware, and deploy:
-
Get the firmware onto your Notecarrier CX:
arduino-cli core install STM32:stm32 arduino-cli lib install "Blues Wireless Notecard" OneWire DallasTemperature arduino-cli compile -b STM32:stm32:Nucleo_L476RG firmware/propane_tank_telemetry/ arduino-cli upload -b STM32:stm32:Nucleo_L476RG -p /dev/ttyACM0 firmware/propane_tank_telemetry/Adjust the port (
/dev/ttyACM0on Linux/Mac,COM*on Windows) and board as needed. -
Claim your Notecard to Notehub: Sign up at notehub.io and create a project. Copy the ProductUID and paste it into the firmware as
PRODUCT_UID. -
Configure fleet variables in Notehub — Set these in Projects → Environment (tab) at the Fleet level:
tank_capacity_gal: your tank's usable capacity (e.g., 500)fill_alert_pct: alert threshold (default 20)- All others have sensible defaults; see §6 for the full list.
-
See your first event: After a few minutes of network registration, check Notehub → Devices → [Your device] → Events. You should see a
tank_status.qodaily summary Note (or atank_alert.qoif your tank is below the alert threshold). The Note body carriesfill_pct,fill_gal,temp_c,gal_per_day, anddays_until_empty.
Full assembly and commissioning instructions follow in §4–§9.
Here is a sample Note this device emits:
{
"file": "tank_status.qo",
"body": {
"fill_pct": 42.3,
"fill_gal": 211.5,
"min_fill_pct": 38.1,
"temp_c": 14.8,
"gal_per_day": 8.2,
"days_until_empty": 25.8,
"transmitter_ma": 11.3
}
}4. Hardware Requirements
| Part | Qty | Rationale |
|---|---|---|
| Notecarrier CX | 1 | Integrated carrier with onboard Cygnet STM32 host — handles the 12-bit ADC for the 4-20 mA loop and OneWire for the temperature probe with no external MCU needed. |
| Notecard for Skylo (NOTE-NBGLWX) · datasheet | 1 | One M.2 module carrying cellular (LTE-M / NB-IoT / GPRS, Quectel BG95-S5 modem), WiFi (Silicon Labs WFM200S), and Skylo satellite (NTN) radios. The firmware's card.transport wifi-cell-ntn setting makes it prefer cellular at in-coverage tanks and fall back automatically to the Skylo satellite network at remote sites beyond cellular reach — no second device or part-number decision. Cellular removes the per-site IT dependency; the embedded global SIM and bundled satellite allocation cover the whole territory from one SKU. Requires the antennas below. |
| Blues Mojo | 1 | Bench only. Coulomb counter on the 5 V supply rail for validating power behavior during commissioning (see §9). Remove and discard for field deployment; not integrated into production units. |
| Rochester Sensors M6300-LP Magnetel® Rough Rider® LP gas gauge + R6315-12 4-20 mA transmitter — M6300-LP datasheet · R6315-12 datasheet · 6300 series installation guide. Available from John M. Ellsworth Co. and LP gas equipment distributors. | 1 | Float-type magnetel level transmitter designed specifically for LP gas service. A float rides the liquid propane surface inside the tank and drives a two-wire 4-20 mA current loop proportional to fill level: 4 mA at 0 % fill, 20 mA at 100 % fill. Representative orderable assembly: M6300-LP gauge body (1¼″ NPT, 4″ dial) with R6315-12 transmitter module attached — the R6315-12 clips to the M6300 gauge body and provides the 4-20 mA output. The R6315-12 outputs 4-20 mA proportional to the float position; see the R6315-12 datasheet for electrical specifications and wiring. Mounting: the M6300-LP installs at the tank's existing 1¼″ NPT dip-tube gauge port (the standard gauge opening on most horizontal residential and commercial LP tanks). Dip-tube length and float arm length vary by tank geometry — confirm the correct M6300-LP model suffix against the Rochester Sensors product application table and the tank's nameplate before ordering. Some larger commercial tanks use a 2″ NPT gauge boss; Rochester Sensors offers corresponding variants. Electrical: two-wire loop-powered, 12–28 V DC supply. Note: because the float tracks the liquid surface directly, no density or temperature correction is applied in firmware — the 4-20 mA output is already proportional to fill level regardless of liquid temperature or density. Installation at a propane pressure vessel must be performed by a licensed LP gas technician per NFPA 58. |
| SparkFun Waterproof DS18B20 Temperature Sensor (SEN-11050) | 1 | OneWire temperature probe clamped to the tank shell. Included in daily summary Notes for cloud-side consumption correlation against ambient conditions. |
| 120 Ω 0.1 % precision resistor | 1 | Shunt across the 4-20 mA current loop. Converts 4–20 mA to 0.48–2.40 V DC at the Cygnet's A0 ADC pin. The 120 Ω value provides safe electrical headroom for standard 4–20 mA transmitter fault currents: a 24 mA diagnostic output produces only 2.88 V at A0 — well within the 3.3 V ADC absolute maximum. The firmware rejects currents outside the 3.5–21 mA valid window as NAN and emits a sensor_fault alert; with this shunt the ADC is electrically safe up to ~27 mA (3.3 V ÷ 120 Ω). |
| 4.7 kΩ resistor | 1 | OneWire pull-up for the DS18B20 data line. |
| 12 V DC/DC step-down module, 5 V / 2.5 A output (e.g. Pololu D24V22F5) | 1 | Steps 12 V battery rail down to 5 V for the Notecarrier CX VBAT input. A 2.5 A continuous output rating is required for this design: Notecard for Skylo's onboard modem (Quectel BG95-S5) can momentarily demand up to ~2 A in brief bursts, and a 1 A regulator cannot reliably source that peak. The D24V22F5 delivers 5 V at up to 2.5 A continuous from a 4.5–42 V input, giving comfortable headroom above the Notecard's 2 A burst demand plus the Cygnet host's active-mode draw. |
| 24 V DC/DC boost converter module, input 8–16 V, output regulated 24 V, ≥ 100 mA (e.g. Pololu U3V50F24) | 1 | Provides a stable, regulated 24 V supply for the 4–20 mA transmitter current loop. A regulated 24 V loop supply guarantees transmitter compliance across the full SLA discharge cycle, any practical cable run, and an AHJ-required IS barrier. See the loop compliance calculation in §5 Step 7. Do not drive the transmitter loop from the 12 V system rail: at battery sag (11–11.5 V under partial charge and load) the loop supply falls below the R6315-12's 12 V minimum specification, and any IS barrier in the loop worsens the margin further. The Pololu U3V50F24 accepts 2–16 V input and delivers a regulated 24 V at up to 500 mA; it is powered from the same 12 V system rail as the 5 V step-down module. |
| Skylo-certified LTE/satellite antenna included with Notecard for Skylo (u.FL) | 1 | Connects to the MAIN u.FL port and carries both the terrestrial cellular signal and the Skylo satellite link — a single antenna for both networks. Use only the Skylo-certified antenna supplied with Notecard for Skylo; substituting an uncertified antenna risks regulatory non-compliance and link failure. Mount outdoors with an unobstructed view of the sky (northern hemisphere: the southern sky) so the board can reach Skylo wherever it falls back from cellular; route through a cable gland. Do not rely on the bare antenna inside a polycarbonate enclosure at tank-side — signal margin is too variable. |
| u.FL-to-SMA-F bulkhead pigtail, ~15–20 cm (e.g. Taoglas CAB.0150.A.01 or equivalent) | 0–1 | Optional. Only needed to mount an external SMA-terminated antenna instead of routing the bare u.FL antenna through the enclosure wall. Adapts the MAIN u.FL port to an external SMA bulkhead, then connects to the external antenna cable outside. Not required when the included Skylo-certified antenna is routed directly through a gland. |
| Passive GPS/GNSS antenna (u.FL) per the Notecard for Skylo datasheet | 1 | Connects to the GPS u.FL port for GNSS time/location. Mount outdoors with a clear sky view alongside the main antenna; route through a cable gland. |
| IP68-rated PG-11 nylon cable gland, 5–10 mm cable OD (e.g. Lapp SKINTOP® MS-M PG 11 or equivalent) | 4 | One gland per field cable entering the enclosure. This installation requires penetrations for: (1) the Skylo-certified MAIN antenna lead (or its SMA bulkhead); (2) the GPS/GNSS antenna lead; (3) DS18B20 temperature probe cable; and (4) 4–20 mA transmitter loop wiring (two conductors from transmitter to enclosure). Every penetration must be sealed to maintain the NEMA 4X enclosure rating. Select gland cable-OD range to match each specific cable's outer diameter. |
| 12 V sealed lead-acid battery, 7–10 Ah (e.g. Universal Power Group UB1280, 8 Ah) | 1 | Energy reservoir for cloudy periods and overnight. At this device's duty cycle, 8 Ah provides ≥3 days of autonomy without solar input (see Limitations for power budget). |
| Inline fuse holder + 5 A automotive blade fuse (e.g. Bussmann BP/HHM + ATC5) | 1 | Placed in the battery (+) lead as close to the battery positive terminal as possible. Protects wiring from a short-circuit fault in the load circuit. The 5 A rating provides adequate protection for the ≤2 A maximum load while giving headroom above the controller's worst-case startup surge. Use a weatherproof fuse holder if the battery is outside the NEMA 4X enclosure. |
| Victron SmartSolar MPPT 75/10 solar charge controller | 1 | Regulates solar panel output to charge the 12 V SLA battery safely. The SmartSolar MPPT 75/10 exposes dedicated LOAD+ / LOAD− output terminals with built-in low-voltage disconnect (LVD) that automatically cuts load power to protect the SLA from deep discharge — this specific feature is required for the wiring in §5. If a different controller is substituted, confirm it has equivalent LOAD terminals with LVD before following the §5 wiring steps. |
| Monocrystalline solar panel, 10–20 W, 12 V nominal (e.g. Renogy 10W Monocrystalline RNG-10D-SS) | 1 | 10 W is adequate for mid-latitude sites (≥4 h/day usable sun). Size up to 20 W for northern latitudes, winter deployments, or sites with frequent cloud cover. Mount with a clear sky view, not against the tank body. |
| NEMA 4X polycarbonate enclosure, ~8 × 6 × 3.5″ | 1 | Weatherproof housing rated for outdoor tank-side mounting. Polycarbonate is UV-resistant and non-sparking. |
Bundled connectivity (Notecard for Skylo): Ships with an active global SIM including 500 MB of cellular data and 10 years of service, plus 10 KB of bundled Skylo satellite data — no activation fees, no monthly commitment, and no separate satellite provider subscription. Additional satellite data is billed per byte (see the Notecard for Skylo datasheet for current pricing). Minimizing inbound sync frequency conserves the bundled satellite allocation.
Safety notice. LP gas (liquefied petroleum gas) is a flammable compressed gas. Any sensor connection to a propane tank, including at the gauge port — must be performed by a qualified LP gas technician following applicable codes (NFPA 58, CGA, and local authority having jurisdiction). The level transmitter, fittings, and wiring must be rated for LP gas service.
Classified-area / hazardous-location requirement. Blues Notecard and Notecarrier CX electronics are not rated for hazardous locations (NEC Class I Division 1 or Division 2 / ATEX Zone equivalents) and must not be installed inside the classified area as defined by the installation's authority having jurisdiction (AHJ) and NFPA 58. The classified area boundary around a propane container typically extends several feet from fittings, relief valves, and regulators — confirm the boundary with the AHJ and the installing LP gas technician before positioning the enclosure. Mount the electronics enclosure outside that boundary. For 4–20 mA transmitter loop wiring that crosses the classified-area boundary, the AHJ may require a listed intrinsic-safety (IS) barrier or other approved interface device in the loop circuit, between the tank-side transmitter and the enclosure-side electronics. Confirm IS barrier requirements with the installing LP gas technician and the AHJ before wiring.
5. Wiring and Assembly
All Notecarrier CX host I/O lands on its dual 16-pin header. Notecard for Skylo seats into the M.2 slot. The Mojo sits inline between the 5 V step-down and the Notecarrier +VBAT pad during bench validation only; it is not deployed in the field.
Enclosure placement first. Blues Notecard and Notecarrier CX electronics must be installed outside the classified-area boundary defined by NFPA 58 and the authority having jurisdiction — confirm that boundary with the installing LP gas technician before drilling cable-gland holes or positioning the enclosure.
Step 1 — Enclosure and cable-gland assignment. Install the NEMA 4X polycarbonate enclosure at the chosen mounting location. Drill and install one cable gland for each field-cable penetration before pulling cables. Assign glands as follows:
| Gland | Cable / penetration |
|---|---|
| 1 | Skylo-certified MAIN antenna lead (or its SMA bulkhead) — carries cellular and satellite |
| 2 | GPS/GNSS antenna lead (GPS u.FL port) |
| 3 | DS18B20 temperature probe cable |
| 4 | 4–20 mA transmitter loop wiring (2-conductor, from transmitter to enclosure) |
Match each gland's cable-OD clamp range to the actual cable outer diameter. Tighten all glands to the manufacturer's torque spec after routing cables; leave no unused penetration open.
Step 2 — Solar panel to charge controller (PV input).
- Solar panel PV+ → charge controller PV+ terminal.
- Solar panel PV− → charge controller PV− terminal.
Mount the panel in an unobstructed location with good sky view — not against the tank body or in the tank's shadow. Tilt angle should maximize winter sun exposure for the deployment latitude. Run the panel cable into the enclosure through an appropriately-sized cable gland (or use an MC4 weatherproof pass-through if the controller has external PV terminals). Keep the run as short as practical to minimize resistive loss.
Step 3 — SLA battery to charge controller (battery terminals).
- Battery (+) → charge controller BATT+ terminal.
- Battery (−) → charge controller BATT− terminal.
Use wire rated for the battery's short-circuit current (14 AWG minimum for a 7–10 Ah SLA). Place the inline fuse holder + 5 A fuse from the BOM in the battery (+) lead, as close to the battery positive terminal as possible. Use a weatherproof fuse holder if the battery is positioned outside the NEMA 4X enclosure.
Step 4 — Charge controller load output to step-down module.
- Charge controller LOAD+ → step-down module Vin+.
- Charge controller LOAD− → step-down module Vin− / GND.
The Victron SmartSolar MPPT 75/10 has dedicated LOAD+ / LOAD− terminals with built-in low-voltage disconnect (LVD); these terminals switch the 12 V supply on and off based on battery state to protect the SLA. Only use this wiring with a controller that has LOAD terminals and LVD — if a different controller is substituted, verify those features before following these steps. If the controller lacks LOAD terminals, wire from BATT terminals and use the controller's LVD relay or alarm output to interrupt the load circuit.
Step 5 — 12 V step-down to Mojo and Notecarrier +VBAT (5 V rail).
Set the step-down module output to 5.0 V and verify with a meter before connecting any load.
Step-down Vout+ → Mojo BAT+
Step-down Vout− → Mojo BAT− / GND
Mojo LOAD+ → Notecarrier CX +VBAT
Mojo LOAD− → Notecarrier CX GNDDuring bench validation the Mojo sits in this path to measure 5 V rail current. For field deployment, remove the Mojo and wire the step-down Vout+ directly to Notecarrier CX +VBAT.
Step 6 — Notecard installation and antenna connections.
Seat Notecard for Skylo (NOTE-NBGLWX) into the Notecarrier CX M.2 slot and secure the retaining screw.
Notecard for Skylo exposes two antenna u.FL ports — MAIN and GPS. The single Skylo-certified antenna on the MAIN port carries both the cellular and the satellite signal; there is no separate satellite antenna to install. Connect antennas as follows:
- MAIN port — attach the included Skylo-certified antenna, routed through Gland 1 (connect it directly, or adapt it to an external SMA bulkhead with a u.FL-to-SMA-F pigtail). Mount the antenna outdoors with an unobstructed view of the sky (northern hemisphere: the southern sky) so the board can reach the Skylo satellite network wherever it falls back from cellular. Use only the Skylo-certified antenna; an uncertified part risks regulatory non-compliance and link failure. Do not skip this connection — both cellular and satellite operation require this external antenna.
- GPS port — attach the passive GPS/GNSS antenna, routed through Gland 2, and mount it outdoors with a clear sky view alongside the main antenna.
Select antenna cable lengths to suit the routing distance before ordering — most pre-terminated assemblies should not be cut or field-terminated. Secure any excess cable outside the enclosure with a gentle loop; do not coil cable inside the enclosure.
Step 7 — 4–20 mA current loop (gauge-port level transmitter).
The Rochester Sensors M6300-LP + R6315-12 is a two-wire loop-powered instrument. A single 2-conductor cable runs from the transmitter (at the tank gauge port, outside or at the hazardous boundary) to the electronics enclosure. Route this cable through Gland 4. Wire the loop from the dedicated 24 V boost converter output — not the 12 V system rail and not the 5 V Notecarrier rail (see compliance Note below):
- 24 V boost converter Vin+ → charge controller LOAD+ (same 12 V rail that feeds the 5 V step-down). 24 V boost converter GND → system GND.
- 24 V boost converter Vout+ (regulated 24 V) → transmitter + terminal (loop supply in).
- Transmitter − terminal (loop signal out) → one leg of the 120 Ω precision shunt resistor; other shunt leg → system GND (same node as Notecarrier GND and battery −).
- A0 (Cygnet analog input on the Notecarrier CX header) → the junction between the transmitter − terminal and the shunt resistor.
At 4 mA (float at bottom — empty tank): V(A0) = 0.48 V. At 20 mA (float at full-scale — full tank): V(A0) = 2.40 V. Both are well within the 0–3.3 V Cygnet ADC range. With the 120 Ω shunt, a 24 mA transmitter diagnostic output produces only 2.88 V at A0 — the ADC is electrically safe up to ~27 mA (3.3 V ÷ 120 Ω). The firmware's software fault window is 3.5–21 mA; any current outside that range asserts a sensor_fault alert and marks the reading NAN. The shunt voltage and ADC range are unchanged from a 12 V supply design — only the loop supply source changes.
Loop compliance calculation. The R6315-12 datasheet specifies a supply voltage range of 12–28 V DC. Worst-case compliance budget at 20 mA full-scale:
| Element | Voltage drop at 20 mA |
|---|---|
| 120 Ω shunt (sense resistor, enclosure side) | 20 mA × 120 Ω = 2.40 V |
| 100 m of 22 AWG field wiring (both conductors combined) | 20 mA × 2 × 100 m × 0.053 Ω/m ≈ 0.21 V |
| IS barrier (Zener-diode shunt type, if required by AHJ) | ≤ 2.5 V at 20 mA |
| Total worst-case external drops | ≤ 5.11 V |
With the regulated 24 V boost converter output: V at transmitter terminals = 24 V − 5.11 V = 18.89 V — 6.89 V above the 12 V lower compliance limit, and well below the 28 V upper limit. The transmitter stays in regulation across the full battery charge/discharge cycle, any cable run up to 100 m, and with or without an IS barrier.
Why not the 12 V system rail? An SLA battery discharges from ≈ 12.8 V (fully charged) to the low-voltage disconnect threshold (≈ 10.8 V); at partial charge under load it commonly measures 11.0–11.5 V — already at or below the R6315-12's 12 V minimum supply before accounting for cable resistance or an IS barrier. Adding either makes the margin worse still. The 24 V boost converter removes this dependency: it provides a regulated 24 V output as long as the SLA remains above the converter's ≈ 8 V minimum input voltage, which is well below the charge controller's LVD threshold.
The transmitter process connection is at the tank's single 1¼″ NPT dip-tube gauge port — no second tank connection is needed. The float mechanism provides the level reference internally. The LP gas technician installs the transmitter at the gauge port and runs the 2-conductor loop cable from the transmitter to the enclosure; confirm the correct dip-tube length for the tank geometry before installation.
Confirm that system GND (battery −), charge controller LOAD−, step-down Vin−, step-down Vout−, boost converter GND, and Notecarrier GND are all connected to the same node before applying power.
Step 8 — DS18B20 temperature probe.
Route the DS18B20 cable through Gland 3. Mount the probe body against the tank shell — ideally under a layer of closed-cell foam tape to improve thermal contact and reduce ambient-air influence — and secure the cable with a zip tie to prevent mechanical strain at the gland. Inside the enclosure:
- DS18B20 red wire (VCC) → +3V3 on the Notecarrier CX header.
- DS18B20 black wire (GND) → GND on the Notecarrier CX header.
- DS18B20 yellow wire (data) → D2 on the Notecarrier CX header.
- 4.7 kΩ pull-up resistor between the data wire and +3V3. The Notecarrier CX does not include an onboard OneWire pull-up; this resistor is required.
Step 9 — Satellite operation (automatic, no added hardware).
No additional module or wiring is required for satellite operation — Notecard for Skylo's satellite radio is on the same M.2 board as cellular and WiFi, and the single Skylo-certified MAIN antenna (Step 6) carries the satellite link. The firmware enables cellular→satellite fallback by setting card.transport to wifi-cell-ntn at boot (see §7); the Notecard then routes queued Notes over the Skylo NTN satellite network automatically at any site where cellular is unavailable. To make satellite work in the field, the MAIN antenna must be mounted outdoors with an unobstructed view of the sky (northern hemisphere: the southern sky) — confirm a suitable mounting location at remote tank sites. The daily summary Note (~40 bytes) fits well within the NTN payload budget. Note that the board must complete at least one initial non-NTN (cellular or WiFi) sync to associate with Notehub and register Notefile templates before satellite can be used; commission each unit where it has terrestrial coverage even if it will routinely operate over satellite. Review the Satellite Best Practices guide for duty-cycle and data-budget considerations before deploying to a cellular-dark site.
Final pre-power checklist.
- All cable glands tightened; no unused enclosure penetrations open.
- All GND nodes common: battery −, charge controller LOAD−, step-down Vin−, step-down Vout−, boost converter GND, Notecarrier GND.
- Step-down output confirmed at 5.0 V before connecting Notecarrier.
- Boost converter Vin+ wired to 12 V system rail (LOAD+); boost converter Vout+ confirmed at 24 V before connecting transmitter loop wiring.
- Skylo-certified MAIN antenna connected and routed outdoors with a clear sky view (carries both cellular and satellite); GPS/GNSS antenna connected to the GPS port and routed outdoors.
- 120 Ω shunt installed in the current loop with A0 tapped at the transmitter − / shunt junction; loop supply drawn from 24 V boost converter output (not the 12 V rail).
- Inline fuse installed in battery (+) lead, as close to the battery positive terminal as possible.
6. Notehub Setup
-
Create a project. Sign up at notehub.io and create a project. Copy the ProductUID and paste it into the firmware as
PRODUCT_UID. -
Claim the Notecard. Power the unit; on first cellular session the Notecard associates with the project automatically. Verify the device appears in the Notehub device list and shows a recent session.
-
Optional: configure WiFi credentials. Notecard for Skylo supports WiFi as an optional secondary transport — the device operates normally on cellular (or satellite) alone if no WiFi credentials are set. Two reliable provisioning paths are available for this hardware stack:
-
Preferred — Notehub environment variables (works on deployed hardware). Set the
wifi_ssidandwifi_passwordenvironment variables in Notehub (see the env var table in step 5 below). Env vars are delivered to the device on the next inbound sync. BecausehubConfigure()sets inbound at 2× the outbound period, the default 24-hour report cadence means inbound syncs occur every 48 hours — WiFi credentials set in Notehub may take up to 48 hours to reach the device. Once the inbound sync delivers the vars, the firmware issuescard.wifito store the credentials on the Notecard; the Notecard then connects over WiFi when it provides better or equivalent coverage to cellular. For faster credential rollout, temporarily lowerreport_interval_hr(e.g. set to 1 hour), confirm connectivity, then restore the original value. Credentials persist on the Notecard even if the env vars are later cleared. -
Alternative — direct Notecard USB (bench setup before deployment). Connect a USB cable to the Notecard module's own USB port (the small USB connector on the Notecard M.2 card itself — not the Notecarrier CX USB-C port, which connects to the Cygnet host MCU). With that connection active, open Notecard Playground and issue:
{"req":"card.wifi","ssid":"<SSID>","password":"<password>"}. This is most practical to do at the bench before sealing the enclosure for field deployment.
WiFi is not required for normal operation and does not need to be provisioned on every device.
-
-
Create a Fleet per territory. Fleets let you group devices for shared configuration and routing. A natural breakdown is one fleet per delivery territory or per tank capacity class — a 250-gallon residential fleet and a 1000-gallon commercial fleet may have different alert thresholds and report cadences. Smart Fleets can auto-assign new devices by matching tags set at provisioning time (e.g.
tank_size:1000gal). -
Set environment variables. In Notehub, navigate to Projects → [Your Project] → Environment and configure a Fleet at the Fleet level or Device level. All variables below are optional; firmware compile-time defaults are shown in parentheses. Any value set in Notehub takes effect on the device's next inbound sync — no firmware re-flash required. Best practice: set variables on the Fleet, so a single configuration applies to all tanks in the fleet; override at the Device level for per-tank exceptions.
Variable Default Purpose tank_capacity_gal500Usable tank capacity in gallons at 100 % gauge reading. sensor_empty_ma4.0Transmitter output current in mA corresponding to 0 % fill (empty tank). Standard 4–20 mA transmitters output exactly 4.0 mA at empty; adjust only if the installed unit has a non-standard live-zero (rare). sensor_full_ma20.0Transmitter output current in mA corresponding to 100 % fill. Standard 4–20 mA transmitters output 20.0 mA at full; adjust if the installed unit does not reach exactly 20 mA at the full-tank position. fill_alert_pct20Fill percentage below which a low_fillalert fires.consumption_alert_gal_per_day100Daily consumption rate above which a high_consumptionalert fires. Useful for detecting leaks or sudden demand spikes.sample_interval_min15Minutes between sensor samples. report_interval_hr24Hours between summary Notes. alert_cooldown_hr4Hours between repeated alerts of the same type. Prevents a slowly-draining tank from generating an alert every 15 minutes. consumption_alert_streak3Number of consecutive sample cycles above consumption_alert_gal_per_dayrequired before ahigh_consumptionalert fires. Increasing this value reduces false positives from transient ADC jitter or short-lived post-refill spikes; set to1to alert on the first above-threshold reading.wifi_ssid(unset) SSID of a WiFi network to use as a secondary transport. Both wifi_ssidandwifi_passwordmust be set; the firmware issuescard.wifion the next inbound sync (up to 48 hours at the default cadence. See step 3 above) so the Notecard stores the credentials and connects over WiFi when available. Credentials persist on the Notecard even if the env vars are later cleared. Note: env var values are visible to Notehub project collaborators — use a dedicated IoT or guest network.wifi_password(unset) WPA2 passphrase for the network specified by wifi_ssid. -
Satellite deployments (cellular-dark sites). No hardware change is needed — Notecard for Skylo's satellite radio is already on the board, and the firmware enables cellular→satellite fallback by setting
card.transporttowifi-cell-ntn(see §7). At sites with no cellular coverage the board falls back to the Skylo NTN satellite network automatically; all events travel through the same Notehub project regardless of transport. The board must complete at least one initial non-NTN (cellular or WiFi) sync to associate with the project and register Notefile templates before satellite can be used, so commission each unit where it has terrestrial coverage even if it will routinely operate over satellite. The daily summary Note (~40 bytes per record) fits within typical NTN satellite payload budgets; each inbound sync also consumes some of the bundled 10 KB satellite allocation, so consider wideningreport_interval_hr(which also widens the inbound cadence) at satellite sites. Review the Satellite Best Practices guide before deploying to understand satellite-specific duty-cycle and data-budget considerations. -
Configure routes. Add one route for
tank_alert.qo(real-time delivery to the dealer's dispatch or routing system) and a second fortank_status.qo(batched delivery to a time-series store for historical trend analysis and route-density modeling). Keeping the two Notefiles separate at the source means each can be fanned out to a different destination at a different urgency — alerts go somewhere that pages an operator; daily summaries go somewhere that feeds a dashboard.
7. Firmware Design
Main sketch: firmware/propane_tank_telemetry/propane_tank_telemetry.ino. Sensor math, fill-level calculation, and consumption tracking are factored into firmware/propane_tank_telemetry/propane_tank_telemetry_helpers.h.
Dependencies:
- Arduino core for STM32 (
stm32duino/Arduino_Core_STM32) — install via Boards Manager. Blues Wireless Notecard(thenote-arduinolibrary). Install via the Arduino Library Manager orarduino-cli lib install "Blues Wireless Notecard". See the note-arduino releases for available versions.OneWire— install via Library Manager.DallasTemperature— install via Library Manager.
Modules
| Responsibility | Where |
|---|---|
Notecard configuration (hub.set, card.transport wifi-cell-ntn for cellular→satellite fallback, templates) | hubConfigure, defineTemplates |
| Environment-variable fetch per wake | fetchEnvOverrides |
| 4-20 mA loop read → mA current | readTransmitterMA |
| DS18B20 OneWire temperature read | readTemperatureC |
| Transmitter current → fill % (linear interpolation) | computeFillPct |
| Fill % → gallons (linear scale) | computeFillGal |
| Consumption rate (EWMA), days-until-empty projection | updateConsumption, daysUntilEmpty |
| Alert evaluation and emission | runSampleCycle, sendAlert |
| Daily summary | sendSummary |
| Persistent state across deep-sleep cycles | PersistState + NotePayloadSaveAndSleep / NotePayloadRetrieveAfterSleep |
Sensor reading strategy
Gauge-port level transmitter (4-20 mA). The Cygnet's 12-bit ADC reads the voltage across the 120 Ω shunt. A 16-sample average filters switching noise, then the mean voltage is converted to current (mA):
current_ma = (adc_voltage / 120.0) × 1000.0The firmware's valid window is 3.5–21 mA: below 3.5 mA indicates an open-loop wiring fault; above 21 mA indicates a short or unexpected diagnostic output. Both conditions set the reading to NAN and emit a sensor_fault alert. With the 120 Ω shunt, a 21 mA signal produces 2.52 V at A0 — well within ADC range. The ADC is electrically safe up to ~27 mA, so a transmitter in full fault-high condition does not risk ADC damage.
Fill percentage and fill gallons. The Rochester Sensors M6300-LP + R6315-12 float transmitter outputs a current proportional to the float's position in the liquid propane — the output already represents fill level directly, independent of liquid density or temperature. computeFillPct converts the transmitter current to fill percentage with a simple linear interpolation between the configured empty and full calibration points:
fill_pct = (current_ma - sensor_empty_ma) / (sensor_full_ma - sensor_empty_ma) × 100.0computeFillGal then scales that to gallons:
fill_gal = (fill_pct / 100) × tank_capacity_galNo density or temperature correction is applied to the fill reading — the float tracks the liquid surface directly and its current output is already an accurate representation of fill level across the full operating temperature range.
Temperature (DS18B20 OneWire). The DallasTemperature library handles conversion timing. Tank wall temperature is included in daily summary Notes so cloud-side analytics can correlate demand patterns against ambient conditions — propane consumption is strongly seasonal. A missing or faulted DS18B20 produces the -9999 sentinel in the temp_c field of summary Notes but does not affect the fill reading.
Sensor selection rationale
The initial project specification called for a low-power ultrasonic or pressure level sensor with the DS18B20 temperature probe used for vapor-pressure compensation in the fill measurement path. After evaluating both sensing methods for LP gas tank duty, this design departs from that specification and uses a float-type 4–20 mA transmitter instead. The rationale is detailed in the table below and summarised in the firmware's top-of-file sensor model comment.
| Approach | Why evaluated | Why not selected for this design |
|---|---|---|
| Ultrasonic time-of-flight (transducer at tank top; measures vapor-space height by round-trip echo time) | Non-contact; no liquid exposure for the sensor electronics; well-established for above-ground tank gauging in other applications | Requires a dedicated transducer port at the tank top — an additional tank penetration beyond the standard 1¼″ NPT gauge port that the Rochester Sensors float gauge already occupies. The speed of sound in the LP vapor space varies with temperature and gas composition; an accurate fill reading requires a temperature-compensated speed-of-sound correction, placing the DS18B20 in the fill measurement path and adding a second independent failure mode. LP vapor composition (propane/butane ratio) is not known to the firmware and varies by supplier and season, introducing a systematic bias that cannot be corrected without a composition sensor. |
| Hydrostatic pressure (pressure sensor measuring liquid column head pressure) | Single-point measurement; sensor can be installed at an existing tank fitting | For a horizontally-oriented LP tank, the gauge port at the top of the tank dome accesses the vapor space, not the liquid column bottom, so a sensor at the gauge port reads vapor pressure, not liquid head. Accessing the liquid bottom requires a second tank penetration (a service-valve tee or a dedicated bottom fitting), which increases installation complexity and the number of tank connections requiring LP gas technician work. Even with a bottom connection, the liquid head for a typical 500-gallon horizontal tank is only ~5 kPa (~0.7 psi) riding on top of ~850 kPa (~120 psi) of vapor pressure; resolving fill level to ±5 % from that signal requires a pressure transmitter with ≤ 0.01 % full-scale accuracy — well beyond standard industrial grade. Alternatively, a differential pressure sensor spanning a bottom port and a vapor-space port cancels the vapor background and improves accuracy, but adds a second tank connection and requires two separate field-wiring runs to the enclosure. Either pressure variant places the DS18B20 in the fill calculation path (density correction), consistent with the original brief, but at the cost of two tank penetrations vs. one. |
| Float-type 4–20 mA transmitter (Rochester Sensors M6300-LP + R6315-12, selected design) | Industry-standard LP gas gauging method; well-understood installation at the existing gauge port | — |
The Rochester Sensors M6300-LP Magnetel® float gauge + R6315-12 transmitter was selected for this design because it installs at the tank's single standard 1¼″ NPT dip-tube gauge port, requires no additional tank penetrations, and produces a 4–20 mA output that is directly proportional to fill level regardless of liquid temperature or density — the float tracks the physical liquid propane surface, so its current output is inherently density-independent. No temperature correction is needed or applied in firmware. The principal trade-off relative to the original specification is a continuously-powered 4–20 mA current loop (the dominant load in the power budget), versus the switched-power or ultra-low-power sensing that an I²C ultrasonic or differential-pressure sensor could provide; see §11 for the power-budget discussion.
The DS18B20 temperature probe is retained in the design for cloud-side seasonal demand analytics. Its reading is included in every tank_status.qo daily summary Note and is not passed to the fill calculation. The top-of-file sensor model comment in propane_tank_telemetry.ino records this same rationale alongside the implementation.
Event payload design
Two template-backed Notefiles. Templates store Notes as compact fixed-length records rather than free-form JSON — at 365 summary Notes per tank per year across a fleet of thousands of tanks, the bandwidth savings are material on a prepaid SIM.
tank_status.qo (daily summary):
{
"file": "tank_status.qo",
"body": {
"fill_pct": 42.3,
"fill_gal": 211.5,
"min_fill_pct": 38.1,
"temp_c": 14.8,
"gal_per_day": 8.2,
"days_until_empty": 25.8,
"transmitter_ma": 11.3
}
}tank_alert.qo (immediate, sync:true):
{
"file": "tank_alert.qo",
"sync": true,
"body": {
"alert": "low_fill",
"fill_pct": 18.2,
"fill_gal": 91.0,
"days_until_empty": 11.1,
"gal_per_day": 8.2
}
}Two alert types are defined: low_fill (fill percentage dropped below fill_alert_pct) and high_consumption (smoothed daily consumption rate has exceeded consumption_alert_gal_per_day for consumption_alert_streak consecutive sample cycles, default 3, to debounce transient spikes from ADC jitter or post-refill noise). A third synthetic type, sensor_fault, fires when the transmitter current is outside the valid 4-20 mA window — open-circuit or short on the current loop. All three use the same tank_alert.qo Notefile with sync:true so they bypass the daily outbound window and arrive at the dealer's dispatch system within the Notecard's session-establishment window (typically well under 60 seconds in good cellular coverage, and minutes when the unit is operating over the Skylo satellite link; see the NOTE-NBGLWX datasheet for authoritative figures).
Satellite alert latency. When Notecard for Skylo is operating over the satellite (NTN) link, sync:true does not eliminate latency — the alert must wait for an available satellite pass, and Skylo's network duty-cycle rules constrain how often sessions can be opened. Treat satellite alert latency as minutes, not seconds. The session energy profile over satellite also differs from a cellular session; the cellular Mojo current figures in §9 do not directly apply to satellite sessions. Validate alert timing and solar/battery sizing separately for sites expected to operate over satellite, using the Satellite Best Practices guide before commissioning.
Low-power strategy
Between samples, the Cygnet is cut entirely. loop() runs one sample cycle, then serializes state into the Notecard's flash via NotePayloadSaveAndSleep, which internally calls card.attn to cut host power for sample_interval_min × 60 seconds. Notecard for Skylo itself idles at ~8 µA between network sessions (NOTE-NBGLWX published idle figure), regardless of which radio it last used. On the next scheduled wake the host enters setup(), calls NotePayloadRetrieveAfterSleep to rehydrate state (including the running consumption history and alert cooldown timestamps), then hands off to loop() for the next sample cycle.
This structure matters beyond battery life. Because sampling lives in loop(), the same code path runs on every iteration — both after a hardware power-cut (deep-sleep field mode) and after the bench delay() fallback (USB-powered mode). The behavior you observe on the bench is the behavior you'll see in the field.
The Notecard is configured in periodic mode with an outbound period matching report_interval_hr. Summary Notes accumulate in the Notecard's queue and sync in a single cellular session once per day. Alert Notes set sync:true and flush within minutes of triggering.
Retry and error handling
- The first Notecard transaction at boot uses
notecard.sendRequestWithRetry(req, 10)to paper over the cold-boot I²C race documented in the note-arduino library. - Transmitter current readings outside 3.5–21 mA are rejected as
NANand excluded from summary averages. Asensor_faultalert fires on the first detection and is suppressed foralert_cooldown_hrthereafter — enough to page the dealer once without flooding on every 15-minute cycle. - DS18B20 returns
DEVICE_DISCONNECTED_C(−127.0) if no sensor is present. Firmware checks for this sentinel and excludes the reading from the window temperature average (thetemp_cfield in the summary Note carries the-9999sentinel when no valid temperature samples were collected), so a missing probe does not affect the fill reading. - Consumption rate is computed only when two consecutive valid fill readings exist. A refill event (fill level increases by more than 5 % between samples) resets the short-term accumulator without touching the EWMA, so a delivery visit doesn't corrupt the running consumption estimate.
- Env var changes to
report_interval_hrre-applyhub.seton the next wake so the Notecard's outbound cellular cadence stays synchronized with the local summary cadence.
Key code snippet 1: template definition
Templates compress daily summary Notes to fixed-length records. Notecard template format codes follow the pattern XY where X is the byte size and Y is the type:
14.1: 4-byte float (±3.4e38, ~7 significant digits, suitable for fill %, consumption rates, days-until-empty)12: 2-byte signed integer (−32,768 to 32,767, not used in this design but shown for reference)
J *req = notecard.newRequest("note.template");
JAddStringToObject(req, "file", "tank_status.qo");
JAddNumberToObject(req, "port", 50);
J *body = JAddObjectToObject(req, "body");
JAddNumberToObject(body, "fill_pct", 14.1); // current fill at time of note
JAddNumberToObject(body, "fill_gal", 14.1); // current fill gallons
JAddNumberToObject(body, "min_fill_pct", 14.1); // lowest fill seen this window
JAddNumberToObject(body, "temp_c", 14.1); // window-averaged tank temperature
JAddNumberToObject(body, "gal_per_day", 14.1);
JAddNumberToObject(body, "days_until_empty", 14.1);
JAddNumberToObject(body, "transmitter_ma", 14.1); // current transmitter output current
notecard.sendRequest(req);For a detailed reference on Notecard template codes, see the Note.template API documentation.
Key code snippet 2: 4-20 mA level transmitter current → fill percentage → fill gallons
computeFillPct converts the float-type LP gauge-port transmitter current to fill percentage via a linear interpolation between the configured empty and full calibration points. computeFillGal scales that to gallons. No density or temperature correction is applied — the float rides the liquid surface directly, so its current output is already an accurate fill reading across the full operating temperature range.
// In propane_tank_telemetry_helpers.h
// Convert 4-20 mA float-type level transmitter current to fill percentage (0–100 %).
// The Rochester Sensors M6300-LP + R6315-12 outputs a current proportional to the
// float position (liquid surface level) inside the tank. A linear interpolation
// between the configured empty and full calibration currents gives fill percentage
// directly — no density or temperature correction is needed.
static float computeFillPct(float current_ma,
float sensor_empty_ma, float sensor_full_ma) {
if (isnan(current_ma)) return NAN;
float span = sensor_full_ma - sensor_empty_ma;
if (span < 0.1f) return NAN;
float fill_pct = (current_ma - sensor_empty_ma) / span * 100.0f;
return fmaxf(0.0f, fminf(100.0f, fill_pct));
}
// Fill percentage → gallons (linear scale).
static float computeFillGal(float fill_pct, float tank_capacity_gal) {
if (isnan(fill_pct)) return NAN;
return (fill_pct / 100.0f) * tank_capacity_gal;
}In runSampleCycle() the call is:
float fill_pct = computeFillPct(xmtr_ma, SENSOR_EMPTY_MA, SENSOR_FULL_MA);Temperature is still read on every cycle (for inclusion in the daily summary) but is not passed to the fill calculation.
Key code snippet 3: sleep with state persistence
NotePayloadSaveAndSleep serializes the runtime state struct into Notecard flash and then calls card.attn to cut host power for exactly SAMPLE_INTERVAL_MIN × 60 seconds. The Notecard's ATTN pin brings the host back up on schedule; NotePayloadRetrieveAfterSleep rehydrates the struct at the top of the next setup(). Sampling runs in loop() before the sleep call so it executes on every iteration — both after a hardware power-cycle (deep-sleep mode) and after the bench delay() fallback (USB-powered mode).
// In loop() — sample, then sleep (or delay on bench); repeats each iteration
runSampleCycle();
state.cycles++;
NotePayloadDesc payload = {0, 0, 0};
NotePayloadAddSegment(&payload, STATE_SEG_ID, &state, sizeof(state));
NotePayloadSaveAndSleep(&payload, (uint32_t)SAMPLE_INTERVAL_MIN * 60UL, NULL);
// Bench/USB fallback: if card.attn doesn't cut VBAT, wait here, then loop()
// runs again and performs the next sample — correct cadence with no extra code.
delay((uint32_t)SAMPLE_INTERVAL_MIN * 60UL * 1000UL);8. Data Flow
Every sample_interval_min (default 15 min) the Cygnet wakes, reads the LP gauge-port level transmitter and DS18B20 temperature probe, converts the transmitter current directly to fill %, updates the consumption EWMA, and evaluates three alert conditions.
Collected. Fill percentage (from 4-20 mA float-type level transmitter current, linearly interpolated between the configured empty and full calibration points), fill gallons (fill % × tank capacity), tank shell temperature (DS18B20 °C — included in every summary for seasonal demand analytics), raw transmitter current (mA for diagnostics), smoothed daily consumption rate (gal/day), projected days-until-empty.
Transmitted.
tank_status.qo— one templated Note perreport_interval_hr(default daily). Carries the current (most-recent valid reading)fill_pct,fill_gal, andtransmitter_ma— not window averages, so a refill or sharp draw-down is accurately represented at reporting time. Also carriesmin_fill_pct(the lowest fill percentage seen during the window, for analytics); window-averagedtemp_c(representing the day's thermal environment); the current EWMAgal_per_day(a running smoothed consumption estimate); and the deriveddays_until_empty(current fill gallons divided by the EWMA rate). Batched and synced in a single cellular session. 365 Notes per tank per year.tank_alert.qo— emitted on threshold trip withsync:true, bypassing the outbound timer. Suppressed foralert_cooldown_hrafter each firing to prevent alarm fatigue.
Routed. Notehub fans tank_alert.qo to whatever real-time channel the dealer's operations team uses (dispatch system webhook, SMS gateway, paging service) and tank_status.qo to a time-series store that feeds historical trend analysis and route-density modeling.
Alerts trigger on.
low_fill— fill percentage drops belowfill_alert_pct(default 20 %). Fires once peralert_cooldown_hruntil the tank is refilled.high_consumption— smoothed daily consumption rate has exceededconsumption_alert_gal_per_day(default 100 gal/day) forconsumption_alert_streakconsecutive sample cycles (default 3). The streak debounce prevents false positives from transient ADC jitter or short-lived post-refill consumption spikes; the counter resets to zero any time the rate drops back below threshold or the transmitter reports a fault. At the 15-minute default sample rate, a streak of 3 means the sustained high-rate condition must persist for at least 30 minutes before the alert fires. Most residential tanks run 3–15 gal/day in normal operation; 100 gal/day sustained flags a potential leak or piping fault.sensor_fault— transmitter current outside the valid 4–20 mA window. Indicates wiring damage, a flooded enclosure, or a failed transmitter. Requires physical inspection.
Cloud-side usage model (high level). The dealer's analytics system receives daily tank_status.qo Notes with fill_gal and gal_per_day for every tank. A simple projection — days_until_empty = fill_gal / gal_per_day — is computed by the firmware and included in each Note, so the dealer's route planner can sort tanks by urgency without running any analytics locally. Route density optimization (grouping tanks within a delivery window by geography and urgency) is a cloud-side concern, not a firmware concern; the device's job is to get accurate fill data into Notehub on time.
9. Validation and Testing
Expected cadence in steady state. A correctly-functioning unit on a residential propane tank should produce one tank_status.qo event per day and zero tank_alert.qo events during normal operation. During commissioning, expect a sensor_fault event if the transmitter wiring is incomplete, and low-fill alerts if the tank happens to already be below threshold.
Bench validation before field deployment. To simulate the transmitter on the bench, drive the A0 analog input with a variable voltage in the 0.48–2.40 V range (a potentiometer from the 3.3 V rail to GND, or a bench DC supply, works). Confirm the firmware maps 0.48 V to 0 % fill (4 mA), 1.44 V to 50 % fill (12 mA), and 2.40 V to 100 % fill (20 mA). Verify the open-circuit condition (drive A0 to 0 V or below 0.42 V, corresponding to < 3.5 mA) emits a sensor_fault alert Note. For the DS18B20, confirm the firmware reports a valid temperature on the serial port and that a missing probe produces NAN (which becomes the -9999 sentinel in summary Notes) rather than a garbage reading.
Commissioning calibration. After mounting on the tank, set tank_capacity_gal to the tank's rated usable capacity in the fleet's Notehub environment variables. Verify that the fill percentage shown in Notehub matches the independent reference reading (mechanical gauge, weight, or LP technician's measurement) within a few percent. If there is a persistent offset that grows toward the high-fill end, the transmitter's span may not reach exactly 20 mA at the full-float position — adjust sensor_full_ma to the transmitter's actual full-scale output current until the Notehub reading aligns with the reference. If the offset is consistent across the full range (roughly constant error from empty to full), the transmitter may have a non-standard live-zero — adjust sensor_empty_ma from its default 4.0 mA to match the transmitter's actual output at the empty (float-at-bottom) position. Because the fill calculation is a simple linear interpolation with no temperature correction, the commissioning measurement is valid at any ambient temperature — no special thermal condition is required.
Using Mojo to validate power behavior. Place the Mojo inline between the 5 V step-down output and the Notecarrier VBAT pad. The table below lists expected current envelopes on the 5 V rail for each major firmware state, with the source of each figure clearly identified.
| Firmware state | Expected current (5 V rail, Mojo) | Source |
|---|---|---|
Deep sleep (host cut via card.attn, Notecard idle, radio off) | ~8 µA @ 5 V | Blues-published idle figure for the NOTE-NBGLWX; see the low-power design guide and firmware best practices guide. The Mojo measures the entire powered subsystem (Notecard + Notecarrier CX regulators), so the bench reading will be modestly above the Notecard-only figure; use trace shape and per-session energy as the primary commissioning targets, not an exact match to the Notecard-only idle number. |
| Host awake — sampling (Cygnet active, 16-sample ADC average, DS18B20 750 ms conversion, I²C Notecard call, ~5 s total) | 30–50 mA | Bench estimate for the host subsystem only — not a Blues-published figure. Covers Cygnet STM32 active-mode current, 12-bit ADC operation, DS18B20 conversion current, and I²C Notecard transactions. The exact value varies with supply voltage and MCU clock. Trace shape (brief spike every sample_interval_min, then flat near zero) is the more reliable commissioning indicator than the absolute mA reading. |
| Notecard network session — cellular (or satellite), small queued Note, good signal | in-session average ~250 mA from the onboard modem; brief peaks up to ~2 A for a few ms | Notecard for Skylo's Quectel BG95-S5 modem draws on the order of ~250 mA average during a network session (cellular or satellite are similar in magnitude), with brief higher peaks — a 2G transmit burst can momentarily pull nearly 2 A for a few milliseconds (see the Blues low-power hardware design application Note). The Pololu D24V22F5 step-down (2.5 A rated) and SLA battery in this design comfortably source ≥ 2 A. Session duration is typically 30–60 s on cellular — expect a broad hump on the Mojo trace, not a sharp spike. Weaker signal or first-time network registration lengthens the session and raises per-session energy; the Blues low-power design guide RSRP/SINR signal-quality table shows how signal conditions affect mAh per session. |
The expected Mojo trace for a 15-minute sample / 24-hour cellular sync cycle: a brief (~5 s) 30–50 mA spike every 15 minutes from host-awake sampling, and once per day a broader 30–60 s hump averaging ~250 mA for the cellular sync. Between sample spikes the trace should sit flat at the ~8 µA idle floor — continuously elevated current between spikes means the host is not entering deep sleep (check the card.attn wiring and the NotePayloadSaveAndSleep return path). At the 15-minute default cadence the expected 24-hour Mojo total has three contributors: (1) idle — ~8 µA Notecard floor × 24 h ≈ ~0.2 mAh (the total 5 V rail idle including Notecarrier CX regulator quiescent will read modestly above the Notecard-only figure at the bench); (2) sampling — 96 host-awake wakes/day × ~5 s @ 30–50 mA = ~4–6.7 mAh (96 wakes × 5 s ÷ 3 600 s/h × 30–50 mA); (3) daily sync — ~250 mA × ~45 s ÷ 3 600 s/h ≈ ~3 mAh. The expected daily total is therefore roughly 7–10 mAh/day. If the Mojo 24-hour total runs materially above this range, the network session may be staying open longer than expected or the Notecard may be in continuous mode rather than periodic; confirm with hub.status.
Note: the 4-20 mA transmitter loop is powered from the 24 V boost converter circuit and does not appear on the Mojo trace (Mojo measures the 5 V Notecarrier rail only). For a complete energy audit of the transmitter loop, place a bench ammeter in series with the boost converter's Vin+ lead on the 12 V system rail. Expect a draw of approximately 50–110 mW (4 mA loop, empty tank) to 550 mW (20 mA loop, full tank) from the 12 V rail continuously, accounting for boost converter losses; the 4–20 mA loop current itself can be read directly in serial debug output as xmtr_ma.
When operating over satellite (NTN). The session-duration and daily-energy figures above describe cellular sessions. When Notecard for Skylo falls back to the Skylo satellite link the idle draw is unchanged (~8 µA) and a satellite session draws a similar ~250 mA average from the same modem, but session duration, the number of sessions Skylo's duty-cycle rules allow per day, and per-session energy differ from cellular. sync:true alert delivery depends on a satellite pass being available — latency is minutes, not seconds. Each inbound sync also consumes some of the bundled 10 KB satellite allocation, so widen report_interval_hr at satellite sites to conserve it. Validate solar panel sizing, battery capacity, and alert latency separately for any site expected to operate over satellite using the Satellite Best Practices guide before commissioning; do not assume the cellular sizing figures in this section are sufficient.
10. Troubleshooting
No device appearing in Notehub after power-up.
- Confirm the Notecard MAIN u.FL antenna is connected to an external antenna (not left stubbed internally). A missing or unplugged antenna will prevent cellular registration entirely.
- Check that
PRODUCT_UIDis defined in the firmware and matches the UUID shown in Notehub under Projects → ProjectUID. - Verify that the 5 V step-down is outputting exactly 5.0 V (measured at Notecarrier +VBAT pad before applying load).
- Check the serial console for Notecard and I²C errors. If unavailable, move the device to a location with strong cellular signal (≥2 bars) and reboot.
Device appears in Notehub but no events are arriving.
- Confirm the device is showing a recent session timestamp in Notehub (Devices → [Your device] → Events → Device Activity). A stale timestamp means the device is not connecting.
- Check the Notecard's hub.status: connect via USB to the Notecarrier CX's USB-C port and open the Notecard Playground, then issue
{"req":"hub.status"}. The response should show"mode": "periodic"and"outbound": 24(hours). If it shows"status": "error", the Notecard may not be properly associated with the project. - Verify that environment variables are being delivered. Issue
{"req":"env.list"}in Notecard Playground. If the response is empty, the device has not yet received the fleet's environment variables — this can take up to 48 hours at the default 24-hour inbound sync cadence (see §6 step 3).
Fill percentage is incorrect or drifts over time.
- Confirm the tank capacity is set correctly in the environment variable
tank_capacity_gal. An incorrect capacity will scale all fill percentages proportionally. - Verify the transmitter is wired correctly: the loop supply must come from the 24 V boost converter output (not the 12 V rail), and the shunt-to-GND junction must connect to A0. At an empty tank (float at bottom), measure A0 with a meter — it should read ~0.48 V. At a full tank, it should read ~2.40 V.
- If the fill reading is consistently high or low across the full range, the transmitter may have a non-standard live-zero or span. See §9 "Commissioning calibration" for how to adjust
sensor_empty_maandsensor_full_ma.
Alerts are firing constantly, or false sensor_fault alerts.
- A
sensor_faultalert indicates the transmitter current is outside the 3.5–21 mA window (open circuit or short). Check the loop wiring: confirm both conductors from the transmitter are connected and not damaged, and that the shunt resistor is solidly connected. - High-consumption alerts may be false positives after a refill event. The firmware requires
consumption_alert_streakconsecutive above-threshold cycles before alerting; increaseconsumption_alert_streakin environment variables to reduce sensitivity to post-refill transients. - Set
alert_cooldown_hrto increase the minimum hours between repeated alerts of the same type.
Very high or very low current readings in serial debug.
- The firmware reads the transmitter current every sample cycle and prints it to the serial console (USB-C on the Notecarrier CX). At an empty tank you should see ~4.0 mA; at a full tank, ~20.0 mA. If readings are consistently outside this range, re-check the shunt wiring and the 24 V boost converter output voltage (should be exactly 24 V measured at the transmitter + terminal with no load attached).
Battery drains quickly / device stops after a few hours.
- Confirm the host is actually entering deep sleep. The firmware calls
NotePayloadSaveAndSleepafter each sample cycle; if this fails, the host will run continuously and drain the battery in hours. Check thatcard.attnis properly wired (see §5 Step 5) and that the ATTN signal is reaching the Cygnet host. - If using the Mojo for validation, confirm it is removed before field deployment. The Mojo adds a continuous measurement load even during deep sleep.
- For sites operating over the Skylo satellite (NTN) link, review the Satellite Best Practices guide — satellite session timing and duty-cycle behavior differ from cellular and may shift the energy budget; size the battery and solar panel against the expected satellite session pattern.
WiFi is not connecting even after credentials are set.
- WiFi credentials are delivered via environment variables and applied on the next inbound sync. At the default 24-hour report cadence, inbound syncs occur every 48 hours — credentials may take up to 48 hours to reach the device. Temporarily lower
report_interval_hrto 1 hour to speed delivery, then restore the original value after confirming connection. - Alternatively, set WiFi credentials via USB at the bench (see §6 step 3) before sealing the enclosure.
- Notecard for Skylo's WiFi uses its onboard 2.4 GHz antenna; a metal enclosure will attenuate that signal. If WiFi fallback is important at this site, prefer a non-metallic enclosure or rely on cellular/satellite, which use the external MAIN antenna.
11. Limitations and Next Steps
This reference design covers the common case of a dealer instrumenting a tank fleet for demand-driven dispatch — float transmitter at the gauge port, temperature probe on the shell, cellular (or satellite) backhaul. The trade-offs below are deliberate scope choices; each has a clear extension path for a production rollout.
Simplified for the POC
Continuously-powered current loop. The Rochester Sensors M6300-LP + R6315-12 and similar LP gauge-port float transmitters use a continuously-powered 4–20 mA current loop. Powered from the 24 V boost converter, the loop draws 96–480 mW from the 24 V rail (4 mA × 24 V to 20 mA × 24 V); accounting for the boost converter's ≈ 87 % efficiency, the draw on the 12 V system rail ranges from ≈ 110 mW (empty tank) to ≈ 550 mW (full tank) continuously. This is the dominant load in the system power budget. At worst case (full tank, 20 mA), the transmitter loop draws ≈ 550 mW for 24 h = ≈ 13.2 Wh/day from the 12 V rail; a 10 W solar panel at ≥ 4 h/day peak sun yields ≈ 40 Wh — well above the combined transmitter and electronics load for mid-latitude deployments. In low-sun environments or high-latitude winter deployments, size the panel to 20 W. Note: the tank spends most of its time between 20–80 % fill (8–16 mA), so the average draw is typically 250–370 mW, materially below the 550 mW worst case.
Fill-gallons calculation uses a linear scale. computeFillGal computes fill_gal = (fill_pct / 100) × tank_capacity_gal. The horizontal-cylinder cross-section introduces a small nonlinearity between liquid height and volume (the relationship curves near the top and bottom of the tank). This nonlinearity is not corrected in firmware — an additional geometry correction table keyed to tank_inner_diameter_in could improve accuracy at fill levels below ~20 % or above ~80 %, at the cost of an additional environment variable and more complex calibration. For the typical operating range (20–80 % fill) the linear-scale error is small.
Satellite (NTN) operation requires an unobstructed sky-view antenna and an initial non-NTN sync. Notecard for Skylo adds satellite with no extra module, but to use the Skylo link the Skylo-certified MAIN antenna must be mounted outdoors with a clear view of the sky (northern hemisphere: the southern sky) — it cannot reach the satellite from beneath a metal obstruction. Satellite operation is also opt-in at the Notecard level: the firmware enables it by setting card.transport to wifi-cell-ntn, and the board must complete at least one initial non-NTN (cellular or WiFi) sync to associate with Notehub and register Notefile templates before NTN works — commission each unit where it has terrestrial coverage. Over satellite, expect alert latency in minutes (not seconds), keep each Note within the NTN payload budget, and remember that inbound syncs draw on the bundled 10 KB satellite allocation. At remote tank sites, confirm a suitable sky-view antenna location before relying on the satellite path.
Electronics must be outside the classified area; IS barrier may be required. Blues Notecard and Notecarrier CX electronics are not rated for hazardous locations and must be installed outside the classified area boundary defined by NFPA 58 and the authority having jurisdiction. For 4–20 mA wiring that crosses the classified-area boundary, the AHJ may require a listed intrinsic-safety (IS) barrier in the loop circuit between the tank-side transmitter and the enclosure-side electronics. Transmitter selection, fitting compatibility, classified-area boundary determination, and any IS barrier requirement are outside the scope of the electronics design. Any connection to a propane pressure vessel must comply with NFPA 58, applicable codes, and be performed by a licensed LP gas technician.
Consumption rate requires stable readings over time. The EWMA consumption rate is meaningful only after several days of operation. On first deployment, days_until_empty may be unreliable until the EWMA has converged. The firmware initializes consumption to zero and does not report days_until_empty until at least two consecutive valid fill readings exist.
No flow meter. Consumption rate is estimated from successive fill readings — a delta-volume over delta-time approximation. This is accurate enough for daily route planning but not for billing or leak detection at high precision. A turbine or ultrasonic flow meter at the regulator outlet would give direct consumption measurement; integration would require an additional pulse-counting or analog input channel.
Mojo is bench-validation equipment only. The firmware does not read the Mojo's LTC2959 coulomb counter at runtime. Adding cumulative mAh to the daily summary is a straightforward extension if fleet-level power telemetry is useful for the dealer's operations team.
Production Next Steps
- Transmitter calibration tool — a Notehub JSONata route transform that reads
transmitter_mafrom the first three Notes after provisioning and auto-suggests asensor_full_macorrection, removing the manual commissioning step. - Refill event detection: when
fill_pctincreases by more than 10 % in a single sample cycle, emit arefill_detectedNote with the pre- and post-fill readings. This lets the dealer's billing system close the loop on deliveries without a separate ticket. - Per-tank consumption model: extend the EWMA with seasonal coefficients (summer vs. winter heating demand) so
days_until_emptyis corrected for known demand patterns, not just trailing-average consumption. - Over-the-air host firmware updates via Notecard Outboard DFU once the fleet reaches scale — a threshold recalibration or a new alert type can be pushed fleet-wide without a site visit.
12. Summary
The dealer who used to roll a truck every six weeks because that's what the calendar said now rolls a truck because a specific tank is at 22% and trending toward empty in nine days. A float transmitter at the gauge port, a temperature probe on the shell, a single Notecard for Skylo that carries cellular, WiFi, and satellite on one module — reaching cellular near town and the Skylo satellite network at the remote cabin with nothing to swap — and a daily summary in Notehub turn every tank in the territory into a self-reporting asset — fewer miles, fewer emergency calls, and no more Friday-night apologies to the customer whose heat just went out.