Клавиатура и реле Arduino

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

Здравствуйте, у меня собрана на Arduino Uno клавиатура 4 на 4 и двух канальный модуль реле. Хочу сделать так, чтобы например я ввел на клавиатуре код 123 и один из каналов реле включился, а если код не верый то канал не включался. Пробывал написать сам, не получилось, не опытен в написании кода. Может кто-то подскажет как это сделать.
 

Этот код отвечате за то, чтобы нажимаемые цифры отображались в COM порте.

#include <Keypad.h> // подключаем нашу библиотеку

const byte ROWS = 4; //число строк у нашей клавиатуры
const byte COLS = 4; //число столбцов у нашей клавиатуры

char hexaKeys[ROWS][COLS] = {
{'1','4','7','*'}, 
{'3','6','9','#'},
{'2','5','8','0'},
{'A','B','C','D'}
}; 

byte rowPins[ROWS] = {3, 2, 10, 0}; //к каким выводам подключаем управление строками
byte colPins[COLS] = {7, 6, 5, 4}; //к каким выводам подключаем управление столбцами


Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup(){
 Serial.begin(9600);
}

void loop(){
char customKey = customKeypad.getKey();
if (customKey) {
Serial.print(customKey);
}

}

 

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

Nekut_Nekut пишет:

Здравствуйте, у меня собрана на Arduino Uno клавиатура 4 на 4 и двух канальный модуль реле. Хочу сделать так, чтобы например я ввел на клавиатуре код 123 и один из каналов реле включился, а если код не верый то канал не включался. Пробывал написать сам, не получилось, не опытен в написании кода. Может кто-то подскажет как это сделать.
 

Этот код отвечате за то, чтобы нажимаемые цифры отображались в COM порте.

#include <Keypad.h> // подключаем нашу библиотеку

const byte ROWS = 4; //число строк у нашей клавиатуры
const byte COLS = 4; //число столбцов у нашей клавиатуры

char hexaKeys[ROWS][COLS] = {
{'1','4','7','*'}, 
{'3','6','9','#'},
{'2','5','8','0'},
{'A','B','C','D'}
}; 

byte rowPins[ROWS] = {3, 2, 10, 0}; //к каким выводам подключаем управление строками
byte colPins[COLS] = {7, 6, 5, 4}; //к каким выводам подключаем управление столбцами


Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup(){
 Serial.begin(9600);
}

void loop(){
char customKey = customKeypad.getKey();
if (customKey) {
Serial.print(customKey);
}

}

Это код работы реле
 

int in1 = 5;              // Указываем, что вывод реле In1, подключен к реле цифровому выводу 5
int in2 = 6;              // Указываем, что вывод реле In2, подключен к реле цифровому выводу 6
 
void setup()
{
 pinMode(in1, OUTPUT);    // Установим вывод 5 как выход
 pinMode(in2, OUTPUT);    // Установим вывод 6 как выход
}
void loop()
{
 digitalWrite(in1, HIGH); // Включаем реле
 delay(2000);             // Ждем 2с
 digitalWrite(in1, LOW);  // Выключаем реле
 delay(2000);             // Ждем 2с
 digitalWrite(in2, HIGH); // Включаем реле
 delay(2000);             // Ждем 2с 
 digitalWrite(in2, LOW);  // Выключаем реле
}

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

^)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Nekut_Nekut пишет:

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

А я вот "Ларису Ивановну хочу". Пробывал подкатить сам, не получилось, не опытен в этих делах. Можете подсказать как это сделать?

anatoli_nik
Offline
Зарегистрирован: 17.01.2019

Как то так, может с ошибками (нету у меня библы <Keypad>):

#include <Keypad.h> // подключаем нашу библиотеку
#define timeWait 1000 //время ожидания нажатие следующей кнопки мС
#define numOfBut 3  //количество символов кода
#define timeOn 1500 //время работы реле мС, если 0 бесконечно

#define in1  5              // Указываем, что вывод реле In1, подключен к реле цифровому выводу 5
#define in2  6             // Указываем, что вывод реле In2, подключен к реле цифровому выводу 6

const byte ROWS = 4; //число строк у нашей клавиатуры
const byte COLS = 4; //число столбцов у нашей клавиатуры
char keyCode[numOfBut];    //массив нажатых кнопок
unsigned long waitPres; //время для следующего нажатия
unsigned long timeIn1On;
unsigned long timeIn2On;
bool in1On;
bool in2On;
byte presCount =0;
const char CODE1 [numOfBut] = {'1','2','3'};  //желаемый код 1
const char CODE2 [numOfBut] = {'4','5','6'};  //желаемый код 2


