ARDUINO Функции, массивы и электронный замок. Помогите.

leiz

✩✩✩✩✩✩✩
4 Сен 2019
4
0
Небольшая проблема на пути великого (первого) проекта.
В общем, я решил сделать электронный замок, но не понимаю как разобраться с 2 моментами, которые возникли.

1. Функция, как я понимаю, не видит массив мой, хотя он глобально задан.
Но также, если его объявить внутри функции оказывается, что getKey() тоже не работает, потому что оно не объявлено внутри функции. Как это работает? Я вроде просмотрел многие уроки и форумы, но подробнее про работу функций\массивов не нашел, только обрывки на итальянских форумах. Не знаю, может в моем понимание проблема, но можете помочь разобраться с этим?

2. С клавиатуры возвращается char, а мне ведь нужен int. Я вроде бы видел как это делать, просто прописывать к переменной -'0', но сработает ли это в данном случае? Я вот не уверен. Ну там конечно надо учесть, что у меня может быть нажата кнопка A/B/C/D, но мне сейчас просто разобраться бы с этим.

Надеюсь в этот раз получится...
Я начинающий, как видите, так что может это вовсе не проблемы. Я просто не нашел их решение и решил обратиться, вот.
Спасибо.


C++:
#include <TroykaButton.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>


int Pass [8];                                                                //Массивы для проверки.
int Check [8];

LiquidCrystal_I2C lcd(0x3F,16,2);                                             //Экран.

TroykaButton button(13);                                                      //Кнопка.

const byte ROWS = 4;                                                          //Клавиатура.
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte colPins[COLS] = {7, 6, 5, 4};
byte rowPins[ROWS] = {11,10, 9, 8};                                         
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );



void setup() {
Serial.begin(9600);
button.begin();
lcd.init();
lcd.backlight();
Pass [0]=1; Pass [1]=1; Pass [2]=1; Pass [3]=1; Pass [4]=1; Pass [5]=1; Pass [6]=1; Pass [7]=1;
TroykaButton button(13);
}



void loop() {

 
   button.read();   
   if (button.isHold())                       {
                                              Serial.println("Key on long press");
                                              boolean Checking = pass_check ();
                                              if (Checking == 1) {Serial.println("Verno");} else {Serial.println("Neverno");}
                                              }
            

 
}

boolean pass_check ()                                         //Должно проверить и вернуть логическое значение в зависимости от результата проверки введенных значений.
 {int Number = 0;
  for(int i = 0; i < 9; i++)    {pass[i] = getKey();}
  for(int i = 0; i < 9; i++)    {if (Pass[i]==Check[i]){Number=Number+1;}}
  If (Number == 8)              {return 1;} else {return 0;}
  }
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
у тебя в цикле loop идет обработка только одного события - удерживание кнопки, после чего идет проверка корректности пароля. а как он вводится ?
И вместо if (Checking == 1) достаточно написать if (pass_check ())
 

leiz

✩✩✩✩✩✩✩
4 Сен 2019
4
0
у тебя в цикле loop идет обработка только одного события - удерживание кнопки, после чего идет проверка корректности пароля. а как он вводится ?
И вместо if (Checking == 1) достаточно написать if (pass_check ())
Вводится в функции pass_check() при помощи getKey(). getKey() я взял из библиотеки Keypad.h.
Насколько я понимаю все должно происходить так:
После длительного нажатия на кнопку начинается проверка функции на значение 1\0, но тк внутри самой функции лежит массив принимающий вводимые значения, то после длительного нажатия надо будет ввести все значения массива и после этого уже будет выполнена проверка, которая выдаст verno\neverno.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
посмотри тут https://radioprog.ru/post/146

for(int i = 0; i < 9; i++) {pass = getKey();
на сколько я понял функция getKey() не приостанавливает работу программы для ожидания ввода клавиш , соотв. опять же, успел за "6 секунд" ввести пароль - молодец, не успел , сам виноват.