Замок.Вывод данных на LCD

BataniQ
Offline
Зарегистрирован: 05.02.2017

Приветствую. Работаю над кодовым замком. Ход мыслей таков.  Есть код который изначально храниться в памяти (например 1111-стартовый всегда одинаковый) если нажата определенная доп клавиша пароль можно изменить, если нажаты клавиши матричной клавиатуры в определенной последовательности (той которая совпадает с паролем) то на определенный пин подается высокий сигнал если нет то ничего не происходит. При этом все действия описываются на дисплее 1602. Хочу написать код но либо команд не знаю либо недопонимаю как они работаю. Написал код и сразу столкнулся с трудностью. Цифра введенная на клавиатуре пишется в 1 столбце 2 строки а последующее нажатие другой цифры просто ее меняет. Как сделать что бы нажатые клавиши двигались по столбцу второй строки соответственно с нажатием? Про пароль пока не прашиваю, пытаюсь пройти все этапы с нуля.

 

#include <LiquidCrystal.h> // Библиотека дисплей
#include <Keypad.h> // Библиотека клавиатуры

LiquidCrystal lcd(A0, A1, A5, A4, A3, A2); // Задаем пины

const byte ROWS = 4; // 4 строки
const byte COLS = 3; // 3 столбца

char keys[ROWS][COLS] =
{
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};
byte rowPins[ROWS] = {2, 3, 4, 5};
byte colPins[COLS] = {6, 7, 8};

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

int relay = 10; // Задаем пины релле

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);                 // Задаем размерность экрана
  lcd.setCursor(5, 0);              // Устанавливаем курсор в начало 1 строки
  lcd.print("Welcom");              // Выводим текст
  lcd.setCursor(3, 1);              // Устанавливаем курсор в начало 2 строки
  lcd.print("Enter Pin");           // Выводим текст
}

void loop() {

  char key = keypad.getKey();
  if (key)
  {
    lcd.clear();                   // Очищаем дисплей если нажата кнопка
    lcd.setCursor(3, 0);           // устанавливаем курсор на 1 строку
    lcd.print("<< PIN >>");        // Пишем ПИН
    lcd.setCursor(0, 1);           // Устанавливаем курсор на 2 строку
    lcd.print(key);                // Выводим цифру нажатую на клавиатуре

  }
}

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Запоминай позицию, в которую надо писать цифру, введённую на клавиатуре. Как только ввели цифру - записал её на дисплей, увеличил позицию на 1.

А ещё лучше, т.к. цифр всего 4 - просто тупо держать массив из четырёх символов, и заполнять его по мере введения цифр с клавиатуры, по факту изменения массива - печатать его на экран.

BataniQ
Offline
Зарегистрирован: 05.02.2017

DIYMan пишет:

Запоминай позицию, в которую надо писать цифру, введённую на клавиатуре. Как только ввели цифру - записал её на дисплей, увеличил позицию на 1.

А ещё лучше, т.к. цифр всего 4 - просто тупо держать массив из четырёх символов, и заполнять его по мере введения цифр с клавиатуры, по факту изменения массива - печатать его на экран.

Цифр может быть и не 4 а любое количество. Просто наиболее часто используют 4. Так что мне подходит первый вариант. Как запонить позицию? Через какой цикл? Если не сложно продемонстрируйте код?

sadman41
Offline
Зарегистрирован: 19.10.2016

BataniQ пишет:

Цифр может быть и не 4 а любое количество. Просто наиболее часто используют 4. Так что мне подходит первый вариант. Как запонить позицию? Через какой цикл? Если не сложно продемонстрируйте код?

Вопрос #1. Что на ваш взгляд означают две цифры в команде lcd.setCursor(0, 1) ?

Вопрос #2. Могут ли быть данный цифры заменены на переменные (подсказка - проведите натурный эксперимент)?

BataniQ
Offline
Зарегистрирован: 05.02.2017

sadman41 пишет:

BataniQ пишет:

Цифр может быть и не 4 а любое количество. Просто наиболее часто используют 4. Так что мне подходит первый вариант. Как запонить позицию? Через какой цикл? Если не сложно продемонстрируйте код?