char hexaKeys[ROWS][COLS] = {
{'1','4','7','*'}, 
{'3','6','9','#'},
{'2','5','8','0'},
{'A','B','C','D'}
}; 

byte rowPins[ROWS] = {3, 2, 10, 0}; //к каким выводам подключаем управление строками
byte colPins[COLS] = {7, 6, 5, 4}; //к каким выводам подключаем управление столбцами


Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup(){
 Serial.begin(9600);
 waitPres=millis();
 pinMode(in1, OUTPUT);
 pinMode(in2, OUTPUT);
 digitalWrite(in1, false);
 digitalWrite(in2, false);
}

void loop(){
char customKey = customKeypad.getKey();

if (customKey&&(presCount<numOfBut)) {     //складываем нажатые кнопки
  keyCode[presCount]=customKey;
  waitPres=millis(); 
  presCount++;
}
if (((customKey==0)&&((millis()-waitPres)>timeWait)&&(presCount!=numOfBut))||(customKey&&(presCount==numOfBut))) //если таймаут или кнопок нажато больше положенного
{
    for(presCount=0; presCount<numOfBut; presCount++)     //чистим буфер
  {
    keyCode[presCount] = 0;
  }
  presCount=0;
}
if (((millis()-waitPres)>=timeWait)&&(presCount==numOfBut))  //по истечении таймаута и если кнопок сколько нужно (чтоб код сложнее подбирать)
{
  if(!in1On)                                        //если еще не включено
  {
    for (presCount=0;presCount<numOfBut;presCount++)  //сравниваем буфер с кодами
    {
      if (keyCode[presCount]==CODE1[presCount])     //если совпадение
      {
        in1On=true;         //разрешаем включение
        timeIn1On=millis(); //запоминаем время включения
      }
      else          //если хоть один не совпал
      {
        in1On=false;  //запрещаем включение
        break;        //линяем из цикла
      }
    }
  }
  if(!in2On)                          //если еще не включено
  {
    for(presCount=0;presCount<numOfBut;presCount++)
    {
      if(keyCode[presCount]==CODE2[presCount])
      {
        in2On=true;
        timeIn2On=millis();
      }
      else
      {
        in2On=false;
        break;
      }
    }
  }
  for(presCount=0; presCount<numOfBut; presCount++)     //чистим буфер
  {
    keyCode[presCount] = 0;
  }
}
if(timeOn!=0)       //если время включения не равно 0
  {
    if((millis()-timeIn1On)>=timeOn)    //когда реле отработало выключаем
    {
      in1On=false;
    }
    if((millis()-time2On)>=timeOn)
    {
      in2On=false;
    }
  }
digitalWrite(in1,in1On);
digitalWrite(in2,in2On);
}

 

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

Спасибо, буду пробовать. 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
Посмотрите еще и на такой вариант для одного блока
КОД для включения РЕЛЕ (1-4-7)--можете сменить
Отключение нажатие любой кнопки
#include <Keypad.h> // подключаем нашу библиотеку

const byte ROWS = 4; //число строк у нашей клавиатуры
const byte COLS = 3; //число столбцов у нашей клавиатуры

int in1 = 8;              // Указываем, что вывод реле In1, подключен к реле цифровому выводу 5
int in2 = 9;              // Указываем, что вывод реле In2, подключен к реле цифровому выводу 6
char shifr1[]={'1','4','7'};// Код - 1-4-7
uint8_t num = 0;

char hexaKeys[ROWS][COLS] = {
  { 'A','0','B' }, 
  { '7','8','9' },
  { '4','5','6' },
  { '1','2','3' }
}; 

byte rowPins[ROWS] = { 3, 2, 10, 4}; //к каким выводам подключаем управление строками
byte colPins[COLS] = { 7, 6, 5}; //к каким выводам подключаем управление столбцами
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup(){
  pinMode(in1, OUTPUT);    // Установим вывод 5 как выход
  //pinMode(in2, OUTPUT);    // Установим вывод 6 как выход
  Serial.begin(9600);
  Serial.print("start");
}

void loop(){
  char customKey = customKeypad.getKey();
  if (customKey) {
    Serial.print(customKey);
    if(customKey == shifr1[num]) num++;
    else num = 0;
  }

  if(num >= 3)digitalWrite(in1, HIGH);
	else digitalWrite(in1, LOW);
}

 

 

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

