Проблема с 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 поднял. Крайне благодарен!!!