Arduino, ввод чисел

nikvas
Offline
Зарегистрирован: 07.10.2016

Как на Arduino вводить с клавиатуры 3-х значные числа, для дальнейшего их использования в вычислениях?

nikvas
Offline
Зарегистрирован: 07.10.2016

Я понимаю так:

Опрос клавиатуры - запоминание введенного числа в ячейку.

далее опрос и запоминание в другую ячейку, и так до клавиши "Ввод".

А как потом преобразовать все это в одно чило? Или это всё делается по другому?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

nikvas, погуглите про функцию Serial.parseInt() откроете для себя мир новых возможностей :)

nikvas
Offline
Зарегистрирован: 07.10.2016

Спасибо!

Попробую с этим разобраться.

nikvas
Offline
Зарегистрирован: 07.10.2016

Всё ОК. Ещё раз СПАСИБО!!

nikvas
Offline
Зарегистрирован: 07.10.2016

Прошу прощение за назойливость.

Serial.parseInt() прикрасно работает при вводе с монитора порта (через компьютер), а мне надо вводить со своей клавиатуры без связи с компьютером.

Никак не могу этого добиться.

 

okta
Offline
Зарегистрирован: 10.01.2015

Какая клавиатура? Как подключена? Как проводите ее опрос? Лучше прям сразу текущий код выложить.

nikvas
Offline
Зарегистрирован: 07.10.2016

Клавиатура 4х4.  Кода нет, по тому что не знаю как  вводить с клавиатуры 3-х значные числа, для дальнейшего их использования в вычислениях? Вот моя программа ввода и отображения на ЖКИ, но это однозначное число, а мне надо вводить 3х значное.

//клава 4х4 с выводом на ЖК 16х2
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // Подключаем библиотеку индикатора и I2C - LiquidCrystal_I2C_V112
LiquidCrystal_I2C lcd(0x27, 16,2);
#include <Keypad.h> // Подключаем библиотеку кнопок
const byte ROWS = 4; // 4 строки
const byte COLS = 4; // 4 столбца
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
}; 
byte rowPins[ROWS] = {11,10, 9, 8}; //красные
byte colPins[COLS] = {7, 6, 5, 4};  //синие
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup()
{
  lcd.init();                     
  lcd.backlight();// Включаем подсветку дисплея
  lcd.print("Klava 4x4");
  Serial.begin(9600);
}
void loop(){
   char key = keypad.getKey(); //опрос клавиатуры
  if (key){   //если нажата то
  lcd.clear();  //очистить дисплей
  lcd.setCursor(6, 1);   //курсор на вторую строчку (Первая-0, вторая-1), 6 символ
  lcd.print(key);         //вывод на экран знака кнопки
  lcd.setCursor(10, 1);   //курсор на вторую строчку (Первая-0, вторая-1), 10 символ
  int data = key-48;
  lcd.print(data);         //вывод на экран число
  }
}
nikvas
Offline
Зарегистрирован: 07.10.2016

При использование функции Serial.parseInt() все прекрасно работает, но только через компьютер на системный монитор.

Вот что я намудрил:

//Ввод многозначных чисел клава 4х4 с выводом на ЖК 16х2
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // Подключаем библиотеку индикатора и I2C - LiquidCrystal_I2C_V112
LiquidCrystal_I2C lcd(0x27, 16,2);
#include <Keypad.h> // Подключаем библиотеку кнопок
const byte ROWS = 4; // 4 строки
const byte COLS = 4; // 4 столбца
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
}; 
byte rowPins[ROWS] = {11,10, 9, 8}; //красные
byte colPins[COLS] = {7, 6, 5, 4};  //синие
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int inx = 0; //переменная для числа Х
int iny = 0; //переменная для числа У
void setup()
{
  lcd.init();                     
  lcd.backlight();// Включаем подсветку дисплея
  lcd.print("vvod");
  Serial.begin(9600);
  Serial.setTimeout(2000);
}
void loop() 
{
   if (Serial.available() > 0) 
   {
      inx = Serial.parseInt(); // Опрос ввода цыфр, до нажатия любого символа
  Serial.write(inx);
  lcd.setCursor(1, 0);   //курсор на первую строчку (Первая-0, вторая-1), 1 символ
  lcd.print("X = ");         //вывод на экран X =
  lcd.setCursor(5, 0);   //курсор на первую строчку (Первая-0, вторая-1), 5 символ      
  lcd.print(inx);
   }
   if (Serial.available() > 0) 
   {
      iny = Serial.parseInt();   // Опрос ввода цыфр, до нажатия любого символа
  Serial.write(iny);      
  lcd.setCursor(1, 1);   //курсор на вторую строчку (Первая-0, вторая-1), 1 символ
  lcd.print("Y = ");         //вывод на экран У =
  lcd.setCursor(5, 1);   //курсор на вторую строчку (Первая-0, вторая-1), 5 символ      
  lcd.print(iny);
   }   
}
nikvas
Offline
Зарегистрирован: 07.10.2016

И всётаки, КАК ВВОДИТЬ с отдельной клавиатуры 3-х значные (и более) числа???

Использование системного монитора не нужно (я вообще не понимаю его назначение).

Arduino должен работать как самостоятельный узел.

okta
Offline
Зарегистрирован: 10.01.2015

Ну, например, как-то так (среды нет под рукой, в блокнотике ваш код поправил, так что могут быть косяки с синтаксисом). Да и с библиотекой клавы я не работал, судя по описанию, там можно более красиво нажатие кнопок отслеживать.

//клава 4х4 с выводом на ЖК 16х2

