Два устройства по UART. Nextion и mh-z19

irvdev
Offline
Зарегистрирован: 19.03.2017

Доброго времени суток! Возникла следующая проблема. Не хотят вместе работать дисплей nextion и датчик CO2 mh-z19.

Суть примерно следующее. Устройство ждет команды от дисплея, и раз в минуту подключается к датчику.

Но проблема в том что по отдельности все работает. А вместе, датчик вроде что то получает. Ардуина отправляет команды дисплею, но при этом почему то не получает команды от дисплея.

Есть подозрение, что они где то мешают друг другу, уже всю голову сломал. помогите пожалуйста(

// include library
#include <SoftwareSerial.h>
#include <Nextion.h>
#include <Wire.h>
#include <iarduino_RTC.h>
#include <EEPROM.h>

// init ds1307
iarduino_RTC RTC1(RTC_DS1307);

// init Nextion
SoftwareSerial nextion(2, 3); // TX - 2, RX - 3
Nextion myNextion(nextion, 9600);

SoftwareSerial mySerial(A0, A1); // A0 - TX, A1 - RX
byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; 
unsigned char response[9];

// init var time
int curHour = 0;
int curMin = 0;
String curTimeStr = "0";
String curHourStr = "0";
String curMinStr = "0";

int ppm = 0;


void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
  myNextion.init();
  
  RTC1.begin();
  RTC1.period(1);
  RTC1.gettime();
  curHour = RTC1.Hours;
  curMin = RTC1.minutes;
  SetVarCurrentTimeStr();
  
  CheckPpm();
  GoHome();
}

void loop() {
  RTC1.gettime();
  SetVarCurrentTimeStr();
  if (curHour != RTC1.Hours) {
    curHour = RTC1.Hours;
    myNextion.setComponentText("t3", String(curHourStr));
  }
  if (curMin != RTC1.minutes) {
    curMin = RTC1.minutes;
    myNextion.setComponentText("t4", String(curMinStr));
    CheckPpm();
  }
    
  String message = myNextion.listen(); // check for message

  // SetTimeButtonMenu
  if (message == "65 3 2 0 ffff ffff ffff") {
    
  };
  
  if (message != "") { // if a message is received...
    Serial.println(message); //...print it out
  };
}

void GoHome() {
  myNextion.sendCommand("page 1");

  myNextion.setComponentText("t0", String(ppm));
  myNextion.setComponentText("t3", String(curHourStr));
  myNextion.setComponentText("t4", String(curMinStr));
}

void SetVarCurrentTimeStr() {
  curTimeStr = RTC1.gettime("H:i");
  curHourStr = (curTimeStr).substring(0, 2);
  curMinStr = (curTimeStr).substring(3, 5);
};

void CheckPpm() {
  mySerial.write(cmd, 9);
  memset(response, 0, 9);
  mySerial.readBytes(response, 9);
  int i;
  byte crc = 0;
  for (i = 1; i < 8; i++) crc+=response[i];
  crc = 255 - crc;
  crc++;

  if ( !(response[0] == 0xFF && response[1] == 0x86 && response[8] == crc) ) {
    Serial.println("CRC error: " + String(crc) + " / "+ String(response[8]));
  } else {
    unsigned int responseHigh = (unsigned int) response[2];
    unsigned int responseLow = (unsigned int) response[3];
    unsigned ppm = (256*responseHigh) + responseLow;
    myNextion.setComponentText("t0", String(ppm));
  }
}

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Посмотрите пример здесь Two Port Receive .Если я правильно понял, библиотека SoftwareSerial умеет слушать только один порт. Если используется несколько портов, надо задавать, который слушаем в данный момент.

ErrorDS
Offline
Зарегистрирован: 13.05.2022

Подскажите плиз, решили данную проблему?

Если можно пример кода.