Skip to content

Commit 1d9d37c

Browse files
authored
Merge pull request #1247 from entr0p1/dev
Fixed T1000-E temperature, lux and BME280 sensor reading accuracies
2 parents 3d6e523 + cc28b1a commit 1d9d37c

4 files changed

Lines changed: 23 additions & 7 deletions

File tree

src/helpers/sensors/EnvironmentSensorManager.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,13 @@ bool EnvironmentSensorManager::begin() {
192192
if (BME280.begin(TELEM_BME280_ADDRESS, TELEM_WIRE)) {
193193
MESH_DEBUG_PRINTLN("Found BME280 at address: %02X", TELEM_BME280_ADDRESS);
194194
MESH_DEBUG_PRINTLN("BME sensor ID: %02X", BME280.sensorID());
195+
// Reduce self-heating: single-shot conversions, light oversampling, long standby.
196+
BME280.setSampling(Adafruit_BME280::MODE_FORCED,
197+
Adafruit_BME280::SAMPLING_X1, // temperature
198+
Adafruit_BME280::SAMPLING_X1, // pressure
199+
Adafruit_BME280::SAMPLING_X1, // humidity
200+
Adafruit_BME280::FILTER_OFF,
201+
Adafruit_BME280::STANDBY_MS_1000);
195202
BME280_initialized = true;
196203
} else {
197204
BME280_initialized = false;
@@ -359,10 +366,12 @@ bool EnvironmentSensorManager::querySensors(uint8_t requester_permissions, Cayen
359366

360367
#if ENV_INCLUDE_BME280
361368
if (BME280_initialized) {
362-
telemetry.addTemperature(TELEM_CHANNEL_SELF, BME280.readTemperature());
363-
telemetry.addRelativeHumidity(TELEM_CHANNEL_SELF, BME280.readHumidity());
364-
telemetry.addBarometricPressure(TELEM_CHANNEL_SELF, BME280.readPressure()/100);
365-
telemetry.addAltitude(TELEM_CHANNEL_SELF, BME280.readAltitude(TELEM_BME280_SEALEVELPRESSURE_HPA));
369+
if (BME280.takeForcedMeasurement()) { // trigger a fresh reading in forced mode
370+
telemetry.addTemperature(TELEM_CHANNEL_SELF, BME280.readTemperature());
371+
telemetry.addRelativeHumidity(TELEM_CHANNEL_SELF, BME280.readHumidity());
372+
telemetry.addBarometricPressure(TELEM_CHANNEL_SELF, BME280.readPressure()/100);
373+
telemetry.addAltitude(TELEM_CHANNEL_SELF, BME280.readAltitude(TELEM_BME280_SEALEVELPRESSURE_HPA));
374+
}
366375
}
367376
#endif
368377

variants/t1000-e/t1000e_sensors.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#define HEATER_NTC_BX 4250 // thermistor coefficient B
66
#define HEATER_NTC_RP 8250 // ohm, series resistance to thermistor
77
#define HEATER_NTC_KA 273.15 // 25 Celsius at Kelvin
8-
#define NTC_REF_VCC 3000 // mV, output voltage of LDO
8+
#define NTC_REF_VCC 3300 // mV, max voltage of 3V3 sensor rail
99
#define LIGHT_REF_VCC 2400 //
1010

1111
static unsigned int ntc_res2[136] = {
@@ -54,6 +54,7 @@ static int get_light_lv(unsigned int light_volt) {
5454
float Vout = 0, Vin = 0, Rt = 0, temp = 0;
5555
unsigned int light_level = 0;
5656

57+
// Seeed's firmware maps the photocell reading to a 0-100 % range rather than lux.
5758
if (light_volt <= 80) {
5859
light_level = 0;
5960
return light_level;
@@ -75,7 +76,8 @@ float t1000e_get_temperature(void) {
7576
analogReference(AR_INTERNAL_3_0);
7677
analogReadResolution(12);
7778
delay(10);
78-
vcc_v = (1000.0 * (analogRead(BATTERY_PIN) * ADC_MULTIPLIER * AREF_VOLTAGE)) / 4096;
79+
unsigned int rail_v = (1000.0 * (analogRead(BATTERY_PIN) * ADC_MULTIPLIER * AREF_VOLTAGE)) / 4096;
80+
vcc_v = (rail_v > NTC_REF_VCC) ? NTC_REF_VCC : rail_v;
7981
ntc_v = (1000.0 * AREF_VOLTAGE * analogRead(TEMP_SENSOR)) / 4096;
8082
digitalWrite(PIN_3V3_EN, LOW);
8183
digitalWrite(SENSOR_EN, LOW);
@@ -87,13 +89,15 @@ uint32_t t1000e_get_light(void) {
8789
int lux = 0;
8890
unsigned int lux_v = 0;
8991

92+
digitalWrite(PIN_3V3_EN, HIGH);
9093
digitalWrite(SENSOR_EN, HIGH);
9194
analogReference(AR_INTERNAL_3_0);
9295
analogReadResolution(12);
9396
delay(10);
9497
lux_v = 1000 * analogRead(LUX_SENSOR) * AREF_VOLTAGE / 4096;
9598
lux = get_light_lv(lux_v);
9699
digitalWrite(SENSOR_EN, LOW);
100+
digitalWrite(PIN_3V3_EN, LOW);
97101

98102
return lux;
99-
}
103+
}

variants/t1000-e/target.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ bool T1000SensorManager::querySensors(uint8_t requester_permissions, CayenneLPP&
154154
telemetry.addGPS(TELEM_CHANNEL_SELF, node_lat, node_lon, node_altitude);
155155
}
156156
if (requester_permissions & TELEM_PERM_ENVIRONMENT) {
157+
// Firmware reports light as a 0-100 % scale, but expose it via Luminosity so app labels it "Luminosity".
157158
telemetry.addLuminosity(TELEM_CHANNEL_SELF, t1000e_get_light());
158159
telemetry.addTemperature(TELEM_CHANNEL_SELF, t1000e_get_temperature());
159160
}

variants/t1000-e/variant.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ void initVariant()
6767
// https://github.com/Seeed-Studio/Adafruit_nRF52_Arduino/blob/fab7d30a997a1dfeef9d1d59bfb549adda73815a/cores/nRF5/wiring.c#L65-L69
6868

6969
pinMode(BATTERY_PIN, INPUT);
70+
pinMode(TEMP_SENSOR, INPUT);
71+
pinMode(LUX_SENSOR, INPUT);
7072
pinMode(EXT_CHRG_DETECT, INPUT);
7173
pinMode(EXT_PWR_DETECT, INPUT);
7274
pinMode(GPS_RESETB, INPUT);

0 commit comments

Comments
 (0)