Как повторить оператор IF

Информация о моем ЖК-дисплее вызывается из оператора IF, но, поскольку это информация о часах и температуре, я не хочу просто отображать информацию, а постоянно обновлять информацию в режиме реального времени. я не хочу использовать цикл (пока) или любую другую "блокировку кода".

Вот весь код:

#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
#include <DS3231.h>
#include <DallasTemperature.h>


#define ONE_WIRE_BUS 2
int Heater= 3;
int Switch1= 4;

Time t;
LiquidCrystal_I2C lcd(0x27, 16, 2);
DS3231  rtc(SDA, SCL);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// Нажать кнопку

boolean oldSwitchState = LOW;
boolean newSwitchState = LOW;
boolean lcdScroll = LOW;
boolean lcdBacklight = LOW;
boolean lcdWelcome = LOW;

unsigned long previousMillis = 0;
const long BacklightTime = 10000;

void setup() {
  Serial.begin(115200);
  pinMode(Heater, OUTPUT);
  pinMode(Switch1, INPUT);
  lcd.begin();
  rtc.begin();
}
void loop() {
  float testTemp = sensors.getTempCByIndex(0);
  sensors.requestTemperatures();
  t = rtc.getTime();
  if(lcdWelcome == LOW){
      lcd.setCursor(0,0);
      lcd.print("Welcome, Admin!");
      lcd.setCursor(0,1);
      lcd.print("press Start");
  }

  // ЖК-дисплей
  newSwitchState = digitalRead(Switch1);
    if (millis() - previousMillis >= BacklightTime) {
      lcd.noBacklight();
      lcdBacklight = LOW;
    }
    else if ( lcdBacklight == LOW ){
      lcd.backlight();
      lcdBacklight = HIGH;
    }
    if ( newSwitchState != oldSwitchState ) {
       if ( newSwitchState == HIGH ){
       previousMillis = millis();
       lcdWelcome = HIGH;
       lcd.clear();
      if ( lcdScroll == LOW ){
        lcd.setCursor(0,0);
        lcd.print(testTemp);
        lcd.print("   ");
        lcd.print(rtc.getTimeStr());
        lcdScroll = HIGH;
      }
      else{
        lcd.setCursor(0,0);
        lcd.print(rtc.getDOWStr());
        lcd.print("   ");
        lcd.print(rtc.getDateStr());
        lcdScroll = LOW;
      }
       }
       oldSwitchState = newSwitchState;
    }
}

Как я могу постоянно обновлять функции внутри операторов if(lcdScroll == LOW){} и else{}, чтобы они отображались на дисплее?

, 👍2

Обсуждение

пожалуйста, используйте true и false как логические значения, @Juraj

@Juraj спасибо, но есть ли разница?, @ElectronSurf

Я не понимаю, в чем ваша проблема - я не вижу здесь никакого блокирующего кода - вы проверяете часы и переключатели и либо действуете на них, либо нет, что уместно. Кроме того, что вы подразумеваете под «Как повторить оператор IF»?, @JRobert

Кроме того, не сравнивайте значения с true, false, 1, 0 или HIGH или LOW, просто напишите if (переменная), по умолчанию все ненулевые значения приведут к выполнению оператора if., @Michel Keijzers

ну, ваш цикл void() уже является циклом while ..... Что вы хотите повторить, чего еще не происходит?, @Chad G

@JRobert проблема в том, что код внутри if (lcdScroll == LOW){} запускается только один раз, но если я хочу иметь время для обновления в реальном времени, функции времени должны быть в цикле, а не только один раз., @ElectronSurf

Ну, он запускается один раз за loop(). Если остальная часть кода реализована правильно, loop() будет работать быстро, и у вас будет все, что вы хотите. Я не вижу никакого блокирующего кода, такого как delays() и т. д. Итак, в чем проблема?, @Sim Son

Может быть, это происходит так быстро, что ОП не может видеть прокрутку, создавая **видимость**, что она запускается только один раз.???? Что произойдет, если вы поместите в свой код некоторые файлы serial.println? Выполняется ли оператор if более одного раза, когда вы нажимаете «кнопку»???, @GMc

@SimSon, если мы добавим Serial.prinln("test"); в оператор if (lcdScroll == LOW){}, вы увидите, что при нажатии кнопки код внутри этого оператора запускается только один раз. я думаю, что мне нужна "машина состояний", чтобы заставить это работать..., @ElectronSurf

А, теперь понял, смотри мой ответ, @Sim Son


1 ответ


Лучший ответ:

2

Как вы предложили в своем комментарии, вы можете реализовать конечный автомат, но самым простым, вероятно, будет установка флага bool a_flag в этом if(lcdScroll==LOW) и проверка if(a_flag) в самой высокой области действия секции loop(). Здесь вы print("test");.

В отношении вашего кода это будет выглядеть так:

bool a_flag=false;
void loop() {
  // какие-то ненужные вещи
  if ( newSwitchState != oldSwitchState) {
    // некоторые вещи
    if ( lcdScroll == LOW ){
      // вещи, которые вы бы обработали здесь
      a_flag=true;
    }
    else {
      // вещи, которые вы бы обработали здесь
      a_flag=false;
    }
  }
  if (a_flag) Serial.println("lcdScroll is LOW");
  else Serial.println("lcdScroll is HIGH");
}

Помимо этого общего решения вы можете просто сделать следующее в вашем конкретном случае:

loop(){

  // ваш фактический код

  if (lcdScroll) Serial.println("lcdScroll is LOW");
  else Serial.println("lcdScroll is HIGH");
}
,

я очень новичок в этом, не могли бы вы внедрить это в код, чтобы я мог понять всю идею?, @ElectronSurf

@newbie Вам нужно где-то снять этот флаг, и я не уверен, где (вероятно, в соответствующем else{}). Я добавлю реализацию этого в ближайшее время..., @Sim Son

Смотрите мой пример реализации. Это будет **постоянно** печатать соответствующее сообщение. Учтите также, что подсветка будет вести себя ошибочно, когда миллисекунды превысят лимит!, @Sim Son

Я задал этот вопрос как на форуме Reddit, так и на форуме Arduino, и они не смогли/не смогли дать мне ответ. вы, сэр, легенда. спасибо и да благословит вас бог., @ElectronSurf