как убрать ложное срабатывание после ввода разблокирующей комбинации
- Войдите на сайт для отправки комментариев
Ср, 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, ищите ошибки так. Я и логику работы не понял толком.
Это функциональные кнопки. нельзя их отключить.
Мдаааа... сравниваю сейчас свою писанину... ахтунг...
теперь все работает как надо, понимаю что по хорошему надо все через массивы и функции выполнить и что без боли на это смотреть сложно, но работает же..
boolean butstate1 = 0; boolean butstate2 = 0; boolean butstate3 = 0; boolean butstate4 = 0; boolean butstate5 = 0; boolean but_flag1_1 = 0; boolean but_flag1_2 = 0; boolean but_flag1_3 = 0; unsigned long timer = 0; unsigned long timer2 = 0; boolean check1 = 0; boolean check2 = 0; int but1 = 2; int but2 = 3; int but3 = 4; int but4 = 5; int but5 = 6; int pass = 0; boolean flag = 0; boolean but_flag1 = 0; boolean but_flag2 = 0; boolean but_flag3 = 0; boolean but_flag4 = 0; boolean 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; int onoff_pin7 = 0; int onoff_pin8 = 0; int onoff_pin9 = 0; int onoff_pin10 = 0; int onoff_pin11 = 0; void setup() { Serial.begin (9600); //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 (!but_flag1_1 && butstate1 && pass == 0 && millis() - t_but1 > 150) // фиксируем нажатие кнопка1 { but_flag1_1 = !but_flag1_1; t_but1 = millis(); timer = millis(); timer = timer + 1500; check1 = 1; Serial.println ("код1"); } if (but_flag1_1 && !butstate1 && !pass && millis() - t_but1 > 150) //фиксируем отпускание кнопки1 { but_flag1_1 = !but_flag1_1; t_but1 = millis(); } if (!but_flag1_3 && butstate3 && check1 && timer > millis() && !pass && millis() - t_but3 > 150) // фиксируем нажатие кнопка3 { but_flag1_3 = !but_flag1_3; t_but3 = millis(); check2 = 1; Serial.println ("код3"); } if (but_flag1_3 && !butstate3 && !pass && millis() - t_but3 > 150) // фиксируем отпускание кнопка3 { but_flag1_3 = !but_flag1_3; t_but3 = millis(); } if (!but_flag1_2 && butstate2 && check2 && timer > millis() && !pass && millis() - t_but2 > 200) // фиксируем нажатие кнопка2 { but_flag1_2 = !but_flag1_2; t_but2 = millis(); pass = 1; check1 = 0; check2 = 0; timer = 0; Serial.println ("код2"); Serial.println ("Устройство разблокировано"); digitalWrite (11, LOW); // гасим индикатор блокировки } if (but_flag1_2 && !butstate2 && !pass && millis() - t_but2 > 200) // фиксируем отпускание кнопка2 { but_flag1_2 = !but_flag1_2; t_but2 = millis(); } //если не введен код реле в 0, индикатор на 11 пине горит красным if (pass == 0) { digitalWrite (7, HIGH); digitalWrite (8, HIGH); digitalWrite (9, HIGH); digitalWrite (10, HIGH); digitalWrite (11, HIGH); } if (!flag && (butstate1 || butstate2 || butstate3 || butstate4 || butstate5) && pass == 0 && millis() - timer2 > 2000) { flag = 1; timer2 = millis(); Serial.println ("устройство блокировано"); //команда на mp3 модуль. проигрываем трек доступ запрещен } if (flag && pass == 0 && millis() - timer2 > 150) { flag = !flag; timer2 = millis(); } //включаем-выключаем реле 1 if (butstate1 && pass && !but_flag1 && millis() - t_but1 > 150) { Serial.println (onoff_pin7); digitalWrite(7, onoff_pin7); t_but1 = millis(); but_flag1 = !but_flag1; onoff_pin7 = !onoff_pin7; Serial.println ("кнопка1 нажалась"); Serial.println (onoff_pin7); } if (!butstate1 && pass && but_flag1 && millis() - t_but1 > 150) { t_but1 = millis(); but_flag1 = !but_flag1; Serial.println ("кнопка1 отжалась"); } //включаем-выключаем реле 2 if (butstate2 && pass && !but_flag2 && millis() - t_but2 > 150) { digitalWrite(8, onoff_pin8); t_but2 = millis(); but_flag2 = !but_flag2; onoff_pin8 = !onoff_pin8; Serial.println ("кнопка2 нажалась"); } if (!butstate2 && pass && but_flag2 && millis() - t_but2 > 150) { t_but2 = millis(); but_flag2 = !but_flag2; Serial.println ("кнопка2 отжалась"); } //включаем-выключаем реле 3 if (butstate3 && pass && !but_flag3 && millis() - t_but3 > 150) { digitalWrite(9, onoff_pin9); t_but3 = millis(); but_flag3 = 1; onoff_pin9 = !onoff_pin9; } if (!butstate3 && pass && but_flag3 && millis() - t_but3 > 150) { t_but3 = millis(); but_flag3 = 0; } //включаем-выключаем реле 4 if (butstate4 && pass && !but_flag4 && millis() - t_but4 > 150) { digitalWrite(10, onoff_pin10); t_but4 = millis(); but_flag4 = !but_flag4; onoff_pin10 = !onoff_pin10; } if (!butstate4 && pass && but_flag4 && millis() - t_but4 > 150) { t_but4 = millis(); but_flag4 = !but_flag4; } //блокировка устройства if (butstate5 && pass && !but_flag5 && millis() - t_but5 > 150) { but_flag5 = 0; pass = 0; t_but5 = millis(); Serial.println ("нажата кнопка 5 блокировка"); } //Put your main code here, to run repeatedly: }Логика работы следующая:
1. подали питание - устройство блокировано, на пины 7-10( реле) на высокий уровень, 11 горит диод(высокий уровень)
2. при нажатии любой кнопки с динамика трек"устройство заблокировано"
3. при последовательном нажатии кнопок допустим 1,3,2 гасим диод разблокируем функции кнопок(реле)
4. при нажатии кнопок 1-4 срабатывает соответственное реле на пинах 7-10, повторное нажатие выключает.
5. нажимаем кнопку 5 - устройство снова заблокировано
Это функциональные кнопки. нельзя их отключить.
Давайте не отключать. Просто отработку кнопок вынесем в подпрограмму.
Типа
switch (getPressedButton()){ case BUTTON_UP: Tinset+=0.1; //увеличение температуры на 0,1 градус if (Tinset>TinMax) Tinset=TinMax; lcdPrintTset(Tinset); EEPROM.write(0,TtoByte(Tinset)); break; case BUTTON_DOWN: Tinset-=0.1; //уменьшение температуры на 0,1 градус if (Tinset<TinMin) Tinset=TinMin; lcdPrintTset(Tinset); EEPROM.write(0,TtoByte(Tinset)); break; и т.д.А так - гавно.
Спасибо за подсказку, попробую.
то что код гавно, это понятно.
я не профи и никогда с кодингом не сталкивался, занялся потому что необходимо реализовать устройство.
здесь мнение о своем коде не спрашиваю... знаю ответ. я спрашивал совет как реализовать то или другое и убрать косяки.
На данный момент, на макетке, вроде работает как надо. Если будут косяки буду решать по ходу дела. Когда проект реализую, тогда и выложу для оценки... а пока об этом рано говорить.
Спасибо за подсказку, попробую.
А вобще самая идеальная программа для МК выглядит так:
void main(){ НастроитьКакЯХочу(); while(1){ СделатьКакЯХочу(); } }А вобще самая идеальная программа для МК выглядит так:
void main(){ НастроитьКакЯХочу(); while(1){ СделатьКакЯХочу(); } }Самое смешное, что это можно заставить работать
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 ссылок ведут обратно сюда))
Я смотрел много ссылок, но там в основном на клавиатуре - в моем случае вообще не подходит, а на кнопках нужно что бы кнопки отвечали и за действие аппарата(допустим реле или семисторы,) и в тоже время с их помощью можно было вводить код разблокировки.
Ну, а от себя скажу - мне почему то очень тяжело понимать чужой код, учитывая, что я очень плохо в этом разбираюсь, поэтому пока такой кривой код, а со временем причешу, переделаю и т.д., в общем приведу в божеский вид.
Сейчас работает, но будет еще много доделок, по ходу дела буду разбираться. Всем ОГРОМНОЕ спасибо за внимание и ответы.