xsns_19_mgs.ino 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /*
  2. xsns_19_mgs.ino - Xadow and Grove Mutichannel Gas sensor support for Sonoff-Tasmota
  3. Copyright (C) 2018 Palich2000 and Theo Arends
  4. This program is free software: you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation, either version 3 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. #ifdef USE_I2C
  16. #ifdef USE_MGS
  17. /*********************************************************************************************\
  18. * Grove - Multichannel Gas Sensor
  19. * http://wiki.seeed.cc/Grove-Multichannel_Gas_Sensor/
  20. *
  21. * https://github.com/Seeed-Studio/Mutichannel_Gas_Sensor.git
  22. \*********************************************************************************************/
  23. #define XSNS_19 19
  24. #ifndef MGS_SENSOR_ADDR
  25. #define MGS_SENSOR_ADDR 0x04 // Default Mutichannel Gas sensor i2c address
  26. #endif
  27. #include "MutichannelGasSensor.h"
  28. void MGSInit(void) {
  29. gas.begin(MGS_SENSOR_ADDR);
  30. }
  31. boolean MGSPrepare(void)
  32. {
  33. gas.begin(MGS_SENSOR_ADDR);
  34. if (!gas.isError()) {
  35. snprintf_P(log_data, sizeof(log_data), S_LOG_I2C_FOUND_AT, "MultiGasSensor", MGS_SENSOR_ADDR);
  36. AddLog(LOG_LEVEL_DEBUG);
  37. return true;
  38. } else {
  39. return false;
  40. }
  41. }
  42. char* measure_gas(int gas_type, char* buffer)
  43. {
  44. float f = gas.calcGas(gas_type);
  45. dtostrfd(f, 2, buffer);
  46. return buffer;
  47. }
  48. #ifdef USE_WEBSERVER
  49. const char HTTP_MGS_GAS[] PROGMEM = "%s{s}MGS %s{m}%s " D_UNIT_PARTS_PER_MILLION "{e}"; // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>
  50. #endif // USE_WEBSERVER
  51. void MGSShow(boolean json)
  52. {
  53. char buffer[33];
  54. if (json) {
  55. snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"MGS\":{\"NH3\":%s"), mqtt_data, measure_gas(NH3, buffer));
  56. snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"CO\":%s"), mqtt_data, measure_gas(CO, buffer));
  57. snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"NO2\":%s"), mqtt_data, measure_gas(NO2, buffer));
  58. snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"C3H8\":%s"), mqtt_data, measure_gas(C3H8, buffer));
  59. snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"C4H10\":%s"), mqtt_data, measure_gas(C4H10, buffer));
  60. snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"CH4\":%s"), mqtt_data, measure_gas(GAS_CH4, buffer));
  61. snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"H2\":%s"), mqtt_data, measure_gas(H2, buffer));
  62. snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"C2H5OH\":%s}"), mqtt_data, measure_gas(C2H5OH, buffer));
  63. #ifdef USE_WEBSERVER
  64. } else {
  65. snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_MGS_GAS, mqtt_data, "NH3", measure_gas(NH3, buffer));
  66. snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_MGS_GAS, mqtt_data, "CO", measure_gas(CO, buffer));
  67. snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_MGS_GAS, mqtt_data, "NO2", measure_gas(NO2, buffer));
  68. snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_MGS_GAS, mqtt_data, "C3H8", measure_gas(C3H8, buffer));
  69. snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_MGS_GAS, mqtt_data, "C4H10", measure_gas(C4H10, buffer));
  70. snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_MGS_GAS, mqtt_data, "CH4", measure_gas(GAS_CH4, buffer));
  71. snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_MGS_GAS, mqtt_data, "H2", measure_gas(H2, buffer));
  72. snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_MGS_GAS, mqtt_data, "C2H5OH", measure_gas(C2H5OH, buffer));
  73. #endif // USE_WEBSERVER
  74. }
  75. }
  76. /*********************************************************************************************\
  77. * Interface
  78. \*********************************************************************************************/
  79. boolean Xsns19(byte function)
  80. {
  81. boolean result = false;
  82. static int detected = false;
  83. if (i2c_flg) {
  84. switch (function) {
  85. case FUNC_INIT:
  86. // MGSInit();
  87. break;
  88. case FUNC_PREP_BEFORE_TELEPERIOD:
  89. detected = MGSPrepare();
  90. break;
  91. case FUNC_JSON_APPEND:
  92. if (detected) MGSShow(1);
  93. break;
  94. #ifdef USE_WEBSERVER
  95. case FUNC_WEB_APPEND:
  96. if (detected) MGSShow(0);
  97. break;
  98. #endif // USE_WEBSERVER
  99. }
  100. }
  101. return result;
  102. }
  103. #endif // USE_MGS
  104. #endif // USE_I2C