Здравствуйте. Может кто-нибудь подсказать как сделать или переделать мой код, чтобы решить такой вопрос... У нас есть три блока реле по 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); } }
К примеру, взять массив 32-битных целых чисел (24 бита -> состояние 24-х реле). Каждому паролю будет соответствовать свой индекс массива. Дальше, получаете пароль, определяете нужный индекс массива, читаете из массива 32-битное число, согласно значению бит меняете состояние всех реле. Это если не нужно учитывать предыдущее состояние состояние реле.
А хоть какой-нибудь пример можно? Я в программировании не шарю, а если взять какой-то код и переделать, тут ещё куда не шло
Чисто для примера. Могут быть ошибки (на МК не проверял). 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); } }