Вопрос #1. Что на ваш взгляд означают две цифры в команде lcd.setCursor(0, 1) ?

Вопрос #2. Могут ли быть данный цифры заменены на переменные (подсказка - проведите натурный эксперимент)?

Конечно можно заменить на переменные. Это значение столбцов и строк. Вот код с использованием вашей подсказки. Однако результат не меняется вообще. Видимо из-за команды lcd.clear она и не дает переместится на один столбец вперед так как очищает дисплей.

void loop() {
  int x = 0;
  char key = keypad.getKey();      // Считываем нажатое значение
  if (key) {                       // Условие "Если нажата кнопка на клавиатуре"
    lcd.clear();                   // Очищаем дисплей
    lcd.setCursor(3, 0);           // устанавливаем курсор на 1 строку
    lcd.print("<< PIN >>");        // Пишем ПИН
    lcd.setCursor(x, 1);           // Устанавливаем курсор на 2 строку
    lcd.print(key);                // Выводим цифру нажатую на клавиатуре
    lcd.setCursor(x + 1, 1);       // Увеличиваем значение столбца на 1
  }

}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Очищаете вы напрасно, конечно. И x вы так не увеличиваете. Вы просто перепозиционируете курсор LCD на позицию x+1. Обратите внимание на то, что x у вас на каждом loop() обнуляется. Вам нужно объявлять его как глобальную переменную, либо как static, либо внутри лупа делать свой бесконечный цикл (while (true) {} например)

BataniQ
Offline
Зарегистрирован: 05.02.2017

Товарищи прошу прощения. Вообще никак не получается сделать данную операцию. Пробовал и через массив и через переменную записывать результат одинаков. Либо записывается одна цифра либо как в массиве сразу весь массив. причем все значения массива одинаковые. Пробовал вводить глобальную переменную типа char результат такойже. Прошу помощи с кодом если есть возможность конечно.

О да!!! Спасибо всем!!! У меня получилось!!! 

Тему прошу не закрывать ибо вопросы по данному проекту у меня возникнут 100%)))

Вот скетч который у меня получился

#include <LiquidCrystal.h> // Библиотека дисплей
#include <Keypad.h> // Библиотека клавиатуры

LiquidCrystal lcd(A0, A1, A5, A4, A3, A2); // Задаем пины

const byte ROWS = 4; // 4 строки
const byte COLS = 3; // 3 столбца

char keys[ROWS][COLS] =
{
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};
byte rowPins[ROWS] = {2, 3, 4, 5};
byte colPins[COLS] = {6, 7, 8};

Keypad mykeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

int relay = 10; // Задаем пины релле

char myPass[4] = {1, 2, 3, 4};
char keyKlik[] = {};
char button;

void setup() {
  Serial.begin(9600);
  mykeypad.addEventListener(keypadEvent);
  lcd.begin(16, 2);                 // Задаем размерность экрана
  lcd.setCursor(3, 0);              // Устанавливаем курсор в начало 1 строки
  lcd.print("Enter Pin");           // Выводим текст
  lcd.setCursor(0, 1);
}

void loop() {
  char key = mykeypad.getKey();
}
void keypadEvent(KeypadEvent key) {
  switch (mykeypad.getState()) {
    case PRESSED:
    if (key >= '0' && key <= '9'){
      lcd.print(key);
    }
  }
}

 

b707
Онлайн
Зарегистрирован: 26.05.2017

а вы пробовали читать ответ sadman41 - сообщение #5? - там же все уже описано. Или даже эти три строчки непонятны? - тогда лучше вам бросить ардуино, вы тест на IQ не прошли

Ведь вроде все понятно написали...

void loop() {
  static int x = 0;
  char key = keypad.getKey();      // Считываем нажатое значение
  if (key) {                       // Условие "Если нажата кнопка на клавиатуре"
    //lcd.clear();                   // Очищаем дисплей
    lcd.setCursor(3, 0);           // устанавливаем курсор на 1 строку
    lcd.print("<< PIN >>");        // Пишем ПИН
    lcd.setCursor(x, 1);           // Устанавливаем курсор на 2 строку
    lcd.print(key);                // Выводим цифру нажатую на клавиатуре
   x++;       // Увеличиваем значение столбца на 1
  }

}

 

