Меню не меняется при нажатии кнопки TFT 128 x 128
Я только что следовал руководству, чтобы при нажатии кнопки происходило меню. Щелкните один раз, следующий слайд. Единственная проблема в том, что он вообще не отображается на моем экране. Он загружен, но я совсем новичок, когда дело доходит до макетов и т. д. Вот мой код:
#include "Ucglib.h" // библиотека для этого дисплея
#include <TFT.h> // Аппаратно-зависимая библиотека
#include <SPI.h>
#define CS 10
#define DC 8
#define RESET 9
#define up 5
#define down 6
TFT TFTscreen = TFT(CS, DC, RESET);
const int menuSize = 4;
String menuItems(menuSize);
bool upLastState = HIGH;
bool downLastState = HIGH;
int currentMenu = 0;
String temp;
char currentPrintOut(10);
void setup()
{
Serial.begin(9600);
pinMode(up, INPUT_PULLUP);
pinMode(down, INPUT_PULLUP);
menuItems[0] = ":)";
menuItems[1] = ":(";
menuItems[2] = "X(";
menuItems[3] = ":S";
menuItems[4] = ":T";
// инициализируем библиотеку
TFTscreen.begin();
MenuChanged();
}
void loop() {
if (digitalRead(up) != upLastState) {
upLastState = !upLastState;
}
if (!upLastState) {
if (currentMenu > 0) {
currentMenu--;
} else {
currentMenu = menuSize - 1;
}
MenuChanged();
} else {
}
if (digitalRead(down) !=downLastState) {
downLastState = !downLastState;
if (!downLastState) {
if (currentMenu < menuSize - 1) {
currentMenu++;
} else {
currentMenu = 0;
}
//Serial.printIn(menuItems[currentMenu]);
MenuChanged();
} else {
//Выпускать
}
}
delay(50);
}
void MenuChanged() {
Serial.println(menuItems[currentMenu]);
// очищаем экран черным фоном
TFTscreen.background(0,0,0);
TFTscreen.setTextSize(9);
TFTscreen.stroke(255,255,255);
temp = String(menuItems[currentMenu]);
temp.toCharArray(currentPrintOut, 10);
TFTscreen.text(currentPrintOut, 40, 32);
}
Отредактировано до исходного по запросу
1 ответ
Лучший ответ:
Вы можете упростить задачу:
int count = 0;
int button = 5;
int buttonStatus;
unsigned long timer = 0;
void setup() {
Serial.begin(9600);
pinMode(button, INPUT_PULLUP);
}
void loop() {
buttonStatus = digitalRead(button); // читаем статус кнопки
if (buttonStatus == LOW) {
if (millis() - timer > 200) { // устраняем дребезг кнопки
count++; // увеличиваем +1 при каждом нажатии кнопки
// здесь должна быть функция очистки экрана
timer = millis();
}
}
if (count > 3){ // если count больше 3, начинаем заново.
count = 0;
// здесь должна быть функция очистки экрана
}
switch (count){
case 1: // если количество == 1
// показать символ :)
break; // выйти из этого случая!
case 2:
// показать символ :(
break;
case 3:
// показать символ :D
break;
default: // если ни один из вышеперечисленных случаев не является допустимым
count = 0;
// здесь должна быть функция очистки экрана
}
Serial.println(count);
delay(100);
}
Поэтому при каждом нажатии кнопки значение count
будет увеличиваться на 1. Вы также можете добавить еще одну кнопку, чтобы уменьшить это значение...
Вы также можете заметить, что нажатие кнопки засчитывается более одного раза. Вам также потребуется отменить отскок кнопки. руководство.
Изменить: добавлена функция устранения отказов.
Привет снова новичок. Итак, я говорю, как в случае 1: TFTscreen.stroke(0,0,0); TFTscreen.text(":)"); со всеми моими настройками цвета? Должен ли я также указать пустоту, чтобы фон был черным? Я просто хочу убедиться, что это то, что вы имели в виду, говоря о том, что вы мне прислали, или вы имеете в виду, что кнопка по-прежнему будет посередине, а провода с другой стороны? [ссылка](https://cdn.discordapp.com/attachments/446294089621569536/630427693183402014/20191007_013403.jpg). Мой TFT просто пустой и ничего не будет отображаться раньше, поэтому я не хочу уточнять, прежде чем начать. еще раз спасибо, @Ijustneedtopassprobs
@Ijustneedtopassprobs Только два провода идут к кнопке (что за третий провод на этом рисунке?), в данном случае это земля и контакт 5. да, определите свои библиотеки сверху, как вы это делали в своем исходном коде, и сеансы, которые вы хотите в настройке пустоты. также прочитайте комментарии в коде, который я разместил., @ElectronSurf
Я удалил это после, извините, я понял это в конце концов. Это проходит через все лица в данный момент. Я сделал до 5 дел. Это в значительной степени спам. Я еще не трогал кнопку. Я собираюсь отредактировать свой код, чтобы вы могли увидеть мой новый код, чтобы увидеть, тупой я или нет =), еще раз спасибо за это, @Ijustneedtopassprobs
- Остановить мигание светодиодов
- Кнопка с таймером переключения и функцией сброса времени + светодиод обратной связи
- Низкая частота обновления 1,8-дюймового TFT-дисплея
- Использование библиотеки емкостных датчиков с мультиплексором 74HC4067
- Проблема с сигналом датчика пульса
- Как сделать собственный символ на ЖК-дисплее TFT? (128x128)
- Аппаратный SPI Arduino NANO не работает
- Контроллер радиоуправляемой машины с использованием библиотеки RC-switch
удалите
#define up 5
и#define down 6
, мы уже определили контакт 5 для кнопки. также удалитеTFTscreen.text(":)", 40, 32);
, который стоит передdefault:
.serial.begin()
,serial.println()
иdelay(100)
предназначены только для тестирования кода, вы также можете удалить их., @ElectronSurfПривет! Я сделал все это сейчас. Он все еще пробегает по каждому лицу, поэтому я собираюсь попробовать отскок и посмотреть, так ли это. Я даже не могу нажать кнопку, он просто делает это сам, ха-ха. Извините, я не был уверен, нужно ли мне что-то писать по умолчанию! После этого мне осталось сделать только одну важную вещь в моем коде (которую вы, вероятно, снова мне поможете, мне очень жаль, что я такой новичок в этом). Я постараюсь исправить скорость лица через, @Ijustneedtopassprobs
Пожалуйста, верните исходный код, чтобы другие могли увидеть, в чем была проблема, вы в основном решили вопрос..., @ElectronSurf
Конечно, теперь у меня была еще одна проблема, ха-ха. Я попытался устранить дребезг, но теперь лица стали еще быстрее. Он идет между лицами и на самом деле не останавливается на одном, и все равно не позволяет мне нажать кнопку, чтобы активировать его :/, @Ijustneedtopassprobs
обновил ответ с помощью de-bounce, если на ваши вопросы на этом сайте есть ответ, который решил вашу проблему, выберите их как правильный ответ, нажав «галочку» рядом с ответом. у тебя кнопка нормально открыта или нормально закрыта?, @ElectronSurf
Извините, что беспокою вас так много. Я предполагаю, что это был не дебаунс (я не ошибся в кои-то веки! Я сделал это правильно, иди ко мне), он все еще проходит через все случаи, просто медленнее. Есть ли способ остановиться на этом лице, если кнопка на самом деле нажата? Я пытаюсь решить это самостоятельно, но он просто продолжает повторяться, просматривая лица, а не останавливаясь на том, который я хочу, при нажатии кнопки:/, @Ijustneedtopassprobs
я подозреваю, что это потому, что у вас есть нормально замкнутая кнопка, что означает, что кнопка подключена, пока вы ее не нажмете. [ссылка](http://www.learningaboutelectronics.com/images/Normally_Open_Push_Button_Diagrams.png). это нормально замкнутая кнопка?, @ElectronSurf
Ах, я вижу, что это имеет смысл. Я думаю, я могу попытаться расширить пространство с помощью резисторов и т. Д.? Даже думал, что это все еще электрический ток, но попробовать не помешает., @Ijustneedtopassprobs
замените кнопку на нормально открытую кнопку **ИЛИ** измените эту строку:
if (buttonStatus == LOW) {}
наif (buttonStatus == HIGH) {}
, @ElectronSurfПривет, новичок, я поместил кнопку в середину платы (как и изначально) и подключил оба провода к каждому концу. Кое как работает! Мне нужно дважды нажать на кнопку, потому что иногда она решает сделать это снова, но я попробую и ваш способ. Я оставлю тебя пока в покое <3. Большое вам спасибо за вашу помощь. Я ценю это больше, чем ты думаешь. Вот [моё победное фото](https://cdn.discordapp.com/attachments/446294089621569536/630452856356601867/20191007_031425.jpg)., @Ijustneedtopassprobs
пожалуйста., @ElectronSurf
Изменить: мне удалось решить мою проблему, поместив провода по диагонали (заземляющий левый контакт, 5 правая сторона), если у кого-то в будущем возникнет моя проблема. Вернемся к танцу победы =), @Ijustneedtopassprobs