похожую тему создавал, но проблема другая. При кол-ве операторов if меньше 8, дисплей работает нормально. При кол-ве равном 8 начинается свистопляска. Дисплей включается и выключается самостоятельно (ПОЛНОСТЬЮ выключается подсветка с непостоянной периодичностью) и показыает в рандомных местах какую то абракадабру. Фото прикрепил
Полный код ниже
#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 = 30; //минимально допустимый уровень света
int const mintemp = 16; //минимально допустимый уровень температуры воздуха
int const maxtemp = 30; //максимально допустимый уровень температуры воздуха
int const maxhum = 70; //максимально допустимая влажность воздуха
int const minhum = 10; //минимально допустимая влажность воздуха поменяй на 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();
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.clear();
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);//подаем питание на датчик влажности почвы
delay(1000);//задержка для стабилизации датчика
int Soil = analogRead(SoilPin); //снимаем показания с датчика влажности почвы. Содержит аналоговое значение в диапазоне от 0 до 1023. Используется для анализа состояния почвы.
delay(250);//тут воткнул делей чисто ради безопасности мб убрать его?
digitalWrite(SoilPowerPin,LOW);//отключаем питание у датчика влажности почвы
int percentSoil = map(Soil, 0, 1023, 100, 0); //перевод значений влажности почвы в проценты из аналоговых единиц. Используется для вывода
//блок вывода показаний
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("%");
//блок тревоги
if (luxLED < maxlight) {
lcd.clear();
lcd.print("TOO MUCH LIGHT!");
alertSignal();
}
if (Soil>=minsoil) {
lcd.clear();
lcd.print("SOIL IS DRY!");
alertSignal();
}
if (HumLed < minhum){
lcd.clear();
lcd.print("AIR IS DRY!");
alertSignal();
}
if (TempLED < mintemp) {
lcd.clear();
lcd.print("AIR IS COLD!");
alertSignal();
}
if (luxLED < minlight) {
lcd.clear();
lcd.print("TOO DARK!");
alertSignal();
}
if (HumLed > maxhum) {
lcd.clear();
lcd.print("AIR IS TOO HUMID!");
alertSignal();
}
if (TempLED > maxtemp) {
lcd.clear();
lcd.print("TOO HOT!");
alertSignal();
}
if (Soil < maxsoil) {
lcd.clear();
lcd.print("DryTheSoil");
alertSignal();
}
delay(1000);
}