BataniQ
Offline
Зарегистрирован: 05.02.2017

Оооо заговорили бородатые дяди, очевидно, неоднократно, проходившие тест IQ для самоутверждения. Так вот своими ответами именно вы отбиваете все желание чем-либо заниматься. Попрошу не язвить и не тыкать носом, а отвечать по мере поступления вопроса либо не отвечать. Извиняюсь.

BataniQ
Offline
Зарегистрирован: 05.02.2017

Товарищи следующий вопрос не заставил себя долго ждать. Каким образом в мой скетч добавить пароль и сравнивать его с введенными цифрами (при этом должна быть возможность изменять пароль)? Через что это все проще всего сделать (массив) ? Если да то как все это правильно вписать. Вот мой скетч. 

 

#include <LiquidCrystal.h> // Библиотека дисплей
#include <Keypad.h> // Библиотека клавиатуры

LiquidCrystal lcd(A0, A1, A5, A4, A3, A2); // Задаем пины

const byte ROWS = 4; // 4 строки
const byte COLS = 3; // 3 столбца

char keys[ROWS][COLS] =
{
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};
byte rowPins[ROWS] = {3, 4, 5, 6};
byte colPins[COLS] = {7, 8, 9};

Keypad mykeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int button = 2;
int relay = 11; 
int ledRed = 10;
int ledGreen = 12;
int ledOrange = 13;


void setup() {
  Serial.begin(9600);
  mykeypad.addEventListener(keypadEvent);
  lcd.begin(16, 2);                 // Задаем размерность экрана
  lcd.setCursor(0, 0);              // Устанавливаем курсор в начало 1 строки
  lcd.print("HelLo Enter Pin");           // Выводим текст
  lcd.setCursor(0, 1);
  pinMode(ledRed, OUTPUT);
  pinMode(ledGreen, OUTPUT);
  pinMode(ledOrange, OUTPUT);
  pinMode(button, INPUT);
  pinMode(relay, OUTPUT);

}

void loop() {
  char key = mykeypad.getKey();
}
void keypadEvent(KeypadEvent key) {
  switch (mykeypad.getState()) {
    case PRESSED:
      if (key >= '0' && key <= '9') {
        lcd.print(key);
      }
      if (key == '#') {
        lcd.clear();
        lcd.setCursor(3, 0);
        lcd.print("Enter Pin");
        lcd.setCursor(0, 1);
      }
  }
}

 

b707
Онлайн
Зарегистрирован: 26.05.2017

Введенные символы складывать в массив, пароль в программе тоже хранить в массиве. Как только кол-во введенных символов достигнет нужной длины - сравниваем два массива между собой.

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну или можно хранить в виде p = a + b*10 + c*100 + d*1000 

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

b707
Онлайн
Зарегистрирован: 26.05.2017

sadman41 пишет:

Ну или можно хранить в виде p = a + b*10 + c*100 + d*1000 

 

в цифровом виде довольно трудно отрабатывать лидирующие нули.

BataniQ
Offline
Зарегистрирован: 05.02.2017

Как создать динамический массив? т.е. у массива не определен размер и не опроеделены элементы. И да прои присвоении массиву значения "key" ничего не получается. 

b707
Онлайн
Зарегистрирован: 26.05.2017

BataniQ пишет:

Как создать динамический массив? т.е. у массива не определен размер и не опроеделены элементы. И да прои присвоении массиву значения "key" ничего не получается. 

В Си, в общем-то -нет динамических массивов. А  зачем вам динамический? -у вас же длина пароля заранее известна, значит больше символов и хранить незачем.

Одиночное значение массиву не присваивают. Одиночное значение нужно присваивать элементу массива, например так

massiv[0] = key;

Только не говорите, что вы и про массивы ничего не знаете. Если да - то сначала возьмите любую ссылку по Си в инете и прочитайте соответсвующий раздел