Всё работает, большое спасибо! Вы очень помогли.

anatoli_nik
Offline
Зарегистрирован: 17.01.2019

Видео в студию!

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

Как завершу проект, обязательно скину

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

Я собираю "Станцию контроля доступа", я так её назвал

Nekut_Nekut
Nekut_Nekut аватар
Offline
Зарегистрирован: 10.02.2018

Ещё такой вопрос, что нужно дописать, чтобы можно было использовать несколько кодов?

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

Не уверен в работе, но пусть лежит

/**/
const byte relay1Pin = 8;              // Указываем, что вывод реле In1, подключен к реле цифровому выводу 5
const byte relay2Pin = 9;              // Указываем, что вывод реле In2, подключен к реле цифровому выводу 6
char Password1[] = "123";/*пароль для 1 реле*/
char Password2[] = "456";/*пароль для 2 реле*/
uint8_t num = 0;
enum state_t {sReady, sOne, sTwo, sThree};
state_t state, state2;
const unsigned long time6s = 6000; //6 секунд
unsigned long past, past2;
void stand(state_t s) {
  past = millis();
  state = s;
  switch (state) {
    case sReady:
      digitalWrite(relay1Pin, LOW);
      break;
    case sOne:
      break;
    case sTwo:
      break;
    case sThree:
      digitalWrite(relay1Pin, HIGH);
      break;
  }
}
void stand2(state_t s) {
  past2 = millis();
  state2 = s;
  switch (state2) {
    case sReady:
      digitalWrite(relay2Pin, LOW);
      break;
    case sOne:
      break;
    case sTwo:
      break;
    case sThree:
      digitalWrite(relay2Pin, HIGH);
      break;
  }
}

#include <Keypad.h> // подключаем нашу библиотеку
const byte ROWS = 4; //число строк у нашей клавиатуры
const byte COLS = 3; //число столбцов у нашей клавиатуры
const char hexaKeys[ROWS][COLS] = {
  { 'A', '0', 'B' },
  { '7', '8', '9' },
  { '4', '5', '6' },
  { '1', '2', '3' }
};
byte rowPins[ROWS] = { 3, 2, 10, 4}; //к каким выводам подключаем управление строками
byte colPins[COLS] = { 7, 6, 5}; //к каким выводам подключаем управление столбцами
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup() {
  pinMode(relay1Pin, OUTPUT);    // Установим вывод 5 как выход
  stand(sReady);
  pinMode(relay2Pin, OUTPUT);    // Установим вывод 6 как выход
  stand2(sReady);
}

void loop() {
  char customKey = customKeypad.getKey();
  if (customKey) {
    switch (state) {
      case sReady:
        if (customKey == Password1[0])stand(sOne);
        else stand(sReady);
        break;
      case sOne:
        if (customKey == Password1[1])stand(sTwo);
        else stand(sReady);
        break;
      case sTwo:
        if (customKey == Password1[2])stand(sThree);
        else stand(sReady);
        break;
      case sThree:
        if (millis() - past >= time6s)stand(sReady);
        break;
    }
    switch (state2) {
      case sReady:
        if (customKey == Password2[0])stand2(sOne);
        else stand2(sReady);
        break;
      case sOne:
        if (customKey == Password2[1])stand2(sTwo);
        else stand2(sReady);
        break;
      case sTwo:
        if (customKey == Password2[2])stand2(sThree);
        else stand2(sReady);
        break;
      case sThree:
        if (millis() - past2 >= time6s)stand2(sReady);
        break;
    }
  }
}
/**/

 

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

Nekut_Nekut пишет:

Ещё такой вопрос, что нужно дописать, чтобы можно было использовать несколько кодов?

Вот на 2 пароля и с выключением по времени. Единственное условие чтобы пароли начинались с разных символов

#include <Keypad.h> // подключаем нашу библиотеку

const byte ROWS = 4; //число строк у нашей клавиатуры
const byte COLS = 3; //число столбцов у нашей клавиатуры

#define in1 9  // вывод реле In1, подключен цифровому выводу 9
#define in2 11 // вывод реле In2, подключен цифровому выводу 10
#define led 8
#define pausa 5000 //Пауза отк. после сработки 5 sek
char sekret_cod1[]={'1','4','7'};// Код - 1-4-7
char sekret_cod2[]={'7','4','1'};
uint8_t num = 0;
uint8_t grup = 0; //Грпа 1я или 2я
uint32_t time; //Засекаем время для сработки

