Проблема с Nextion. Некорректно передает код.
- Войдите на сайт для отправки комментариев
Вс, 21/01/2018 - 20:08
В цикле выполняется:
String message = myNextion.listen();
Иногда при нажатии кнопки на экране, считывается нужныя строчка:
65 0 2 1 ffff ffff ffff и подобные
Иногда вообще ничего не считывается, а бывает, что приходят разные символы, как при слетевшей кодировке.
Пробовал припаять провода прямо к плате, что бы исключить плохой контакт. Изменять скорость порта.
Так же и данные передаваемые на экран. Иногда доходят, иногда нет. В чем дело?
Вот весь код, если понадобится:
#include <AccelStepper.h> #include <max6675.h> #include <SoftwareSerial.h> #include <Nextion.h> SoftwareSerial nextion(10, 11);// Nextion TX to pin 2 and RX to pin 3 of Arduino Nextion myNextion(nextion, 57600); MAX6675 thermocouple(30, 32, 31); AccelStepper Stepper1(1,25,24); AccelStepper Stepper2(1,22,23); AccelStepper Stepper3(1,22,23); int debugMessage = 1; int on = 0; int ont = 0; int onb = 0; int onp = 0; int calibration_1 = 0; int calibration_2 = 0; const int buttonPin = 33; const int rele = 40; long interval = 500; long previousMillis = 0; int tempn = 0; int temp = 50; int spe = 500; int spep = 200; int page = 0; int FlagN = 0; int dir = -1; void setup() { noInterrupts (); // отключить все прерывания TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; OCR1A = 125; // сравнить регистр 16 МГц / 256/500 Гц (2ms=125) TCCR1B |= (1 << WGM12); // Режим СТС TCCR1B |= (1 << CS12); // 256 делитель TIMSK1 |= (1 << OCIE1A ); // включить таймер сравнить прерываний interrupts(); // включить все прерывания nextion.begin(9600); Serial.begin(57600); myNextion.init(); myNextion.sendCommand("baud=57600"); nextion.end(); // закрытие порта nextion.begin(57600); // открытие порта на новой скорости myNextion.sendCommand("baud=57600"); pinMode(buttonPin, INPUT); pinMode(rele, OUTPUT); Stepper1.setMaxSpeed (2000); Stepper1.setAcceleration(2000); Stepper2.setMaxSpeed(2000); Stepper3.setMaxSpeed(2000); } ISR (TIMER1_COMPA_vect) // Функция прерывания таймера { if(digitalRead(buttonPin)==1){ calibration_1 = 1; } Stepper1.run(); if (onb == 1){ Stepper2.runSpeed(); } if (onp == 1){ Stepper3.runSpeed(); } } void loop() { if(calibration_1 == 0 && on == 1){ Stepper1.move(100*dir); } if (calibration_1 == 1 && calibration_2 == 0){ calibration_2 = 1; dir=1; Stepper1.move(2000*dir); } Stepper2.setSpeed(spe); Stepper3.setSpeed(spep); if (ont == 1 && tempn<temp){ digitalWrite(rele, HIGH); } else { digitalWrite(rele, LOW); } String message = myNextion.listen(); //check for message // Запуск станка if(message == "65 0 2 1 ffff ffff ffff"){ // if a message is received... on = 1; ont = 1; page = 1; } // Настройки температуры и скорости экструзии else if(message == "65 1 4 1 ffff ffff ffff"){ // if a message is received... page = 2; } // Выход из настроек температуры и скорости экструзии else if(message == "65 2 6 1 ffff ffff ffff"){ // if a message is received... page = 1; } // Запуск экструзии else if(message == "65 1 3 1 ffff ffff ffff" && calibration_2 == 1 && tempn>=temp){ // if a message is received... onb=1; } // Температура +1 else if(message == "65 2 2 1 ffff ffff ffff"){ // if a message is received... temp = temp - 1; } // Температура -1 else if(message == "65 2 4 1 ffff ffff ffff"){ // if a message is received... temp = temp + 1; } // Скорость экструзии + else if(message == "65 2 3 1 ffff ffff ffff"){ // if a message is received... spe = spe - 50; } // Скорость экструзии - else if(message == "65 2 5 1 ffff ffff ffff"){ // if a message is received... spe = spe + 50; } // Настройка скорости прокатки else if(message == "65 1 5 1 ffff ffff ffff"){ // if a message is received... page = 3; } // Скорость прокатки + 1 else if(message == "65 3 3 1 ffff ffff ffff"){ // if a message is received... spe = spep + 1; } // Скорость прокатки - 1 else if(message == "65 3 3 1 ffff ffff ffff"){ // if a message is received... spe = spep - 1; } // // if(message != "" && debugMessage == 1){ // if a message is received... Serial.println(message); //...print it out } unsigned long currentMillis = millis(); //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis > interval) { tempn = thermocouple.readCelsius(); Serial.println(page); //...print it out // сохраняем время последнего переключения previousMillis = currentMillis; if (FlagN == 0){ if (page == 1){ myNextion.setComponentText("t0", String(tempn)); Serial.println(tempn); //...print it out } FlagN =1; } else if (FlagN == 1){ if (page == 2){ myNextion.setComponentText("t1", String(temp)); } FlagN = 2; } else if (FlagN == 2){ if (page == 2){ myNextion.setComponentText("t2", String(spe)); } FlagN = 3; } else if (FlagN == 3){ if (page == 3){ myNextion.setComponentText("t3", String(spep)); } FlagN = 0; } } }
Если в коде оставить только ту часть, которая отвечает за экран, то все работает нормально. Значит надо как-то оптимизировать...
Некстион подключен по Софт-сериалу на скорости 57600? - Софтсериал выше 19200 не тянет.
Ну работает же )
Попробую на аппаратный подключить. Просто не знаю, как. На этот-то еле подключил.
Ну работает же )
Сами же пишете - работает только когда в программе только этот код. Вот так эти проблемы и проявляются - пока контроллер больше ничем не занят - он успевает обмен отрабатывать, а как добавляете что-то в скетч - связь разваливается.
не обязательно на аппаратный. Оставьте на программном, просто снизьте скорость до 9600
У меня при такой скорости, не успевает код отработать до следующего прерывания. Мне бы наоборот увеличить скорость. Возможно на аппаратном как раз получится еще увеличить.
Огромное спасибо. Все работает. И скорость до 115200 поднял. Крайне благодарен!!!