Изменение состояния света

Может ли кто-нибудь дать мне решение следующей проблемы?
У меня есть 1 ИК-пульт, приложение blynk, несколько кнопок, а также 1 релейный модуль. (Я установил 1 контакт ATMega в качестве входа, чтобы иметь возможность читать то, что отправляет esp, когда я использую приложение blynk).
Итак, в основном я хочу сделать следующее:
Если я нажму btn1 с ИК-пульта или PushBtn nr1, или отправлю 1 из приложения blynk то реле 1 должно включиться. Пока эта часть работает.
В любом случае, я хочу сделать следующее:
Если реле включено (замкнуто), я хочу иметь возможность выключать его с помощью тех же кнопок (для которых я установил счетчик и вызываю эту переменную).
Теперь я могу выключить реле, только если воспользуюсь той же кнопкой, которую раньше использовал для его включения. Но я хочу иметь возможность отключить его по-другому. Если я использовал приложение blynk, чтобы включить его, то, если я нажму кнопку во второй раз, я хочу, чтобы оно было выключено. Также, если я не нажимаю кнопку, а использую ИК-пульт и нажимаю 1 2 раза - реле должно быть выключено.

if(cntbtn2 == 1 || cntPushbtn2 == 1)
      {
      digitalWrite(rel2,LOW);
      u8g.setFont(u8g_font_courB10);
      u8g.drawStr(32,10,"Interior");
      u8g.drawFrame(0,12,128,51);
      u8g.drawLine(64,12,64,62);

      if(cntbtn1 == 1 || cntPushbtn1 == 1)
          {
          u8g.setFont(u8g_font_5x8);
          u8g.drawStr(10,23,"Sufragerie");
          u8g.drawStr(15,60,"L.aprinsa");
          u8g.drawBitmapP( 20, 8, 16, 64, LightOn); 
          }

      else if(cntbtn1 != 1)
          {
          u8g.setFont(u8g_font_5x8);
          u8g.drawStr(10,23,"Sufragerie");
          u8g.drawStr(15,60,"L.stinsa");
          u8g.drawBitmapP( 20, 8, 16, 64, LightOff); 
          }  

      u8g.drawStr(73,23,"Dormitor");
      u8g.drawStr(75,60,"L.aprinsa");
      u8g.drawBitmapP( 78, 7, 16, 64, LightOn);
      }

else if(cntbtn2 == 2)
    {     
    if(cntbtn1 == 1 || cntPushbtn1 == 1)
        {
        u8g.setFont(u8g_font_courB10);
        u8g.drawStr(32,10,"Interior");
        u8g.drawFrame(0,12,128,51);
        u8g.drawLine(64,12,64,62);
        u8g.setFont(u8g_font_5x8);
        u8g.drawStr(10,23,"Sufragerie");
        u8g.drawStr(15,60,"L.aprinsa");
        u8g.drawBitmapP( 20, 8, 16, 64, LightOn);  
        u8g.drawStr(73,23,"Dormitor");
        u8g.drawStr(75,60,"L.stinsa");
        u8g.drawBitmapP( 78, 7, 16, 64, LightOff);
        }
    else{
        digitalWrite(rel2,HIGH);
        u8g.setFont(u8g_font_courB10);
        u8g.drawStr(32,10,"Interior");
        u8g.drawFrame(0,12,128,51);
        u8g.drawLine(64,12,64,62);
        u8g.setFont(u8g_font_5x8);
        u8g.drawStr(10,23,"Sufragerie");
        u8g.drawStr(15,60,"L.stinsa");
        u8g.drawBitmapP( 20, 8, 16, 64, LightOff);  
        u8g.drawStr(73,23,"Dormitor");
        u8g.drawStr(75,60,"L.stinsa");
        u8g.drawBitmapP( 78, 7, 16, 64, LightOff);
        }
    }

if(cntbtn2 == 1 && cntPushbtn2 == 2)
    {
    digitalWrite(rel2,HIGH);
    }

//экран станга
if(cntbtn1 == 1 || digitalRead(espPin) == 1 || cntPushbtn1 == 1)
    {
    digitalWrite(rel1,LOW);
    u8g.setFont(u8g_font_courB10);
    u8g.drawStr(32,10,"Interior");
    u8g.drawFrame(0,12,128,51);
    u8g.drawLine(64,12,64,62);
    u8g.setFont(u8g_font_5x8);
    u8g.drawStr(10,23,"Sufragerie");
    u8g.drawStr(15,60,"L.aprinsa");
    u8g.drawBitmapP( 20, 8, 16, 64, LightOn);
    if(cntbtn2 == 1 || cntPushbtn2 == 1)
        {
        u8g.drawStr(73,23,"Dormitor");
        u8g.drawStr(75,60,"L.aprinsa");
        u8g.drawBitmapP( 78, 7, 16, 64, LightOn);   
        }
    else
        {
        u8g.drawStr(73,23,"Dormitor");
        u8g.drawStr(75,60,"L.stinsa");
        u8g.drawBitmapP( 78, 7, 16, 64, LightOff); 
        }

   }

