LCD экран печатает одни и те же символы дважды
Я надеюсь, что кто-нибудь сможет помочь мне понять, как предотвратить то, чтобы мой ЖК-дисплей выдавал двузначные цифры (например, 55, 66, 77 - вместо 5,6,7);
У меня есть 2 функции, которые печатают, поэтому я ожидаю, что проблема будет связана с этим.
Вот код:
#include <Wire.h>
#include <Adafruit_LiquidCrystal.h>
#include <Keypad.h>
unsigned int deBounce = 100;
int curs = 0;
Adafruit_LiquidCrystal lcd(8, 9, 3, 10, 11, 12, 13);
const byte numRows = 4; //количество строк на клавиатуре
const byte numCols = 4; //количество столбцов на клавиатуре
char keymap[numRows][numCols] =
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'.', '0', '#', 'D'}
};
char keymap2[numRows][numCols] =
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'.', '0', '#', 'D'}
};
//Код, который показывает подключения клавиатуры к терминалам arduino
byte rowPins[numRows] = {25, 27, 29, 31};
byte colPins[numCols] = {17, 19, 21, 23};
//инициализирует экземпляр класса Keypad
Keypad myKeypad = Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);
Keypad myKeypad2 = Keypad(makeKeymap(keymap2), rowPins, colPins, numRows, numCols);
char enteredDigits[10] = " ";//завершающийся нулем массив символов для хранения записи
char enteredDigits2[10] = " ";//завершающийся нулем массив символов для хранения
boolean entryComplete = false;
boolean entryComplete2 = false;
boolean first = 0;
float result; // Создайте целое число для результата 'A' и 'B' (в данном случае это будет 'Индуктивность' x 'Емкость')
float power = .5; // Используется в уравнении
float r1; // Результат 1
float r2; // Результат 2
float r3; // Результат 3
float r4; // Результат 4
float fc; // Результат 5
float power2 = 6; // Используется в последней части уравнения уравнение
float result2 = 10; // Также используется в последней части уравнения
#define TWO_PI 6.283185307179586476925286766559 // два числа (:
float num1;
float num2;
void setup()
{
myKeypad.setDebounceTime(deBounce);
myKeypad2.setDebounceTime(deBounce);
lcd.begin(16, 2);
}
void loop()
{
getNumber();
if (entryComplete)
{
entryComplete = false;
lcd.setCursor(0, 1);
num1 = atof(enteredDigits);
first = 1;
}
if (first == 1) {
getNumber2();
if (entryComplete2)
{
entryComplete2 = false;
lcd.setCursor(0, 1);
num2 = atof(enteredDigits2);
values();
first = 0;
}
}
}
void getNumber()
{
static byte index = 0;
char key = myKeypad.getKey();
if (key != NO_KEY)
{
switch (key)
{
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9': case'.':
lcd.print(key);// печать записи в верхнем ряду
enteredDigits[index] = key;//построить символьную строку
index++;
enteredDigits[index] = '\0'; //завершается нулевым значением
break;
case '#':
lcd.setCursor(8, 0);
lcd.print(F("= Ind."));
delay(1000);
entryComplete = true;
index = 0;// сброс для следующей записи
break;
case 'D'://очистить ввод и отображение
memset(enteredDigits, '\0', 10); // очистить буфер
lcd.clear();
index = 0;
entryComplete = false;
break;
}
}
}
void getNumber2()
{
static byte index2 = 0;
char key2 = myKeypad2.getKey();
if (key2 != NO_KEY)
{
switch (key2)
{
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9': case'.':
lcd.print(key2);//печать записи в верхнем ряду
enteredDigits2[index2] = key2;//построить символьную строку
index2++;
enteredDigits2[index2] = '\0'; //завершается нулевым значением
break;
case '#':
lcd.setCursor(8, 1);
lcd.print(F("= Cap."));
delay(1000);
entryComplete2 = true;
index2 = 0;// сброс для следующей записи
break;
case 'D'://очистить ввод и отображение
memset(enteredDigits2, '\0', 10); // очистить буфер
lcd.clear();
index2 = 0;
entryComplete2 = false;
break;
}
}
}
void values() {
result = num1 * num2; // Если нажата клавиша 'запятая' (в данном случае клавиша # на клавиатуре 4x4)
lcd.clear(); // Очистить запись с ЖК-дисплея
lcd.setCursor(0, 0); // Установите положение курсора на первый блок в первой строке
lcd.print(F("Ind. =")); // Отображать 'Ind. =' на ЖИДКОКРИСТАЛЛИЧЕСКИЙ экран
lcd.setCursor(7, 0); // Установите положение курсора для отображения после предыдущего текста
lcd.print(num1, 4); // Отображение числового значения, присвоенного num1
lcd.setCursor(0, 1); // Установите курсор для первого блока во второй строке
lcd.print(F("Cap. ="));// Дисплей 'Cap. =' на ЖИДКОКРИСТАЛЛИЧЕСКИЙ экран
lcd.setCursor(7, 1); // Установите положение курсора для отображения после предыдущего текста
lcd.print(num2, 2); // Отображение числового значения, присвоенного num2
delay(2500);
r1 = pow(result, power);
r2 = r1 * TWO_PI;
r3 = 1 / r2;
r4 = pow(result2, power2);
fc = r3 * r4;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F("Res. Peak =")); // Вывести ответ на ЖК-экран
lcd.setCursor(0, 1);
lcd.print(fc);
lcd.setCursor(9, 1);
lcd.print(F("(Hz)"));
}
@zRockafellow, 👍1
Обсуждение2 ответа
Вам нужно разбить свой код на части и отлаживать его по частям. Начните с однократной печати одного символа на ЖК-дисплее и установки bool, чтобы не делать это повторно. Если это сработает, ЖК-дисплей - это не ваша проблема.
Как предположил DataFiddler, проблемы с отказами с вашим коммутатором кажутся вероятным виновником. Добавьте инструкции последовательной печати в свой код обработки кнопок и посмотрите, запускается ли он более одного раза. Если это так, изучите разоблачающий код.
Мне пришлось удалить эту строку из функции getNumber2!
жк-дисплей.печать (клавиша 2);
работает сейчас (:
keymap2
вообще не полезен и является просто дубликатом. Но то, что обе клавиатуры работают с одними и теми же выводами, - это ваша проблема. Или вы не собираетесь иметь две клавиатуры?, @DataFiddler
- Оператор Switch застрял в цикле
- Использование switch case с 5-позиционным переключателем и последовательным выходом
- Нет функции сопоставления для вызова 'DS3231 (const uint8_t &, const uint8_t &)
- Почему на моем ЖК-дисплее 16x2 отображаются странные буквы и не удается вставить клавишу с клавиатуры?
- Sketch запускается и продолжает рассчитывать на внешнее питание, но не на usb
- Функция Arduino не работает, перезапуск цикла
- Печать string and integer LCD
- Как отобразить символ º на ЖК-дисплее?
Я боюсь, что это связано со временем отмены и продолжительностью нажатия кнопки на клавиатуре. Всегда ли это точное дублирование записей? Как насчет отладочного вывода (последовательного), чтобы узнать больше о том, что происходит?, @DataFiddler
Хм, я ничего не заметил после изменения настроек дебаунса. Даже при относительно высокой скорости удаления (500 миллисекунд) он все равно печатает дважды., @zRockafellow
Если я выну эту строку из функции getNumber2:, @zRockafellow