#include <Wire.h>
#include <LiquidCrystal_I2C.h> // Подключаем библиотеку индикатора и I2C - LiquidCrystal_I2C_V112
LiquidCrystal_I2C lcd(0x27, 16,2);
#include <Keypad.h> // Подключаем библиотеку кнопок

const byte ROWS = 4; // 4 строки
const byte COLS = 4; // 4 столбца
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
}; 

byte rowPins[ROWS] = {11,10, 9, 8}; //красные
byte colPins[COLS] = {7, 6, 5, 4};  //синие
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int data=0;
boolean first=true;

void setup()
{
  lcd.init();                     
  lcd.backlight();// Включаем подсветку дисплея
  lcd.print("Klava 4x4");
  Serial.begin(9600);
}

void loop(){
  char key = keypad.getKey(); //опрос клавиатуры
  if(key){
    if(first){
   first=false;
   if(isDigit(key)){
     data = data*10+key-48;
     lcd.clear();  //очистить дисплей
     lcd.setCursor(6, 1);   //курсор на вторую строчку (Первая-0, вторая-1), 6 символ
     lcd.print(key);         //вывод на экран знака кнопки
     lcd.setCursor(10, 1);   //курсор на вторую строчку (Первая-0, вторая-1), 10 символ
     lcd.print(data);         //вывод на экран число    
   }else{
    //обрабатываем нажатие не цифровых клавиш
   }
    }
  }else if (!first){
 first=true;
  }
}

 

nikvas
Offline
Зарегистрирован: 07.10.2016

Большое спасибо за участие!

Представленные мною коды все рабочие. В первом скетче можно ввести только ОДНОзначное число,

а во втором все прекрасно работает но ТОЛЬКО с клавиатуры компьютера и через системный монитор, а мне надо ввод со своей клавиатуры и без участия компьютера.

Мне не понятно как вводдить трех значное число со своей клавиатуры, что бы потом его использовать. 

okta
Offline
Зарегистрирован: 10.01.2015

И что, тот код, что я дал, не заработал?

nikvas
Offline
Зарегистрирован: 07.10.2016

Это не то. Это ввод знаков (просто со сдвигом) но не одного числа. при вводе переменная равна поледнему введеному знаку. Мне надо ввести 532 (сохраненное в одной переменной), а не 5, 3 и 2.

В вашем скетче вводятся цифры со сдвигом и в переменной сохраняется только последнее введенное число. И нет команды конца ввода.

 

okta
Offline
Зарегистрирован: 10.01.2015

Нда... Кто вам это сказал? Плюньте ему в глаз. В переменной data хранится введенное число, хоть одно, хоть дву, хоть трехзначное, хоть... на сколько типа integer хватит. Понадобится больше - переделаете переменную в long.

Конец ввода не стал писать специально, но место под обработку обозначил. Его надо писать в строке 44, назначив в качестве ввода одну из нецифровых клавиш. Либо, если число всегда трехзначное, завести счетчик и, после ввода третьей цифры, делать автоматический ввод/обработку числа.

nikvas
Offline
Зарегистрирован: 07.10.2016

Уважаемый "okta" скажите что в вашем коде делают строки:

   if(first){

     if(isDigit(key)){

не могу найти их описание, а использовать в слепую не очень хочется. Ваш код наверно то что надо. 

okta
Offline
Зарегистрирован: 10.01.2015

first - переменная, которую я ввел для проверки, что кнопка была нажата, но еще не отпущена (что бы пока клавишу не отпустят одну и туже цифру несколько раз не записывать). В принципе, этот функционал должен быть в библиотеке, но лезть разбираться не хочется.

isDigit(key)

nikvas
Offline
Зарегистрирован: 07.10.2016

Да, дребезг в библиотеке обрабатывается. Спасибо за ссылку, буду разбираться.

okta
Offline
Зарегистрирован: 10.01.2015

Дребезг как раз таки я отдал на откуп библиотеке. Я имел в виду, что если кнопку нажали и держат, то цифра будет введена один раз, а не сколько раз сработает функция чтения кнопки.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

okta пишет:

Дребезг как раз таки я отдал на откуп библиотеке. Я имел в виду, что если кнопку нажали и держат, то цифра будет введена один раз, а не сколько раз сработает функция чтения кнопки.

Не понимаете вы главного. Это раньше были программы. Введите 1 число, ввели, введите 2 число ввели, посчитали и вывели результат. Если хотите посчитать снова введите 1. Ну и дальше по кругу. Тогда ввод числа имеет смысл. Тем более в таком режиме можно написать функции INKEY() и INPUT().  Но сейчас в моде структуры в виде меню. А значит не удобны такие функции.

ПС: У вас есть кнопки "А","B","C","D". Та вот их можно использовать так "А" - это HOME. Переход в начало меню, "B" - очистка полностью число , то есть =0, "C" это DELETE удаление последнего знака, "D" 'это ENTER-ввод числа который на экране.

nikvas
Offline
Зарегистрирован: 07.10.2016

Большое спасибо!! Все решено. Мне нехватало только одной строчки (сам не смог додуматься)

data=data*10+key-48

Вопрос решен! Всем большое спасибо!!!

Antero
Offline
Зарегистрирован: 13.04.2018

подскажите, а как же сделать из дополнительных клавиш A B - 

1) удаление последнего символа 

2) полное удаление введенных данных

nikvas
Offline
Зарегистрирован: 07.10.2016
   char key = keypad.getKey(); //опрос клавиатуры
     if (key == 'A')
    {
      delay(200); 
      goto Set1;
    }