Почему мои высокие и низкие значения не обновляются корректно во время последовательных циклов

Я пытаюсь зафиксировать высокие и низкие значения температуры и влажности, затем очистить ЖК-дисплей и отобразить их на 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);

    }

, 👍0

Обсуждение

у вас есть небольшая логическая ошибка в вашем коде ... на самом деле ненужный код ... в if (lTemp == 10000) { установите lTemp, hTemp, lHumid и hHumid ... нет необходимости в if (hTemp == 10000) { или if (lHumid == 10000) { или if (hHumid == 10000) {, @jsotola


3 ответа


2

У вас это или что-то подобное было несколько раз:

  if (lTemp = 10000) {
     lTemp = CurrTemp;
   }

Это неверно. Оператор == используется для сравнения.

Попробуйте:

  if (lTemp == 10000) {
     lTemp = CurrTemp;
   }

Как у вас это получается, переменной lTemp присваивается 10000 каждый раз, когда выполняется оператор. Это не делает сравнение так, как вы намереваетесь.

,

Включение файла / настроек уровня предупреждения компилятора покажет полезное сообщение, указывающее на это в коде., @timemage

Спасибо! Я знал это, но не мог этого видеть. Сейчас работает отлично., @Mav

@Mav Если это был ответ на ваш вопрос, пожалуйста, примите его как ответ. Спасибо., @jwh20


2

При программировании на C "=" присваивает значение, а "==" проверяет значение. Итак, в этой строке кода:

if (lTemp = 10000)

... на самом деле вы присваиваете переменной lTemp значение 10000. Подумайте о том, чтобы изменить строку кода на следующую:

if (lTemp == 10000)

... это проверит, равна ли переменная lTemp 10000.

,

Включение файла / настроек уровня предупреждения компилятора покажет полезное сообщение, указывающее на это в коде., @timemage

Большое спасибо! Я ценю ваше время и знания., @Mav

@Mav там, где вы нашли их ответы полезными, вы можете проголосовать за них., @timemage


2

Хотя у вас уже есть два совершенно верных ответа, я поделюсь трюком, который полностью обходит проблему стороной. Вместо выбора определенного числа (здесь 10 000) в качестве “магического” значения, имеющего особое значение, вы можете вместо этого инициализировать максимумы и минимумы таким образом, чтобы гарантировать, что они будут обновлены на самой первой итерации:

  • сделайте lTemp выше, чем любая температура, которую вы когда-либо читали
  • сделайте hTemp ниже любой температуры, которую вы когда-либо читали

Например:

float lTemp = +INFINITY;
float hTemp = -INFINITY;

и то же самое, конечно, касается влажности воздуха. Таким образом, первая итерация больше не нуждается в специальной обработке, так как она становится обычной итерацией:

if (CurrTemp < lTemp) lTemp = CurrTemp;
if (CurrTemp > hTemp) hTemp = CurrTemp;

Обратите внимание, что выбор ±∞ для min и max пустого набора показаний - это не просто грязный взлом. Это на самом деле согласуется с математическим понятием минимума и супремума пустого множества.

,