Made requested changes:

- Added checks for improved MAX44009 detection
- removed HTTP_SNS_ILLUMINANCE_S (show only integer in web-interface)
- removed missed readings and repeated detection
This commit is contained in:
Louis Lagendijk 2019-01-23 16:06:06 +01:00
parent 08512fc5fa
commit ee3ab87d07
3 changed files with 31 additions and 32 deletions

View File

@ -549,7 +549,6 @@ const char HTTP_SNS_PRESSURE[] PROGMEM = "%s{s}%s " D_PRESSURE "{m}%s %s{e}";
const char HTTP_SNS_SEAPRESSURE[] PROGMEM = "%s{s}%s " D_PRESSUREATSEALEVEL "{m}%s %s{e}"; // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>
const char HTTP_SNS_ANALOG[] PROGMEM = "%s{s}%s " D_ANALOG_INPUT "%d{m}%d{e}"; // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>
const char HTTP_SNS_ILLUMINANCE[] PROGMEM = "%s{s}%s " D_ILLUMINANCE "{m}%d " D_UNIT_LUX "{e}"; // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>
const char HTTP_SNS_ILLUMINANCE_S[] PROGMEM = "%s{s}%s " D_ILLUMINANCE "{m}%s " D_UNIT_LUX "{e}"; // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>
#if defined(USE_MHZ19) || defined(USE_SENSEAIR) || defined(USE_AZ7798)
const char HTTP_SNS_CO2[] PROGMEM = "%s{s}%s " D_CO2 "{m}%d " D_UNIT_PARTS_PER_MILLION "{e}"; // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>

View File

@ -342,7 +342,7 @@
#define MTX_ADDRESS6 0x76 // [DisplayAddress6] I2C address of sixth 8x8 matrix module
#define MTX_ADDRESS7 0x00 // [DisplayAddress7] I2C address of seventh 8x8 matrix module
#define MTX_ADDRESS8 0x00 // [DisplayAddress8] I2C address of eigth 8x8 matrix module
#define USE_MAX44009 // Enable MAX44009 sensor ((I2C address 0x4a 0x4b) +5k2 code)
#define USE_MAX44009 // Enable MAX44009 sensor ((I2C address 0x4a 0x4b) +6k1 code)
#endif // USE_I2C
// -- SPI sensors ---------------------------------

View File

