Wemos D1 mini Pro. Глючит программый сериал

Samson2
Offline
Зарегистрирован: 06.03.2020

Добрый день. Прошу помощи. Не работает программный сериал в связке с датчиком СО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. Уже всю голову сломал. Может кто-то встречался с этим.

sadman41
Offline
Зарегистрирован: 19.10.2016

delay(1000) точно там нужен?

Samson2
Offline
Зарегистрирован: 06.03.2020

sadman41 пишет:

delay(1000) точно там нужен?

Это только часть скетча. Предоставил для примера. Может для ESP8266TX нужна какая-то особая библиотека. Но пока склоняюсь к мысли нестыковки уровней сигнала

sadman41
Offline
Зарегистрирован: 19.10.2016

Как по вашему разумению работает SoftwareSerial? 

Samson2
Offline
Зарегистрирован: 06.03.2020

sadman41 пишет:

Как по вашему разумению работает SoftwareSerial? 

Как работает я примерно представляю. Меня смущает что этот датчик нормально работает с Ардуино Уно. С этим же скетчем. И ещё, когда я пробовал соединить Ардуино с Wemos по программному сериалу, всё работало. Попробую с другой платой Wemos. Хотя мне кажется что это не поможет.

sadman41
Offline
Зарегистрирован: 19.10.2016

Я вот, например, удивлён тому, что на Uno нормально то же самое работало. 

Samson2
Offline
Зарегистрирован: 06.03.2020

Мозг окончательно устал. Уже ничего не понимаю. На Ардуино работает, на Wemos - нет. Уже все пины перепробовал, Питание 5В подавал прямо на плату. Ну никак. И резистор подтягивающий припаивал. Осталось поменять Wemos. Сделаю перерыв, а то уже тошнит от этого

b707
Offline
Зарегистрирован: 26.05.2017

Мне кажется, вы неверно считаете CRC. С индексами в цикле for не напутали? Во всяком случае функция проверки контрольной суммы очень нелогичная. Я бы посоветовал вывести респонс побайтно на печать и посчитать crc вручную

Samson2
Offline
Зарегистрирован: 06.03.2020

b707 пишет:
Мне кажется, вы неверно считаете CRC. С индексами в цикле for не напутали? Во всяком случае функция проверки контрольной суммы очень нелогичная. Я бы посоветовал вывести респонс побайтно на печать и посчитать crc вручную

Добрый день. Расчет CRC и брал из готового скетча. И, потом, на Ардуино то работает. Попробую на другой плате Wemos.

b707
Offline
Зарегистрирован: 26.05.2017

Samson2 пишет:

Добрый день. Расчет CRC и брал из готового скетча. И, потом, на Ардуино то работает. Попробую на другой плате Wemos.

я бы начал с того, что вывел ответ в сериал и посчитал CRC вручную

Samson2
Offline
Зарегистрирован: 06.03.2020

Я попробую.

b707
Offline
Зарегистрирован: 26.05.2017

для начала исправьте строчку 38 вот так и попробуйте:

 for (setrangeA_i = 0; setrangeA_i < 8; setrangeA_i++) 

 

Samson2
Offline
Зарегистрирован: 06.03.2020

Нет, дело не в контрольной сумме. На запрос:

0xFF  0x01  0x99  0x00  0x00  0x00  0x13  0x88  0xCB   считывается ответ:

0xFE  0xEF  0xEF  0xFE   0xFE  0xEF  0xEF  0xFE  0xFE

Толи датчик не понимает запроса (но при этом отвечает), толи Wemos не понимает ответа.

Samson2
Offline
Зарегистрирован: 06.03.2020

Очередная непонятка. Связал Ардуино с Wemos по программному сериалу. Передача шла от Ардуино к Wemos.

При передачи простых чисел, всё нормально передавалось. Тогда я решил передать массив из 9 байт (как команда на датчик). Wemos считывает не правильно. Причём при одном цикле передачи он умудряется считывать 3 раза. И все 3 раза считывает разные значения. Тогда я поменял направление передачи, от Wemos к Ардуино. И всё стало передаваться правильно. У Wemos какието глюки при считывании массива данных. Где то кроется ошибка. Может Wemos нужно особенная библиотека для программного сериала?????

Мозг кипит со вчерашнего дня.

sadman41
Offline
Зарегистрирован: 19.10.2016

Может такая же история: http://arduino.ru/forum/programmirovanie/skorost-vosproizvedeniya-na-matritse-ws2812#comment-531335

Гоняйте на простом экзампле от SoftSerial - там, где он просто с порта в порт перекладывает.

 

Samson2
Offline
Зарегистрирован: 06.03.2020

Всем, добрый день.

Решил больше не экспериментировать. А так не долго и дурку сыграть. Последний эксперимент показал следующее: как и прежде с Ардуино передаю

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 загружу с следующем посте.

Samson2
Offline
Зарегистрирован: 06.03.2020
#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);

}

}

 

sadman41
Offline
Зарегистрирован: 19.10.2016
Serial.print("Readed from stream ");
Serial.prin(mySerial.readBytes(resp, 9));
Serial.print(" bytes");

 

Samson2
Offline
Зарегистрирован: 06.03.2020

Попробовал. Вот что получилось. Это после ресета:

⸮n?⸮4⸮!⸮⸮⸮⸮OAqr⸮⸮

Readed from stream 4294967295 bytes

Readed from stream 4294967295 bytes

Readed from stream 4294967295 bytes

Readed from stream 4294967295 bytes

Там в первой строчке какая-то дрянь вылезает.

sadman41
Offline
Зарегистрирован: 19.10.2016

Сдается мне, что неправильно буфер читаете. > 0 не всегда 9.

Samson2
Offline
Зарегистрирован: 06.03.2020

Добрый день.

Я думаю, что дело в каких-то особенностях Wemos. Этот скетч прекрасно работает на Ардуино. Попробую обратиться на профильный сайт.

b707
Offline
Зарегистрирован: 26.05.2017

Samson2 пишет:

Я думаю, что дело в каких-то особенностях Wemos. Этот скетч прекрасно работает на Ардуино. Попробую обратиться на профильный сайт.

Возможно у Вемоса есть какие-то особенности, выражающиеся в том, что кривой код для Нано на Вемосе не работает :)

Но в этом случае вместо того чтоб тратить время на "профильном сайте" - лучше переписать код нормально

Samson2
Offline
Зарегистрирован: 06.03.2020

Если подскажете как, буду премного благодарен. Тема для того и создавалась чтобы найти ошибки.

b707
Offline
Зарегистрирован: 26.05.2017

Samson2 пишет:

Если подскажете как, буду премного благодарен. Тема для того и создавалась чтобы найти ошибки.

так вам Садман в #19 уже подсказал, не читайте 9 байт, если в Сериале их нет.

А я добавлю - выкиньте функцию readbytes(), читайте по одному байту за раз в цикле, проверяя каждый раз Serial.available()