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

Тема в разделе "Arduino & Shields", создана пользователем irvdev, 16 сен 2017.

  1. irvdev

    irvdev Нерд

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

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

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

    Сейчас все собрано на arduino Uno, но есть еще и mega.

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

    Уже всю голову сломал. помогите пожалуйста(

    Спасибо!

    Код (C++):
    // include library
    #include <SoftwareSerial.h>
    #include <Nextion.h>
    #include <AM2320.h>
    #include <Wire.h>
    #include <iarduino_RTC.h>
    #include <EEPROM.h>

    // init ds1307
    iarduino_RTC RTC1(RTC_DS1307);
    AM2320 sensorTh;

    // init ppm sensor
    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 Nextion
    SoftwareSerial nextion(2, 3); // TX - 2, RX - 3
    Nextion myNextion(nextion, 9600);

    int prevVal = LOW;
    long th, tl, h, l, ppm;

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

    // init CO2 var
    int co2timeOn = EEPROM.read(0);
    int co2timeOff = EEPROM.read(1);
    int co2levelOn = (EEPROM.read(8) * 10);
    int co2levelOff = (EEPROM.read(9) * 10);

    // init Hum var
    int HumLevel = EEPROM.read(2);

    // init Temp var
    int TempLevel = EEPROM.read(3);

    // init Set Time var
    int SetTimeHour = EEPROM.read(6);
    int SetTimeMin = EEPROM.read(7);


    void setup() {
        pinMode(5, INPUT); // ppm
        pinMode(6, OUTPUT); // co2 up
        pinMode(7, OUTPUT); // hum up
      pinMode(8, OUTPUT); // hum down
      pinMode(9, OUTPUT); // temp down
      digitalWrite(6, HIGH);
      digitalWrite(7, HIGH);
      digitalWrite(8, HIGH);
      digitalWrite(9, HIGH);

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

    void loop() {

        RTC1.gettime();
        curSec = RTC1.seconds;
        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));
        }
        // 4 раза в минуту проверяем со2
        if ( curSec == 0  || curSec == 15 || curSec == 30 || curSec == 45 ) {
            CheckPpm();
        }
     
        // Постоянно слушаем дисплей
        String message = myNextion.listen();

        // ..и расшифровываем команды
        // ExitMenu
        if (message == "65 2 5 0 ffff ffff ffff") {
            GoHome();
        };
     
        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));

        sensorTh.Read();
        myNextion.setComponentText("t1", String(sensorTh.h));
        myNextion.setComponentText("t2", String(sensorTh.t));
    }

    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 int ppm = (256*responseHigh) + responseLow;
        Serial.println(ppm);
        myNextion.setComponentText("t0", String(ppm));
      }
    }
     
  2. rkit

    rkit Гуру

    Два софтварных сериала на 9600? Когда уно один-то едва тянет?
     
  3. ИгорьК

    ИгорьК Гуру

    Берите мегу там 4 железнвх uart. На один uart можно сажать одно устройство
    Если uno - то надо подключать библиотеку софтверного сериала и одно устройство пускать через нее.

    В данном случае вместо софтверного использовать железный - 0 и1 ноги.
    (Не посмотрел код сразу. Некстион через свою библиотеку. Забыл уже что правоверный ардуинщик не имеет права работать с некстион без библиотеки)
     
    Последнее редактирование: 16 сен 2017
    DIYMan и irvdev нравится это.
  4. irvdev

    irvdev Нерд

    Вот уже готов пуститься во все тяжкие и использовать некстион без библиотеки, но не очень понимаю как сделать, чтобы он через софтвар слушал команды. Как раз гуглю на этот счет, но пока не помогает(
     
  5. b707

    b707 Гуру

    А какая разница - через библиотеку или нет, проблема-то не в ней, Проблема в том, что софтварсериал не может работать одновременно с двумя портами. Если будете Некстиону сами команды посылать - это ничего не изменит.
    Если у вас два софтвара - а у вас два, один к некстиону, другой к датчику - то для корректной работы вы должны переключаться между ними командой mySerial.listen()
     
    arkadyf и irvdev нравится это.
  6. irvdev

    irvdev Нерд

    Спасибо! Так и сделал. Пробовал уже так, не работало. Переключил дисплей и датчик на 10, 11, 12, 13 пины и все заработало!

    УРА!! всем спасибо!
     
    arkadyf нравится это.
  7. demp

    demp Нуб

    и какой итоговый код программы, если не секрет?