NodeMCU v2 с датчиком CO2 MH-Z19B Проблема чтения UART

Я пытаюсь считать данные с датчика MH-Z19B на плату NodeMCU v2 с помощью такой простой схемы.

Некоторые ключевые моменты, которые могут быть не так очевидны на картинке:
- датчик имеет отдельное питание 4 АА, обеспечивающее ~5,5В
- TX датчика подключен к GPIO15 (TX D2) NodeMCU
- RX датчика подключен к GPIO13 (RX D2) NodeMCU

А вот мой набросок:

const byte readCommand[] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79}; // по даташиту
unsigned char response[9];

void setup() {
  // согласно даташиту, датчик использует 9600 бод, 8 бит данных и 1 стоповый бит
  // с контролем четности NONE, что, как мне кажется, соответствует конфигурации по умолчанию SERIAL_8N1
  Serial.begin(9600);
}

void loop() {

    // ... проверяем, не пора ли мерить

    Serial.swap(); // переключаемся на датчик

    Serial.write(readCommand, sizeof(readCommand));

    memset(response, 0, sizeof(response));

    int attempts = 5;
    int available = Serial.available();
    while(available < sizeof(response) && attempts > 0) {
        delay(100);
        attempts--;
        available = Serial.available();
    }

    Serial.readBytes(response, sizeof(response));

    Serial.swap(); // переключаемся обратно в консоль

    // распечатать ответ в шестнадцатеричном формате
    for (int i = 0; i < sizeof(response); i++) {
      Serial.print(String(response[i], HEX));
      Serial.print("   ");
    }

    // ...обработать ответ по протоколу
}

Проблема

По какой-то причине после отправки команды на серийный номер я получаю ответ точно такой же, как и команда, хотя ожидается, что структура ответа будет другой. Разумеется, в техпаспорте ничего не говорится о подобных ситуациях.
Ожидание

ff 86 .. .. 0 0 0 0 CRC

Реальность (те же байты, которые я отправил как команду)

ff   1   86   0   0   0   0   0   79 

Другие примечания:
- Я получил точно такое же, когда попытался использовать SoftwareSerial с D1 & Контакты D2
- подключение TX к RX соответственно на датчике и MCU приводит к сбою чтения
- Я пытался вытащить все, что доступно из серийного номера, там только мои ожидаемые 9 байт
- мои навыки пайки далеки от идеала, но я уверен, что tx/rx на датчике подключены правильно

Я новичок во всех этих вещах, поэтому вполне возможно, что это смехотворно глупая, но важная ошибка, поэтому буду признателен за любую помощь в этом. И я понимаю, что датчик также имеет дополнительные интерфейсы для получения значения, но, как я уже сказал, я новичок и хотел ознакомиться с UART, так как это что-то новое для меня.

ОБНОВЛЕНИЕ 1:
Я не использовал преобразование уровня для выходного сигнала датчика, как указано в техническом описании:

Исходя из этого, я думал, что датчик сам обеспечивает преобразование логического уровня. Я ошибся?

UPD 2:
Я вернулся к правильному соединению TX-RX, просто чтобы проверить, что именно происходит, чтобы описать эту проблему «ошибки чтения» с более подробной информацией. Кажется, что Serial.available() возвращает 0 после того, как я отправляю команду, поэтому этот цикл останавливается после 5 попыток:

while(available < sizeof(response) && attempts > 0)

, 👍1

Обсуждение

Это должен быть RX-TX с UART. То, что это приводит к сбою чтения, является еще одной проблемой. Что именно вы подразумеваете под «неудачным чтением»?, @chrisl

Вы не понижаете напряжение TX датчика с 5 В до 3,3 В для NodeMCU. Это рискованно, так как вы можете разрушить вывод RX NodeMCU., @chrisl

@chrisl спасибо за ваши комментарии, я обновил свой вопрос, добавив некоторые подробности, касающиеся этого случая «ошибки чтения», и мои предположения, которые я взял из таблицы данных, которые заставили меня подумать, что мне не нужно преобразование уровня 3,3., @Viacheslav


1 ответ


1

В вашем описании сказано, что у вас есть Rx, подключенный к Rx, и Tx, подключенный к Tx. Это назад. То, что один передает, другой должен получить. Когда вы разговариваете с кем-то, вы говорите ему в рот и слушаете его уши? У вас должны быть Rx-Tx и Tx-Rx.

Вы также должны быть уверены, что можно подавать 5 В Tx на этот контакт Rx. На некоторых платах ESP8266 это есть, а на большинстве нет. Если у вас нет одной из плат со встроенной схемой для обработки входов 5 В, вы сожгете свой NodeMCU

,

Спасибо за ваш ответ. Я добавил скриншот из таблицы данных датчика, в которой говорится, что он обеспечивает UART 3,3, поэтому я подумал, что преобразование уровня было сделано на стороне датчика. Я понял неправильно?, @Viacheslav

Если это даст 3V3, то вы в безопасности. Из вашего вопроса выяснилось, что это было 5В., @Delta_G