Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CO2 MH-Zxx #1248

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Binary file added bin/sonoff.ino.generic_20171202_1.bin
Binary file not shown.
4 changes: 4 additions & 0 deletions sonoff/language/de-DE.h
Expand Up @@ -384,6 +384,7 @@
#define D_DOMOTICZ_VOLTAGE "Voltage"
#define D_DOMOTICZ_CURRENT "Current"
#define D_DOMOTICZ_UPDATE_TIMER "Update timer"
#define D_DOMOTICZ_CO2 "CO2" //storm_6

// xdrv_irremote.ino
#define D_INVALID_JSON "ungültiger JSON"
Expand Down Expand Up @@ -454,6 +455,9 @@
#define D_SENSOR_DID_NOT_ACK_COMMAND "Sensor hat ACK-Befehl nicht ausgeführt"
#define D_SHT1X_FOUND "SHT1X gefunden"

// xsns_14_mhz.ino
#define D_SENSOR_CO2 "MHZхх" //storm_6

// sonoff_template.h
// Max string length is 8 characters including suffixes
#define D_SENSOR_NONE "None"
Expand Down
4 changes: 4 additions & 0 deletions sonoff/language/en-GB.h
Expand Up @@ -384,6 +384,7 @@
#define D_DOMOTICZ_VOLTAGE "Voltage"
#define D_DOMOTICZ_CURRENT "Current"
#define D_DOMOTICZ_UPDATE_TIMER "Update timer"
#define D_DOMOTICZ_CO2 "CO2" //storm_6

// xdrv_irremote.ino
#define D_INVALID_JSON "Invalid JSON"
Expand Down Expand Up @@ -454,6 +455,9 @@
#define D_SENSOR_DID_NOT_ACK_COMMAND "Sensor did not ACK command"
#define D_SHT1X_FOUND "SHT1X found"

// xsns_14_mhz.ino
#define D_SENSOR_CO2 "MHZхх" //storm_6

// sonoff_template.h
// Max string length is 8 characters including suffixes
#define D_SENSOR_NONE "None"
Expand Down
4 changes: 4 additions & 0 deletions sonoff/language/nl-NL.h
Expand Up @@ -384,6 +384,7 @@
#define D_DOMOTICZ_VOLTAGE "Spanning"
#define D_DOMOTICZ_CURRENT "Stroom"
#define D_DOMOTICZ_UPDATE_TIMER "Bijwerk timer"
#define D_DOMOTICZ_CO2 "CO2" //storm_6

// xdrv_irremote.ino
#define D_INVALID_JSON "Ongeldig JSON"
Expand Down Expand Up @@ -454,6 +455,9 @@
#define D_SENSOR_DID_NOT_ACK_COMMAND "Geen opdracht ACK van sensor"
#define D_SHT1X_FOUND "SHT1X gevonden"

// xsns_14_mhz.ino
#define D_SENSOR_CO2 "MHZхх" //storm_6

// sonoff_template.h
// Max string length is 8 characters including suffixes
#define D_SENSOR_NONE "Geen"
Expand Down
4 changes: 4 additions & 0 deletions sonoff/language/pl-PL.h
Expand Up @@ -384,6 +384,7 @@
#define D_DOMOTICZ_VOLTAGE "Napiecie"
#define D_DOMOTICZ_CURRENT "Prad"
#define D_DOMOTICZ_UPDATE_TIMER "Zaktualizuj czasomierz"
#define D_DOMOTICZ_CO2 "CO2" //storm_6

// xdrv_irremote.ino
#define D_INVALID_JSON "Invalid JSON"
Expand Down Expand Up @@ -454,6 +455,9 @@
#define D_SENSOR_DID_NOT_ACK_COMMAND "Czujnik nie otrzymal komendy ACK"
#define D_SHT1X_FOUND "SHT1X znaleziony"

// xsns_14_mhz.ino
#define D_SENSOR_CO2 "MHZхх" //storm_6

