Доброго времени суток! Возникла следующая проблема. Не хотят вместе работать дисплей 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)); } }
Берите мегу там 4 железнвх uart. На один uart можно сажать одно устройство Если uno - то надо подключать библиотеку софтверного сериала и одно устройство пускать через нее. В данном случае вместо софтверного использовать железный - 0 и1 ноги. (Не посмотрел код сразу. Некстион через свою библиотеку. Забыл уже что правоверный ардуинщик не имеет права работать с некстион без библиотеки)
Вот уже готов пуститься во все тяжкие и использовать некстион без библиотеки, но не очень понимаю как сделать, чтобы он через софтвар слушал команды. Как раз гуглю на этот счет, но пока не помогает(
А какая разница - через библиотеку или нет, проблема-то не в ней, Проблема в том, что софтварсериал не может работать одновременно с двумя портами. Если будете Некстиону сами команды посылать - это ничего не изменит. Если у вас два софтвара - а у вас два, один к некстиону, другой к датчику - то для корректной работы вы должны переключаться между ними командой mySerial.listen()
Спасибо! Так и сделал. Пробовал уже так, не работало. Переключил дисплей и датчик на 10, 11, 12, 13 пины и все заработало! УРА!! всем спасибо!