Кости не показывают правильные числа
Я сделал ролик для игры в кости (чтобы было легче бросать кости), используя 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;
}
}
ОБНОВЛЕНИЕ, теперь все работает
@taran, 👍0
Обсуждение2 ответа
Вероятно, ваша проблема связана с синхронизацией ЖК-дисплея. Для отправки данных на ЖК-дисплей требуется точная синхронизация, а встроенному чипу ЖК-модуля требуется несколько миллисекунд для завершения обработки отправленных данных, вместо этого вы передаете всю команду очистки и рисования в каждом цикле цикла.
Я использовал пример ЖК-дисплея 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);
}
но как только я удалю 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
Вы вызываете 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
- Печать string and integer LCD
- Почему мои часы реального времени показывают неверное время с моего ПК?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Отправьте несколько значений int из Python в Arduino, используя pySerial
- Глобальные переменные занимают много места в динамической памяти.
- (Код ультразвукового датчика: такого файла или каталога нет)
- rfid_default_keys проверить с помощью RC522
- Команда strtok() с Serial связью
что вы подразумеваете под «не удается получить правильные номера для отображения»?, @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