Проблема с сохранением клавиатуры. Хранить более 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
Я изменил его..он выдал мне эту ошибку
@aikachiqq, 👍0
Обсуждение2 ответа
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
Используйте строку или символ. Они хранят свои номера посимвольно, а не в большом количестве. В длинной позиции может храниться максимум около 2 000 000 000.
Например, 123, объявленное как lon, будет буквально, математически 123 (как 100 + 20 + 3). С другой стороны, символ будет считать это 1,2,3. Он может хранить более высокие цифры.
Можете ли вы дать мне представление, как это сделать в моем коде? Пожалуйста, уточните, большое спасибо., @aikachiqq
- C++ против языка Arduino?
- avrdude ser_open() can't set com-state
- Как читать и записывать EEPROM в ESP8266
- Float печатается только 2 десятичных знака после запятой
- устаревшее преобразование из строковой константы в 'char*'
- Запрограммировать ATMega328P и использовать его без платы Arduino.
- Разница между print() и println()
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
Вы просматривали свой вопрос, прежде чем его опубликовать? Это бардак. Выделите часть кода, а затем нажмите Ctrl+K, чтобы сделать отступ на четыре пробела, чтобы он выглядел как код., @Nick Gammon
В моем ответе число не возвращается, оно передается обратно в аргументе («buf»). Таким образом, вам не следует пытаться сохранить его в
nl
., @Nick Gammon