Меню не меняется при нажатии кнопки 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);
}

Отредактировано до исходного по запросу

, 👍0

Обсуждение

удалите #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


1 ответ


Лучший ответ:

0

Вы можете упростить задачу:

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