BataniQ
Offline
Зарегистрирован: 05.02.2017

В том и дело что прочитав все что возможно я заметил что нигде нет дирамических массивов. Спсибо.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

искаропки - нет. Но можно самому написать. 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

BataniQ пишет:

В том и дело что прочитав все что возможно я заметил что нигде нет дирамических массивов. Спсибо.

Где это - нигде? А это что - уд собачий?

char* dynamicArrayOfChar = new char[20];


delete [] dynamicArrayOfChar;

 

b707
Онлайн
Зарегистрирован: 26.05.2017

DIYMan пишет:

Где это - нигде? А это что - уд собачий?

char* dynamicArrayOfChar = new char[20];


delete [] dynamicArrayOfChar;

 

да разве это динамический? - не видал ты, похоже, динамических массивов. Динамический - это который сам прямо в ходе выполнения программы подстраивает свой размер под размер данных. То есть, в начале программы  создаешь массив, скажем, на 10 элементов, потом кладешь туда 20 или 100 значений - и все работает! Ближайший аналог - класс String

Таким образом устроены массивы, например, в Перле.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

b707 пишет:

DIYMan пишет:

Где это - нигде? А это что - уд собачий?

char* dynamicArrayOfChar = new char[20];


delete [] dynamicArrayOfChar;

 

да разве это динамический? - не видал ты, похоже, динамических массивов. Динамический - это который сам прямо в ходе выполнения программы подстраивает свой размер под размер данных. То есть, в начале программы  создаешь массив, скажем, на 10 элементов, потом кладешь туда 20 или 100 значений - и все работает! Ближайший аналог - класс String

Таким образом устроены массивы, например, в Перле.

Ты меня потроллить решил, что ли? :) Есть кучу реализаций того же vector, я даже больше скажу - есть stl для дуньки - юзай не хочу, там кучу всего. Нету блин, динамических массивов, и всё тут :) Мозгов и желания подучиться нет у пишущих подобную чушь (это я не к тебе, если что) - вот чего нету. А остальное - всё уже давно есть.

b707
Онлайн
Зарегистрирован: 26.05.2017

DIYMan пишет:

Ты меня потроллить решил, что ли? :) Есть кучу реализаций того же vecto....

ну как тут без троллинга :)

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну, вообще-то Ардуина - это не С, а С++. 

И vector - он уже есть, его писать не надо.

BataniQ
Offline
Зарегистрирован: 05.02.2017

Господа не могу правильно сформировать код для последовательно добавления введенных чисел в  массив. Помогите кто совето а кто примером кода.))) Спасибо. 

Вот код который у меня получился последний. Все мои дейсвия останавливаются на  66 ходе.

#include <LiquidCrystal.h> // Библиотека дисплей
#include <Keypad.h> // Библиотека клавиатуры

LiquidCrystal lcd(A0, A1, A5, A4, A3, A2); // Задаем пины

const byte ROWS = 4; // 4 строки
const byte COLS = 3; // 3 столбца

char keys[ROWS][COLS] =
{
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};
byte rowPins[ROWS] = {3, 4, 5, 6};
byte colPins[COLS] = {7, 8, 9};

Keypad mykeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

int button = 2;
int relay = 11;
int ledRed = 10;
int ledGreen = 12;
int ledOrange = 13;

char mypass1[] = {2, 2, 2, 2};
char mypass2[] = {0, 0, 0, 0};
void setup() {
  Serial.begin(9600);
  mykeypad.addEventListener(keypadEvent);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("HelLo Enter Pin");
  lcd.setCursor(0, 1);
  pinMode(ledRed, OUTPUT);
  pinMode(ledGreen, OUTPUT);
  pinMode(ledOrange, OUTPUT);
  pinMode(button, INPUT);
  pinMode(relay, OUTPUT);
  digitalWrite(ledRed, HIGH);
}

