Проблема с Nextion. Некорректно передает код.

Vasilisk
Offline
Зарегистрирован: 22.09.2017

В цикле выполняется:

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;
    }
  }
}

 

Vasilisk
Offline
Зарегистрирован: 22.09.2017

Если в коде оставить только ту часть, которая отвечает за экран, то все работает нормально. Значит надо как-то оптимизировать...

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

Некстион подключен по Софт-сериалу на скорости 57600? - Софтсериал выше 19200 не тянет.

Vasilisk
Offline
Зарегистрирован: 22.09.2017

Ну работает же )

Попробую на аппаратный подключить. Просто не знаю, как. На этот-то еле подключил.

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

Vasilisk пишет:

Ну работает же )

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

Vasilisk пишет:
Попробую на аппаратный подключить. Просто не знаю, как. На этот-то еле подключил.

не обязательно на аппаратный. Оставьте на программном, просто снизьте скорость до 9600

Vasilisk
Offline
Зарегистрирован: 22.09.2017

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

Vasilisk
Offline
Зарегистрирован: 22.09.2017

Огромное спасибо. Все работает. И скорость до 115200 поднял. Крайне благодарен!!!