Просмотр исходного кода

Fixed T1000-E temperature and lux sensors

entr0p1 7 месяцев назад
Родитель
Сommit
6c993827de
3 измененных файлов с 10 добавлено и 3 удалено
  1. 7 3
      variants/t1000-e/t1000e_sensors.cpp
  2. 1 0
      variants/t1000-e/target.cpp
  3. 2 0
      variants/t1000-e/variant.cpp

+ 7 - 3
variants/t1000-e/t1000e_sensors.cpp

@@ -5,7 +5,7 @@
 #define HEATER_NTC_BX 4250   // thermistor coefficient B
 #define HEATER_NTC_RP 8250   // ohm, series resistance to thermistor
 #define HEATER_NTC_KA 273.15 // 25 Celsius at Kelvin
-#define NTC_REF_VCC   3000   // mV, output voltage of LDO
+#define NTC_REF_VCC   3300   // mV, max voltage of 3V3 sensor rail
 #define LIGHT_REF_VCC 2400   //
 
 static unsigned int ntc_res2[136] = {
@@ -54,6 +54,7 @@ static int get_light_lv(unsigned int light_volt) {
   float Vout = 0, Vin = 0, Rt = 0, temp = 0;
   unsigned int light_level = 0;
 
+  // Seeed's firmware maps the photocell reading to a 0-100 % range rather than lux.
   if (light_volt <= 80) {
     light_level = 0;
     return light_level;
@@ -75,7 +76,8 @@ float t1000e_get_temperature(void) {
   analogReference(AR_INTERNAL_3_0);
   analogReadResolution(12);
   delay(10);
-  vcc_v = (1000.0 * (analogRead(BATTERY_PIN) * ADC_MULTIPLIER * AREF_VOLTAGE)) / 4096;
+  unsigned int rail_v = (1000.0 * (analogRead(BATTERY_PIN) * ADC_MULTIPLIER * AREF_VOLTAGE)) / 4096;
+  vcc_v = (rail_v > NTC_REF_VCC) ? NTC_REF_VCC : rail_v;
   ntc_v = (1000.0 * AREF_VOLTAGE * analogRead(TEMP_SENSOR)) / 4096;
   digitalWrite(PIN_3V3_EN, LOW);
   digitalWrite(SENSOR_EN, LOW);
@@ -87,6 +89,7 @@ uint32_t t1000e_get_light(void) {
   int lux = 0;
   unsigned int lux_v = 0;
 
+  digitalWrite(PIN_3V3_EN, HIGH);
   digitalWrite(SENSOR_EN, HIGH);
   analogReference(AR_INTERNAL_3_0);
   analogReadResolution(12);
@@ -94,6 +97,7 @@ uint32_t t1000e_get_light(void) {
   lux_v = 1000 * analogRead(LUX_SENSOR) * AREF_VOLTAGE / 4096;
   lux = get_light_lv(lux_v);
   digitalWrite(SENSOR_EN, LOW);
+  digitalWrite(PIN_3V3_EN, LOW);
 
   return lux;
-}
+}

+ 1 - 0
variants/t1000-e/target.cpp

@@ -154,6 +154,7 @@ bool T1000SensorManager::querySensors(uint8_t requester_permissions, CayenneLPP&
     telemetry.addGPS(TELEM_CHANNEL_SELF, node_lat, node_lon, node_altitude);
   }
   if (requester_permissions & TELEM_PERM_ENVIRONMENT) {
+    // Firmware reports light as a 0-100 % scale, but expose it via Luminosity so app labels it "Luminosity".
     telemetry.addLuminosity(TELEM_CHANNEL_SELF, t1000e_get_light());
     telemetry.addTemperature(TELEM_CHANNEL_SELF, t1000e_get_temperature());
   }

+ 2 - 0
variants/t1000-e/variant.cpp

@@ -67,6 +67,8 @@ void initVariant()
   // https://github.com/Seeed-Studio/Adafruit_nRF52_Arduino/blob/fab7d30a997a1dfeef9d1d59bfb549adda73815a/cores/nRF5/wiring.c#L65-L69
 
   pinMode(BATTERY_PIN, INPUT);
+  pinMode(TEMP_SENSOR, INPUT);
+  pinMode(LUX_SENSOR, INPUT);
   pinMode(EXT_CHRG_DETECT, INPUT);
   pinMode(EXT_PWR_DETECT, INPUT);
   pinMode(GPS_RESETB, INPUT);