void loop() {
  char key = mykeypad.getKey();
}
void keypadEvent(KeypadEvent key) {
  switch (mykeypad.getState()) {
    case PRESSED:
      int n = 0;  // обозначаем переменную порядковый номер числа в массиве
      if (key >= '0' && key <= '9') { // нажаты кнопки от 0 до 9 то
        mypass2[n] = key;           // записываем его в массив порядковый номер n
        lcd.print(key);     // печатаем нажатое число
        n = n + 1; // добавляем к порядковому номеру 1
        if (n > 3) { // если Н больше 3 то
          n = 0; // Н равно 0
        }
        if (mypass1[0] == mypass2[0] && mypass1[1] == mypass2[1] && mypass1[2] == mypass2[2] && mypass1[3] == mypass2[3]) {
          lcd.clear();
          lcd.setCursor(4, 0);
          lcd.print("Open DOOR");
        }
        else {
          lcd.clear();
          lcd.setCursor(5, 0);
          lcd.print("NO DOOR");
          delay(1000);
        }
      }
  }
  if (key == '#') {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("HelLo Enter Pin");
    lcd.setCursor(0, 1);
  }
}



 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

DetSimen пишет:

искаропки - нет. Но можно самому написать. 

по типу стека?

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

ua6em пишет:

DetSimen пишет:

искаропки - нет. Но можно самому написать. 

по типу стека?

нет. стек - это как магазин в Калаше, чтоб достать первый патрон, надо вытащить все остальные. Массив подразумевает возможность вытащить любой патрон, не трогая другие. Как в револьвере, примерно. 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

BataniQ пишет:

Господа не могу правильно сформировать код для последовательно добавления введенных чисел в  массив. Помогите кто совето а кто примером кода.))) Спасибо. 

у меня получился последний. Все мои дейсвия останавливаются на  66 ходе.

Программа написана канешно жесть и делай тормозит смену цыфр, Попробуйте так, должно исключить делай пока не наберете ввесь масив

#include <LiquidCrystal.h> // Библиотека дисплей
#include <Keypad.h> // Библиотека клавиатуры

LiquidCrystal lcd(A0, A1, A5, A4, A3, A2); // Задаем пины

const byte ROWS = 4; // 4 строки
const byte COLS = 3; // 3 столбца

char keys[ROWS][COLS] =
{
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};
byte rowPins[ROWS] = {3, 4, 5, 6};
byte colPins[COLS] = {7, 8, 9};

Keypad mykeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

int button = 2;
int relay = 11;
int ledRed = 10;
int ledGreen = 12;
int ledOrange = 13;
bool f_n; //add

char mypass1[] = {2, 2, 2, 2};
char mypass2[] = {0, 0, 0, 0};
void setup() {
  Serial.begin(9600);
  mykeypad.addEventListener(keypadEvent);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("HelLo Enter Pin");
  lcd.setCursor(0, 1);
  pinMode(ledRed, OUTPUT);
  pinMode(ledGreen, OUTPUT);
  pinMode(ledOrange, OUTPUT);
  pinMode(button, INPUT);
  pinMode(relay, OUTPUT);
  digitalWrite(ledRed, HIGH);
}

void loop() {
  char key = mykeypad.getKey();
}
void keypadEvent(KeypadEvent key) {
  switch (mykeypad.getState()) {
    case PRESSED:
      int n = 0;  // обозначаем переменную порядковый номер числа в массиве
      if (key >= '0' && key <= '9') { // нажаты кнопки от 0 до 9 то
        mypass2[n] = key;           // записываем его в массив порядковый номер n
        lcd.print(key);     // печатаем нажатое число
        n = n + 1; // добавляем к порядковому номеру 1
        if (n > 3) { // если Н больше 3 то
          n = 0; // Н равно 0
          f_n = 1;
        }
        if (f_n)//add
        {
          if (mypass1[0] == mypass2[0] && mypass1[1] == mypass2[1] && mypass1[2] == mypass2[2] && mypass1[3] == mypass2[3]) {
          lcd.clear();
          lcd.setCursor(4, 0);
          lcd.print("Open DOOR");
        }
        else {
          lcd.clear();
          lcd.setCursor(5, 0);
          lcd.print("NO DOOR");
          delay(1000);
         }
         f_n = 0;//add
        }
        
      }
  }
  if (key == '#') {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("HelLo Enter Pin");
    lcd.setCursor(0, 1);
  }
}


 

