как убрать ложное срабатывание после ввода разблокирующей комбинации

VitaliyGrimm
Offline
Зарегистрирован: 29.01.2021

Доброго времени суток!

Есть задача управлять неким устройством с помощью реле (пока 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:

}

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Есть такая подпрограмма Serial.print(). Она много чего может прояснить...

А хотите по-быстрому - так в платный раздел велком.

VitaliyGrimm
Offline
Зарегистрирован: 29.01.2021

Если бы хотел не заморачиваться, то сразу туда написал бы, а не сам эту ерунду собирал.
Я так понял что то с кодом явно не так, щас буду смотреть.
Ну и если такой ответ, то думаю косяков тут много. Буду искать. Спасибо за совет по отладке, так действительно наглядный будет.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

VitaliyGrimm пишет:

Доброго времени суток!

Есть задача управлять неким устройством с помощью реле (пока 4 реле потом функционал расширится до 10, но не суть)

Код работает нормально, но есть одна проблема, при вводе разблокирующей последовательности идет срабатывание второго реле. нажимаю кнопки 1 , 3, 2 и сразу включается реле 2.

Как это исправить?

код прилагаю

А, собственно, код и не нужен.

Если, как Вы пишете, проблема заключается в срабатывании второго реле, то исправить проблему можно, полностью убрав это второе реле из схемы. Это полностью решает описанную Вами проблему.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

andriano пишет:

А, собственно, код и не нужен.

Если, как Вы пишете, проблема заключается в срабатывании второго реле, то исправить проблему можно, полностью убрав это второе реле из схемы. Это полностью решает описанную Вами проблему.

Бритва Оккама, да!

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

83-86 не верное выражение. Все «или» в отдельный блок нужно выделить (круглые скобки). 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Ещё бы схему приложить, мне трудно «туда-сюда» листать по этой простынке. 
Поддержу mykaida, ищите ошибки так. Я и логику работы не понял толком. 

SLKH
Offline
Зарегистрирован: 17.08.2015

BOOM пишет:

Ещё бы схему приложить, мне трудно «туда-сюда» листать по этой простынке. 
Поддержу mykaida, ищите ошибки так. Я и логику работы не понял толком. 

так ТС про логику ничего и не написал. исходное сообщение загадочное: управление, 4, 10, разблокировать - это про что?

VitaliyGrimm
Offline
Зарегистрирован: 29.01.2021

Это функциональные кнопки. нельзя их отключить.

Мдаааа... сравниваю сейчас свою писанину... ахтунг...

теперь все работает как надо, понимаю что по хорошему надо все через массивы и функции выполнить и что без боли на это смотреть сложно, но работает же..

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:

}

 

VitaliyGrimm
Offline
Зарегистрирован: 29.01.2021

Логика работы следующая:

1. подали питание - устройство блокировано, на пины 7-10( реле) на высокий уровень, 11 горит диод(высокий уровень)

2. при нажатии любой кнопки с динамика трек"устройство заблокировано"

3. при последовательном нажатии кнопок допустим 1,3,2 гасим диод разблокируем функции кнопок(реле)

4. при нажатии кнопок 1-4 срабатывает соответственное реле на пинах 7-10, повторное нажатие выключает.

5. нажимаем кнопку 5 - устройство снова заблокировано

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

VitaliyGrimm пишет:

Это функциональные кнопки. нельзя их отключить.

Давайте не отключать. Просто отработку кнопок вынесем в подпрограмму.

Типа

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;
и т.д.

А так - гавно.

VitaliyGrimm
Offline
Зарегистрирован: 29.01.2021

Спасибо за подсказку, попробую.

то что код гавно, это понятно.

я не профи и никогда с кодингом не сталкивался, занялся потому что необходимо реализовать устройство.

здесь мнение о своем коде не спрашиваю... знаю ответ. я спрашивал совет как реализовать то или другое и убрать косяки.

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

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

VitaliyGrimm пишет:

Спасибо за подсказку, попробую.

А вобще самая идеальная программа для МК выглядит так:

void main(){
НастроитьКакЯХочу();
while(1){
СделатьКакЯХочу();
}
}

 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

mykaida пишет:

А вобще самая идеальная программа для МК выглядит так:

void main(){
НастроитьКакЯХочу();
while(1){
СделатьКакЯХочу();
}
}

Самое смешное, что это можно заставить работать 

SLKH
Offline
Зарегистрирован: 17.08.2015
Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

SLKH пишет:

 (0,50 сек.) 

Результатов: примерно 5 520 (0,45 сек.) 

У меня быстрее гугль. 

8 ссылок ведут обратно сюда))

SLKH
Offline
Зарегистрирован: 17.08.2015

Rumata пишет:

SLKH пишет:

 (0,50 сек.) 

Результатов: примерно 5 520 (0,45 сек.) 

У меня быстрее гугль. 

8 ссылок ведут обратно сюда))

уже легче, 5512 остаются.

VitaliyGrimm
Offline
Зарегистрирован: 29.01.2021

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

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

Сейчас работает, но будет еще много доделок, по ходу дела буду разбираться. Всем ОГРОМНОЕ спасибо за внимание и ответы.