Проблема с сохранением клавиатуры. Хранить более 11 цифр, например номер телефона.

#include <SoftwareSerial.h>
#include <LiquidCrystal.h>

SoftwareSerial mySerial(6,5);
int table[]={0,0,0};

#include <Keypad.h>
#include <Wire.h>

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
const byte ROWS = 4; //четыре строки
const byte COLS = 3; //три столбца

char keys[ROWS][COLS] = {
    {'1','2','3'},
    {'4','5','6'},
    {'7','8','9'},
    {'*','0','#'}
};
byte rowPins[ROWS] = {2, 3, 17, 16}; //подключаемся к выводам строк клавиатуры
byte colPins[COLS] = {15, 14, 13}; //подключаемся к выводам колонки клавиатуры
int count=0;
Keypad kpd = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
char entryStr[13];   // Это может содержать до 4 цифр
int i=0;
***char n1, n2 , n3;
char buf [15] ;//я положил сюда***

void setup()
{
    Wire.begin();
    mySerial.begin(9600);
    Serial.begin(9600);
    lcd.begin(20, 4);
    ask();
}

void loop()
{
    Wire.requestFrom(2, 3);    // запрос 6 байт от ведомого устройства №2
    for (int i = 0; i < 3; i++)
    {
        int c = Wire.read(); // получаем байт как символ
        Serial.print(c);
        table[i] = c;
        Serial.print('\t');
        // печатаем символ
    }
    Serial.print('\n');
    Serial.print(table[0]);
    Serial.print('\t');
    Serial.print(table[1]);
    Serial.print('\t');
    Serial.print(table[2]);
    Serial.print('\n');

    //если(таблица[0]<=8)
    //{
    //Serial.print("Обнаружено пламя!");
    //Serial.println("Уровень1");
}

void ask()
{
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Enter no1.:");
    lcd.setCursor(0,1);
    lcd.print("(starts with 0)");
    lcd.setCursor(1, 2);
    n1 = GetNumber(buf, sizeof (buf) - 1);

    Serial.print(n1);

    delay(1);

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Enter no2.:");
    lcd.setCursor(0, 1);
    lcd.print("(starts with 0)");
    lcd.setCursor(1, 2);
    n2 = GetNumber(buf, sizeof (buf) - 1);

    Serial.println(n2);
    delay(1);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Enter no3.:");
    lcd.setCursor(0,1);
    lcd.print("(starts with 0)");
    lcd.setCursor(1,2);
    n3 = GetNumber(buf, sizeof (buf) - 1);

    Serial.println (n3);
    delay(1);
    Serial.println (n1);
    Serial.println (n2);
    Serial.println (n3);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("list of numbers ");
    lcd.setCursor(0, 1);
    lcd.print("will be shown press");
    lcd.setCursor(1, 2);
    lcd.print("reset if wrong");


    delay(7000);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Numbers Stored:");
    lcd.setCursor(0, 1);
    lcd.print("no1.:0");
    lcd.print(n1);
    lcd.setCursor(1, 2);
    lcd.print("no2.:0");
    lcd.print(n2);
    lcd.setCursor(2, 3);
    lcd.print("no3.:0");
    lcd.print(n3);
}

void GetNumber(char * result, const int maxLength)
{
    char key = kpd.getKey();
    int i = 0;   // как далеко мы прошли буфер
    while (key != '#')
    {
        switch (key)
        {
            case NO_KEY:
                break;

            case '0': case '1': case '2': case '3': case '4':
            case '5': case '6': case '7': case '8': case '9':
                lcd.print(key);
                if (i < maxLength)
                {
                    result [i++] = key;
                    result [i] = 0;  // завершающий ноль
                }
                break;

            case '*':  // возврат налево
                if (i > 0)
                {
                    i--;
                    result [i] = 0;  // завершающий ноль
                }
                break;
        }

        key = kpd.getKey();
    }
} // конец GetNumber

Я изменил его..он выдал мне эту ошибку

значение void не игнорируется, как должно быть

, 👍0

Обсуждение

Вы просматривали свой вопрос, прежде чем его опубликовать? Это бардак. Выделите часть кода, а затем нажмите Ctrl+K, чтобы сделать отступ на четыре пробела, чтобы он выглядел как код., @Nick Gammon

В моем ответе число не возвращается, оно передается обратно в аргументе («buf»). Таким образом, вам не следует пытаться сохранить его в nl., @Nick Gammon


2 ответа


1
 long GetNumber()

Тип long (на этой платформе) может достигать 2^31 (то есть 2 147 483 648). Большие 10-значные числа (т. е. начинающиеся с «9») не подходят.

Вы можете работать со строкой из 10 символов (или длиннее) вместо длинной.


Заставьте GetNumber работать со строками, как показано ниже:

void GetNumber(char * result, const int maxLength)
{
  char key = kpd.getKey();
  int i = 0;   // как далеко мы прошли буфер
  while (key != '#')
  {
    switch (key)
    {
      case NO_KEY:
        break;

      case '0' ... '9': 
        lcd.print(key);
        if (i < maxLength)
          {
          result [i++] = key;
          result [i] = 0;  // завершающий ноль
          }
        break;

      case '*':  // возврат налево
        if (i > 0)
          {
          i--;
          result [i] = 0;  // завершающий ноль
          }

        break;
    }

    key = kpd.getKey();
  }
} // конец GetNumber

Теперь для вызова GetNumber укажите буфер символов и максимальную длину (с учетом 0x00, необходимого для завершения строки), например:

  char buf [15];
  GetNumber (buf, sizeof (buf) - 1);
,

Как я могу преобразовать long в строку, это дает мне ошибку, если я помещаю String GetNumber() и String n1, n2, n3; Спасибо за помощь :), @aikachiqq

Вы вообще не пользуетесь долго. Смотрите мой исправленный ответ., @Nick Gammon


0

Используйте строку или символ. Они хранят свои номера посимвольно, а не в большом количестве. В длинной позиции может храниться максимум около 2 000 000 000.

Например, 123, объявленное как lon, будет буквально, математически 123 (как 100 + 20 + 3). С другой стороны, символ будет считать это 1,2,3. Он может хранить более высокие цифры.

,

Можете ли вы дать мне представление, как это сделать в моем коде? Пожалуйста, уточните, большое спасибо., @aikachiqq