BataniQ
Offline
Зарегистрирован: 05.02.2017

Я конечно извеняюсь но я ничего не понял)))

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

BataniQ пишет:

Я конечно извеняюсь но я ничего не понял)))

Залейте код и попробуйте. У меня проверить не на чем!

BataniQ
Offline
Зарегистрирован: 05.02.2017

vosara пишет:

BataniQ пишет:

Я конечно извеняюсь но я ничего не понял)))

Залейте код и попробуйте. У меня проверить не на чем!

Ничего не присходит. Только цифры на дисплей выводятся. Не сравнивает.

У меня главный вопрос как последовательно заполнить массив цифрами введенными на клавиатуре?

qwone
qwone аватар
Онлайн
Зарегистрирован: 03.07.2016

BataniQ пишет:
У меня главный вопрос как последовательно заполнить массив цифрами введенными на клавиатуре?
Разумеется последовательно по одной. 

BataniQ
Offline
Зарегистрирован: 05.02.2017

А как это написать кодом  и   в каком месте? То что разумеется последовательно я понимаю.

qwone
qwone аватар
Онлайн
Зарегистрирован: 03.07.2016

Прежде чем садится писать код надо 1 - внятно написать (переписать ТЗ) и 2- нарисовать проект программы. А вы сразу дернулись за 3- написать код и 4 -залить скетч и увидеть хрень. Пока вы не нормально нарисуете проект, то здесь на форуме у вас будет только треп не о чем. И ввод с клавиатуры должен быть похож на ввод с Serial.

sadman41
Offline
Зарегистрирован: 19.10.2016

Я думал, что "индусский код" методом копипасты - это самое дно. Однако нет, есть еще программирование методом "выклянчивание"...

Green
Offline
Зарегистрирован: 01.10.2015

Выкляничивание - всего лишь нащупывание дна.)

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

BataniQ пишет:

А как это написать кодом  и   в каком месте? То что разумеется последовательно я понимаю.

Намой взгляд Вам надо решить 2е проблемы.

1) АНТИДРЕБЕЗГ - я не видел канешно библиотеки, если там  встроен, тогда отпадаед.

2) Вы нажали кнопку - записали значение и надо дождаться ее ОТПУКАНИЯ и только после этого при нажатии кнопки писать следующее значение.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

DetSimen пишет:

ua6em пишет:

DetSimen пишет:

искаропки - нет. Но можно самому написать. 

по типу стека?

нет. стек - это как магазин в Калаше, чтоб достать первый патрон, надо вытащить все остальные. Массив подразумевает возможность вытащить любой патрон, не трогая другие. Как в револьвере, примерно. 

Ааа! А я по не знанию вычислял нужный элемент в стеке и вытягивал ))) на интеле (SS)

 

BataniQ
Offline
Зарегистрирован: 05.02.2017

ТОварищи не могу понять принципа записи в массив!!! Как он записывает ?

После нажатия на первую же кнопку выскакивает 59 строка... В чем ошибка вроде последовательно пробую вписывать данные в массив. Перечитал кучу инфы а результат нулевой. В чем ошибка? 

#include <LiquidCrystal.h> // Библиотека дисплей
#include <Keypad.h> // Библиотека клавиатуры

LiquidCrystal lcd(A0, A1, A5, A4, A3, A2); // Задаем пины

const byte ROWS = 4; // 4 строки
const byte COLS = 3; // 3 столбца

char keys[ROWS][COLS] =
{
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};
byte rowPins[ROWS] = {3, 4, 5, 6};
byte colPins[COLS] = {7, 8, 9};

Keypad mykeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

int button = 2;
int relay = 11;
int ledRed = 10;
int ledGreen = 12;
int ledOrange = 13;

char PIN[] = {'2', '2', '2', '2'};
char KLIK[4] = {};
char num = 0;

