Хочу сделать простейший замок, но случилась проблема...

leiz

✩✩✩✩✩✩✩
4 Сен 2019
4
0
Я немного неумело это делаю, новичок все таки. Немного не понимаю в чем дело в данном коде:

C++:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
int n;
char pass[6]={1,1,1,1,1,1};
char check[6] = {0, 0, 0, 0, 0, 0};
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 rowPins[ROWS] = {11,10, 9, 8};
byte colPins[COLS] = {7, 6, 5, 4};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
LiquidCrystal_I2C lcd(0x3F,16,2);
void setup()
{
Serial.begin(9600);
lcd.init();
lcd.backlight();
}
void loop()
{
  lcd.setCursor(1, 0);
  lcd.print("Give me pass.");
  pass[0]="1";
  pass[1]="1";
  pass[2]="1";
  pass[3]="1";
  pass[4]="1";
  pass[5]="1";
   for(int i = 0; i < 6; i++)
   {
      char key = keypad.getKey();
      if (key)
        {
        Serial.println(key);
          Serial.println(pass[key]);
          Serial.println(check[key]);
        check[n]=key;
        lcd.setCursor(n+4, 1);          
        lcd.print(key);
        delay(1000);
        n++;
        if (pass[0]==check[0] && pass[1]==check[1] && pass[2]==check[2] && pass[3]==check[3] && pass[4]==check[4] && pass[5]==check[5] && pass[6]==check[6]){for (int i=1; i <= 20; i++){lcd.print("cong"); delay(200000);}}
        if (n==6){lcd.clear();  lcd.setCursor(1, 0); lcd.print("Give me pass.");n=0; }}
    }}
Я ввожу с клавиатуры 4х4 символы и они появляются на экране, но сравнить массивы данных не выходит, тк вместо массива с паролем почему то рандомные символы лежат постоянно. Я многое перепробовал, но как то ничего не помогло :(
Скорее дело в построение массива и тд, но я как то уже не уверен. На скрине то, что я ввожу с клавиатуры и то, что связано с 1\2\3\4 частью массива с паролем.
Помогите!! Извините за неграмотный код, учусь.
 

Вложения

Последнее редактирование:

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

★★★★★✩✩
14 Авг 2019
1,704
417
Москва
мне не нравиться цикл внутри loop, он или пролетит моментом и не успеешь нажать что то, либо подвесит работу ардуины до нажатия.
вот взять кусок кода из примера
{
char customKey = customKeypad.getKey();
if (customKey){
Serial.println(customKey);
}
считывают клавишу и выводят ее в порт, если она была нажата. если нет, то цикл повторяется.
у вас 6 раз пытается считать клавишу. но надо умудриться ее еще успеть нажать столько раз пока цикл крутиться.

логичнее было бы что то типа в setup сделать

pass[0]="1";
pass[1]="1";
pass[2]="1";
pass[3]="1";
pass[4]="1";
pass[5]="1";
i=0;'

а в loop уже читать символы. и постепенно заполнять их от 1-го к 6-му. т.е. если символ был нажат, то в запомнить и увеличить i
если все символы введены, то совершить проверку

опишите идею алгоритма работы своей версии, может я чего не понял

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

Александр Симонов

★★★✩✩✩✩
2 Авг 2018
514
132
Я ввожу с клавиатуры 4х4 символы и они появляются на экране, но сравнить массивы данных не выходит, тк вместо массива с паролем почему то рандомные символы лежат постоянно. Я многое перепробовал, но как то ничего не помогло :(
Скорее дело в построение массива и тд, но я как то уже не уверен. На скрине то, что я ввожу с клавиатуры и то, что связано с 1\2\3\4 частью массива с паролем.
Помогите!! Извините за неграмотный код, учусь.
У тебя нет понимания, как устроены массивы. Попробуй для начала просмотреть курс Заметки Ардуинщика: https://www.youtube.com/playlist?list=PLgAbBhxTglwmVxDDC5TSYUI91oZ0LZQMw Лучше все уроки, но хотя бы №15
 

leiz

✩✩✩✩✩✩✩
4 Сен 2019
4
0
Сброс ввода был, но когда я обнаружил проблемы, то решил от него избавиться на время и разобраться с основными моментами. Оке, раз такие проблемы монументальные, то лучше курсы посмотрю. Около года не занимался ардуино и все наработки даром пошли, а щас просто с нуля пытаюсь что-то сделать. Всем спасибо! Извините, что отвлек!!