// sonoff_template.h
// Max string length is 8 characters including suffixes
#define D_SENSOR_NONE "Brak"
Expand Down
6 changes: 4 additions & 2 deletions sonoff/sonoff_template.h
Expand Up @@ -78,6 +78,7 @@ enum UserSelectablePins {
GPIO_LED2_INV,
GPIO_LED3_INV,
GPIO_LED4_INV,
GPIO_CO2_MHZ, //storm_6 CO2 sensor MH-Zxx
GPIO_SENSOR_END };

// Text in webpage Module Parameters and commands GPIOS and GPIO
Expand Down Expand Up @@ -137,7 +138,8 @@ const char kSensors[GPIO_SENSOR_END][9] PROGMEM = {
D_SENSOR_LED "1i",
D_SENSOR_LED "2i",
D_SENSOR_LED "3i",
D_SENSOR_LED "4i"
D_SENSOR_LED "4i",
D_SENSOR_CO2 //storm_6
};

// Programmer selectable GPIO functionality offset by user selectable GPIOs
Expand Down Expand Up @@ -781,4 +783,4 @@ const mytmplt kModules[MAXMODULE] PROGMEM = {
}
};

#endif // _SONOFF_TEMPLATE_H_
#endif // _SONOFF_TEMPLATE_H_
4 changes: 2 additions & 2 deletions sonoff/xdrv_domoticz.ino
Expand Up @@ -40,10 +40,10 @@ enum DomoticzCommands {
const char kDomoticzCommands[] PROGMEM =
D_CMND_IDX "|" D_CMND_KEYIDX "|" D_CMND_SWITCHIDX "|" D_CMND_SENSORIDX "|" D_CMND_UPDATETIMER ;

enum DomoticzSensors {DZ_TEMP, DZ_TEMP_HUM, DZ_TEMP_HUM_BARO, DZ_POWER_ENERGY, DZ_ILLUMINANCE, DZ_COUNT, DZ_VOLTAGE, DZ_CURRENT, DZ_MAX_SENSORS};
enum DomoticzSensors {DZ_TEMP, DZ_TEMP_HUM, DZ_TEMP_HUM_BARO, DZ_POWER_ENERGY, DZ_ILLUMINANCE, DZ_COUNT, DZ_VOLTAGE, DZ_CURRENT, DZ_CO2, DZ_MAX_SENSORS};

const char kDomoticzSensors[] PROGMEM =
D_DOMOTICZ_TEMP "|" D_DOMOTICZ_TEMP_HUM "|" D_DOMOTICZ_TEMP_HUM_BARO "|" D_DOMOTICZ_POWER_ENERGY "|" D_DOMOTICZ_ILLUMINANCE "|" D_DOMOTICZ_COUNT "|" D_DOMOTICZ_VOLTAGE "|" D_DOMOTICZ_CURRENT ;
D_DOMOTICZ_TEMP "|" D_DOMOTICZ_TEMP_HUM "|" D_DOMOTICZ_TEMP_HUM_BARO "|" D_DOMOTICZ_POWER_ENERGY "|" D_DOMOTICZ_ILLUMINANCE "|" D_DOMOTICZ_COUNT "|" D_DOMOTICZ_VOLTAGE "|" D_DOMOTICZ_CURRENT "|" D_DOMOTICZ_CO2;

const char S_JSON_DOMOTICZ_COMMAND_INDEX_NVALUE[] PROGMEM = "{\"" D_CMND_DOMOTICZ "%s%d\":%d}";

Expand Down
156 changes: 156 additions & 0 deletions sonoff/xsns_14_mhz.ino
@@ -0,0 +1,156 @@
/*
xsns_14_mhz.ino - MH-Zхх CO2 sensor

Copyright (C) 2017 Theo Arends

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

//#ifdef USE_MHZCO2
/*********************************************************************************************\
* DS18B20 - Temperature
*
* Source: Marinus vd Broek https://github.com/ESP8266nu/ESPEasy and AlexTransit (CRC)
\*********************************************************************************************/

const uint8_t cmd_co2[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
const char HTTP_SNS_CO2[] PROGMEM = "%s{s}%s CO2 ppm {m}%s ppm {e}"; // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>

#define D_CO2 "CO2 ppm"

// измерение СО2 черех serial
int getCO2serial(int &temp) {
int ppm;
uint8_t response[9];
Serial.write(cmd_co2, 9);
ppm = -1;
if (Serial.readBytes(response, 9) == 9) {
int responseHigh = (int) response[2];
int responseLow = (int) response[3];
temp = (int) response[4];
ppm = (256 * responseHigh) + responseLow;
}
return ppm;
}

int getCO2pwm() {
int ppm;
while(digitalRead(pin[GPIO_CO2_MHZ])==HIGH){;}
float duration_h = pulseIn(pin[GPIO_CO2_MHZ],HIGH)/1000;

ppm = int(5000*(duration_h-2)/(duration_h+(1004-duration_h)-4)); // по паспорту

return ppm;
}

/********************************************************************************************/
void CO2PWMReadPrepPWM()
{
pinMode(pin[GPIO_CO2_MHZ], INPUT);
}

/********************************************************************************************/
void CO2PWMReadPrepSerial()
{
Serial.begin(9600);
//Serial.swap();
}

/********************************************************************************************/
void CO2PWMReadPPMPrep()
{
//CO2PWMReadPrepPWM();
CO2PWMReadPrepSerial();
}

/********************************************************************************************/

void MHZCO2Show(boolean json)
{
int ppm;
int temp;
//ppm = getCO2pwm();
ppm = getCO2serial(temp);
//if (ppm > 0) { // Check if read failed
char ppmCO[10];
char temperature[10];

dtostrfi(ppm, 0, ppmCO);
dtostrfi(temp, Settings.flag2.temperature_resolution, temperature);

if(json) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"MHZxxCO2\":{\"" D_CO2 "\":%s}"), mqtt_data, ppmCO);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"MHZxxTEMP\":{\"" D_TEMPERATURE "\":%s}"), mqtt_data, temperature);
#ifdef USE_DOMOTICZ
DomoticzSensor(DZ_CO2, ppmCO);
//DomoticzSensor(DZ_CO2, ppm);
#endif // USE_DOMOTICZ
#ifdef USE_WEBSERVER
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_CO2, mqtt_data, "MH-Zxx", ppmCO, "ppm");
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_TEMP, mqtt_data, "MH-Zxx", temperature, TempUnit());
#endif // USE_WEBSERVER
}
//}
#ifdef USE_WEBSERVER
if (!json) {
CO2PWMReadPPMPrep();
}
#endif // USE_WEBSERVER
}


/*********************************************************************************************\
* Interface
\*********************************************************************************************/

#define XSNS_14

boolean Xsns14(byte function)
{
boolean result = false;

if (pin[GPIO_CO2_MHZ] < 99) {
switch (function) {
case FUNC_XSNS_INIT:
CO2PWMReadPPMPrep();
break;
case FUNC_XSNS_PREP:
CO2PWMReadPPMPrep();
break;
case FUNC_XSNS_JSON_APPEND:
MHZCO2Show(1);
break;
#ifdef USE_WEBSERVER
case FUNC_XSNS_WEB:
MHZCO2Show(0);
break;
#endif // USE_WEBSERVER
}
}
return result;
}


//#ifdef USE_DOMOTICZ
//void DomoticzSensorCO2(uint16_t power, uint32_t *ppm)
//{
// char data[16];
// snprintf_P(data, sizeof(data), PSTR("%d"), ppm);
// DomoticzSensor(DZ_CO2, data);
//}
//#endif // USE_DOMOTICZ

//#endif // USE_MHZCO2