Управление реле матричной клавиатурой arduino mega

Тема в разделе "Arduino & Shields", создана пользователем UmovistovSport, 14 окт 2020.

  1. Здравствуйте. Может кто-нибудь подсказать как сделать или переделать мой код, чтобы решить такой вопрос...

    У нас есть три блока реле по 8 штук, и того 24 релюшки, все они подключены к цифровым выходам ардуинки мега, так же к ардуинке подключена матричная клава 4x4, стоит задача сделать так, чтобы допустим 10 релюшка открывалась при наборе пароля 52, а 6 релюшка по паролю 11, и так надо чтобы каждая реле открывалась по определённому паролю.

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

    Мой код:
    Код (C++):
    #include <Keypad.h>

    const byte ROWS = 4; // Four rows
    const byte COLS = 4; // Three columns

    char keys[ROWS][COLS] = { // Define the Keymap
      {'1', '4', '7', '*'},               //  здесь мы располагаем названия наших клавиш, как на клавиатуре,для удобства пользования
      {'2', '5', '8', '0'},
      {'3', '6', '9', '#'},
      {'A', 'B', 'C', 'D'}
    };

    byte rowPins[ROWS] = { 5, 4, 3, 2 };// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.

    byte colPins[COLS] = { 9, 8, 7 , 6}; // Connect keypad COL0, COL1 and COL2 to these Arduino pins.

    Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );// Create the Keypad

    #define Uch1Rub0 30
    #define Uch1Rub1 31
    #define Uch1Rub2 32

    void setup()
    {
      pinMode(Uch1Rub0, OUTPUT);
      pinMode(Uch1Rub1, OUTPUT);
      pinMode(Uch1Rub2, OUTPUT);
      Serial.begin(9600);
    }

    void loop()
    {

      // ================ Охранный извещатель - УЧАСТОК № 1 "0" РУБЕЖ ОБНАРУЖЕНИЯ
      char right_pass[] = "A10";
      int N = sizeof(right_pass) / sizeof(char) - 1;
      char *try_pass = new char[N];
      for (int i = 0; i < N;) {
        char key = kpd.getKey();
        if (key) {
          try_pass[i] = key;
          ++i;
        }
      }

      bool correct = true;
      for (int i = 0; i < N; ++i) {
        if (try_pass[i] != right_pass[i]) {
          correct = false;
        }
      }
      delete [] try_pass;

      if (correct)
      {
        digitalWrite(Uch1Rub0, HIGH);
      }

      // =============== Охранный извещатель - УЧАСТОК № 1 "1" РУБЕЖ ОБНАРУЖЕНИЯ
      char right_pass2[] = "A11";
      int N2 = sizeof(right_pass2) / sizeof(char) - 1;
      char *try_pass2 = new char[N2];
      for (int i = 0; i < N2;) {
        char key2 = kpd.getKey();
        if (key2) {
          try_pass2[i] = key2;
          ++i;
        }
      }

      bool correct2 = true;
      for (int i = 0; i < N2; ++i) {
        if (try_pass2[i] != right_pass2[i]) {
          correct2 = false;
        }
      }
      delete [] try_pass2;

      if (correct2)
      {
        digitalWrite(Uch1Rub1, HIGH);
      }

      // =============== Охранный извещатель - УЧАСТОК № 1 "2" РУБЕЖ ОБНАРУЖЕНИЯ
      char right_pass3[] = "A12";
      int N3 = sizeof(right_pass3) / sizeof(char) - 1;
      char *try_pass3 = new char[N3];
      for (int i = 0; i < N3;) {
        char key3 = kpd.getKey();
        if (key3) {
          try_pass3[i] = key3;
          ++i;
        }
      }

      bool correct3 = true;
      for (int i = 0; i < N3; ++i) {
        if (try_pass3[i] != right_pass3[i]) {
          correct3 = false;
        }
      }
      delete [] try_pass3;

      if (correct3)
      {
        digitalWrite(Uch1Rub2, HIGH);
      }

      // ============================== ОТКЛЮЧИТЬ ВСЁ ==============================
      char right_pass50[] = "D";
      int N50 = sizeof(right_pass50) / sizeof(char) - 1;
      char *try_pass50 = new char[N50];
      for (int i = 0; i < N50;) {
        char key50 = kpd.getKey();
        if (key50) {
          try_pass50[i] = key50;
          ++i;
        }
      }

      bool correct50 = true;
      for (int i = 0; i < N50; ++i) {
        if (try_pass50[i] != right_pass50[i]) {
          correct50 = false;
        }
      }
      delete [] try_pass50;

      if (correct50)
      {
        digitalWrite(Uch1Rub0, LOW);
        digitalWrite(Uch1Rub1, LOW);
        digitalWrite(Uch1Rub2, LOW);
      }

    }
     
    Последнее редактирование: 14 окт 2020
  2. fogary

    fogary Гик

    К примеру, взять массив 32-битных целых чисел (24 бита -> состояние 24-х реле). Каждому паролю будет соответствовать свой индекс массива.
    Дальше, получаете пароль, определяете нужный индекс массива, читаете из массива 32-битное число, согласно значению бит меняете состояние всех реле. Это если не нужно учитывать предыдущее состояние состояние реле.
     
  3. А хоть какой-нибудь пример можно? Я в программировании не шарю, а если взять какой-то код и переделать, тут ещё куда не шло ;)
     
  4. fogary

    fogary Гик

    Чисто для примера.
    Могут быть ошибки (на МК не проверял).
    get_password() - функция получения пароля с клавиатуры, предполагается, что возвращает числовое значение.
    Код (C++):
    #define RELAYS_COUNT = 24
    #define PASSWORDS = 2

    // Вместо R1-24 нужно ввести реальные номера портов реле
    int relays_ports[RELAYS_COUNT] = {
      R1, R24, ... R24
      };

    // Порядок: правый бит -> первое реле
    // Состояние: 1 -> реле вкл.; 0 -> реле выкл.
    unsigned long relays_states[PASSWORDS] = {
      0b00000000111100000011000000001111,
      0b00000000111100001111000011110000
      };

    int passwords[PASSWORDS] = {
      1111,
      2222
      };

    . . .

    void switch_relays(unsigned long states);

    void setup(){
      . . .
    }

    void loop(){
      int cur_pass = get_password();
     
      for (int i = 0; i < PASSWORDS; i++){
        if (cur_pass == passwords[i]){
          switch_relays(relays_states[i]);
        }
      }
    }

    void switch_relays(unsigned long states){
      for (int j = 0; j < RELAYS_COUNT; j++){
        int state = (states & (1 << j)) ? 1 : 0;
        digitalWrite(relays_ports[i], state);
      }
    }