Клавиатура и реле Arduino
- Войдите на сайт для отправки комментариев
Сб, 19/01/2019 - 14:33
Здравствуйте, у меня собрана на 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);
}
}
Здравствуйте, у меня собрана на 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); // Выключаем реле }^)
Хочу сделать так, чтобы например я ввел на клавиатуре код 123 и один из каналов реле включился, а если код не верый то канал не включался. Пробывал написать сам, не получилось, не опытен в написании кода. Может кто-то подскажет как это сделать.
А я вот "Ларису Ивановну хочу". Пробывал подкатить сам, не получилось, не опытен в этих делах. Можете подсказать как это сделать?
Как то так, может с ошибками (нету у меня библы <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); }Спасибо, буду пробовать.
#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); }Всё работает, большое спасибо! Вы очень помогли.
Видео в студию!
Как завершу проект, обязательно скину
Я собираю "Станцию контроля доступа", я так её назвал
Ещё такой вопрос, что нужно дописать, чтобы можно было использовать несколько кодов?
Не уверен в работе, но пусть лежит
/**/ 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; } } } /**/Ещё такой вопрос, что нужно дописать, чтобы можно было использовать несколько кодов?
Вот на 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); } }Исправил небольшой глюк. Сброс происходит как по времени так и по нажатию любой кнопки
#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); } }