else if(cntbtn1 == 2)
    {
    digitalWrite(rel1,HIGH);
    u8g.setFont(u8g_font_courB10);
    u8g.drawStr(32,10,"Interior");
    u8g.drawFrame(0,12,128,51);
    u8g.drawLine(64,12,64,62);
    u8g.setFont(u8g_font_5x8);
    u8g.drawStr(10,23,"Sufragerie");
    u8g.drawStr(15,60,"L.stinsa");
    u8g.drawBitmapP( 20, 8, 16, 64, LightOff); 
    if(cntbtn2 == 1 || cntPushbtn2 == 1)
        {
        u8g.drawStr(73,23,"Dormitor");
        u8g.drawStr(75,60,"L.aprinsa");
        u8g.drawBitmapP( 78, 7, 16, 64, LightOn);   
        }
        if(cntbtn2 != 1)
            {
            u8g.drawStr(73,23,"Dormitor");
            u8g.drawStr(75,60,"L.stinsa");
            u8g.drawBitmapP( 78, 7, 16, 64, LightOff);   
            }
        }
    else
        {
        digitalWrite(rel1,HIGH);
        digitalWrite(rel2,HIGH);
        u8g.setFont(u8g_font_courB10);
        u8g.drawStr(32,10,"Interior");
        u8g.drawFrame(0,12,128,51);
        u8g.drawLine(64,12,64,62);
        u8g.setFont(u8g_font_5x8);
        u8g.drawStr(10,23,"Sufragerie");
        u8g.drawStr(15,60,"L.stinsa");
        u8g.drawBitmapP( 20, 8, 16, 64, LightOff);  
        u8g.drawStr(73,23,"Dormitor");
        u8g.drawStr(75,60,"L.stinsa");
        u8g.drawBitmapP( 78, 7, 16, 64, LightOff);  
        }
   }

, 👍-1

Обсуждение

ваш код плохо отформатирован ... отступы повсюду .... это затрудняет отслеживание хода программы ... пожалуйста, исправьте отступы, @jsotola

как должно быть? написано на ардуино ide. эта идентификация редактора плохая., @Iulian Chirvasa

Насчет «_эта идентификация редактора плохая_»: IDE — это просто инструмент для написания. Он не несет ответственности за то, что вы пишете. Ты. Однако он готов помочь, если вы вежливо попросите: «Инструменты → Автоформат»., @Edgar Bonet


1 ответ


0

Разделите логику и кнопки на отдельные части и избегайте дублирования кода.

Первый шаг — определить, что должно управлять состоянием реле:

// следует псевдокод
if (pushButton.isPressed() || blinkApp.sentCommand() || conditionAlfa.isMet()) {
  // условие обновления выполнено, переходим к изменению состояния
  relayState = !relayState; // поменять местами состояние реле
  updateRelay = true; // активируем часть, ответственную за изменение
}

После установки нового желаемого состояния воздействуйте на реле и соответствующим образом обновите экран:

// снова псевдокод
if (updateRelay == true) {
  updateRelay = false; // мы сейчас собираемся обновить, не делайте этого снова, если в этом нет необходимости
  relay.setState(relayState); // обновляем реле, независимо от того, что было источником события
  screen.drawGraphics(); // обновить экран, независимо от того, что было источником события
}

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

,

Я новичок в программировании и не так хорошо знаю многие концепции. Также у меня есть вопрос о последней части кода, который вы разместили. `if(updateRelay == true){updateRelay = false; }` который будет выполняться? я имею в виду, что UC смотрит на это условие и проверяет, верно ли оно, но затем, когда он входит в скобки, это условие не становится ложным? и перестать его выполнять?, @Iulian Chirvasa

updateRelay - это просто "флаг". Он ничего не делает сам по себе; это способ сохранить тот факт, что условие было выполнено. После того, как он был протестирован (с помощью if (updateRelay == true) { , его значение больше не требуется; следующий раздел будет или не будет введен оператором if. " в следующий раз. Вы не хотите продолжать вводить предложение if после того, как увидели условие один раз; только когда одно из условий (кнопка, мигание и т. д.) становится истинным *снова*., @JRobert

Большое спасибо, Роберт., @Iulian Chirvasa