Переделал чуть код меню для дисплея 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; } }
Попробуйте "трассировать" вашу программу, хотя бы простешим выводом разных значений в Serial на монитор порта. Посмотрите получает ли ваш ардуин хоть какие либо данные с пина, если да то какие, какие значения принимает ваши переменные. Вставьте выводы в сериал в ключевых точках программы что бы увидеть какие части срабатывают а какие нет. Итогом станет локализация проблемы и ее будет легче обнаружить и исправить. Более того в вашем коде пара логических ошибки. Код (Text): if (state != lastState) Вы никогда не сможете нажать подряд два раза одну и ту же кнопку, итогом станет то что вы никогда не сможете передвинутся например на 2 меню вверх или вниз. Код (Text): currentMenuItem = currentMenuItem - 1; displayMenu(currentMenuItem); Учитывая то что эта переменная изначально равна нулю и парой строк выше так же сбрасывается в ноль, очень часто вы будите отправлять значение -1 в функцию displayMenu, в итоге switch находящей в этой функции просто не сработает. Ну как то, так
Мои замечания по коду можно не брать в расчет, они не повлияют на работу кода ну по крайней мере до тех пор пока вы не сможете нажать два раза подряд на одну и ту же кнопку что бы функция analogRead() два раза подряд считала одно и то же значение, что почти не реально Я чуть чуть упустил один аспект при рассмотрении кода, моя вина Вам нужно понять, проблема в дисплее или коде. Для этого, напишите просто мини скетч в котором на этот дисплей вы будите выводить 2 строчки текста, если будут выводится значит проблема в коде, если нет, тогда дисплей или библиотека.
С дислпеем точно все ОК - 2 строчки кода выводятся без проблем. Проблема в коде или реально в библиотеке (((
Хватит заниматься гаданием на кофейной гуще. Используя эту библиотеку просто выведите 2 строчек текста на дисплей. Вывели ?.. отлично библиотека в норме, дисплей тоже. Далее с помощью Serial.println() в нужных местах выкидывайте в монитор порта ключевые данные и следите за тем что у вас творится в программе. Возможно работа вашей программы даже не доходит до места вывода текста. Как вариант вставьте в функцию setup вывод двух строк типа "LCD test" и задержку скажем на пару секунд что бы вы могли это увидеть, дабы при запуске программы вы видели что монитор функционирует, текст выводится (после отладки, в окончательной версии просто уберете эти строчки как собственно и выводы в serial). Если вы и дальше желаете двигаться в этом направлении, учитесь искать баги и заниматься отладкой
Да я не гаданием занимаюсь - просто не очяень понятно почему так получается. Спасибо. Обязательно сделаю - отпишусь.