Помогите с while пожалуйста!

Подключен BH1750 по айтуси еще с несколькими датчиками. Монтаж на макетке через провода. По задумке на дисплей выводятся показания датчиков и если они нарушают установленные пороговые значения то врубается тревога. Решил сделать через оператор while.
Тревога включается как при слишком высоком уровне света когда предельное значение 36000 а люксметр выдает 56.
Чувствую, что где-то очень тупая ошибка, но не понимаю где…
ПОЛНЫЙ код прикрепил ниже.
P.S Сериал принт для отладки сделан

#include "DHT.h"
#include <BH1750.h>                      //подключаем все необходимые библиотеки
#include <Wire.h>
#include <math.h>


#define DHTPIN 3 //задаем пин для датчика DHT22 (датчик влажности и температуры воздуха)
#define DHTTYPE 22 //тип датчика (DHT22), для универсальной библиотеки DHT
#define SoilPin A1 // задаем пин для снятия показаний с  датчика влажности почвы 
#define SoilPowerPin 9//задаем пин питания датчика влажности почвы
int piezoPin = 6; //задаем пин для управления зуммером (для сигнала тревоги)

LiquidCrystal_I2C lcd(0x27,16,2); //установка дисплея
BH1750 lightMeter; //создаем объект lightMeter для управления датчиком света


DHT dht(DHTPIN, DHTTYPE); //задаем тип и пин датчика DHT для библиотеки

//объявляем глобальные переменные (предельные показатели датчиков)
int const maxlight = 36000;  //максимально допустимый уровень света
int const minlight = 6000; //минимально допустимый уровень света
int const mintemp = 16; //минимально допустимый уровень температуры воздуха
int const maxtemp = 30;  //максимально допустимый уровень температуры воздуха
int const maxhum = 70; //максимально допустимая влажность воздуха
int const minhum = 40; //минимально допустимая влажность воздуха
int const maxsoil = 300;  //максимально допустимая влажность почвы. 
int const minsoil = 908; //минимально допустимая влажность почвы



void alertSignal(){//функция для  сигнала тревоги. 
  lcd.home();
  tone(piezoPin, 1000, 500);
  delay(800);
  noTone(piezoPin);                   //мелодия для зуммера 
  delay(100);
  tone(piezoPin,1000,500);
  delay(800);
}


void setup() {
//подготовка к работе (инициализация, задание режима работы пинов)
pinMode(SoilPin, INPUT);
pinMode(SoilPowerPin, OUTPUT);//переводим пин питания датчика влажности почвы в режим output
lcd.backlight();
Wire.begin();
lightMeter.begin();
lcd.init();
dht.begin();
Serial.begin(9600);

byte Humidity_symbol[] = {//символ капли для влажности воздуха
  B00100,
  B00100,
  B01110,
  B11111,
  B11111,
  B11111,
  B11111,
  B01110
};

byte Temp_symbol[] = {//символ градусника для показа температуры воздуха
  B01011,
  B01011,
  B01000,
  B11111,
  B01000,
  B01000,
  B01010,
  B01110
};

byte LightLevelSymbol[] = {//символ солнца для отображения уровня освещенности
  B00100,
  B10101,
  B01110,
  B11111,
  B11111,
  B01110,
  B10101,
  B00100
};



byte SoilSymbol[ ] = {//символ уровня влажности почвы (толком нихрена не придумал еще)
  B00100,
  B01110,
  B11111,
  B11111,
  B01110,
  B00000,
  B11111,
  B11111
};

lcd.createChar(3, Temp_symbol);
lcd.createChar(0, Humidity_symbol);
lcd.createChar(4, LightLevelSymbol);
lcd.createChar(5, SoilSymbol);

}

