Здравствуйте, пожалуйста помогите со скетчем. Требуется просто для начала вывести показания потенциометра или любого другого сенсора через serial monitor на LCD c кнопками. Скетч: #include <Wire.h> #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7 ); // Нажатые кнопки int button; const int BUTTON_NONE = 0; const int BUTTON_RIGHT = 1; const int BUTTON_UP = 2; const int BUTTON_DOWN = 3; const int BUTTON_LEFT = 4; const int BUTTON_SELECT = 5; int getPressedButton() { int buttonValue = analogRead(0); // считываем значения с аналогового входа(A0) if (buttonValue < 100) { return BUTTON_RIGHT; } else if (buttonValue < 200) { return BUTTON_UP; } else if (buttonValue < 400){ return BUTTON_DOWN; } else if (buttonValue < 600){ return BUTTON_LEFT; } else if (buttonValue < 800){ return BUTTON_SELECT; } return BUTTON_NONE; } void setup() { lcd.begin(16, 2); lcd.print("Welcome"); Serial.begin(9600); delay(10); } void loop() { int sensorValue = analogRead(A14); Serial.println(sensorValue); delay(1); int a = analogRead(A14); button = getPressedButton(); switch (button) { case BUTTON_RIGHT: // при нажатии кнопки выводим следующий текст lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 0); lcd.write(a); break; case BUTTON_LEFT: lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("BUTTON: LEFT"); break; case BUTTON_UP: lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("BUTTON: UP"); break; case BUTTON_DOWN: lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("BUTTON: DOWN"); break; case BUTTON_SELECT: lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("BUTTON: SELECT"); break; } } При нажатии например кнопки RIGHT должно выводиться значение потенциометра с A14 , переменная a, но этого не происходит. Подскажите пожалуйста почему? Рисунок знакомест на LCD все-таки меняется от положения ручки потенциометра, но численного значения нет.
"Хеллоу ворлд" для экрана корректно работает? http://wiki.amperka.ru/схемы-подключения:подключение-текстового-экрана
Ага, вы имели ввиду lcd.print(a)... Теперь значение выводится, но оно статичное и не реагирует на динамические изменения показаний серийного монитора. Новые значения принимаются только после перетыкивания кнопок.Как бы сие поправить?
Никаких волшебных способов отладки нет. Только рутина - упрощать скетч до тех пор пока ошибка не будет локализована. В данном случае LCD подключен правильно, значит что-то не так с подключением кнопок или их обработкой в программе. Выводить значения analogRead(0) в порт пробовали? Значения те же что указаны в скетче получаются? И если делаете задержку, учтите, delay(10) это задержка на 0,01 сек, т.е. совершенно неразличимая человеком. Задержка в одну секунду - delay(1000)
Спасибо за содержательный совет! С analogRead(0) считываются все показания кнопок данного LCD.Они все повешены на этот аналоговый вход, так что он по сути больше не используется. Работает lcd.print(a) , но значение показываются в ДИНАМИКЕ только при ЗАЖАТОЙ правой кнопке. При этом яркость малоразборчива, как будто нужно опять резистор контрастности подкручивать..Хмм. При отжатой показывается статичное значение потенциометра. Если переткнуть с левой-на правую например -значение естественно обновляется. Я хочу понять как добиться чтобы оно демонстрировалось в динамике при ОТЖАТОЙ кнопке...Нельзя же например считывать сенсор, постоянно держа кнопку нажатой..
Так у Вас же именно так программа и написана. Изображение тусклое потому, что вы постоянно (много-много раз в секунду) посылаете на экран значение командой lcd.print(a); При отжатой кнопке ничего не происходит, потому что Код (C++): button = getPressedButton(); выполняется много-много раз в секунду, значение предыдущей нажатой кнопки нигде не сохраняется, поэтому как только все кнопки будут отпущены, переменная button сразу получает значение BUTTON_NONE, вывод на экран при этом прекращается и на экране с нормальной яркостью отображается последнее выведенное значение.
Вопрос был немного в другом. Пробовали ли Вы выполнить подобный скетч на своей схеме: Код (C++): void setup() { Serial.begin(9600); } void loop() { Serial.println(analogRead(0)); delay(1000); }
Сразу говорю-код не мой, я его только адаптировала под собственные нужды Ардуинка у меня с неделю, многих функций в коде я еще не понимаю. Курю мануалы. Мне просто вычеркнуть эту строку?
Попро Попробовала по вашей схеме такой скетч примитивный. #include <Wire.h> #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7 ); void setup() { Serial.begin(9600); } void loop() { Serial.println(analogRead(A14)); delay(1000); int a = analogRead(A14); lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 0); lcd.print(a); } Тут все получилось Только при выводе от большего к меньшему, почему-то выводит еще какую-то загадочную двойку(или тройку).Значения получаются вида 1512-151, 0762-это 76..Загадочно.
Ни в коем случае ничего не вычеркивать и ничего не дописывать, если не понимаете как и зачем это нужно.
Не вижу lcd.begin(16, 2); в последнем скетче. А лишние цифры - так и должно быть. Функция analogRead() возвращает числа от 0 до 1023. Допустим в какой-то момент на LCD выводится значение 1012, а следующее значение 987. Тогда второе значение затрет первые три символа предыдущего числа, а последний, четвертый, символ останется, поэтому на экране будет 9872. Спойлер: рецепт решения очевиден заменить lcd.print(" ") на lcd.print(" "), или, для очистки всей строки на lcd.print(" ") (тут шестнадцать пробелов) Апдейт. Упс, идущие подряд пробелы не отображаются в сообщении, тогда так: заменить Код (C++): lcd.print(" ") на Код (C++): lcd.print(" ") или, для очистки всей строки на Код (C++): lcd.print(" ") (тут шестнадцать пробелов)