void setup() {
  Serial.begin(9600);
  mykeypad.addEventListener(keypadEvent);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("HelLo Enter Pin");
  lcd.setCursor(0, 1);
  pinMode(ledRed, OUTPUT);
  pinMode(ledGreen, OUTPUT);
  pinMode(ledOrange, OUTPUT);
  pinMode(button, INPUT);
  pinMode(relay, OUTPUT);
  digitalWrite(ledRed, HIGH);
}

void loop() {
  char key = mykeypad.getKey();
}

void correctPIN() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Open door");
}

void incorrectPIN() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("NO Open door");
}

void keypadEvent(KeypadEvent key) {
  switch (mykeypad.getState()) {
    case PRESSED:
      if (key >= '0' && key <= '9') { // нажаты кнопки от 0 до 9 то
        KLIK[num] = {key};
        lcd.print(key);     // печатаем нажатое число
        num++;
        if (num == 3 && PIN[0] == KLIK[0] && PIN[1] == KLIK[1] && PIN[2] == KLIK[2] && PIN[3] == KLIK[3] ) {
          correctPIN();
        }
        else {
          incorrectPIN();
        }
      }
  }

  if (key == '#') {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("HelLo Enter Pin");
    lcd.setCursor(0, 1);
  }
}



 

b707
Онлайн
Зарегистрирован: 26.05.2017

BataniQ пишет:

 

После нажатия на первую же кнопку выскакивает 59 строка... В чем ошибка вроде последовательно

Никакой ошибки - так у вас написано в скетче. Смотрите условие в 69 строке: если число введенных цифр такое, как в пароле - вы сравниваете введенное с паролем. А иначе (например введена только одна цифра)- пишете "Инкоррект ПИН".

вам надо СНАЧАЛА должлаться ввода 4х цифр, а потом сравнивать с паролем.

 

BataniQ
Offline
Зарегистрирован: 05.02.2017

b707 пишет:

BataniQ пишет:

 

После нажатия на первую же кнопку выскакивает 59 строка... В чем ошибка вроде последовательно

Никакой ошибки - так у вас написано в скетче. Смотрите условие в 69 строке: если число введенных цифр такое, как в пароле - вы сравниваете введенное с паролем. А иначе (например введена только одна цифра)- пишете "Инкоррект ПИН".

вам надо СНАЧАЛА должлаться ввода 4х цифр, а потом сравнивать с паролем.

 

О да радуюсь как младенец))))) Все получилось!!! Отлично.... Спасибо за помощь!!! 

Тему не закрывайте ибо вопросы возникнут с возможностью изменения пороля....

А вот код который получился  у меня и все стало работать...

void keypadEvent(KeypadEvent key) {
  switch (mykeypad.getState()) {
    case PRESSED:
      if (key >= '0' && key <= '9') { // нажаты кнопки от 0 до 9 то
        delay(100);
        KLIK[num] = key;
        lcd.print(key);     // печатаем нажатое число
        num++;
        if (num == 4) {
          if ( PIN[0] == KLIK[0] && PIN[1] == KLIK[1] && PIN[2] == KLIK[2] && PIN[3] == KLIK[3]) {
            correctPIN();
            num = 0;
          }
          else {
            incorrectPIN();
            num = 0;
          }

        }
      }
  }

 

BataniQ
Offline
Зарегистрирован: 05.02.2017

ПОдскожите как можно реализовать изменение пин кода через нажатие дополнительной тактовой кнопки? В какой цикл долна быть вписана данная команда? 

b707
Онлайн
Зарегистрирован: 26.05.2017

BataniQ пишет:

ПОдскожите как можно реализовать изменение пин кода через нажатие дополнительной тактовой кнопки? В какой цикл долна быть вписана данная команда? 

это не команда, а целая подпрограмма. При переходе в режим смены ПИН-кода вам снова нужно принять от пользователя 4 кнопки, а потом подтверждение - еще раз 4 кнопки. Если оба введенных кода совпали - тогда меняем ПИН, иначе - оставляем старый.

kalapanga
Offline
Зарегистрирован: 23.10.2016

sadman41 пишет:

Я думал, что "индусский код" методом копипасты - это самое дно. Однако нет, есть еще программирование методом "выклянчивание"...

А вот в этой теме Кодовый замок доработка скетча товарищ уже недели полторы назад заявил, что во всём сам разобрался. Я уж думал у меня дежавю с этими замками, ан нет - новая тема старого автора. Так ведь скетч и выжмет :)

