Nextion и Mega 2560

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Svorog, 4 июл 2019.

  1. Svorog

    Svorog Нерд

    Здравствуйте, необходимо осуществить вывод данных с ардуины которая считает импульсы с 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;
    }
    но тоже не работает.

    Может у кого то есть простой рабочий пример обработки нажатий кнопки? и настроек в эдиторе?
     
  2. Evgeniy2017

    Evgeniy2017 Нерд

    Возможно поможет




    https://www.youtube.com/results?search_query=nextion+arduino+пример
     
  3. Belkin

    Belkin Гик