LCD экран печатает одни и те же символы дважды

lcd switch keypad

Я надеюсь, что кто-нибудь сможет помочь мне понять, как предотвратить то, чтобы мой ЖК-дисплей выдавал двузначные цифры (например, 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)"));
}

, 👍1

Обсуждение

Я боюсь, что это связано со временем отмены и продолжительностью нажатия кнопки на клавиатуре. Всегда ли это точное дублирование записей? Как насчет отладочного вывода (последовательного), чтобы узнать больше о том, что происходит?, @DataFiddler

Хм, я ничего не заметил после изменения настроек дебаунса. Даже при относительно высокой скорости удаления (500 миллисекунд) он все равно печатает дважды., @zRockafellow

Если я выну эту строку из функции getNumber2:, @zRockafellow


2 ответа


0

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

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

,

1

Мне пришлось удалить эту строку из функции getNumber2!

жк-дисплей.печать (клавиша 2);

работает сейчас (:

,

keymap2 вообще не полезен и является просто дубликатом. Но то, что обе клавиатуры работают с одними и теми же выводами, - это ваша проблема. Или вы не собираетесь иметь две клавиатуры?, @DataFiddler