как убрать ложное срабатывание после ввода разблокирующей комбинации
- Войдите на сайт для отправки комментариев
Ср, 03/02/2021 - 17:51
Доброго времени суток!
Есть задача управлять неким устройством с помощью реле (пока 4 реле потом функционал расширится до 10, но не суть)
Код работает нормально, но есть одна проблема, при вводе разблокирующей последовательности идет срабатывание второго реле. нажимаю кнопки 1 , 3, 2 и сразу включается реле 2.
Как это исправить?
код прилагаю
int butstate1 = 0; int butstate2 = 0; int butstate3 = 0; int butstate4 = 0; int butstate5 = 0; unsigned long timer = 0; int check1 = 0; int check2 = 0; int but1 = 2; int but2 = 3; int but3 = 4; int but4 = 5; int but5 = 6; int pass = 0; int but_flag1 = 0; int but_flag2 = 0; int but_flag3 = 0; int but_flag4 = 0; int but_flag5 = 0; unsigned long t_but1 = 0; unsigned long t_but2 = 0; unsigned long t_but3 = 0; unsigned long t_but4 = 0; unsigned long t_but5 = 0; unsigned long t_but_long = 0; boolean onoff_pin7 = 0; boolean onoff_pin8 = 0; boolean onoff_pin9 = 0; boolean onoff_pin10 = 0; boolean onoff_pin11 = 0; void setup() { //Put your setup code here, to run once: pinMode (2, INPUT); pinMode (3, INPUT); pinMode (4, INPUT); pinMode (5, INPUT); pinMode (6, INPUT); pinMode (7, OUTPUT); pinMode (8, OUTPUT); pinMode (9, OUTPUT); pinMode (10, OUTPUT); pinMode (11, OUTPUT); } void loop() { butstate1 = digitalRead (but1); butstate2 = digitalRead (but2); butstate3 = digitalRead (but3); butstate4 = digitalRead (but4); butstate5 = digitalRead (but5); // последовательность разблокировки устройства if (butstate1 && pass == 0 && millis() - t_but1 > 100) { t_but1 = millis(); timer = millis(); timer = timer + 1000; check1 = 1; } if (butstate3 && check1 && timer > millis() && pass == 0 && millis() - t_but3 > 100) { t_but3 = millis(); check2 = 1; } if (butstate2 && check2 && timer > millis() && pass == 0 && millis() - t_but2 > 100) { t_but2 = millis(); pass = 1; check1 = 0; check2 = 0; timer = 0; digitalWrite (11, LOW); // гасим индикатор блокировки } //если не введен код реле в 0, индикатор на 11 пине горит красным if (pass == 0) { digitalWrite (7, HIGH); digitalWrite (8, HIGH); digitalWrite (9, HIGH); digitalWrite (10, HIGH); digitalWrite (11, HIGH); } if (butstate1 || butstate2 || butstate3 || butstate4 || butstate5 && pass == 0) { //команда на mp3 модуль. проигрываем трек доступ запрещен } //включаем-выключаем реле 1 if (butstate1 && pass && !but_flag1 && millis() - t_but1 > 100) { t_but1 = millis(); but_flag1 = 1; onoff_pin7 = !onoff_pin7; digitalWrite(7, onoff_pin7); } if (!butstate1 && pass && but_flag1 && millis() - t_but1 > 100) { t_but1 = millis(); but_flag1 = 0; } //включаем-выключаем реле 2 if (butstate2 && pass && !but_flag2 && millis() - t_but2 > 100) { t_but2 = millis(); but_flag2 = 1; onoff_pin8 = !onoff_pin8; digitalWrite(8, onoff_pin8); } if (!butstate2 && pass && but_flag2 && millis() - t_but2 > 100) { t_but2 = millis(); but_flag2 = 0; } //включаем-выключаем реле 3 if (butstate3 && pass && !but_flag3 && millis() - t_but3 > 100) { t_but3 = millis(); but_flag3 = 1; onoff_pin9 = !onoff_pin9; digitalWrite(9, onoff_pin9); } if (!butstate3 && pass && but_flag3 && millis() - t_but3 > 100) { t_but3 = millis(); but_flag3 = 0; } //включаем-выключаем реле 4 if (butstate4 && pass && !but_flag4&& millis() - t_but4 > 100) { t_but4 = millis(); but_flag4 = 1; onoff_pin10 = !onoff_pin10; digitalWrite(10, onoff_pin10); } if (!butstate4 && pass && but_flag4 && millis() - t_but4 > 100) { t_but4 = millis(); but_flag4 = 0; } //блокировка устройства if (butstate5 && pass && but_flag5 == 0 && millis() - t_but5 > 100) { but_flag5 = 0; pass = 0; t_but5 = millis(); } //Put your main code here, to run repeatedly: }
Есть такая подпрограмма Serial.print(). Она много чего может прояснить...
А хотите по-быстрому - так в платный раздел велком.
Если бы хотел не заморачиваться, то сразу туда написал бы, а не сам эту ерунду собирал.
Я так понял что то с кодом явно не так, щас буду смотреть.
Ну и если такой ответ, то думаю косяков тут много. Буду искать. Спасибо за совет по отладке, так действительно наглядный будет.
Доброго времени суток!
Есть задача управлять неким устройством с помощью реле (пока 4 реле потом функционал расширится до 10, но не суть)
Код работает нормально, но есть одна проблема, при вводе разблокирующей последовательности идет срабатывание второго реле. нажимаю кнопки 1 , 3, 2 и сразу включается реле 2.
Как это исправить?
код прилагаю
А, собственно, код и не нужен.
Если, как Вы пишете, проблема заключается в срабатывании второго реле, то исправить проблему можно, полностью убрав это второе реле из схемы. Это полностью решает описанную Вами проблему.
А, собственно, код и не нужен.
Если, как Вы пишете, проблема заключается в срабатывании второго реле, то исправить проблему можно, полностью убрав это второе реле из схемы. Это полностью решает описанную Вами проблему.
Бритва Оккама, да!
83-86 не верное выражение. Все «или» в отдельный блок нужно выделить (круглые скобки).
Ещё бы схему приложить, мне трудно «туда-сюда» листать по этой простынке.
Поддержу mykaida, ищите ошибки так. Я и логику работы не понял толком.
Ещё бы схему приложить, мне трудно «туда-сюда» листать по этой простынке.
Поддержу mykaida, ищите ошибки так. Я и логику работы не понял толком.
Это функциональные кнопки. нельзя их отключить.
Мдаааа... сравниваю сейчас свою писанину... ахтунг...
теперь все работает как надо, понимаю что по хорошему надо все через массивы и функции выполнить и что без боли на это смотреть сложно, но работает же..
Логика работы следующая:
1. подали питание - устройство блокировано, на пины 7-10( реле) на высокий уровень, 11 горит диод(высокий уровень)
2. при нажатии любой кнопки с динамика трек"устройство заблокировано"
3. при последовательном нажатии кнопок допустим 1,3,2 гасим диод разблокируем функции кнопок(реле)
4. при нажатии кнопок 1-4 срабатывает соответственное реле на пинах 7-10, повторное нажатие выключает.
5. нажимаем кнопку 5 - устройство снова заблокировано
Это функциональные кнопки. нельзя их отключить.
Давайте не отключать. Просто отработку кнопок вынесем в подпрограмму.
Типа
А так - гавно.
Спасибо за подсказку, попробую.
то что код гавно, это понятно.
я не профи и никогда с кодингом не сталкивался, занялся потому что необходимо реализовать устройство.
здесь мнение о своем коде не спрашиваю... знаю ответ. я спрашивал совет как реализовать то или другое и убрать косяки.
На данный момент, на макетке, вроде работает как надо. Если будут косяки буду решать по ходу дела. Когда проект реализую, тогда и выложу для оценки... а пока об этом рано говорить.
Спасибо за подсказку, попробую.
А вобще самая идеальная программа для МК выглядит так:
А вобще самая идеальная программа для МК выглядит так:
Самое смешное, что это можно заставить работать
https://www.google.com/search?client=opera&q=кодовый+замок+ардуино&sourceid=opera&ie=UTF-8&oe=UTF-8
Результатов: примерно 5 520 (0,50 сек.)
(0,50 сек.)
Результатов: примерно 5 520 (0,45 сек.)
У меня быстрее гугль.
8 ссылок ведут обратно сюда))
(0,50 сек.)
Результатов: примерно 5 520 (0,45 сек.)
У меня быстрее гугль.
8 ссылок ведут обратно сюда))
Я смотрел много ссылок, но там в основном на клавиатуре - в моем случае вообще не подходит, а на кнопках нужно что бы кнопки отвечали и за действие аппарата(допустим реле или семисторы,) и в тоже время с их помощью можно было вводить код разблокировки.
Ну, а от себя скажу - мне почему то очень тяжело понимать чужой код, учитывая, что я очень плохо в этом разбираюсь, поэтому пока такой кривой код, а со временем причешу, переделаю и т.д., в общем приведу в божеский вид.
Сейчас работает, но будет еще много доделок, по ходу дела буду разбираться. Всем ОГРОМНОЕ спасибо за внимание и ответы.