fw_owen
@owen_t42 · Joined April 2026
Embedded developer · agriculture
- Topics
- 6
- Replies
- 20
- Points
- 0
Forum Replies Created
So for our one designer who is a User, I’d make a group and tick designs.write for it? Or does write need Admin no matter what?
Wired ota.rollout.paused into our on-call webhook today. Wave pauses at 2 in the morning are exactly what I want to hear about.
Two of your markers near the top are almost on top of each other. Do they group when they overlap?
I always assumed WROOM was “Wireless ROOM” or something. Never checked.
There’s a voltage supervisor on the board that trips at roughly 4.63 V and the firmware latches it. You read it with vcgencmd get_throttled.
AfcAutoOn on, AfcBw at 41.7 kHz. This week had three mornings at -1 °C and no dropouts. The FEI chart is a nice touch, one probe swings 13 kHz, it gets a TCXO board.
Router A done via phone call with the farm manager, panel opened on the first try and I fixed the Modbus timeout from my desk. Router B updated last night on its own, then the panel worked too. It was on LTE and the 50 MB prompt came up, the session used about 6.
Numbers are in after two weeks. Keepalive 300 (our carrier is fine with it, no timeouts in the Log tab), batches of 3, attributes only on change. Projected ~9 MB per SIM per month, down from 25. The attribute chatter was the surprise: our firmware was publishing lan.ip and cell.rssi as attributes with every reading. Moved rssi into telemetry every 15 minutes instead. Thanks Kevin, those measurements saved me a week.
We track tractors and handheld scanners in large sheds, so I’ve been through both parts.
Positioning: UWB two-way ranging. Fix 4-8 anchors on walls and columns (more in aisles with racking), put a tag on each cart (Qorvo DWM1001/DWM3000 modules are the usual starting point). The tag ranges to the anchors and computes x, y in metres in your own coordinate frame. 10-30 cm accuracy in line of sight. Racks of metal parts will cost you some of that.
The dashboard part is easier than people think. A Map card has an Image (floor plan) mode: you give it the floor plan picture and its width/height in pixels, and then the latitude and longitude columns hold y and x in pixels from the top-left corner. So convert metres to pixels on the cart (or in the gateway) and send them as two keys:
{"pos_x_px": 812, "pos_y_px": 377, "batt_pct": 74, "job": "B12"}
In the card set Latitude column to pos_y_px and Longitude column to pos_x_px, colour markers from a status column (idle, busy, fault), and add tooltip fields for battery and job. Routes can be drawn and replayed too if you want “where did cart 7 go this morning”.
Megan’s question matters for limits. One message per cart per second is 86,400 a day each, so put all the cart’s values in the same message. The default per-device limit is 10 messages a second, so you’re fine there, but look at your monthly message quota before you go to 50 carts. Map cards
Struct with scaled int fixed it. Temperature has been clean since yesterday afternoon, no gaps on the chart. The evaluation order thing was news to me.
Got it working on two bench units and one in the field. I used the upper half of flash plus a 16 KB bootloader. First try failed because I set fw_title on the package to “irr_stm32” and the ESP32 checked for a dash, so it just sat in Queued. Named it properly and it went through to UPDATED with the new current_fw_version.
This is exactly what I needed. Told him: we have the IoT layer, the “4.0” part for us would be the asset tree plus automatic actions on the pivots, and anything MES-like we look at separately once I know what Forge covers. He was happy with that, and I got a ticket to build out Sites & Assets for the north farm. Thanks Maria.
Ha, “plumbing” is probably the word I need for the meeting. But he will ask “so what would make it 4.0” and I still don’t have that.
Once it joins you’ll see your bytes but no values until you give the profile a codec. Plan your payload layout before you write the firmware.
master side, sorry, should have included it:
Wire.requestFrom(8, 9);
m1 = (Wire.read() << 8) | Wire.read();
m2 = (Wire.read() << 8) | Wire.read();
Wire.read(); // the old byte
for (int i = 0; i < 4; i++) ((byte*)&t)[i] = Wire.read();

