Nextion + arduino mega2560

Тема в разделе "Arduino & Shields", создана пользователем Aleks666, 6 окт 2018.

  1. Svorog

    Svorog Нерд

    в монитор порта все правильно пишет через Serial.println (X/1000,3)? как это привязать к nextiony не могу понять (
     
  2. timon

    timon Гик

    Тотесть в мониторе порта вы видите что то типа 3.145? А на экране 3.000?
     
  3. Svorog

    Svorog Нерд

    ну да, примерно так
     
  4. timon

    timon Гик

    А txt_maxl в HMI экрана сколько у переменной t0?
     
  5. Svorog

    Svorog Нерд

    ну как по умолчанию 10 стоит
     
  6. timon

    timon Гик

    А вот так пробовали?
    Serial3.print(data,3);
    Ибо раз Serial.println(X/1000,3) работает то должно и первое работать.
     
  7. Svorog

    Svorog Нерд

    увы но Serial3.print(data,3) ситуацию не изменило нули стоят как вкопанные)
     
  8. Svorog

    Svorog Нерд

    Заработало когда делить начал в sendData
    Код (C++):
    ...
    SendData("t0.txt",X/1000);
    }
    void SendData(String div,float data)
    {
    X=encoder0Pos;
    .....
    Не знаю почему так и почему все говорят что это не правильно, но тем не менее работает)
     
  9. Svorog

    Svorog Нерд

    Спасибо за помощь!
     
  10. DetSimen

    DetSimen Guest

    X=encoder0Pos/1000.0
     
    timon нравится это.
  11. timon

    timon Гик

    Правильно то, что работает ) а код.... компиляторы придумали не просто так, а что бы код никому не показывать )))
    не за что )
    Вообще вот тут полезное написано весьма https://www.arduino.cc/reference/en/language/variables/data-types/float/ особенно про float х = 2 / 3.0 )))
     
  12. DetSimen

    DetSimen Guest

    у тебя encoder0Pos и 1000 числа целые, поэтому компилятор сначала делит их нацело, а ПОТОМ результат преобразует во float. Если явно задать тип одного из чисел как float, то сначала другое число преобразуется во float, а потом деление будет выполнено правильно.
     
  13. DetSimen

    DetSimen Guest

    поэтому вот это работает. X у тебя имеет тип float, поэтому сначала 1000 туда же преобразуется и только потом они делятся.
     
  14. Svorog

    Svorog Нерд

    Если я правильно понял, то для деления с остатком оба числа должны быть float? я ввел дополнительную переменную которую объявил float, затем присвоил ей значение 1000 и затем поделил, остаток появился все заработало, но честно говоря действий больше и не понятно чем все таки лучше такая конструкция?
     
  15. DetSimen

    DetSimen Guest

    Если б ты прочитал хоть одну книшку по языку, ты бы знал, что достаточно хотя бы у одного числа указать тип явно, например 1000.0, и все будет работать правильно.
    Это я до тебя в #50 пытался донести.
     
  16. Svorog

    Svorog Нерд

    Спасибо что пытался, но не понял из 50-го поста, видимо потому что давно книжек не читал, в основном потому что современный образ жизни позволяет получать знания "точечно", например с помощью форумов, в которых конечное многие гуру портят настроение своими советами : отучись на программиста и стань Гуру, но некоторые участники все-таки очень помогают.
     
  17. Svorog

    Svorog Нерд

    Использую работающий код из 39 поста, пытаюсь добавить обнуление счетчика по нажатию кнопки на экране, не могу понять с какой командой ардуино считывает код с кнопки на экране? например:

    String message = myNextion.listen(); //check for message
    if (message == "65 00 05 ff ff ff") {
    encoder0Pos = 0;}
    if (message == "65 00 06 ff ff ff") {
    encoder1Pos = 0;
    но компиляцию не проходит начинаются притенении к незадекларированному nextiony... и чем дальше тем больше.. проблема в том что что все все примеры которые нахожу в интернете, используют софтсериал, и наверное поэтому не подходят команды.
    Кто может подсказать как использовать сенсорные кнопки nextiona с Мегой.
     
  18. b707

    b707 Гуру

    Правильное декларирование переменных уж никак не зависит от того софт-сериал или аппаратный...
    Ищите ошибки синтаксиса - если программа ругается на "незадекларированный nextion" - значит надо найти, почему он незадекларирован и задекларировать...
    Если не можете найти сами - выкладывайте код
     
  19. Svorog

    Svorog Нерд

    Код был рабочий до попытки ввести обнуление, и чем дальше пытаешься привести к книжному примеру с софсериалом тем больше ошибок...

    Код (C++):
    #include <Wire.h>

    #include <Nextion.h>
    #define encoder0PinA 2
    #define encoder0PinB 3
    Nextion myNextion(nextion, 9600);
    volatile long encoder0Pos;

    #define encoder1PinA 21
    #define encoder1PinB 20

    volatile long encoder1Pos;

    float X = 0.000;
    float Y = 0.000;

    boolean button1State;
    boolean button2State;

    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);
    String message = myNextion.listen(); //check for message
      if (message == "65 00 05 ff ff ff") {
        encoder0Pos = 0;}
      if (message == "65 00 06 ff ff ff") {
        encoder1Pos = 0;
      }
    }
    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
        }
      }
    }
     
  20. b707

    b707 Гуру

    в пятой строке
    Код (C++):
    Nextion myNextion(nextion, 9600);
    - что такое nextion в скобках? откуда он взялся?
    Был бы я компилятором - ругался бы на не задекларированный nextion