Помогите с кодом.

Тема в разделе "Arduino & Shields", создана пользователем Максим B, 11 июн 2014.

  1. Максим B

    Максим B Гуру

    Переделал чуть код меню для дисплея i2c, но кроме как фразы: MENU больше ничего не выводиться. С дисплеем не i2c все ОК. Что не так???


    Код (Text):
    #include <LiquidCrystal_I2C.h>
    #include <Wire.h>
    // Initialize the library with the numbers of the interface pins
    LiquidCrystal_I2C lcd(0x27,16,2);
    //States for the menu.
    int currentMenuItem = 0;
    int lastState = 0;
    void setup() {
      //Set the characters and column numbers.
        lcd.init();                      // initialize the lcd
      lcd.backlight();
      //Print default title.
      clearPrintTitle();
    }
    void loop() {
      //Call the main menu.
      mainMenu();
    }
    void mainMenu() {
      //State = 0 every loop cycle.
      int state = 0;
      //Refresh the button pressed.
      int x = analogRead (A3);
      //Set the Row 0, Col 0 position.
      lcd.setCursor(0,0);
      //Check analog values from LCD Keypad Shield
      if (x < 100) {
        //Right
      } else if (x < 170) {
      //Up
        state = 1;
      } else if (x < 290){
      //Down
        state = 2;
      } else if (x < 600){
        //Left
      } else if (x < 390){
        //Select
        state = 3;
      }
      //If we are out of bounds on th menu then reset it.
      if (currentMenuItem < 0 || currentMenuItem > 4) {
      currentMenuItem = 0;
      }
      //If we have changed Index, saves re-draws.
      if (state != lastState) {
          if (state == 1) {
            //If Up
              currentMenuItem = currentMenuItem - 1;
              displayMenu(currentMenuItem);
          } else if (state == 2) {
            //If Down
              currentMenuItem = currentMenuItem + 1;
              displayMenu(currentMenuItem);
          } else if (state == 3) {
            //If Selected
            selectMenu(currentMenuItem);
          }
          //Save the last State to compare.
          lastState = state;
      }
      //Small delay
      delay(5);
    }
    //Display Menu Option based on Index.
    void displayMenu(int x) {
        switch (x) {
          case 1:
            clearPrintTitle();
            lcd.print ("-> Menu Option 1");
            break;
          case 2:
            clearPrintTitle();
            lcd.print ("-> Menu Option 2");
            break;
          case 3:
            clearPrintTitle();
            lcd.print ("-> Menu Option 3");
            break;
          case 4:
            clearPrintTitle();
            lcd.print ("-> Menu Option 4");
            break;
        }
    }
    //Print a basic header on Row 1.
    void clearPrintTitle() {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(" MENU ");
      lcd.setCursor(0,1);
    }
    //Show the selection on Screen.
    void selectMenu(int x) {
      switch (x) {
          case 1:
            clearPrintTitle();
            lcd.print ("Selected Opt 1");
            //Call the function that belongs to Option 1
            break;
          case 2:
            clearPrintTitle();
            lcd.print ("Selected Opt 2");
            //Call the function that belongs to Option 2
            break;
          case 3:
            clearPrintTitle();
            lcd.print ("Selected Opt 3");
            //Call the function that belongs to Option 3
            break;
          case 4:
            clearPrintTitle();
            lcd.print ("Selected Opt 4");
            //Call the function that belongs to Option 4
            break;
        }
    }
     
     
  2. NR55RU

    NR55RU Гик

    Попробуйте "трассировать" вашу программу, хотя бы простешим выводом разных значений в Serial на монитор порта.
    Посмотрите получает ли ваш ардуин хоть какие либо данные с пина, если да то какие, какие значения принимает ваши переменные.
    Вставьте выводы в сериал в ключевых точках программы что бы увидеть какие части срабатывают а какие нет.
    Итогом станет локализация проблемы и ее будет легче обнаружить и исправить.

    Более того в вашем коде пара логических ошибки.

    Код (Text):
    if (state != lastState)
    Вы никогда не сможете нажать подряд два раза одну и ту же кнопку, итогом станет то что вы никогда не сможете передвинутся например на 2 меню вверх или вниз.

    Код (Text):
    currentMenuItem = currentMenuItem - 1;
    displayMenu(currentMenuItem);
    Учитывая то что эта переменная изначально равна нулю и парой строк выше так же сбрасывается в ноль, очень часто вы будите отправлять значение -1 в функцию displayMenu, в итоге switch находящей в этой функции просто не сработает.

    Ну как то, так :)
     
  3. Максим B

    Максим B Гуру

    А с другим дисплеем такой код работает, который не i2c
     
  4. Максим B

    Максим B Гуру

  5. NR55RU

    NR55RU Гик

    Мои замечания по коду можно не брать в расчет, они не повлияют на работу кода ну по крайней мере до тех пор пока вы не сможете нажать два раза подряд на одну и ту же кнопку что бы функция analogRead() два раза подряд считала одно и то же значение, что почти не реально :)
    Я чуть чуть упустил один аспект при рассмотрении кода, моя вина :)

    Вам нужно понять, проблема в дисплее или коде.
    Для этого, напишите просто мини скетч в котором на этот дисплей вы будите выводить 2 строчки текста, если будут выводится значит проблема в коде, если нет, тогда дисплей или библиотека. :)
     
  6. Максим B

    Максим B Гуру

    С дислпеем точно все ОК - 2 строчки кода выводятся без проблем. Проблема в коде или реально в библиотеке (((
     
  7. NR55RU

    NR55RU Гик

    Хватит заниматься гаданием на кофейной гуще. :)
    Используя эту библиотеку просто выведите 2 строчек текста на дисплей.
    Вывели ?.. отлично библиотека в норме, дисплей тоже.
    Далее с помощью Serial.println() в нужных местах выкидывайте в монитор порта ключевые данные и следите за тем что у вас творится в программе. Возможно работа вашей программы даже не доходит до места вывода текста.

    Как вариант вставьте в функцию setup вывод двух строк типа "LCD test" и задержку скажем на пару секунд что бы вы могли это увидеть, дабы при запуске программы вы видели что монитор функционирует, текст выводится (после отладки, в окончательной версии просто уберете эти строчки как собственно и выводы в serial).

    Если вы и дальше желаете двигаться в этом направлении, учитесь искать баги и заниматься отладкой :)
     
    Megakoteyka нравится это.
  8. Максим B

    Максим B Гуру

    Да я не гаданием занимаюсь - просто не очяень понятно почему так получается. Спасибо. Обязательно сделаю - отпишусь.