Кости не показывают правильные числа

Я сделал ролик для игры в кости (чтобы было легче бросать кости), используя Arduino UNO и экран с ЖК-клавиатурой, но я не могу получить правильные числа (1, 6 (7)), чтобы они отображались, Я пробовал использовать int, float и все, что между ними. кнопки на шилде подключены к A0, может кто-нибудь помочь?

#include <LiquidCrystal.h>
// выбор контактов, используемых на ЖК-панели
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

#include "DFRkeypad.h"
String line2 = "Press Select to roll"; // Прокручиваемая строка

// просто несколько ссылочных флагов
//int stringStart, stringStop = 0;
//int scrollCursor = screenWidth;

// определяем некоторые значения, используемые панелью и кнопками
int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

// читаем кнопки
int read_LCD_buttons()
{
  adc_key_in = analogRead(0);      // считываем значение с датчика

  // Для версии 1.0 прокомментируйте другой порог и используйте приведенный ниже:

  if (adc_key_in > 1000) return btnNONE; // Делаем это 1-й опцией
  for speed reasons since it will be the most likely result
  // Для версии 1.1 используем этот порог
  if (adc_key_in < 50)   return btnRIGHT;
  if (adc_key_in < 195)  return btnUP;
  if (adc_key_in < 380)  return btnDOWN;
  if (adc_key_in < 555)  return btnLEFT;
  if (adc_key_in < 790)  return btnSELECT;

  return btnNONE;  // когда все остальные терпят неудачу, возвращаем это...
}

void setup() {
  randomSeed(analogRead(1));
  lcd.begin(16, 2);              // запускаем библиотеку
  lcd.setCursor(3, 0);
  lcd.print ("Catan Dice");
  lcd.setCursor(0, 1);

  // пока(строка2)
  //
  // lcd.print(line2);
  // перерыв;
}

void loop() {

  //Игральная кость
  byte DiceOne = random(1, 7);
  byte DiceTwo = random(1, 7);

  //локальные переменные
  int buttonState = read_LCD_buttons(); // читаем панель кнопок
  int lastButtonState = btnNONE; // предыдущее состояние кнопки

  // следующие переменные являются беззнаковыми длинными, потому что время, измеренное в
  // миллисекунды, быстро станет большим числом, чем может быть сохранено в int.
  unsigned long lastDebounceTime = 0;  // последний раз, когда выходной пин был переключен
  unsigned long debounceDelay = 50;    // время устранения дребезга; увеличить, если выход мерцает

  switch (buttonState)
  {
    case btnSELECT:
      lcd.clear();
      // Строка, столбец
      lcd.setCursor (0, 4);
      lcd.print(DiceOne);
      lcd.setCursor (1, 4);
      lcd.print(DiceTwo);
      break;
  }

  DELAY(100)

  // считываем состояние переключателя в локальную переменную:
  int reading = digitalRead(buttonState);

  // проверяем, не нажали ли вы кнопку только что
  // (т.е. входной сигнал изменился с НИЗКОГО на ВЫСОКИЙ), и вы ждали достаточно долго
  // с момента последнего нажатия, чтобы игнорировать любой шум:

  // Если переключатель изменился из-за шума или нажатия:
  if (reading != lastButtonState) {
    // сброс таймера устранения дребезга
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // каким бы ни было значение, оно существует дольше, чем
    debounce
    // задержка, так что примите это как фактическое текущее состояние:

    // если состояние кнопки изменилось:
    if (reading != buttonState) {
      buttonState = reading;
    }
  }

ОБНОВЛЕНИЕ, теперь все работает

, 👍0

Обсуждение

что вы подразумеваете под «не удается получить правильные номера для отображения»?, @jsotola

Вопрос неясен, что значит не получить правильный номер? Официальная документация Arduino рекомендует использовать переменную типа «длинный» https://www.arduino.cc/reference/en/language/functions/random-numbers/random/, @emax

я хочу, чтобы от 1 до 6 отображались вместо больших чисел, @taran

Какие "большие числа" вы получаете?, @jose can u c

42, 43,62 и 55, я хочу, чтобы он генерировал числа 1,2,3,4,5,6 случайным образом, когда я нажимаю кнопку, @taran


2 ответа


1

Вероятно, ваша проблема связана с синхронизацией ЖК-дисплея. Для отправки данных на ЖК-дисплей требуется точная синхронизация, а встроенному чипу ЖК-модуля требуется несколько миллисекунд для завершения обработки отправленных данных, вместо этого вы передаете всю команду очистки и рисования в каждом цикле цикла.

Я использовал пример ЖК-дисплея Tinkercad по умолчанию. Этот код работает нормально:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  randomSeed(analogRead(1));
  lcd.begin(16, 2);
  lcd.setCursor(3, 0);
  lcd.print ("Catan Dice");
  lcd.setCursor(0, 1);
}