@ -22,7 +22,7 @@
/*********************************************************************************************\
* MAX44009 - Ambient Light Intensity
*
* I2C Address: 0x23 or 0x5C
* I2C Address: 0x4a or 0x4b
\*********************************************************************************************/
#define XSNS_91 91
@ -91,9 +91,9 @@ void Max4409Detect(void)
// supported for illiminance registers
for (byte r = 0; r < MAX44009_NO_REGISTERS; r++) {
if (false == Max4409Read_register(r, &reg[r])) {
snprintf_P(log_data, sizeof(log_data), "MAX44009 at %x: Failed to read register %d",
max44009_address, (int)r);
AddLog(LOG_LEVEL_DEBUG);
// snprintf_P(log_data, sizeof(log_data), "MAX44009 at %x: Failed to read register %d",
// max44009_address, (int)r);
// AddLog(LOG_LEVEL_DEBUG_MORE);
failed = true;
break;
}
@ -102,19 +102,22 @@ void Max4409Detect(void)
continue;
}
snprintf_P(log_data, sizeof(log_data), "MAX44009 at %x: Read %x %x %x %x %x %x %x %x",
(int) max44009_address, (int)reg[0], (int)reg[1], (int)reg[2], (int)reg[3],
(int)reg[4], (int)reg[5], (int)reg[6], (int)reg[7]);
AddLog(LOG_LEVEL_DEBUG);
// snprintf_P(log_data, sizeof(log_data), "MAX44009 at %x: Read %x %x %x %x %x %x %x %x",
// (int) max44009_address, (int)reg[0], (int)reg[1], (int)reg[2], (int)reg[3],
// (int)reg[4], (int)reg[5], (int)reg[6], (int)reg[7]);
// AddLog(LOG_LEVEL_DEBUG_MORE);
if ( (0x00 == reg[0]) &&
(0x00 == reg[1]) &&
( (0x00 == (reg[2] & 0xc0)) || (MAX44009_CONTINUOUS_AUTO_MODE == (reg[2] & 0xc0)) ) &&
(0xef == reg[5]) &&
// reg[2] is written at configuration, so we cannot rely on its value after restart
// reg[3] and reg[4] will always contain lux values
// Datasheet says reg[5] is on power-up is 0xff, but we get 0xef?
// This makes sense as 0xf for exponent means invalid, so we accept both
( (0xef == reg[5]) || (0xff == reg[5]) ) &&
(0x00 == reg[6]) &&
(0xff == reg[7])) {
// looks reasonable, try to initialize
// looks like a MAX44009, try to initialize
Wire.beginTransmission(max44009_address);
@ -127,29 +130,22 @@ void Max4409Detect(void)
AddLog(LOG_LEVEL_DEBUG);
break;
} else {
snprintf_P(log_data, sizeof(log_data), "MAX44009 at %x: config failed!", max44009_address);
AddLog(LOG_LEVEL_DEBUG);
// snprintf_P(log_data, sizeof(log_data), "MAX44009 at %x: config failed!", max44009_address);
// AddLog(LOG_LEVEL_DEBUG_MORE);
}
} else {
snprintf_P(log_data, sizeof(log_data), "Reading initial data failed: No MAX44009 at %x", max44009_address);
AddLog(LOG_LEVEL_DEBUG);
//snprintf_P(log_data, sizeof(log_data), "Reading initial data failed: No MAX44009 at %x", max44009_address);
//AddLog(LOG_LEVEL_DEBUG_MORE);
}
}
}
void Max4409EverySecond(void)
{
if (90 == (uptime %100)) {
// 1mS
Max4409Detect();
}
else {
// 1mS
if (max44009_found) {
Max4409Read_lum();
}
}
}
void Max4409Show(boolean json)
{
@ -157,7 +153,7 @@ void Max4409Show(boolean json)
if (max44009_valid) {
/* convert illuminance to fixed size string */
/* convert illuminance to string with suitable accuracy */
if (max44009_illuminance < 10) {
dtostrf(max44009_illuminance, sizeof(illum_str) -1, 3, illum_str);
} else if (max44009_illuminance < 100) {
@ -169,7 +165,9 @@ void Max4409Show(boolean json)
}
if (json) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"%s\":{\"" D_JSON_ILLUMINANCE "\":%s}"), mqtt_data, max44009_types, illum_str);
snprintf_P(mqtt_data, sizeof(mqtt_data),
PSTR("%s,\"%s\":{\"" D_JSON_ILLUMINANCE "\":%s}"),
mqtt_data, max44009_types, illum_str);
#ifdef USE_DOMOTICZ
if (0 == tele_period) {
DomoticzSensor(DZ_ILLUMINANCE, illum_str);
@ -177,7 +175,9 @@ void Max4409Show(boolean json)
#endif // USE_DOMOTICZ
#ifdef USE_WEBSERVER
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_ILLUMINANCE_S, mqtt_data, max44009_types, illum_str);
// show integer value for lx on web-server
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_ILLUMINANCE,
mqtt_data, max44009_types, (int)max44009_illuminance);
#endif // USE_WEBSERVER
}
}
@ -193,9 +193,9 @@ boolean Xsns91(byte function)
if (i2c_flg) {
switch (function) {
// case FUNC_INIT:
// Max4409Detect();
// break;
case FUNC_INIT:
Max4409Detect();
break;
case FUNC_EVERY_SECOND:
Max4409EverySecond();
break;