Изменение состояния света
Может ли кто-нибудь дать мне решение следующей проблемы?
У меня есть 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);
}
}
@Iulian Chirvasa, 👍-1
Обсуждение1 ответ
Разделите логику и кнопки на отдельные части и избегайте дублирования кода.
Первый шаг — определить, что должно управлять состоянием реле:
// следует псевдокод
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
- Сброс Arduino Uno в коде
- Как вызвать функции C из скетча ардуино?
- Проблема с Software Serial: нет ответа
- Варианты программирования, отличные от C++
- Как автоматически сбросить модуль NRF24L01
- Как обновить ESP8266 NodeMCU SDK с версии 2.5.2 до версии 3?
- I2C - программная отправка данных
- Невозможно получить постоянное чтение с тензодатчиками
ваш код плохо отформатирован ... отступы повсюду .... это затрудняет отслеживание хода программы ... пожалуйста, исправьте отступы, @jsotola
как должно быть? написано на ардуино ide. эта идентификация редактора плохая., @Iulian Chirvasa
Насчет «_эта идентификация редактора плохая_»: IDE — это просто инструмент для написания. Он не несет ответственности за то, что вы пишете. Ты. Однако он готов помочь, если вы вежливо попросите: «Инструменты → Автоформат»., @Edgar Bonet