void loop() {
  byte DiceOne = random(1, 7);
  byte DiceTwo = random(1, 7);

  lcd.clear();
  lcd.setCursor (0, 4);
  lcd.print(DiceOne);
  lcd.setCursor (1, 4);
  lcd.print(DiceTwo);
  delay(100);
}

пример tinkercad

но как только я удалю delay(100)

void loop() {
  byte DiceOne = random(1, 7);
  byte DiceTwo = random(1, 7);

  lcd.clear();
  lcd.setCursor (0, 4);
  lcd.print(DiceOne);
  lcd.setCursor (1, 4);
  lcd.print(DiceTwo);
  //delay(100);
}

На ЖК-дисплее начинают появляться странные вещи.

отображен неверный номер

Попробуйте переписать свой код так, чтобы команды отправлялись на ЖК-дисплей только один раз при каждом нажатии кнопки.

,

Я считаю, что драйвер последовательного ЖК-дисплея в библиотеке LiquidCrystal является синхронным и не вернется, пока не завершит отправку команд для отображения нужных символов. Цифровой интерфейс не должен путаться даже без задержек., @Duncan C

Я предполагаю, что без задержки ЖК-дисплей обновляется так быстро, что жидкие кристаллы не заканчивают сдвиг, чтобы отобразить заданный шаблон пикселей, прежде чем будет отправлено следующее число. (ЖК-дисплеи имеют кристаллы, взвешенные в жидкости, и когда вы меняете шаблон пикселей, требуется значительное время, чтобы кристаллы сместились в новые шаблоны. Если вы наблюдаете за изменением с помощью высокоскоростной камеры, пиксели кажутся «жидкими». в новый узор.), @Duncan C

у меня есть, поэтому он генерирует числа при нажатии правой кнопки, @taran


2

Вы вызываете setCursor() с помощью:

//Строка, Столбец
lcd.setCursor (0, 4);
lcd.print(DiceOne);
lcd.setCursor (1, 4);
lcd.print(DiceTwo);

Хотя в вашем комментарии указано, что порядок следующий: Строка, Столбец, похоже, что есть несколько библиотек LiquidCrystal, некоторые из которых используют Столбец. , порядок Row в функции SetCursor(). официальный источник библиотеки Arduino указывает col, порядок строки.

Вы записываете оба значения в строке 4 (даже если ее нет на вашем дисплее) и в столбцах 0 и 1, таким образом, вы правильно вычисляете значения Dice, но они записываются без промежутка между ними.

,

Да, я пишу их в той же строке, но в разных столбцах, и я не буду играть в кости несколько дней, мы продолжим это, когда я вернусь, хорошо звучит?, @taran

Вы отметили, что у вас получилось. Если вы поделитесь результатами, это может помочь другим в будущем, у которых, возможно, возникнет аналогичный вопрос., @jose can u c

все, что я сделал, это поменял номера в lcd.Setcusor из lcd.setCursor(0, 4); lcd.print(DiceOne); lcd.setCursor (1, 4); lcd.print (DiceTwo); в lcd.setCursor(4, 0); lcd.print(DiceOne); lcd.setCursor (4, 1); lcd.print (DiceTwo);, @taran