diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index 70bf414a7..049cd5af6 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Reekse" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index 95175b63d..df87380c0 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -739,6 +739,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 5caeac14b..99e61570c 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index 8c54b3910..f60108589 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index 01c06280e..5c903e821 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index 92ef05979..6f5c7c345 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index 4d93cde93..fbb2688b6 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index f69e84af2..9a62e90c6 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -736,6 +736,7 @@ #define D_SENSOR_ADC_RANGE "ADC Distance" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Manette" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index 39b106e21..10c45e1f0 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index 1955583fe..ba628122a 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index d1a326889..763986451 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC - Intervallo" #define D_SENSOR_ADC_CT_POWER "ADC - CTR alimentazione" #define D_SENSOR_ADC_JOYSTICK "ADC - Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "Webcam - PWDN" #define D_GPIO_WEBCAM_RESET "Webcam - RESET" #define D_GPIO_WEBCAM_XCLK "Webcam - XCLK" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index eb6e64672..25493d6c1 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index d688ba616..6481799f2 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index fc01777c5..b33e0e221 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index 65ced1ca1..35eacffea 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index b9c70be3f..4985d386d 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index 52cfaf350..8f44f53ca 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index f71a967e3..678eae852 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index 6561c4aeb..2d567b1a4 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 605fdc1eb..95303ab60 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index 3d8ddec8b..82d684839 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 0f5c4d4b6..738886f35 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 983c7409d..2fa5e4282 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index 3dce3a3d7..d5079a834 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index da55c86ba..d68e00380 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -740,6 +740,7 @@ #define D_SENSOR_ADC_RANGE "ADC Range" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" #define D_GPIO_WEBCAM_PWDN "CAM_PWDN" #define D_GPIO_WEBCAM_RESET "CAM_RESET" #define D_GPIO_WEBCAM_XCLK "CAM_XCLK" diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index 4a50aa3e3..0a48c3a66 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -143,7 +143,8 @@ enum UserSelectablePins { GPIO_ST7789_CS, GPIO_ST7789_DC, GPIO_SSD1331_CS, GPIO_SSD1331_DC, GPIO_SDCARD_CS, - GPIO_ROT1A_NP, GPIO_ROT1B_NP, // Rotary switch + GPIO_ROT1A_NP, GPIO_ROT1B_NP, // Rotary switch + GPIO_ADC_PH, // Analog PH Sensor GPIO_SENSOR_END }; enum ProgramSelectablePins { @@ -308,6 +309,7 @@ const char kSensorNames[] PROGMEM = D_SENSOR_SSD1331_CS "|" D_SENSOR_SSD1331_DC "|" D_SENSOR_SDCARD_CS "|" D_SENSOR_ROTARY " A_n|" D_SENSOR_ROTARY " B_n|" + D_SENSOR_ADC_PH "|" ; const char kSensorNamesFixed[] PROGMEM = @@ -765,6 +767,7 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_ADC_RANGE) + MAX_ADCS, // Range AGPIO(GPIO_ADC_CT_POWER) + MAX_ADCS, // Current AGPIO(GPIO_ADC_JOY) + MAX_ADCS, // Joystick + AGPIO(GPIO_ADC_PH) + MAX_ADCS, // Analog PH Sensor #endif // ESP32 }; @@ -783,6 +786,7 @@ const uint16_t kAdcNiceList[] PROGMEM = { AGPIO(GPIO_ADC_RANGE), // Range AGPIO(GPIO_ADC_CT_POWER), // Current AGPIO(GPIO_ADC_JOY), // Joystick + AGPIO(GPIO_ADC_PH), // Analog PH Sensor }; #endif // ESP8266 @@ -797,6 +801,7 @@ enum UserSelectableAdc { ADC_RANGE, // Range ADC_CT_POWER, // Current ADC_JOY, // Joystick + ADC_PH, // Analog PH Sensor // ADC_SWITCH, // Switch // ADC_SWITCH_INV, ADC_END }; diff --git a/tasmota/xsns_02_analog.ino b/tasmota/xsns_02_analog.ino index d9cd0c6e6..239f461c5 100644 --- a/tasmota/xsns_02_analog.ino +++ b/tasmota/xsns_02_analog.ino @@ -97,6 +97,20 @@ // Press "Up" will raise ADC to ANALOG_RANGE, Press "Dn" will raise ADC to ANALOG_RANGE/2 #define ANALOG_JOYSTICK (ANALOG_RANGE / 3) +100 // Add resistor tolerance +// pH scale minimum and maximum values +#define ANALOG_PH_MAX 14.0 +#define ANALOG_PH_MIN 0.0 + +// Default values for calibration solution with lower PH +#define ANALOG_PH_CALSOLUTION_LOW_PH 4.0 +#define ANALOG_PH_CALSOLUTION_LOW_ANALOG_VALUE 282 +// Default values for calibration solution with higher PH +#define ANALOG_PH_CALSOLUTION_HIGH_PH 9.18 +#define ANALOG_PH_CALSOLUTION_HIGH_ANALOG_VALUE 435 + +// Multiplier used to store pH with 2 decimal places in a non decimal datatype +#define ANALOG_PH_DECIMAL_MULTIPLIER 100.0 + struct { uint8_t present = 0; uint8_t type = 0; @@ -169,6 +183,12 @@ void AdcInitParams(uint8_t idx) { Adc[idx].param2 = ANALOG_CT_MULTIPLIER; // (uint32_t) 100000 Adc[idx].param3 = ANALOG_CT_VOLTAGE; // (int) 10 } + else if (ADC_PH == Adc[idx].type) { + Adc[idx].param1 = ANALOG_PH_CALSOLUTION_LOW_PH * ANALOG_PH_DECIMAL_MULTIPLIER; // PH of the calibration solution 1, which is the one with the lower PH + Adc[idx].param2 = ANALOG_PH_CALSOLUTION_LOW_ANALOG_VALUE; // Reading of AnalogInput while probe is in solution 1 + Adc[idx].param3 = ANALOG_PH_CALSOLUTION_HIGH_PH * ANALOG_PH_DECIMAL_MULTIPLIER; // PH of the calibration solution 2, which is the one with the higher PH + Adc[idx].param4 = ANALOG_PH_CALSOLUTION_HIGH_ANALOG_VALUE; // Reading of AnalogInput while probe is in solution 2 + } } if ((Adcs.type != Adc[idx].type) || (0 == Adc[idx].param1) || (Adc[idx].param1 > ANALOG_RANGE)) { if ((ADC_BUTTON == Adc[idx].type) || (ADC_BUTTON_INV == Adc[idx].type)) { @@ -211,6 +231,9 @@ void AdcInit(void) { if (PinUsed(GPIO_ADC_JOY, i)) { AdcAttach(Pin(GPIO_ADC_JOY, i), ADC_JOY); } + if (PinUsed(GPIO_ADC_PH, i)) { + AdcAttach(Pin(GPIO_ADC_PH, i), ADC_PH); + } } for (uint32_t i = 0; i < MAX_KEYS; i++) { if (PinUsed(GPIO_ADC_BUTTON, i)) { @@ -309,6 +332,28 @@ uint16_t AdcGetLux(uint32_t idx) { return (uint16_t)ldrLux; } +float AdcGetPh(uint32_t idx) { + int adc = AdcRead(Adc[idx].pin, 2); + + + float y1 = Adc[idx].param1 / ANALOG_PH_DECIMAL_MULTIPLIER; + uint32_t x1 = Adc[idx].param2; + float y2 = Adc[idx].param3 / ANALOG_PH_DECIMAL_MULTIPLIER; + uint32_t x2 = Adc[idx].param4; + + float m = (y2 - y1) / (x2 - x1); + float ph = m * (adc - x1) + y1; + + + char phLow_chr[6]; + char phHigh_chr[6]; + dtostrfd(y1, 2, phLow_chr); + dtostrfd(y2, 2, phHigh_chr); + AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION "Analog pH read. ADC-RAW: %d, cal-low(pH=ADC): %s=%d, cal-high(pH=ADC): %s=%d"), adc, phLow_chr, x1, phHigh_chr,x2); + + return ph; +} + uint16_t AdcGetRange(uint32_t idx) { // formula for calibration: value, fromLow, fromHigh, toLow, toHigh // Example: 514, 632, 236, 0, 100 @@ -510,6 +555,22 @@ void AdcShow(bool json) { } break; } + case ADC_PH: { + float ph = AdcGetPh(idx); + char ph_chr[6]; + dtostrfd(ph, 2, ph_chr); + + + if (json) { + AdcShowContinuation(&jsonflg); + ResponseAppend_P(PSTR("\"pH%d\":%s"), idx + offset, ph_chr); + #ifdef USE_WEBSERVER + } else { + WSContentSend_PD(HTTP_SNS_PH, "", ph_chr); + #endif // USE_WEBSERVER + } + break; + } } } if (jsonflg) { @@ -551,6 +612,21 @@ void CmndAdcParam(void) { } else { Adc[idx].param3 = (int)(CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 4)) * 10000); } + + if (ADC_PH == XdrvMailbox.payload) { + char *phLow_chr = subStr(sub_string, XdrvMailbox.data, ",", 2); + char *phHigh_chr = subStr(sub_string, XdrvMailbox.data, ",", 4); + float phLow = CharToFloat(phLow_chr); + float phHigh = CharToFloat(phHigh_chr); + + Adc[idx].param1 = phLow * ANALOG_PH_DECIMAL_MULTIPLIER; + Adc[idx].param2 = strtol(subStr(sub_string, XdrvMailbox.data, ",", 3), nullptr, 10); + Adc[idx].param3 = phHigh * ANALOG_PH_DECIMAL_MULTIPLIER; + Adc[idx].param4 = strtol(subStr(sub_string, XdrvMailbox.data, ",", 5), nullptr, 10); + + AddLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION "Analog pH probe calibrated. cal-low(pH=ADC): %s=%d, cal-high(pH=ADC): %s=%d"), phLow_chr, Adc[idx].param2, phHigh_chr, Adc[idx].param4); + } + if (ADC_CT_POWER == XdrvMailbox.payload) { if (((1 == Adc[idx].param1) & CT_FLAG_ENERGY_RESET) > 0) { for (uint32_t idx = 0; idx < MAX_ADCS; idx++) {