void loop() {
//блок вывода интерфейса на экран
lcd.backlight();
lcd.write(3);//выводит на экран градусник
lcd.print(":");
lcd.setCursor(11,0);
lcd.write(0);// выводит на экран каплю
lcd.print(":");
lcd.setCursor(0,1);
lcd.write(4);//выводит на экран символ освещенности
lcd.print(":");
lcd.setCursor(11,1);//выводит на экран символ влажности почвы
lcd.write(5);
lcd.print(":");

//блок сбора данных
float lux = lightMeter.readLightLevel();
float AirHumid = dht.readHumidity();                //считываем показания датчиков
float AirTemp = dht.readTemperature();
int TempLED = ceil(AirTemp);
int HumLed = ceil(AirHumid);    //тут мы округляем значения с датчиков в большую сторону, дабы влезли показания на экран.
int luxLED = ceil(lux);          //и тут тоже округляем...


//отдельно блок управления почвой
digitalWrite(SoilPowerPin, HIGH);//подаем питание на датчик влажности почвы
int Soil = analogRead(SoilPin); //снимаем показания с датчика влажности почвы. Содержит аналоговое значение в диапазоне от 0 до 1023. Используется для анализа состояния почвы.
delay(250);//тут воткнул делей чисто ради безопасности мб убрать его?
digitalWrite(SoilPowerPin,LOW);//отключаем питание у датчика влажности почвы
int percentSoil = map(Soil, 0, 1023, 100, 0); //перевод значений влажности почвы в проценты из аналоговых единиц. Используется для вывода
Serial.println(lux);
Serial.println(luxLED);
//блок вывода показаний
lcd.setCursor(2,0);
lcd.print(TempLED);//вывод показаний на экран.
lcd.print("C");
lcd.setCursor(13,0);
lcd.print(HumLed);
lcd.print("%");
lcd.setCursor(2,1);
lcd.print(luxLED);
lcd.print("Lx");
lcd.setCursor(13,1);
lcd.print(percentSoil);
lcd.print("%");
delay(1000);
lcd.clear();

//блок тревоги 
while (luxLED > maxlight) {
  lcd.print("TOO MUCH LIGHT!");
  alertSignal();
}

while (Soil<=minsoil) {
  alertSignal();
  lcd.print("SOIL IS DRY!");

}


while (HumLed < maxhum){
  alertSignal();
  lcd.print("AIR IS DRY!");
 
}


while (TempLED < maxtemp) {
  alertSignal();
  lcd.print("AIR IS COLD!");
}


while (luxLED < minlight) {
  alertSignal();
  lcd.print("TOO DARK!");
}


while (HumLed > maxhum) {;
  alertSignal();
  lcd.print("AIR IS TOO HUMID!");

}

while (TempLED > maxtemp) {
  alertSignal();
  lcd.print("TOO HOT!");
}

while (Soil >= maxsoil) {
  alertSignal();
  lcd.print("SOIL IS WATERLOGGED!");
  
}


}```

Это, вот так что ли?

while (TempLED < maxtemp) {
  alertSignal();
  lcd.print("AIR IS COLD!");
}

Попробуйте простыми русским словами объяснить, что по-Вашему, здесь должно делаться.

Эх…
Пока выполняются условия (слишком жарко/холодно\сухо…) орет сигналка и выводится причина тревоги (функцию же подписал вроде,не?)

А когда оно прекратит исполняться? И с какого бодуна оно прекратит, если ни TempLED, ни maxtemp в Вашем цикле не изменяются ни при каких обстоятельствах?

Нет, уж эти три строки означают: как только TempLED окажется меньше maxtemp, следует запищать и вывести на экран “AIR IS COLD!”. Потом, безо всякой паузы, снова запищать и вывести на экран “AIR IS COLD!”. Потом ещё и … продолжать это делать до усрачки отключения питания.

Только так!

maxtemp есть константа, а TempLED это округленное AirTemp который снимается с DHT22. Каким образом оно не будет меняться?
Если вас не затруднит не могли бы вы помочь с исправлением?

Замените while на if ради смеха.

только сейчас подумал о том что while может зациклить прогу, а поскольку loop выполняется очень часто то if прокатит…

Очень часто, слишком часто, мгновенно ити его. Поэтому delay() в дозе 5000 единиц принимать в конце каждого цикла.

Но не внутри while

Вот кусок кода, который мы обсуждаем:

while (TempLED < maxtemp) {
  alertSignal();
  lcd.print("AIR IS COLD!");
}

Вы мне объясните каким образом TempLED будет меняться? В какой строке? С какого бодуна?

Вы понимаете, что вообще делает while? Точно не понимаете. Изучите. В данном куске кода, как только TempLED < maxtemp стало истиной, будут выполняться строки №№ 2 и 3 до тех пор, пока TempLED < maxtemp не станет ложным! А с какого лешего ему становиться ложным, если ни TempLED, ни maxtemp в этих двух строчках не меняются, а никакие другие коды в это время не исполняются? Вот она и будет у Вас пищать пока питание не выключите.

да понял я уже что while не подойдет потому что он “замыкает” на себя весь код. Спасибо людям выше за разъяснения.

Да, ничего :frowning:

Только метод Тыка приносит истинное удовольствие экспериментатору ибо древо Знаний Сухо.

А мне всегда нравится, когда говорят что из
while (true); ну не выйти никак. Смех и грех.

Смешно вам… а я верил, пока у китайцев в их библиотеках для e-paper в ключевом месте не нашёл:

void Epd::ReadBusy(void) {
  unsigned char busy;
 
  while(1)
  {
    if(DigitalRead(busy_pin) == 0)
      break;
    DelayMs(50);
  }
  
  DelayMs(200);
}

Нормально. Дождался готовности и подождал ещё 200 мс для надёжности.) Вполне.)
Ну, а если не дождался, то о чём можно говорить дальше!)

эх, молодёжь! Только бы тыкать! Кто ж тычет по сухому? Я самому не в радо5 и Древо обидится.

Тыкают - это уже хорошо. Сидеть на ж#пе ничего не делая - вот это хреново.

А позориться? Или, для молодёжи это простительно?

Им сейчас всё «простительно». Учителя (!) нахрен послать - как два пальца. Перед своим носом что написано не прочесть - так и должно быть. ((