Я хочу иметь отдельные коды доступа к клавиатуре, чтобы загораться 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; // добавляем новый символ в строку ввода пароля
    }
  }
}

, 👍0

Обсуждение

каков твой вопрос?, @jsotola

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


2 ответа


-1

Напишите 3 функции: одну для получения пароля, одну для запуска двигателя постоянного тока, одну для управления светодиодом. Теперь в функции для получения пароля используйте массив из 4 байт для хранения пароля и кнопку «х» для очистки массива. Функция должна запустить цикл for для получения всех 4 цифр и символа "x" key должен разорвать цикл и очистить массив. Вы можете написать функцию драйвера RGB и двигателя в соответствии с вашими потребностями. В основном цикле вы должны получить пароль, а затем обработать этот пароль для запуска RGB или двигателя с использованием условия if-else. По любым дополнительным вопросам не стесняйтесь уточнять.

,

2

В этой программе функции 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() должны быть маленькими функции, которые выполняют срабатывание устройства и ничего более. Они не беспокойтесь о клавиатуре или пароле.

,