BataniQ
Offline
Зарегистрирован: 05.02.2017

Алгоритм мне понятен - Идет опрос клавиатуры если нажаты кнопки записываем их в массив а затем сравниваем два массива (это то что касается проверки пароля и открытия) а вот то что косается изменения стандартного пароля мне представляется так. Если на 2-м пине появился высокий уровень то переходим в цикл опроса клавиатуры тем самым введенные значения записываем в массив стандартного пароля завершаем цикл. Вся суть проблемы заключается в том - В каком цикле должен происходить опрос доп кнопки? Пробовал вписывать опрос доп клавиши в  92 строке. Но тогда при нажатии любой клавиши на  keypad появляется строка изменения пароля.

#include <LiquidCrystal.h> // Библиотека дисплей
#include <Keypad.h> // Библиотека клавиатуры

LiquidCrystal lcd(A0, A1, A5, A4, A3, A2); // Задаем пины

const byte ROWS = 4; // 4 строки
const byte COLS = 3; // 3 столбца

char keys[ROWS][COLS] =
{
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};
byte rowPins[ROWS] = {3, 4, 5, 6};
byte colPins[COLS] = {7, 8, 9};

Keypad mykeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

int button = 2;
int relay = 11;
int ledRed = 10;
int ledGreen = 12;
int ledOrange = 13;

char PIN[] = {'2', '2', '2', '2'};
char KLIK[4] = {};
char num = 0;

void setup() {
  Serial.begin(9600);
  mykeypad.addEventListener(keypadEvent);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("HelLo Enter Pin");
  lcd.setCursor(0, 1);
  pinMode(ledRed, OUTPUT);
  pinMode(ledGreen, OUTPUT);
  pinMode(ledOrange, OUTPUT);
  pinMode(button, INPUT);
  pinMode(relay, OUTPUT);
  digitalWrite(relay, HIGH);
  digitalWrite(ledRed, HIGH);
}

void loop() {
  char key = mykeypad.getKey();
}

void correctPIN() {
  lcd.clear();
  lcd.setCursor(4, 0);
  lcd.print("Open door");
  digitalWrite(ledRed, LOW);
  digitalWrite(ledGreen, HIGH);
}

void incorrectPIN() {
  lcd.clear();
  lcd.setCursor(2, 0);
  lcd.print("NO Open door");
}

void keypadEvent(KeypadEvent key) {
  switch (mykeypad.getState()) {
    case PRESSED:
      if (key >= '0' && key <= '9') {
        lcd.print(key);
        delay(300);
        KLIK[num] = key;
        num++;
        if (num == 4) {
          if ( PIN[0] == KLIK[0] && PIN[1] == KLIK[1] && PIN[2] == KLIK[2] && PIN[3] == KLIK[3]) {
            correctPIN();
            num = 0;
          }
          else {
            incorrectPIN();
            num = 0;
          }
        }
      }
  }
  if (key == '#') {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("HelLo Enter Pin");
    lcd.setCursor(0, 1);
    digitalWrite(ledRed, HIGH);
    digitalWrite(ledGreen, LOW);
  }
}





 

sadman41
Offline
Зарегистрирован: 19.10.2016

У вас тут вообще кроме loop() нет циклов. К чему вопрос о выборе?

Раз цикл один, то и проблемы нет!

BataniQ
Offline
Зарегистрирован: 05.02.2017

sadman41 пишет:

У вас тут вообще кроме loop() нет циклов. К чему вопрос о выборе?

Раз цикл один, то и проблемы нет!

В цикле луп я буду проверять состояние доп кнопки и если оно изменилось то мне нужно создать второй void keypadEvent(KeypadEvent key). Я правильно понял?