char hexaKeys[ROWS][COLS] = {
  { 'A','0','B' }, 
  { '7','8','9' },
  { '4','5','6' },
  { '1','2','3' }
}; 
//////////////////////////////////////////////////
byte rowPins[ROWS] = { 
  3, 2, 10, 4}; //к каким выводам подключаем управление строками
byte colPins[COLS] = { 
  7, 6, 5}; //к каким выводам подключаем управление столбцами
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup(){
  pinMode(in1, OUTPUT);    // Установим вывод 9 как выход
  pinMode(led, OUTPUT);
  pinMode(in2, OUTPUT);    // Установим вывод 10 как выход
  Serial.begin(9600);
  Serial.println("start");
}

void loop(){
  char customKey = customKeypad.getKey();
  if (customKey) {
    Serial.print(customKey);
    if(!grup) //провер 1й знак чтобы определить каой пароль вводми
    {
      if(customKey == sekret_cod1[num]) grup = 1;
      if(customKey == sekret_cod2[num]) grup = 2;
    }	

    if(grup == 1)
    {
      if(customKey == sekret_cod1[num]) num++;//Правильно
      else {   //Не правильно
        num = 0; 
        grup = 0;
      }
      if(num > 2){ //Все сошлось
        digitalWrite(in1, HIGH); 
        grup = 0; 
        time=millis();
      }
    }

    if(grup == 2)
    {
      if(customKey == sekret_cod2[num]) num++;
      else {
        num = 0; 
        grup = 0;
      }
      if(num > 2){
        digitalWrite(in2, HIGH); 
        grup = 0; 
        time=millis();
      }
    }
  }

  if(millis() - time >= pausa && num > 2)//Время вышло
  {
    num =0;
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
  }
}

 

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

Исправил небольшой глюк. Сброс происходит как по времени так и по нажатию любой кнопки

#include <Keypad.h> // подключаем нашу библиотеку

const byte ROWS = 4; //число строк у нашей клавиатуры
const byte COLS = 3; //число столбцов у нашей клавиатуры

#define in1 9  // вывод реле In1, подключен цифровому выводу 9
#define in2 11 // вывод реле In2, подключен цифровому выводу 10
#define led 8
#define pausa 5000 //Пауза отк. после сработки
char sekret_cod1[]="147";// Код - 1-4-7
char sekret_cod2[]="741";
uint8_t num = 0;
uint8_t grup = 0; //Грпа 1я или 2я
uint32_t time; //Засекаем время для сработки
bool flagON = 0;

char hexaKeys[ROWS][COLS] = {
  { 'A','0','B' }, 
  { '7','8','9' },
  { '4','5','6' },
  { '1','2','3' }
}; 
//////////////////////////////////////////////////
byte rowPins[ROWS] = { 
  3, 2, 10, 4}; //к каким выводам подключаем управление строками
byte colPins[COLS] = { 
  7, 6, 5}; //к каким выводам подключаем управление столбцами
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup(){
  pinMode(in1, OUTPUT);    // Установим вывод 9 как выход
  pinMode(led, OUTPUT);
  pinMode(in2, OUTPUT);    // Установим вывод 10 как выход
  Serial.begin(9600);
  Serial.println("start");
}

void loop(){
  char customKey = customKeypad.getKey();
  if (customKey) {
    Serial.print(customKey);
    if(!grup) //провер 1й знак чтобы определить какой пароль вводим
    {
      if(customKey == sekret_cod1[num]) grup = 1;
      if(customKey == sekret_cod2[num]) grup = 2;
    }	

    if(grup == 1)
    {
      if(customKey == sekret_cod1[num]) num++;//Правильно
      else {   //Не правильно
        num = 0; 
        grup = 0;
        flagON = 0;
        digitalWrite(in1, LOW);
      }
      if(num == 3){ //Все сошлось
        digitalWrite(in1, HIGH); 
        if(!flagON)
        {
          time=millis();
          flagON = 1;
        }
      }
    }

    if(grup == 2)
    {
      if(customKey == sekret_cod2[num]) num++;
      else {
        num = 0; 
        grup = 0;
        flagON = 0;
        digitalWrite(in2, LOW);
      }
      if(num == 3){
        digitalWrite(in2, HIGH); 
        if(!flagON)
        {
          time=millis();
          flagON = 1;
        }
      }
    }
  }

  if(flagON && millis() - time >= pausa)//Время вышло
  {
    grup = 0; 
    num =0;
    flagON = 0;
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
  }
}