Wemos D1 mini Pro. Глючит программый сериал
- Войдите на сайт для отправки комментариев
Сб, 18/04/2020 - 14:33
Добрый день. Прошу помощи. Не работает программный сериал в связке с датчиком СО2 - MH-Z19B. Часть скетча ниже
#include <ESP8266WiFi.h>
#include <SoftwareSerial.h> // Подключение библиотеки Software Serial
SoftwareSerial swSerial(4, 5); // RX, TX // Назначение задействованных дискретных каналов
const char* ssid = "";//type your ssid
const char* password = "";//type your password
int pwmPin = 15;
WiFiServer server(80);//Service Port
boolean flagEmptyLine = true; // признак строка пустая
char tempChar;
void setup() {
Serial.begin(9600);
swSerial.begin(9600); // Инициализация программного последовательного порта
pinMode(pwmPin, INPUT);
//byte setAutoCal_cmd[9] = {0xFF, 0x01, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86};// задает выключение автокорреции
/*
Источник - https://revspace.nl/MHZ19
2000 ppm range: 0xFF, 0x01, 0x99, 0x00, 0x00, 0x00, 0x07, 0xD0, 0x8F
5000 ppm range: 0xFF, 0x01, 0x99, 0x00, 0x00, 0x00, 0x13, 0x88, 0xCB
*/
// Этот вариант ("A") с записью команды в 6й и 7й байт - работает
// bytes: 3 4 6 7
byte setrangeA_cmd[9] = {0xFF, 0x01, 0x99, 0x00, 0x00, 0x00, 0x13, 0x88, 0xCB}; // задаёт диапазон 0 - 5000ppm
//swSerial.write(setAutoCal_cmd,9); // выключаем автокоррекцию
unsigned char setrangeA_response[9];
swSerial.write(setrangeA_cmd,9);
delay(1000);
swSerial.readBytes(setrangeA_response, 9);
int setrangeA_i;
byte setrangeA_crc = 0;
for (setrangeA_i = 1; setrangeA_i < 8; setrangeA_i++) setrangeA_crc+=setrangeA_response[setrangeA_i];
setrangeA_crc = 255 - setrangeA_crc;
setrangeA_crc += 1;
if ( !(setrangeA_response[0] == 0xFF && setrangeA_response[1] == 0x99 && setrangeA_response[8] == setrangeA_crc) ) {
Serial.println("Range CRC error: " + String(setrangeA_crc) + " / "+ String(setrangeA_response[8]) + " (bytes 6 and 7)");
} else {
Serial.println("Range was set! (bytes 6 and 7)");
}
delay(1000);
TX и RX пробовал на разных входах. Причем этот скетч нормально работает с Ардуино Уно. Смотрел осциллографом на ножках TX и RX. Видно что проходит запрос и ответ, а Wemos ответ видимо на распознает. В мониторе Range CRC error. Уже всю голову сломал. Может кто-то встречался с этим.
delay(1000) точно там нужен?
delay(1000) точно там нужен?
Это только часть скетча. Предоставил для примера. Может для ESP8266TX нужна какая-то особая библиотека. Но пока склоняюсь к мысли нестыковки уровней сигнала
Как по вашему разумению работает SoftwareSerial?
Как по вашему разумению работает SoftwareSerial?
Как работает я примерно представляю. Меня смущает что этот датчик нормально работает с Ардуино Уно. С этим же скетчем. И ещё, когда я пробовал соединить Ардуино с Wemos по программному сериалу, всё работало. Попробую с другой платой Wemos. Хотя мне кажется что это не поможет.
Я вот, например, удивлён тому, что на Uno нормально то же самое работало.
Мозг окончательно устал. Уже ничего не понимаю. На Ардуино работает, на Wemos - нет. Уже все пины перепробовал, Питание 5В подавал прямо на плату. Ну никак. И резистор подтягивающий припаивал. Осталось поменять Wemos. Сделаю перерыв, а то уже тошнит от этого
Мне кажется, вы неверно считаете CRC. С индексами в цикле for не напутали? Во всяком случае функция проверки контрольной суммы очень нелогичная. Я бы посоветовал вывести респонс побайтно на печать и посчитать crc вручную
Добрый день. Расчет CRC и брал из готового скетча. И, потом, на Ардуино то работает. Попробую на другой плате Wemos.
Добрый день. Расчет CRC и брал из готового скетча. И, потом, на Ардуино то работает. Попробую на другой плате Wemos.
я бы начал с того, что вывел ответ в сериал и посчитал CRC вручную
Я попробую.
для начала исправьте строчку 38 вот так и попробуйте:
Нет, дело не в контрольной сумме. На запрос:
0xFF 0x01 0x99 0x00 0x00 0x00 0x13 0x88 0xCB считывается ответ:
0xFE 0xEF 0xEF 0xFE 0xFE 0xEF 0xEF 0xFE 0xFE
Толи датчик не понимает запроса (но при этом отвечает), толи Wemos не понимает ответа.
Очередная непонятка. Связал Ардуино с Wemos по программному сериалу. Передача шла от Ардуино к Wemos.
При передачи простых чисел, всё нормально передавалось. Тогда я решил передать массив из 9 байт (как команда на датчик). Wemos считывает не правильно. Причём при одном цикле передачи он умудряется считывать 3 раза. И все 3 раза считывает разные значения. Тогда я поменял направление передачи, от Wemos к Ардуино. И всё стало передаваться правильно. У Wemos какието глюки при считывании массива данных. Где то кроется ошибка. Может Wemos нужно особенная библиотека для программного сериала?????
Мозг кипит со вчерашнего дня.
Может такая же история: http://arduino.ru/forum/programmirovanie/skorost-vosproizvedeniya-na-matritse-ws2812#comment-531335
Гоняйте на простом экзампле от SoftSerial - там, где он просто с порта в порт перекладывает.
Всем, добрый день.
Решил больше не экспериментировать. А так не долго и дурку сыграть. Последний эксперимент показал следующее: как и прежде с Ардуино передаю
FF 01 99 00 00 00 13 88 CB
FF 00 00 00 00 00 00 00 00 - это первый ответ
01 99 00 00 00 13 88 CB FF - это повторяется 9 раз, затем:
88 CB FF 01 99 00 00 00 13 - это уже до упора или ресета
Происходит какая-то сдвижка по кругу.
По моему есть два варианта: или существуют какие-то особенности чтения массива через софтсериал на Wemos, или у меня бракованные платы(2 шт.).
Скетч для Wemos загружу с следующем посте.
#include <SoftwareSerial.h> SoftwareSerial mySerial(4, 5); // RX, TX void setup() { // int i = 0; Serial.begin(9600); mySerial.begin(9600); } void loop() { // //byte resp[9]; unsigned char resp[9]; while(mySerial.available()>0) { memset (resp, 0, 9); //delay(2000); mySerial.readBytes(resp, 9); Serial.println(); Serial.print(" "); Serial.print(resp[0], HEX); Serial.print(" "); Serial.print(resp[1], HEX); Serial.print(" "); Serial.print(resp[2], HEX); Serial.print(" "); Serial.print(resp[3], HEX); Serial.print(" "); Serial.print(resp[4], HEX); Serial.print(" "); Serial.print(resp[5], HEX); Serial.print(" "); Serial.print(resp[6], HEX); Serial.print(" "); Serial.print(resp[7], HEX); Serial.print(" "); Serial.print(resp[8], HEX); delay(6000); } }Serial.print("Readed from stream "); Serial.prin(mySerial.readBytes(resp, 9)); Serial.print(" bytes");Попробовал. Вот что получилось. Это после ресета:
⸮n?⸮4⸮!⸮⸮⸮⸮OAqr⸮⸮
Readed from stream 4294967295 bytes
Readed from stream 4294967295 bytes
Readed from stream 4294967295 bytes
Readed from stream 4294967295 bytes
Там в первой строчке какая-то дрянь вылезает.
Сдается мне, что неправильно буфер читаете. > 0 не всегда 9.
Добрый день.
Я думаю, что дело в каких-то особенностях Wemos. Этот скетч прекрасно работает на Ардуино. Попробую обратиться на профильный сайт.
Я думаю, что дело в каких-то особенностях Wemos. Этот скетч прекрасно работает на Ардуино. Попробую обратиться на профильный сайт.
Возможно у Вемоса есть какие-то особенности, выражающиеся в том, что кривой код для Нано на Вемосе не работает :)
Но в этом случае вместо того чтоб тратить время на "профильном сайте" - лучше переписать код нормально
Если подскажете как, буду премного благодарен. Тема для того и создавалась чтобы найти ошибки.
Если подскажете как, буду премного благодарен. Тема для того и создавалась чтобы найти ошибки.
А я добавлю - выкиньте функцию readbytes(), читайте по одному байту за раз в цикле, проверяя каждый раз Serial.available()