Я хочу иметь отдельные коды доступа к клавиатуре, чтобы загораться RGB и запускать двигатель постоянного тока в одном коде. 6113 для RGB и 4613 для двигателя постоянного тока
#include <Keypad.h>
const int ROW_NUM = 4; //четыре строки
const int COLUMN_NUM = 3; //три столбца
const int PIN_RED = 2;
const int PIN_GREEN = 3;
const int PIN_BLUE = 4;
const int MOTOR_PIN1 = 5;
const int MOTOR_PIN2 = 13;
char keys[ROW_NUM][COLUMN_NUM] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte pin_rows[ROW_NUM] = {12, 11, 10, 9};
byte pin_column[COLUMN_NUM] = {8, 7, 6};
Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );
const String password_1 = "6113";
const String password_2 = "4613";
String input_password;
void setup(){
Serial.begin(9600);
input_password.reserve(32); // максимальное количество вводимых символов 33, при необходимости измените
}
void loop(){
loop_RGB();
loop_DCMOTOR();
}
void loop_RGB(){
char key = keypad.getKey();
if (key){
Serial.println(key);
if(key == '*') {
input_password = ""; // сбросить введенный пароль
} else if(key == '#') {
if(input_password == password_1) {
Serial.println("password is correct");
analogWrite(PIN_RED, 255);
analogWrite(PIN_GREEN, 0);
analogWrite(PIN_BLUE, 0);
delay(1000); // сохраняем цвет 1 секунду
analogWrite(PIN_RED, 0);
analogWrite(PIN_GREEN, 255);
analogWrite(PIN_BLUE, 0);
delay(1000); // сохраняем цвет 1 секунду
analogWrite(PIN_RED, 0);
analogWrite(PIN_GREEN, 0);
analogWrite(PIN_BLUE, 255);
delay(1000);
} else {
Serial.println("password is incorrect, try again");
}
input_password = ""; // сбросить введенный пароль
} else {
input_password += key; // добавляем новый символ в строку ввода пароля
}
}
}
void loop_DCMOTOR(){
char key = keypad.getKey();
if (key){
Serial.println(key);
if(key == '*') {
input_password = ""; // сбросить введенный пароль
} else if(key == '#') {
if(input_password == password_2) {
Serial.println("password is correct");
digitalWrite(MOTOR_PIN1, HIGH);
digitalWrite(MOTOR_PIN2, LOW);
delay (3000);
} else {
Serial.println("password is incorrect, try again");
}
input_password = ""; // сбросить введенный пароль
} else {
input_password += key; // добавляем новый символ в строку ввода пароля
}
}
}
@Aled Zurc, 👍0
Обсуждение2 ответа
Напишите 3 функции: одну для получения пароля, одну для запуска двигателя постоянного тока, одну для управления светодиодом. Теперь в функции для получения пароля используйте массив из 4 байт для хранения пароля и кнопку «х» для очистки массива. Функция должна запустить цикл for для получения всех 4 цифр и символа "x" key должен разорвать цикл и очистить массив. Вы можете написать функцию драйвера RGB и двигателя в соответствии с вашими потребностями. В основном цикле вы должны получить пароль, а затем обработать этот пароль для запуска RGB или двигателя с использованием условия if-else. По любым дополнительным вопросам не стесняйтесь уточнять.
В этой программе функции loop_RGB()
и loop_DCMOTOR()
по очереди пытаются прочитать пароль. Если вы нажмете #
после ввода
пароль для светодиода, и loop_DCMOTOR()
считывает ваш
нажмите клавишу, он сообщит вам, что пароль неверен, и сбросит то, что вы
напечатали.
Как уже говорилось в комментарии и ответе, решение состоит в том, чтобы прочитать клавиатура только в одном месте. Вы можете написать специальную функцию для это, но вместо этого я просто поместил бы этот код в цикл:
void loop() {
char key = keypad.getKey();
if (key) {
Serial.print("key pressed: ");
Serial.println(key);
if (key == '*') { // '*' означает сброс ввода
input_password = "";
} else if (key == '#') { // '#' означает подтверждение ввода
if (input_password == password_1) {
Serial.println("Corect RGB LED password.");
actuate_LED();
} else if (input_password == password_2) {
Serial.println("Corect motor password.");
actuate_motor();
} else {
Serial.println("Incorrect password.");
}
input_password = ""; // сбросить ввод
} else {
input_password += key; // добавляем новый символ
}
}
}
Здесь actuate_LED()
и actuate_motor()
должны быть маленькими
функции, которые выполняют срабатывание устройства и ничего более. Они не
беспокойтесь о клавиатуре или пароле.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
каков твой вопрос?, @jsotola
код клавиатуры не должен быть частью кода светодиода или кода двигателя... код клавиатуры должен быть полностью отдельным... он должен просто обновлять значение переменной в зависимости от введенного кода... код двигателя и код светодиода должны просто контролировать значение переменной и работать соответственно, @jsotola