Почему мои высокие и низкие значения не обновляются корректно во время последовательных циклов
Я пытаюсь зафиксировать высокие и низкие значения температуры и влажности, затем очистить ЖК-дисплей и отобразить их на 2 последовательных обновлениях экрана. Все работает правильно, за исключением того, что переменные для high и low обновляются в каждом цикле до текущего вывода датчика, считываемого после выполнения инструкций "if". Почему это происходит? Также обратите внимание, что я объявляю значения с плавающей запятой для максимумов и минимумов маловероятным значением 10000, чтобы изменить их все на начальный вывод, считанный в 1-м цикле, поскольку я не нашел метода для определения null в начальном цикле. Я был бы признателен за любые предложения по улучшению метода! ТИА
#include <dht.h>
#include <LiquidCrystal.h>
// Низкие и Высокие переменные температуры и влажности
float lTemp=10000;
float hTemp=10000;
float lHumid=10000;
float hHumid=10000;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
dht DHT;
#define DHT11_PIN 7
void setup(){
lcd.begin(16, 2);
Serial.begin(9600);
}
void loop(){
lcd.clear();
int chk = DHT.read11(DHT11_PIN);
float CurrTemp = DHT.temperature * 1.8 + 32; // Преобразует показания по Цельсию из показаний DHT в Фаренгейты
// Устанавливает показания высокой и низкой температуры
if (lTemp = 10000) {
lTemp = CurrTemp;
}
if (CurrTemp < lTemp) {
lTemp = CurrTemp;
}
if (hTemp = 10000) {
hTemp= CurrTemp;
}
if (CurrTemp > hTemp) {
hTemp = CurrTemp;
}
// Устанавливает показания высокой и низкой влажности
if (lHumid = 10000) {
lHumid = DHT.humidity;
}
if (DHT.humidity < lHumid) {
lHumid = DHT.humidity;
}
if (hHumid = 10000) {
hHumid = DHT.humidity;
}
if (DHT.humidity > hHumid) {
hHumid = DHT.humidity;
}
//Выводит текущую температуру и влажность на ЖК-дисплей и последовательный монитор
lcd.setCursor(0,0);
lcd.print("Temp: ");
lcd.print(CurrTemp,1);
lcd.print((char)223);
lcd.print("F");
Serial.print(CurrTemp,1);
Serial.println(" F");
lcd.setCursor(0,1);
lcd.print("Humidity: ");
lcd.print(DHT.humidity,0);
lcd.print("%");
Serial.print("Humidity: ");
Serial.print(DHT.humidity,0);
Serial.println("%");
Serial.println("");
delay(10000);
//Печать низкой и высокой температуры на ЖК-дисплее и последовательном мониторе
lcd.clear();
lcd.setCursor(0,0);
lcd.print("L Temp: ");
lcd.print(lTemp,1);
lcd.print((char)223);
lcd.print("F");
Serial.print("Low Temp: ");
Serial.print(lTemp,1);
//Serial.print((символ,223);
Serial.println(" F");
lcd.setCursor(0,1);
lcd.print("H Temp: ");
lcd.print(hTemp,1);
lcd.print((char)223);
lcd.print("F");
Serial.print("High Temp: ");
Serial.print(hTemp,1);
Serial.println(" F");
Serial.println("");
delay(3000);
//Выводит данные о низкой и высокой влажности на ЖК-дисплей и последовательный монитор
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Low Humid: ");
lcd.print(lHumid,0);
lcd.print("%");
Serial.print("Low Humid: ");
Serial.print(lHumid,0);
Serial.println("%");
lcd.setCursor(0,1);
lcd.print("High Humid: ");
lcd.print(hHumid,0);
lcd.print("%");
Serial.print("High Humid: ");
Serial.print(hHumid,0);
Serial.println("%");
Serial.println("");
delay(3000);
}
@Mav, 👍0
Обсуждение3 ответа
У вас это или что-то подобное было несколько раз:
if (lTemp = 10000) { lTemp = CurrTemp; }
Это неверно. Оператор == используется для сравнения.
Попробуйте:
if (lTemp == 10000) { lTemp = CurrTemp; }
Как у вас это получается, переменной lTemp присваивается 10000 каждый раз, когда выполняется оператор. Это не делает сравнение так, как вы намереваетесь.
Включение файла / настроек уровня предупреждения компилятора покажет полезное сообщение, указывающее на это в коде., @timemage
Спасибо! Я знал это, но не мог этого видеть. Сейчас работает отлично., @Mav
@Mav Если это был ответ на ваш вопрос, пожалуйста, примите его как ответ. Спасибо., @jwh20
При программировании на C "=" присваивает значение, а "==" проверяет значение. Итак, в этой строке кода:
if (lTemp = 10000)
... на самом деле вы присваиваете переменной lTemp значение 10000. Подумайте о том, чтобы изменить строку кода на следующую:
if (lTemp == 10000)
... это проверит, равна ли переменная lTemp 10000.
Включение файла / настроек уровня предупреждения компилятора покажет полезное сообщение, указывающее на это в коде., @timemage
Большое спасибо! Я ценю ваше время и знания., @Mav
@Mav там, где вы нашли их ответы полезными, вы можете проголосовать за них., @timemage
Хотя у вас уже есть два совершенно верных ответа, я поделюсь трюком, который полностью обходит проблему стороной. Вместо выбора определенного числа (здесь 10 000) в качестве “магического” значения, имеющего особое значение, вы можете вместо этого инициализировать максимумы и минимумы таким образом, чтобы гарантировать, что они будут обновлены на самой первой итерации:
- сделайте
lTemp
выше, чем любая температура, которую вы когда-либо читали - сделайте
hTemp
ниже любой температуры, которую вы когда-либо читали
Например:
float lTemp = +INFINITY;
float hTemp = -INFINITY;
и то же самое, конечно, касается влажности воздуха. Таким образом, первая итерация больше не нуждается в специальной обработке, так как она становится обычной итерацией:
if (CurrTemp < lTemp) lTemp = CurrTemp;
if (CurrTemp > hTemp) hTemp = CurrTemp;
Обратите внимание, что выбор ±∞ для min и max пустого набора показаний - это не просто грязный взлом. Это на самом деле согласуется с математическим понятием минимума и супремума пустого множества.
- Почему показания датчика температуры становятся непоследовательными при добавлении к плате дополнительного оборудования?
- Из-за чего LCD перестанет работать после 5-секундного подключения к Arduino?
- ЖК-дисплей 20x4 будет писать, но не будет обновляться
- Конфликт I2C с двумя ардуино
- Регистрация данных при просмотре меню на ЖК-экране
- Ошибка компиляции для Arduino Nano 33 BLE с библиотекой LiquidCrystal
- Как изменить созданный байт?
- Arduino читает термопару типа K с помощью ADS1115
у вас есть небольшая логическая ошибка в вашем коде ... на самом деле ненужный код ... в
if (lTemp == 10000) {
установитеlTemp
,hTemp
,lHumid
иhHumid
... нет необходимости вif (hTemp == 10000) {
илиif (lHumid == 10000) {
илиif (hHumid == 10000) {
, @jsotola