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)
@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
- Последовательная связь между nodemcu и Arduino Uno
- NodeMCU ESP8266
- Как использовать контакты GPIO на UART esp12e?
- NodeMCU - Vin контакт как выход 5V?
- Как заставить 5-вольтовое реле работать с NodeMCU
- ESP8266 не подключается к Wi-Fi
- Разве в узле MCU v3 (LoLin) нет встроенного светодиода?
- Разница между этими двумя платами NodeMCU?
Это должен быть RX-TX с UART. То, что это приводит к сбою чтения, является еще одной проблемой. Что именно вы подразумеваете под «неудачным чтением»?, @chrisl
Вы не понижаете напряжение TX датчика с 5 В до 3,3 В для NodeMCU. Это рискованно, так как вы можете разрушить вывод RX NodeMCU., @chrisl
@chrisl спасибо за ваши комментарии, я обновил свой вопрос, добавив некоторые подробности, касающиеся этого случая «ошибки чтения», и мои предположения, которые я взял из таблицы данных, которые заставили меня подумать, что мне не нужно преобразование уровня 3,3., @Viacheslav