Помогите!! Задержка у кнопок на аналоговом.

Тема в разделе "Arduino & Shields", создана пользователем alekseev2017, 9 мар 2017.

  1. alekseev2017

    alekseev2017 Нерд

    Приветствую! У меня такой вопрос: в скетче, который я написал я использую самодельный key pad shield, который подключён к аналоговому входу ардуино. Я сделал меню и пришлось поставить задержку - 250 миллисекунд, так как без неё курсор проскакивал через все пункты меню сразу. Эта задержка сильно тормозит работу меню. Можно как то по другому решить эту проблему, без delay? Заранее спасибо
    Код (C++):
    #include <SPI.h>
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #define OLED_RESET 5

    Adafruit_SSD1306 display(OLED_RESET);

    int item = 1;
    int menuLevel = 1;
    int m1 = 0;
    int m2 = 0;
    int am = 0;
    int mm = 0;
    void setup()
    {
      Serial.begin(9600);
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    }
    byte Key()
    {
      if (analogRead(0) < 2) return 6;// вправо 0
      else if (analogRead(0) < 150) return 2;// вверх 144
      else if (analogRead(0) < 170) return 3;// вниз 164
      else if (analogRead(0) < 500) return 4;// влево 416
      else if (analogRead(0) < 800) return 1;// выбрать 718
      else if (analogRead(0) < 1023) return 0;// ничего не нажато
    }
    void loop()
    {
      if(menuLevel == 1 && item == 1)
      {
        if(am == 0 && mm == 0)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("->Auto mode | Off");
          display.setCursor(0, 10);
          display.print("  Manual mode | Off");
          display.display();
          m1 = 1;
          m2 = 0;
        }
        else if (am == 1 && mm == 0)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("->Auto mode | On");
          display.setCursor(0, 10);
          display.print("  Manual mode | Off");
          display.display();
          m1 = 1;
          m2 = 0;
        }
        else if (am == 0 && mm == 1)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("->Auto mode | Off");
          display.setCursor(0, 10);
          display.print("  Manual mode | On");
          display.display();
          m1 = 1;
          m2 = 0;
        }
      }
      else if(menuLevel == 1 && item == 2)
      {
        if(am == 0 && mm == 0)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Auto mode | Off");
          display.setCursor(0, 10);
          display.print("->Manual mode | Off");
          display.display();
          m1 = 0;
          m2 = 1;
        }
        else if (am == 1 && mm == 0)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Auto mode | On");
          display.setCursor(0, 10);
          display.print("->Manual mode | Off");
          display.display();
          m1 = 0;
          m2 = 1;
        }
        else if (am == 0 && mm == 1)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Auto mode | Off");
          display.setCursor(0, 10);
          display.print("->Manual mode | On");
          display.display();
          m1 = 0;
          m2 = 1;
        }
      }
      else if(menuLevel == 2 && item == 1 && m1 == 1)
      {
        display.clearDisplay();
        display.setTextSize(1);
        display.setTextColor(WHITE);
        display.setCursor(0, 0);
        display.print("->Parametr 1");
        display.setCursor(0, 10);
        display.print("  Parametr 2");
        display.display();
      }
      else if(menuLevel == 2 && item == 2 && m1 == 1)
      {
        display.clearDisplay();
        display.setTextSize(1);
        display.setTextColor(WHITE);
        display.setCursor(0, 0);
        display.print("  Parametr 1");
        display.setCursor(0, 10);
        display.print("->Parametr 2");
        display.display();
      }
        else if(menuLevel == 2 && item == 1 && m2 == 1)
      {
        display.clearDisplay();
        display.setTextSize(1);
        display.setTextColor(WHITE);
        display.setCursor(0, 0);
        display.print("->Parametr 1");
        display.setCursor(0, 10);
        display.print("  Parametr 2");
        display.display();
      }
      else if(menuLevel == 2 && item == 2 && m2 == 1)
      {
        display.clearDisplay();
        display.setTextSize(1);
        display.setTextColor(WHITE);
        display.setCursor(0, 0);
        display.print("  Parametr 1");
        display.setCursor(0, 10);
        display.print("->Parametr 2");
        display.display();
      }
      switch(Key())
      {
        case 2:
          if(item != 1)
          {
            item--;
          }
          else if(item == 1)
          {
            item = 1;
          }
          delay(250);
        break;
        case 3:
        if(item != 2)
        {
          item++;
        }
        else if(item == 2)
        {
          item = 2;
        }
        delay(250);
        break;
        case 1:
        if(menuLevel != 2)
        {
          menuLevel++;
          item = 1;
        }
        else if(menuLevel == 2)
        {
          menuLevel = 2;
        }
        delay(250);
        break;
        case 4:
        if(menuLevel == 1 && item == 1)
        {
          am = 0;
        }
        else if(menuLevel == 1 && item == 2)
        {
          mm = 0;
        }
        if(menuLevel != 1)
        {
          menuLevel--;
          item = 1;
        }
        else if(menuLevel == 1)
        {
          menuLevel = 1;
        }
        delay(250);
        break;
        case 6:
        if(menuLevel == 1 && item == 1)
        {
          am = 1;
        }
        else if(menuLevel == 1 && item == 2)
        {
          mm = 1;
        }
        delay(250);
        break;
      }
    }
     
  2. ostrov

    ostrov Гуру

    После нажатия кнопки и выполнения соответствующего ей действия, программа должна ждать отпускания этой кнопки ни на что боле реагируя. Потом снова ждет кнопку. Проще всего в конце итерации поставить что то вроде:
    Код (C++):
    while (Key());
    Но если в цикле происходит что то важное и нельзя его останавливать, то можно поставить триггер нажато/отжато и согласно ему включать или выключать реакцию на нажатие кнопки.
     
  3. alekseev2017

    alekseev2017 Нерд

    Можно по подробнее, куда while вставлять?
     
  4. ostrov

    ostrov Гуру

    На первый взгляд после конструкции switch. Естественно, все delay убрать.
     
  5. alekseev2017

    alekseev2017 Нерд

    Если уберу, то курсор проскакивает через все значения.
     
  6. ostrov

    ostrov Гуру

    А если
    Код (C++):
    while (!Key());
     
  7. alekseev2017

    alekseev2017 Нерд

    Я что то опять сейчас в коде начудил и даже с задержкой при однократном нажатии - проскакивает с учётом заданной задержки до последнего значения меню. Не подскажите из-за чего так?
    Код (C++):
    #include <SPI.h>
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #define OLED_RESET 5

    Adafruit_SSD1306 display(OLED_RESET);
    int am = 0;
    int lm = 0;
    int aim = 0;
    int info = 0;
    int intens = 0;
    int item = 1;
    int menuLevel = 1;
    int ledI = 0;
    int limit = 0;
    int LedOn = 0;
    int buttonState = 2000;
    void setup()
    {
      Serial.begin(9600);
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    }
    byte Key()
    {
      if (analogRead(0) < 2) return 6;// вправо 0
      else if (analogRead(0) < 150) return 2;// вверх 144
      else if (analogRead(0) < 170) return 3;// вниз 164
      else if (analogRead(0) < 500) return 4;// влево 416
      else if (analogRead(0) < 800) return 1;// выбрать 718
      else if (analogRead(0) < 1023) return 0;// ничего не нажато
    }
    void loop()
    {
      Serial.println(item);
      if(menuLevel == 1 && item == 1)
      {
        if(am == 0)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("->Led | Off | ");
          display.println(ledI);
          display.setCursor(0, 10);
          display.print("  Auto mode");
          display.setCursor(0, 20);
          display.print("  Limit");
          display.display();
          info = 1;
          lm = 0;
          intens = 0;
          aim = 0;
        }
        else if (am == 1)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("->Led | On | ");
          display.println(ledI);
          display.setCursor(0, 10);
          display.print("  Auto mode");
          display.setCursor(0, 20);
          display.print("  Limit");
          display.display();
          info = 1;
          lm = 0;
          intens = 0;
          aim = 0;
        }
      }
      else if(menuLevel == 1 && item == 2)
      {
        if(am == 0)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Led | Off | ");
          display.println(ledI);
          display.setCursor(0, 10);
          display.print("->Auto mode");
          display.setCursor(0, 20);
          display.print("  Limit");
          display.display();
          info = 1;
          lm = 0;
          intens = 0;
          aim = 0;
        }
        else if (am == 1)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Led | On | ");
          display.println(ledI);
          display.setCursor(0, 10);
          display.print("->Auto mode");
          display.setCursor(0, 20);
          display.print("  Limit");
          display.display();
          info = 1;
          lm = 0;
          intens = 0;
          aim = 0;
        }
      }
        else if(menuLevel == 1 && item == 3)
      {
        if(am == 0)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Led | Off | ");
          display.println(ledI);
          display.setCursor(0, 10);
          display.print("  Auto mode");
          display.setCursor(0, 20);
          display.print("->Limit");
          display.display();
          info = 0;
          lm = 1;
          intens = 0;
          aim = 0;
        }
        else if (am == 1)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Led | On | ");
          display.println(ledI);
          display.setCursor(0, 10);
          display.print("  Auto mode");
          display.setCursor(0, 20);
          display.print("->Limit");
          display.display();
          info = 0;
          lm = 1;
          intens = 0;
          aim = 0;
        }
      }
        else if(menuLevel == 1 && item == 4)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Auto mode");
          display.setCursor(0, 10);
          display.print("  Limit");
          display.setCursor(0, 20);
          display.print("->Intensity");
          display.display();
          info = 0;
          lm = 0;
          intens = 1;
          aim = 0;
        }
      switch(Key())
      {
        case 2:
          if(item != 1)
          {
            item--;
          }
          else if(item == 1)
          {
            item = 1;
          }
          delay(500);
        break;
        case 3:
        if(item != 4)
        {
          item++;
        }
        else if(item == 4)
        {
          item = 4;
        }
        delay(500);
        break;
        }
    }
    }
     
  8. qwone

    qwone Гик

    Я обычно использую это https://yadi.sk/d/qi5C8p1t3FNm5f
    Ну и главный файл сюда
    Код (C++):
    /* Class_do_analog_5btn.ino
      #1 аналоговая клавиатура ->A0
      Принцип кода:запустить функцию  по нажатию кнопки
    */

    //#1 кнопка
    #include "Cl_do_anlgBtn5.h"
    const byte AnlgBtn5 = A0;
    Cl_do_anlgBtn5 AnlgBtn;
    void func_1(void) {
      Serial.println("Do Right");
    }
    void func_2(void) {
      Serial.println("Do Up");
    }
    void func_3(void) {
      Serial.println("Do Down");
    }
    void func_4(void) {
      Serial.println("Do Left");
    }
    void func_5(void) {
      Serial.println("Do Select");
    }
    void setup() {
      //#1 кнопка
      AnlgBtn.setup(AnlgBtn5); // подключить аналоговую клавиатуру на пин A0
      //#2 модуль выполнения
      Serial.begin(9600);
    }
    void loop() {
      //#1,#2  кнопка и модуль выполнения
      AnlgBtn.loop(& func_1, & func_2, & func_3, & func_4, & func_5);
    }
     
  9. qwone

    qwone Гик

    Ну и так далее
    Код (C++):
    /* Class_do_analog_5btn.ino
      #3 аналоговая клавиатура ->A0
      Принцип кода:запустить функцию  по нажатию кнопки
    */

    //#2 меню
    void Viev_0() {}; // экран 0
    void Right_0() {};
    void Up_0() {};
    void Down_0() {};
    void Left_0() {};
    void Select_0() {};
    void Viev_1() {}; // экран 1
    void Right_1() {};
    void Up_1() {};
    void Down_1() {};
    void Left_1() {};
    void Select_1() {};
    void Viev_2() {}; // экран 2
    void Right_2() {};
    void Up_2() {};
    void Down_2() {};
    void Left_2() {};
    void Select_2() {};

    struct Str_menu {
      void (*viev)();
      void (*right)();
      void (*up)();
      void (*down)();
      void (*left)();
      void (*select)();
    };
    struct Str_menu Menu[] = {
      &Viev_0, & Right_0, & Up_0, &Down_0, & Left_0, & Select_0,
      &Viev_1, & Right_1, & Up_1, &Down_1, & Left_1, & Select_1,
      &Viev_2, & Right_2, & Up_2, &Down_2, & Left_2, & Select_2
    };
    //#3 кнопка
    #include "Cl_do_anlgBtn5.h"
    const byte AnlgBtn5 = A0;
    Cl_do_anlgBtn5 AnlgBtn;
    void func_1(void) {
      Serial.println("Do Right");
      Menu[0].right();
    }
    void func_2(void) {
      Serial.println("Do Up");
      Menu[0].up();
    }
    void func_3(void) {
      Serial.println("Do Down");
      Menu[0].down();
    }
    void func_4(void) {
      Serial.println("Do Left");
      Menu[0].left();
    }
    void func_5(void) {
      Serial.println("Do Select");
      Menu[0].select();
    }
    void setup() {
      //#3 кнопка
      AnlgBtn.setup(AnlgBtn5); // подключить аналоговую клавиатуру на пин A0
      //#2 модуль выполнения
      Serial.begin(9600);
    }
    void loop() {
    //#2 меню
      Menu[0].viev();
      //#3  кнопка и модуль выполнения
      AnlgBtn.loop(& func_1, & func_2, & func_3, & func_4, & func_5);
    }
     
  10. alekseev2017

    alekseev2017 Нерд

    Я написал вот такой код:
    Код (C++):
    #include <SPI.h>
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #define OLED_RESET 5

    Adafruit_SSD1306 display(OLED_RESET);
    int am = 0;
    int lm = 0;
    int aim = 0;
    int info = 0;
    int intens = 0;
    int intensS = 0;
    int item = 1;
    int menuLevel = 1;
    int ledI = 0;
    int limit = 0;
    int LedOn = 0;
    int buttonState = 2000;
    int autoMode = 0;
    void setup()
    {
      Serial.begin(9600);
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
      pinMode(4, INPUT_PULLUP);
    }
    byte Key()
    {
      if (analogRead(0) < 2) return 6;// вправо 0
      else if (analogRead(0) < 150) return 2;// вверх 144
      else if (analogRead(0) < 170) return 3;// вниз 164
      else if (analogRead(0) < 500) return 4;// влево 416
      else if (analogRead(0) < 800) return 1;// выбрать 718
      else if (analogRead(0) < 1023) return 0;// ничего не нажато
    }
    void loop()
    {
      Serial.println(Key());
      if(menuLevel == 1 && item == 1)
      {
        if(am == 0)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("->Led | Off | ");
          display.println(ledI);
          display.setCursor(0, 10);
          display.print("  Auto mode | ");
          display.println(autoMode);
          display.setCursor(0, 20);
          display.print("  Limit | ");
          display.println(limit);
          display.display();
          info = 1;
          lm = 0;
          intens = 0;
          aim = 0;
        }
        else if (am == 1)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("->Led | On | ");
          display.println(ledI);
          display.setCursor(0, 10);
          display.print("  Auto mode | ");
          display.println(autoMode);
          display.setCursor(0, 20);
          display.print("  Limit | ");
          display.println(limit);
          display.display();
          info = 1;
          lm = 0;
          intens = 0;
          aim = 0;
        }
      }
      else if(menuLevel == 1 && item == 2)
      {
        if(am == 0)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Led | Off | ");
          display.println(ledI);
          display.setCursor(0, 10);
          display.print("->Auto mode | ");
          display.println(autoMode);
          display.setCursor(0, 20);
          display.print("  Limit | ");
          display.println(limit);
          display.display();
          info = 0;
          lm = 0;
          intens = 0;
          aim = 1;
        }
        else if (am == 1)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Led | On | ");
          display.println(ledI);
          display.setCursor(0, 10);
          display.print("->Auto mode | ");
          display.println(autoMode);
          display.setCursor(0, 20);
          display.print("  Limit | ");
          display.println(limit);
          display.display();
          info = 0;
          lm = 0;
          intens = 0;
          aim = 1;
        }
      }
        else if(menuLevel == 1 && item == 3)
      {
        if(am == 0)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Led | Off | ");
          display.println(ledI);
          display.setCursor(0, 10);
          display.print("  Auto mode | ");
          display.println(autoMode);
          display.setCursor(0, 20);
          display.print("->Limit | ");
          display.println(limit);
          display.display();
          info = 0;
          lm = 1;
          intens = 0;
          aim = 0;
        }
        else if (am == 1)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Led | On | ");
          display.println(ledI);
          display.setCursor(0, 10);
          display.print("  Auto mode | ");
          display.println(autoMode);
          display.setCursor(0, 20);
          display.print("->Limit | ");
          display.println(limit);
          display.display();
          info = 0;
          lm = 1;
          intens = 0;
          aim = 0;
        }
      }
        else if(menuLevel == 1 && item == 4)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Auto mode | ");
          display.println(autoMode);
          display.setCursor(0, 10);
          display.print("  Limit | ");
          display.println(limit);
          display.setCursor(0, 20);
          display.print("->Intensity | ");
          display.println(intensS);
          display.display();
          info = 0;
          lm = 0;
          intens = 1;
          aim = 0;
        }
        else if(menuLevel == 2 && item == 1 && aim == 1)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("->On");
          display.setCursor(0, 10);
          display.print("  Off");
          display.display();
        }
        else if(menuLevel == 2 && item == 2 && aim == 1)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  On");
          display.setCursor(0, 10);
          display.print("->Off");
          display.display();
        }
        else if(menuLevel == 2 && item == 1 && lm == 1)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print(limit);
          display.display();
        }
        else if(menuLevel == 2 && item == 1 && intens == 1)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print(intensS);
          display.display();
        }

      switch(Key())
      {
        case 2:
          if(menuLevel == 2 && lm == 1)
          {
            if(menuLevel == 2 && lm == 1 && item != 1)
          {
            item = 1;
          }
          if (menuLevel == 2 && item == 1 && lm == 1)
          {
            limit++;
          }
          if(limit > 1023)
          {
            limit = 0;
          }
          else if(menuLevel == 2 && intens == 1)
          {
            if(menuLevel == 2 && intens == 1 && item != 1)
          {
            item = 1;
          }
          if (menuLevel == 2 && item == 1 && intens == 1)
          {
            intensS++;
          }
          if(intensS > 1023)
          {
            intensS = 0;
          }
          }
          else
          {
          if(item != 1)
          {
            item--;
            delay(250);
          }
          else if(item == 1)
          {
            item = 1;
            delay(250);
          }
          }
          }
        break;
        case 3:
        if(menuLevel == 2 && lm == 1)
        {
           if(menuLevel == 2 && lm == 1 && item != 1)
          {
            item = 1;
          }
          if (menuLevel == 2 && item == 1 && lm == 1)
          {
            limit--;
          }
          if(limit < 0)
          {
            limit = 1023;
          }
        }
        else if(menuLevel == 2 && intens == 1)
        {
           if(menuLevel == 2 && intens == 1 && item != 1)
          {
            item = 1;
          }
          if (menuLevel == 2 && item == 1 && intens == 1)
          {
            intensS--;
          }
          if(intensS < 0)
          {
            intensS = 1023;
          }
        }
        else
        {
        if(item != 4)
        {
          item++;
          delay(250);
        }
        else if(item == 4)
        {
          item = 4;
          delay(250);
        }
        }
        break;
        case 1:
        if(menuLevel != 2)
        {
          menuLevel++;
          item = 1;
        }
        else if(menuLevel == 2)
        {
          menuLevel = 2;
        }
        delay(250);
        break;
        case 4:
        if(menuLevel == 1 && item == 1)
        {
          am = 0;
        }
        else if(menuLevel == 1 && item == 2)
        {
          am = 0;
        }
        if(menuLevel != 1)
        {
          menuLevel--;
          item = 1;
        }
        else if(menuLevel == 1)
        {
          menuLevel = 1;
        }
        delay(250);
        break;
        case 6:
        if(menuLevel == 2 && item == 1 && aim == 1)
        {
          menuLevel = 1;
          item = 2;
          autoMode = 1;
        }
        if(menuLevel == 2 && item == 2 && aim == 1)
        {
          menuLevel = 1;
          item = 2;
          autoMode = 0;
        }
        if(menuLevel == 2 && lm == 1)
        {
          menuLevel = 1;
          item = 3;
        }
        if(menuLevel == 2 && intens == 1)
        {
          menuLevel = 1;
          item = 4;
        }
        delay(250);
        break;
      }
    }
    Это проект дистанционного управления лампой в зависимости от фоторезистора. Модули ещё не подключал, пока делаю меню. Вопросы такие:
    1. Почему, если доходишь до вкладки Intensity в первом меню, то вверх она не хочет идти?
    2. Почему значение intensS при выборе Intenity изменяется только в меньшую сторону, в большую не реагирует?
     
  11. alekseev2017

    alekseev2017 Нерд

    В дальнейшем приёмник и передатчик будут общаться с помощью модулей nrf24l01+.
     
  12. qwone

    qwone Гик

    Все же оформите свой код через структуру указателей на функции. Проще "блох" ловить в программе.
     
  13. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (C++):
    if(item == 1)
          {
            item = 1;
          }
    А смысл?
     
  14. mcureenab

    mcureenab Гуру

    Эти блоки наверняка можно унифицировать и оформить в одну - две функции. В цикле оставить только вызов этих функций.

    Код (C++):
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Led | On | ");
          display.println(ledI);
          display.setCursor(0, 10);
          display.print("->Auto mode | ");
          display.println(autoMode);
          display.setCursor(0, 20);
          display.print("  Limit | ");
          display.println(limit);
          display.display();
        }
     
     
  15. mcureenab

    mcureenab Гуру

    Всю колбасу в switch, можно закодить в структуру данных.

    Код (C++):
      switch(Key())
      {
        case 2:
          if(menuLevel == 2 && lm == 1)
          {
            if(menuLevel == 2 && lm == 1 && item != 1)
          {
            item = 1;
    ...
    menuLevel по моему только усложняет работу. Разверните все узлы иерархической структуры меню (в том числе пункты меню первого и промежуточных уровней) в одну числовую ось. Между узлами задайте переходы по пунктам одного уровня и возврат в меню предыдущего уровня.
    На входе в узел - выделяем его на экране.
    На выходе из узла - удаляем выделение.
    Вызов узла - выполняем действие программы или рисуем меню следующего или предыдущего уровня.
     
  16. mcureenab

    mcureenab Гуру

    Нужно не просто мониторить Key(). Нужно мониторить изменение состояния кнопки. Например нажатие.
    Код (C++):
    void loop {
    ...
      static byte prev_Key = 0;
    ...
      byte now_Key = Key();
      if( !now_Key ){ // Кнопка отпущена. Просто запомним это.
        prev_Key = now_Key; // prev_Key = 0;
      }
      if ( prev_Key != now_Key ) { // Кнопка нажата.
        prev_Key = now_Key; // Запомним это.
       // Выполняем now_Key.
    ...
      }
    ...
      }
     
  17. alekseev2017

    alekseev2017 Нерд

    Это key pad shield, мы же про аналоговые значения разговариваем...
     
  18. alekseev2017

    alekseev2017 Нерд

    Я не понимаю, что это даёт, но если вставить эту строчку в начало лупа, перестаёт проскакивать курсор, без неё проскакивает через все значения:
    Код (C++):
    Serial.println(Key());
     
  19. mcureenab

    mcureenab Гуру

    Вы про что??? Функция Key выполняет АЦП и возвращает дискретные значения 6,1,2,3,4,0. Где тут аналоговые значения?

    Нажатие, это переход от Key() == 0 к Key() != 0. Отпускание - обратный переход. Если Key() от итерации к итерации не меняется, то это нам не интересно. Интересно только то время, когда значение Key() изменилось.
     
  20. Tomasina

    Tomasina Сушитель лампочек Модератор

    чой-от все слишком заумно у вас.
    Зачем две переменные - menuLevel и item, если достаточно одной - номера экрана?
    Что означают aim, lm, intens? Либо давайте переменным осмысленные названия, либо ставьте комментарии.