From 0aea9ba572f6494e956ef063004aff0bedc59019 Mon Sep 17 00:00:00 2001 From: Theo Arends Date: Wed, 9 May 2018 13:43:22 +0200 Subject: [PATCH] Add hardware serial option to MHZ-19 Add hardware serial option to MHZ-19 (#2659) --- sonoff/_releasenotes.ino | 1 + sonoff/sonoff.ino | 3 +- sonoff/support.ino | 8 +++++ sonoff/xsns_15_mhz19.ino | 65 +++++++++++++++++++++++++++++++++++----- 4 files changed, 69 insertions(+), 8 deletions(-) diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino index 00945950d..2e6c44bf9 100644 --- a/sonoff/_releasenotes.ino +++ b/sonoff/_releasenotes.ino @@ -8,6 +8,7 @@ * Fix sensor MHZ-19 vanishing data over time (#2659) * Add Portuguese in Brazil language file * Add rule state test for On/Off in addition to 0/1 (#2613) + * Add hardware serial option to MHZ-19 sensor (#2659) * Updated Italian language file (#2618) * Optimize command handling * diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino index b7b246aa5..11c9cb29c 100644 --- a/sonoff/sonoff.ino +++ b/sonoff/sonoff.ino @@ -100,6 +100,7 @@ const char kTasmotaCommands[] PROGMEM = int baudrate = APP_BAUDRATE; // Serial interface baud rate SerialConfig serial_config = SERIAL_8N1; // Serial interface configuration 8 data bits, No parity, 1 stop bit byte serial_in_byte; // Received byte +uint8_t serial_local = 0; // Handle serial locally; unsigned long serial_polling_window = 0; // Serial polling window int serial_in_byte_counter = 0; // Index in receive buffer byte dual_hex_code = 0; // Sonoff dual input flag @@ -2431,7 +2432,7 @@ void loop() if (millis() >= state_loop_timer) StateLoop(); - SerialInput(); + if (!serial_local) SerialInput(); #ifdef USE_ARDUINO_OTA ArduinoOTA.handle(); diff --git a/sonoff/support.ino b/sonoff/support.ino index 8f18c5a55..1cf6713ab 100644 --- a/sonoff/support.ino +++ b/sonoff/support.ino @@ -486,6 +486,14 @@ void SetSerialBaudrate(int baudrate) } } +void SetSerialLocal(bool slocal) +{ + serial_local = slocal; + if (slocal) { + SetSeriallog(LOG_LEVEL_NONE); + } +} + uint32_t GetHash(const char *buffer, size_t size) { uint32_t hash = 0; diff --git a/sonoff/xsns_15_mhz19.ino b/sonoff/xsns_15_mhz19.ino index 52765f4b5..81069954a 100644 --- a/sonoff/xsns_15_mhz19.ino +++ b/sonoff/xsns_15_mhz19.ino @@ -91,6 +91,46 @@ uint8_t mhz_retry = MHZ19_RETRY_COUNT; uint8_t mhz_received = 0; uint8_t mhz_state = 0; +uint8_t mhz_hard_serial = 0; + +/*********************************************************************************************/ + +size_t MhzSerialAvailable() +{ + if (mhz_hard_serial) { + return Serial.available(); + } else { + return MhzSerial->available(); + } +} + +void MhzSerialFlush() +{ + if (mhz_hard_serial) { + Serial.flush(); + } else { + MhzSerial->flush(); + } +} + +size_t MhzSerialWrite(byte *array, size_t size) +{ + if (mhz_hard_serial) { + return Serial.write(array, size); + } else { + return MhzSerial->write(array, size); + } +} + +int MhzSerialRead() +{ + if (mhz_hard_serial) { + return Serial.read(); + } else { + return MhzSerial->read(); + } +} + /*********************************************************************************************/ byte MhzCalculateChecksum(byte *array) @@ -117,7 +157,8 @@ size_t MhzSendCmd(byte command_id) mhz_send[7] = 0x00; */ mhz_send[8] = MhzCalculateChecksum(mhz_send); - return MhzSerial->write(mhz_send, sizeof(mhz_send)); + + return MhzSerialWrite(mhz_send, sizeof(mhz_send)); } /*********************************************************************************************/ @@ -160,7 +201,7 @@ bool MhzCheckAndApplyFilter(uint16_t ppm, uint8_t s) void MhzEverySecond() { mhz_state++; - if (8 == mhz_state) { // Every 8 sec start a MH-Z19 measuring cycle (which takes 1005 +5% ms) + if (8 == mhz_state) { // Every 8 sec start a MH-Z19 measuring cycle (which takes 1005 +5% ms) mhz_state = 0; if (mhz_retry) { @@ -171,7 +212,7 @@ void MhzEverySecond() } } - MhzSerial->flush(); // Sync reception + MhzSerialFlush(); // Sync reception MhzSendCmd(MHZ_CMND_READPPM); mhz_received = 0; } @@ -182,8 +223,8 @@ void MhzEverySecond() unsigned long start = millis(); uint8_t counter = 0; while (((millis() - start) < MHZ19_READ_TIMEOUT) && (counter < 9)) { - if (MhzSerial->available() > 0) { - mhz_response[counter++] = MhzSerial->read(); + if (MhzSerialAvailable() > 0) { + mhz_response[counter++] = MhzSerialRead(); } else { delay(5); } @@ -281,9 +322,19 @@ void MhzInit() { mhz_type = 0; if ((pin[GPIO_MHZ_RXD] < 99) && (pin[GPIO_MHZ_TXD] < 99)) { - MhzSerial = new TasmotaSerial(pin[GPIO_MHZ_RXD], pin[GPIO_MHZ_TXD]); - if (MhzSerial->begin(9600)) { + if ((1 == pin[GPIO_MHZ_RXD]) && (3 == pin[GPIO_MHZ_TXD])) { + AddLog_P(LOG_LEVEL_DEBUG, PSTR("MHZ: Hardware serial")); + baudrate = 9600; + SetSerialBaudrate(baudrate); + SetSerialLocal(true); + mhz_hard_serial = 1; mhz_type = 1; + } else { + MhzSerial = new TasmotaSerial(pin[GPIO_MHZ_RXD], pin[GPIO_MHZ_TXD]); + if (MhzSerial->begin(9600)) { + AddLog_P(LOG_LEVEL_DEBUG, PSTR("MHZ: Software serial")); + mhz_type = 1; + } } } }