The original setup
Each TUAI Ventures field node reports soil and ambient conditions back over LoRa every fifteen minutes. Temperature and humidity came from a basic low-cost sensor chosen mainly for price, on the assumption that any reasonable accuracy would be "good enough" once we applied smoothing on the backend.
What we expected
We expected the sensor to drift a little over a season, same as any cheap part, but to stay broadly usable — a few percentage points of humidity error we could calibrate out in software.
What we found in the field
By week six, two nodes were reporting humidity readings that stopped moving at all after rain events — a strong sign of moisture getting into the sensor housing itself rather than a calibration issue. A third node's temperature readings drifted nearly 4°C high compared to a reference thermometer at the same shelter. That's enough error to throw off irrigation-timing logic downstream.
The pivot
We moved to the Bosch BME280, which reports temperature, humidity, and barometric pressure over a single I2C bus, and re-wired the sensor housing with better weather sealing at the same time:
BME280 pin Arduino Uno Q pin
----------- -----------------
VCC --> 3.3V
GND --> GND
SDA --> SDA (I2C data)
SCL --> SCL (I2C clock)The pressure channel wasn't part of the original spec, but it turned out to be a useful early signal for incoming weather shifts, which we've since wired into a simple "storm approaching" flag on the dashboard.
function WeatherSignal({ pressureTrend }) {
return pressureTrend === "falling" ? (
<span className="text-amber-700">Storm trend detected</span>
) : null;
}Where this leaves us
The BME280 nodes held calibration through a full wet season without drift, and the barometric channel is now doing quiet extra duty beyond what we originally wired the node for.