Здравствуйте, необходимо осуществить вывод данных с ардуины которая считает импульсы с 2-х энкодеров (координаты Х и У), на емкостной дисплей nextion и параллельно по нажатию кнопки отправлять данные в сериал порт для ПК. Так же требуется обнулять значения по нажатию кнопки. Проблема №1. Используя приведенный ниже код, принимал данные с ардуины на резистивный экран вполне прилично, но при переносе на емкостной экран у меня бывает проскакивают какие-то спец символы, знаки больше меньше или вообще неведомо что, при переходе на нулевой сериал помехи пропадают. В чем может быть проблема? Код (C++): #include <Wire.h> #define encoder0PinA 2 #define encoder0PinB 3 volatile long encoder0Pos; #define encoder1PinA 21 #define encoder1PinB 20 volatile long encoder1Pos; float X = 0.000; float Y = 0.000; void setup () { Serial3.begin(9600); // then the encoder inputs pinMode(encoder0PinA, INPUT); pinMode(encoder0PinB, INPUT); // encoder pin on interrupt 0 (pin 2) attachInterrupt(0, encoder0PinChangeA, CHANGE); // encoder pin on interrupt 1 (pin 3) attachInterrupt(1, encoder0PinChangeB, CHANGE); encoder0Pos = 0; //reseet the encoder position to 0 // then the encoder inputs pinMode(encoder1PinA, INPUT); pinMode(encoder1PinB, INPUT); // encoder pin on interrupt 0 (pin 2) attachInterrupt(2, encoder1PinChangeA, CHANGE); // encoder pin on interrupt 1 (pin 3) attachInterrupt(3, encoder1PinChangeB, CHANGE); encoder1Pos = 0; //reseet the encoder position to 0 } void loop() { SendData("t0.txt",X); SendData("t1.txt",Y); } void SendData(String div,float data) { X=encoder0Pos/1000.000; Y=encoder1Pos/1000.000; Serial3.print(div); Serial3.print("=\""); Serial3.print(data,3); Serial3.print("\""); Serial3.write(0xff); Serial3.write(0xff); Serial3.write(0xff); delay(100); } void encoder0PinChangeA() { // look for a low-to-high on channel A if (digitalRead(encoder0PinA) == HIGH) { // check channel B to see which way encoder is turning if (digitalRead(encoder0PinB) == LOW) { encoder0Pos = encoder0Pos + 1; // CW } else { encoder0Pos = encoder0Pos - 1; // CCW } } else // must be a high-to-low edge on channel A { // check channel B to see which way encoder is turning if (digitalRead(encoder0PinB) == HIGH) { encoder0Pos = encoder0Pos + 1; // CW } else { encoder0Pos = encoder0Pos - 1; // CCW } } } void encoder0PinChangeB() { // look for a low-to-high on channel B if (digitalRead(encoder0PinB) == HIGH) { // check channel A to see which way encoder is turning if (digitalRead(encoder0PinA) == HIGH) { encoder0Pos = encoder0Pos + 1; // CW } else { encoder0Pos = encoder0Pos - 1; // CCW } } // Look for a high-to-low on channel B else { // check channel B to see which way encoder is turning if (digitalRead(encoder0PinA) == LOW) { encoder0Pos = encoder0Pos + 1; // CW } else { encoder0Pos = encoder0Pos - 1; // CCW } } } void encoder1PinChangeA() { // look for a low-to-high on channel A if (digitalRead(encoder1PinA) == HIGH) { // check channel B to see which way encoder is turning if (digitalRead(encoder1PinB) == LOW) { encoder1Pos = encoder1Pos + 1; // CW } else { encoder1Pos = encoder1Pos - 1; // CCW } } else // must be a high-to-low edge on channel A { // check channel B to see which way encoder is turning if (digitalRead(encoder1PinB) == HIGH) { encoder1Pos = encoder1Pos + 1; // CW } else { encoder1Pos = encoder1Pos - 1; // CCW } } } void encoder1PinChangeB() { // look for a low-to-high on channel B if (digitalRead(encoder1PinB) == HIGH) { // check channel A to see which way encoder is turning if (digitalRead(encoder1PinA) == HIGH) { encoder1Pos = encoder1Pos + 1; // CW } else { encoder1Pos = encoder1Pos - 1; // CCW } } // Look for a high-to-low on channel B else { // check channel B to see which way encoder is turning if (digitalRead(encoder1PinA) == LOW) { encoder1Pos = encoder1Pos + 1; // CW } else { encoder1Pos = encoder1Pos - 1; // CCW } } } Вопрос№2 Обрабатывать ардуиной нажатие кнопок с экрана можно любым железным сериалом меги? как это проще сделать? при подключении через сериал 3, в некшен эдиторие ставил галочку сенд компонент ID и пытался использовать вот такой код для ардуины Код (C++): String message = myNextion.listen(); if (message == "65 00 05 ff ff ff") { myNextion.buttonToggle(button1State, "b0", 0, 2); encoder0Pos =0; } if (message == "65 00 06 ff ff ff"){ myNextion.buttonToggle(button2State, "b1", 0, 2); encoder1Pos==0; // comandEnd(); } } void comandEnd() { for (int i = 0; i < 3; i++) { Serial.write(0xff); } но не работает ( потом в некшен эдиторе заменил действие на нажатие кнопки как if(b1.isbr==1) { print "ONY" }else { print "OFF" } и ловить этот текст ардуиной Код (C++): String message = myNextion.listen(); if (message == "ONX") { encoder0Pos ==0; } if (message == "ONY"){ encoder1Pos==0; } но тоже не работает. Может у кого то есть простой рабочий пример обработки нажатий кнопки? и настроек в эдиторе?
И вам не хворать. Здесь хоть что-то читали ? http://forum.amperka.ru/threads/Дисплей-nextion-азы-arduino-esp8266.9204/