Как повторить оператор 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{}
, чтобы они отображались на дисплее?
@ElectronSurf, 👍2
Обсуждение1 ответ
Лучший ответ:
Как вы предложили в своем комментарии, вы можете реализовать конечный автомат, но самым простым, вероятно, будет установка флага 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
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Что лучше использовать: #define или const int для констант?
- Функции со строковыми параметрами
- Как работать с аналоговыми контактами в цикле?
- Какие есть другие IDE для Arduino?
- Как использовать переменные и функции в нескольких файлах .ino
- Разница между void setup() и void setup(void)
- Будет ли .ino-скетч ардуино компилироваться непосредственно на GCC-AVR?
пожалуйста, используйте
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