ESH10000517 - Environment Module
Overview
The ESH10000517 is a comprehensive environmental sensing module featuring the Bosch BME680 sensor, providing advanced environmental monitoring capabilities including temperature, humidity, pressure, and calculated derived parameters for test correlation and environmental characterization.
Description
The Environment Module provides extensive environmental monitoring with real-time measurement, peak tracking, and derived environmental calculations. Using the BME680 environmental sensor, the module delivers industrial-grade sensing with automatic sample averaging, configurable measurement intervals, and persistent peak value tracking for environmental test correlation.
Key Features:
BME680 Environmental Sensor: Single-chip integrated environmental sensing
- Temperature: -40°C to +85°C measurement range
- Humidity: 0-100% relative humidity
- Pressure: 300-1100 hPa absolute pressure
- High-precision 24-bit ADC
Comprehensive Environmental Parameters: Direct and calculated measurements
- Temperature: Ambient, dew point, heat index (with peaks)
- Pressure: Absolute, vapor pressure, altitude calculation (with peaks)
- Humidity: Relative, absolute humidity (with peaks)
- All parameters include peak high and peak low tracking
Intelligent Sampling System: Configurable data acquisition
- Adjustable measurement interval (default: 2000ms)
- Sample depth buffering (default: 5 samples)
- Automatic averaging for noise reduction
- Peak value tracking with reset capability
Weather Calculations: Real-time environmental analytics
- Dew point temperature calculation
- Heat index calculation (apparent temperature)
- Absolute humidity (mass of water vapor per volume)
- Vapor pressure calculation
- Altitude estimation from barometric pressure
Calibration Support: Per-channel gain and offset calibration
- Persistent calibration storage by module identity
- Calibration data accessible via dedicated channel
- Automatic application of calibration factors
Autonomous Operation: Background measurement capability
- Configurable autonomous measurement intervals
- Non-blocking sensor reads
- Automatic channel value updates
Hardware Details
Environmental Sensor:
- Chip: Bosch Sensortec BME680
- I²C Address: 0x76
- Communication: I²C bus
- Measurement Capabilities:
- Temperature: ±0.5°C accuracy (0-65°C)
- Humidity: ±3% RH accuracy (20-80% RH)
- Pressure: ±1 hPa accuracy (300-1100 hPa)
- Integration: Single digital sensor with internal compensation
Measurement Parameters:
- Temperature Range: -40°C to +85°C
- Humidity Range: 0-100% RH
- Pressure Range: 300-1100 hPa
- Update Rate: Configurable (default 2000ms intervals)
Channel Naming Convention
All channels follow the naming pattern: {ModuleIndex}.ESH10000517.{ChannelName}
Where:
{ModuleIndex}is the position of the module in the system (e.g., 0, 1, 2...)ESH10000517is the module type identifier{ChannelName}is the specific capability name from the table below
Example: Module at position 0, temperature reading would be: 0.ESH10000517.READ_TEMPERATURE
Note: Module name format is ENV{index} where index increments for each environment module in the system.
User-Accessible Channels
| Channel Name | Type | Direction | Usage | Description |
|---|---|---|---|---|
| Instrument & Configuration Channels | ||||
| ENV | Instrument | N/A | UserAllocatable | Environment meter instrument channel (InstrumentTypes.EnvironmentMeter) |
| MEASUREMENT_INTERVAL | Counter | OUT | UserAllocatable | Autonomous measurement interval in milliseconds (default: 2000ms) |
| SAMPLE_DEPTH | Counter | OUT | UserAllocatable | Number of samples to buffer for averaging (default: 5) |
| NUMBER_OF_SAMPLES | Counter | IN | UserAllocatable | Current number of samples collected (read-only status) |
| CLEAR_VALUES | Digital | OUT | UserAllocatable | Clear all peak values and sample buffers (write true to clear) |
| Temperature Channels | ||||
| READ_TEMPERATURE | Temperature | IN | UserAllocatable | Ambient temperature in °C (BME680) |
| TEMPERATURE_PEAK | Temperature | IN | UserAllocatable | Peak (highest) ambient temperature in °C |
| TEMPERATURE_PEAK_LOW | Temperature | IN | UserAllocatable | Lowest peak ambient temperature in °C |
| READ_DEWPOINT | Temperature | IN | UserAllocatable | Dew point temperature in °C (calculated) |
| DEWPOINT_PEAK | Temperature | IN | UserAllocatable | Peak dew point temperature in °C |
| DEWPOINT_PEAK_LOW | Temperature | IN | UserAllocatable | Lowest peak dew point temperature in °C |
| READ_HEAT_INDEX | Temperature | IN | UserAllocatable | Heat index (apparent temperature) in °C (calculated) |
| HEAT_INDEX_PEAK | Temperature | IN | UserAllocatable | Peak heat index in °C |
| HEAT_INDEX_PEAK_LOW | Temperature | IN | UserAllocatable | Lowest peak heat index in °C |
| Pressure Channels | ||||
| READ_PRESSURE | Analog | IN | UserAllocatable | Ambient air pressure in Pascals (BME680) |
| PRESSURE_PEAK | Analog | IN | UserAllocatable | Peak ambient air pressure in Pa |
| PRESSURE_PEAK_LOW | Analog | IN | UserAllocatable | Lowest peak ambient air pressure in Pa |
| READ_VAPOR_PRESSURE | Analog | IN | UserAllocatable | Vapor pressure in Pascals (calculated) |
| VAPOR_PRESSURE_PEAK | Analog | IN | UserAllocatable | Peak vapor pressure in Pa |
| VAPOR_PRESSURE_PEAK_LOW | Analog | IN | UserAllocatable | Lowest peak vapor pressure in Pa |
| READ_ALTITUDE | Analog | IN | UserAllocatable | Calculated altitude above sea level in meters |
| ALTITUDE_PEAK | Analog | IN | UserAllocatable | Peak altitude in meters |
| ALTITUDE_PEAK_LOW | Analog | IN | UserAllocatable | Lowest peak altitude in meters |
| Humidity Channels | ||||
| READ_REL_HUMIDITY | Analog | IN | UserAllocatable | Relative humidity in %RH (BME680) |
| REL_HUMIDITY_PEAK | Analog | IN | UserAllocatable | Peak relative humidity in %RH |
| REL_HUMIDITY_PEAK_LOW | Analog | IN | UserAllocatable | Lowest peak relative humidity in %RH |
| READ_ABS_HUMIDITY | Analog | IN | UserAllocatable | Absolute humidity in g/m³ (calculated) |
| ABS_HUMIDITY_PEAK | Analog | IN | UserAllocatable | Peak absolute humidity in g/m³ |
| ABS_HUMIDITY_PEAK_LOW | Analog | IN | UserAllocatable | Lowest peak absolute humidity in g/m³ |
| Calibration | ||||
| CALIBRATION | Calibration | N/A | UserAllocatable | Module calibration table (gain/offset for all channels) |
Total User Channels: 30 (1 instrument + 4 configuration + 9 temperature + 9 pressure + 6 humidity + 1 calibration)
Channel Configuration
Measurement Interval Configuration
Configure autonomous measurement rate:
SetValues(
new[] { "0.ESH10000517.MEASUREMENT_INTERVAL" },
new[] { "1000" } // 1000ms (1 second) interval
);
Sample Depth Configuration
Configure averaging buffer size:
SetValues(
new[] { "0.ESH10000517.SAMPLE_DEPTH" },
new[] { "10" } // Average over 10 samples
);
Note: Peak values are not calculated until the sample depth has been reached.
Clear Peak Values
Reset all peak tracking and sample buffers:
SetValues(
new[] { "0.ESH10000517.CLEAR_VALUES" },
new[] { "true" } // Clear all peaks and buffers
);
Programming Interface
Read Environmental Parameters:
// Read current temperature
string[] temp = GetValues(new[] { "0.ESH10000517.READ_TEMPERATURE" });
double temperatureC = double.Parse(temp[0]);
Console.WriteLine($"Temperature: {temperatureC}°C");
// Read humidity
string[] humidity = GetValues(new[] { "0.ESH10000517.READ_REL_HUMIDITY" });
double humidityRH = double.Parse(humidity[0]);
Console.WriteLine($"Humidity: {humidityRH}%RH");
// Read pressure
string[] pressure = GetValues(new[] { "0.ESH10000517.READ_PRESSURE" });
double pressurePa = double.Parse(pressure[0]);
Console.WriteLine($"Pressure: {pressurePa} Pa ({pressurePa / 100.0} hPa)");
Read Calculated Parameters:
// Read dew point
string[] dewpoint = GetValues(new[] { "0.ESH10000517.READ_DEWPOINT" });
double dewpointC = double.Parse(dewpoint[0]);
Console.WriteLine($"Dew Point: {dewpointC}°C");
// Read heat index (apparent temperature)
string[] heatIndex = GetValues(new[] { "0.ESH10000517.READ_HEAT_INDEX" });
double heatIndexC = double.Parse(heatIndex[0]);
Console.WriteLine($"Heat Index: {heatIndexC}°C (feels like)");
// Read altitude
string[] altitude = GetValues(new[] { "0.ESH10000517.READ_ALTITUDE" });
double altitudeM = double.Parse(altitude[0]);
Console.WriteLine($"Altitude: {altitudeM} meters above sea level");
// Read absolute humidity
string[] absHumidity = GetValues(new[] { "0.ESH10000517.READ_ABS_HUMIDITY" });
double absHumidityGM3 = double.Parse(absHumidity[0]);
Console.WriteLine($"Absolute Humidity: {absHumidityGM3} g/m³");
Monitor Peak Values:
// Read temperature peak values
string[] tempPeaks = GetValues(new[] {
"0.ESH10000517.TEMPERATURE_PEAK",
"0.ESH10000517.TEMPERATURE_PEAK_LOW"
});
double maxTemp = double.Parse(tempPeaks[0]);
double minTemp = double.Parse(tempPeaks[1]);
Console.WriteLine($"Temperature Range: {minTemp}°C to {maxTemp}°C");
// Read humidity peak values
string[] humidityPeaks = GetValues(new[] {
"0.ESH10000517.REL_HUMIDITY_PEAK",
"0.ESH10000517.REL_HUMIDITY_PEAK_LOW"
});
double maxHumidity = double.Parse(humidityPeaks[0]);
double minHumidity = double.Parse(humidityPeaks[1]);
Console.WriteLine($"Humidity Range: {minHumidity}%RH to {maxHumidity}%RH");
Configure Sampling Parameters:
// Set faster sampling rate with larger buffer
SetValues(
new[] {
"0.ESH10000517.MEASUREMENT_INTERVAL",
"0.ESH10000517.SAMPLE_DEPTH"
},
new[] {
"500", // 500ms interval (2 samples/second)
"20" // Average over 20 samples
}
);
// Allow time for buffer to fill
Thread.Sleep(10000); // Wait 10 seconds for 20 samples
// Check sample count
string[] sampleCount = GetValues(new[] { "0.ESH10000517.NUMBER_OF_SAMPLES" });
Console.WriteLine($"Samples collected: {sampleCount[0]}");
Reset Peak Tracking:
// Clear all peak values and start fresh monitoring
SetValues(
new[] { "0.ESH10000517.CLEAR_VALUES" },
new[] { "true" }
);
Console.WriteLine("Peak values cleared. Monitoring reset.");
// Wait for buffer to refill
Thread.Sleep(5000);
// Read new peaks
string[] newPeaks = GetValues(new[] {
"0.ESH10000517.TEMPERATURE_PEAK",
"0.ESH10000517.TEMPERATURE_PEAK_LOW"
});
Calibration Access:
// Read calibration table
string[] calData = GetValues(new[] { "0.ESH10000517.CALIBRATION" });
CalibrationTable cal = SerializableHelpers.CreateFromBase64<CalibrationTable>(calData[0]);
// Modify calibration for a specific channel
foreach (var row in cal.CalData)
{
if (row.Key.Contains("READ_TEMPERATURE"))
{
row.Gain = 1.01; // Apply 1% correction
row.Offset = -0.5; // Apply -0.5°C offset
}
}
// Write updated calibration
string updatedCal = SerializableHelpers.AsBase64(cal);
SetValues(
new[] { "0.ESH10000517.CALIBRATION" },
new[] { updatedCal }
);
Sample Buffering and Averaging
The module maintains circular buffers for each measurement capability:
- Raw sensor readings are added to buffers on each measurement cycle
- Buffer size controlled by
SAMPLE_DEPTH(default: 5 samples) - Returned values are averages of buffered samples
- Peak values are calculated from buffered samples (max/min)
- Clearing values (
CLEAR_VALUES = true) empties all buffers and resets peaks
Buffering Behavior:
- New measurement acquired every
MEASUREMENT_INTERVALmilliseconds - Value added to circular buffer (oldest value dropped if buffer full)
- Average calculated from all buffer values
- Peak high/low updated based on buffer contents
- Channel values represent averaged measurements, not instantaneous readings
Implications:
- Initial readings may fluctuate until buffer fills (< SAMPLE_DEPTH samples)
- Changing
SAMPLE_DEPTHaffects smoothing and responsiveness - Peak tracking requires full buffer before being meaningful
- Rapid environmental changes may be smoothed by averaging
Weather Calculations
The module uses the WeatherHelper class to calculate derived environmental parameters:
Dew Point Calculation:
- Formula: August-Roche-Magnus approximation
- Inputs: Temperature (°C), Relative Humidity (%)
- Output: Dew point temperature (°C)
- Application: Condensation risk assessment
Heat Index Calculation:
- Formula: Rothfusz regression equation (NOAA)
- Inputs: Temperature (°C), Relative Humidity (%)
- Output: Apparent temperature (°C)
- Application: Thermal comfort assessment, safety monitoring
Absolute Humidity Calculation:
- Formula: Ideal gas law with vapor pressure
- Inputs: Temperature (°C), Relative Humidity (%)
- Output: Water vapor mass per volume (g/m³)
- Application: Moisture content analysis
Vapor Pressure Calculation:
- Formula: Actual vapor pressure from saturation pressure
- Inputs: Temperature (°C), Relative Humidity (%)
- Output: Partial pressure of water vapor (Pa)
- Application: Evaporation rate estimation
Altitude Estimation:
- Formula: Barometric formula (ISA standard atmosphere)
- Inputs: Atmospheric pressure (Pa)
- Output: Altitude above sea level (meters)
- Assumptions: Standard temperature lapse rate, sea level pressure 101325 Pa
- Application: Elevation compensation, pressure trend analysis
Error Handling
The module validates operations and provides error messages:
- Invalid MEASUREMENT_INTERVAL: Must be parseable as integer (milliseconds)
- Invalid SAMPLE_DEPTH: Must be parseable as integer (sample count)
- Sensor Communication Failure: BME680 I²C read errors logged and propagated
- Invalid NetName: Throws exception if channel does not exist
- Calibration Errors: Validates calibration table structure and keys
Best Practices
- Allow buffer fill time: Wait for at least
SAMPLE_DEPTH × MEASUREMENT_INTERVALmilliseconds before reading peak values - Use appropriate sampling rate:
- Fast changes: 500-1000ms interval, small buffer (3-5 samples)
- Stable monitoring: 2000-5000ms interval, larger buffer (10-20 samples)
- Clear peaks between tests: Use
CLEAR_VALUESto reset monitoring for each test sequence - Monitor sample count: Check
NUMBER_OF_SAMPLESto verify buffer fill status - Calibration verification: After applying calibration, verify against known reference conditions
- Environmental correlation: Log environmental data alongside test results for correlation analysis
- Altitude compensation: Use altitude reading to compensate pressure-dependent DUT characteristics
- Condensation risk: Monitor dew point relative to DUT temperature to prevent condensation
- Thermal stress detection: Use heat index for thermal chamber correlation
- Measurement interval tuning: Balance between responsiveness and system load
Module Initialization Sequence
On Reset(), the module performs:
- Clear existing channel list
- Create BME680 environmental sensor:
- I²C address: 0x76
- Source bus: Module's own I²C bus
- Reset sensor to default state
- Add instrument channel (InstrumentTypes.EnvironmentMeter)
- Add configuration channels:
- MEASUREMENT_INTERVAL (default: 2000ms, OUT direction)
- SAMPLE_DEPTH (default: 5 samples, OUT direction)
- NUMBER_OF_SAMPLES (read-only, IN direction)
- CLEAR_VALUES (digital OUT)
- Create environmental measurement channels (all IN direction):
- Temperature group: READ_TEMPERATURE, TEMPERATURE_PEAK, TEMPERATURE_PEAK_LOW
- Pressure group: READ_PRESSURE, PRESSURE_PEAK, PRESSURE_PEAK_LOW, READ_VAPOR_PRESSURE, VAPOR_PRESSURE_PEAK, VAPOR_PRESSURE_PEAK_LOW, READ_ALTITUDE, ALTITUDE_PEAK, ALTITUDE_PEAK_LOW
- Humidity group: READ_REL_HUMIDITY, REL_HUMIDITY_PEAK, REL_HUMIDITY_PEAK_LOW, READ_ABS_HUMIDITY, ABS_HUMIDITY_PEAK, ABS_HUMIDITY_PEAK_LOW
- Derived temperature group: READ_DEWPOINT, DEWPOINT_PEAK, DEWPOINT_PEAK_LOW, READ_HEAT_INDEX, HEAT_INDEX_PEAK, HEAT_INDEX_PEAK_LOW
- Initialize peak values:
- Peak channels: Set to
double.MinValue - Peak low channels: Set to
double.MaxValue
- Peak channels: Set to
- Load calibration table from persistent storage (or create default)
- Apply calibration factors to all channels
- Add calibration channel for user access
- Trigger initial channel update event
Autonomous Measurement Cycle
The Invalidate() method implements rate-limited autonomous sensing:
Measurement Sequence:
- Check if
MEASUREMENT_INTERVALhas elapsed since last measurement - If not elapsed, return immediately (non-blocking)
- If elapsed, perform measurement:
- Read BME680 sensor (temperature, humidity, pressure)
- Add raw readings to sample buffers (per capability)
- Calculate derived parameters (dew point, heat index, vapor pressure, absolute humidity, altitude)
- Add derived values to respective buffers
- Update peak high values (max of buffer)
- Update peak low values (min of buffer)
- Trim buffers to
SAMPLE_DEPTH(remove oldest if exceeded)
- Calculate averaged values from buffers
- Update channel RawValue properties with averaged results
- Update timestamp for next measurement cycle
Call Pattern:
Invalidate()called automatically by system pollingInvalidateInternal()performs actual sensor read and calculations- Non-blocking design prevents system delays
Typical Use Cases
1. Environmental Test Correlation:
// Record environmental conditions alongside test
void LogEnvironmentWithTest(string testName)
{
string[] env = GetValues(new[] {
"0.ESH10000517.READ_TEMPERATURE",
"0.ESH10000517.READ_REL_HUMIDITY",
"0.ESH10000517.READ_PRESSURE",
"0.ESH10000517.READ_ALTITUDE"
});
Console.WriteLine($"Test: {testName}");
Console.WriteLine($" Temperature: {env[0]}°C");
Console.WriteLine($" Humidity: {env[1]}%RH");
Console.WriteLine($" Pressure: {env[2]} Pa");
Console.WriteLine($" Altitude: {env[3]} m");
// Perform test with environmental context recorded
}
2. Condensation Risk Monitoring:
// Monitor for condensation risk on DUT
bool CheckCondensationRisk(double dutTemperatureC)
{
string[] dewpoint = GetValues(new[] { "0.ESH10000517.READ_DEWPOINT" });
double dewpointC = double.Parse(dewpoint[0]);
double margin = dutTemperatureC - dewpointC;
if (margin < 2.0)
{
Console.WriteLine($"WARNING: Condensation risk! DUT at {dutTemperatureC}°C, dew point {dewpointC}°C");
return true;
}
Console.WriteLine($"Condensation margin: {margin:F1}°C");
return false;
}
3. Environmental Soak Test:
// Monitor environmental stability during soak
void MonitorEnvironmentalSoak(int durationSeconds)
{
// Clear previous data
SetValues(new[] { "0.ESH10000517.CLEAR_VALUES" }, new[] { "true" });
// Set fast sampling
SetValues(
new[] { "0.ESH10000517.MEASUREMENT_INTERVAL" },
new[] { "1000" } // 1 second
);
// Wait for soak duration
Thread.Sleep(durationSeconds * 1000);
// Read environmental range
string[] results = GetValues(new[] {
"0.ESH10000517.TEMPERATURE_PEAK",
"0.ESH10000517.TEMPERATURE_PEAK_LOW",
"0.ESH10000517.REL_HUMIDITY_PEAK",
"0.ESH10000517.REL_HUMIDITY_PEAK_LOW",
"0.ESH10000517.NUMBER_OF_SAMPLES"
});
double tempRange = double.Parse(results[0]) - double.Parse(results[1]);
double humidityRange = double.Parse(results[2]) - double.Parse(results[3]);
int samples = int.Parse(results[4]);
Console.WriteLine($"Soak Test Results ({samples} samples over {durationSeconds}s):");
Console.WriteLine($" Temperature range: {tempRange:F2}°C");
Console.WriteLine($" Humidity range: {humidityRange:F2}%RH");
if (tempRange < 1.0 && humidityRange < 5.0)
Console.WriteLine(" Environment STABLE");
else
Console.WriteLine(" Environment UNSTABLE");
}
4. Thermal Comfort Assessment:
// Evaluate thermal comfort for operator safety
string EvaluateThermalComfort()
{
string[] env = GetValues(new[] {
"0.ESH10000517.READ_TEMPERATURE",
"0.ESH10000517.READ_REL_HUMIDITY",
"0.ESH10000517.READ_HEAT_INDEX"
});
double tempC = double.Parse(env[0]);
double humidityRH = double.Parse(env[1]);
double heatIndexC = double.Parse(env[2]);
Console.WriteLine($"Thermal Environment:");
Console.WriteLine($" Actual Temperature: {tempC}°C");
Console.WriteLine($" Humidity: {humidityRH}%RH");
Console.WriteLine($" Feels Like: {heatIndexC}°C");
if (heatIndexC > 40)
return "DANGER - Extreme heat stress";
else if (heatIndexC > 32)
return "WARNING - Caution advised";
else if (heatIndexC > 26)
return "ALERT - Fatigue possible with prolonged exposure";
else
return "COMFORTABLE - Normal working conditions";
}
5. Altitude Compensation:
// Compensate measurements for altitude
double CompensatePressureForAltitude(double measuredPressure)
{
string[] altitude = GetValues(new[] { "0.ESH10000517.READ_ALTITUDE" });
double altitudeM = double.Parse(altitude[0]);
// Compensate to sea level equivalent
// Using barometric formula: P0 = P × exp(M × g × h / (R × T))
const double M = 0.02896968; // Molar mass of air (kg/mol)
const double g = 9.80665; // Gravity (m/s²)
const double R = 8.314462618; // Gas constant (J/(mol·K))
double T = 288.15; // Standard temperature (K) = 15°C
double seaLevelPressure = measuredPressure * Math.Exp((M * g * altitudeM) / (R * T));
Console.WriteLine($"Altitude: {altitudeM:F1} m");
Console.WriteLine($"Measured Pressure: {measuredPressure:F1} Pa");
Console.WriteLine($"Sea Level Equivalent: {seaLevelPressure:F1} Pa");
return seaLevelPressure;
}
Debugging and Troubleshooting
Problem: Readings not updating
- Check: Verify
MEASUREMENT_INTERVALis not excessively long - Check: Call
GetValues()to trigger invalidation - Check: BME680 I²C communication is functional (check I²C bus health)
- Try: Reset module to reinitialize sensor
Problem: Peak values show extreme values (min/max doubles)
- Check: Verify
NUMBER_OF_SAMPLESis > 0 - Check: Buffer has not been filled yet (wait for
SAMPLE_DEPTH×MEASUREMENT_INTERVAL) - Action: Clear values and allow buffer to refill
Problem: Readings fluctuate excessively
- Check:
SAMPLE_DEPTHmay be too small (increase for more averaging) - Check:
MEASUREMENT_INTERVALmay be too fast (increase for stable readings) - Action: Increase both parameters for smoother data
Problem: Sensor communication errors
- Check: I²C bus address 0x76 is responding
- Check: BME680 power supply is stable
- Try: Power cycle module or reset system
- Verify: No I²C bus contention with other devices
Problem: Calculated values seem incorrect
- Check: Temperature and humidity base readings are correct
- Check: Calibration factors are appropriate
- Verify: WeatherHelper calculation formulas are suitable for environment
- Note: Some calculations (heat index) are only accurate in specific ranges
Comparison with Standard Sensors
| Feature | ESH10000517 (BME680) | Separate T/H/P Sensors |
|---|---|---|
| Integration | Single chip | Multiple devices |
| I²C Addresses | 1 address (0x76) | 3+ addresses |
| Calibration | Unified | Per-sensor |
| Power Consumption | Low (single device) | Higher (multiple devices) |
| Cost | Moderate | Higher (multiple parts) |
| Environmental Compensation | Internal | Manual |
| Derived Calculations | Built-in | External required |
| Peak Tracking | Automatic | Manual implementation |
| Sample Averaging | Built-in | Manual implementation |
Revision History
- ESH10000517: Current production version
- BME680 environmental sensor (I²C 0x76)
- 9 temperature channels (ambient, dew point, heat index + peaks)
- 9 pressure channels (absolute, vapor, altitude + peaks)
- 6 humidity channels (relative, absolute + peaks)
- Configurable sampling (interval, depth)
- Peak tracking with reset
- Calibration support
- Weather calculations (dew point, heat index, absolute humidity, vapor pressure, altitude)