LCD1602 сам выключается и выдает иероглифы

похожую тему создавал, но проблема другая. При кол-ве операторов 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);
}

линии SDA и SCL надо подтянуть соединить с плюсом питания 5В или 3.3В через резисторы 4,7КОм. Они у вас наверное наводки ловят и произвольные команды из них составляют и выполняют.

есть резистор на 10кОм, слишком много будет? Радиомагазин сейчас уже скорее всего закрыт…

два по 10 КОм если параллельно соединить, будет 5КОм

еще раз спасибо, опять помогаете)

осталось понять почему кол-во операторов while влияет на наводки…

я наверное щас очень плохую вещь скажу. Я не вникаю в ваши скетчи исполненные по цельнотянутой технологии в среде Ардуино, простите. Если при беглом взгляде тридцатилетний опыт ничего не шепнет мне на ушко - я пройду мимо. про линии шины данных и подтяжку я подумал сразу же, как увидел крякозяблы на вашем дисплее. Ставить себе все это говнище за ради попытки разобраться в его сортах - я пас)

а если в программе подтяжку включить на плате, должно же сработать?..

отвечать серьезно на твой вопрос - означает серьезно его воспринять. ты же не воспринимаешь серьезно детский вопрос типа “а почему бы всем не дать мне по копейке, с них не убудет а я стану богат?”
Долго очень объяснять в чем смысл подтяжки, как она и/или количество устройств на шине влияет на емкость линии, ну и все вот это теория. Программная подтяжка у тебя не справляется явно (я подозреваю что так), нужна аппаратная.

1 лайк

это как то можно связать? тем более на модуле который прицеплен к дисплею (на фото) линии I2C подтянуты резисторами.

ежели на каждом дисплее своя подтяжка, то 8 штук могут наоборот слишком сильно перетянуть сигналы в плюс. тут принцип такой: если вам надо более одного дисплея в проекте, вам НЕ надо более одного дисплея в проекте.

блин похоже я затупил конкретнейшим образом и подумал что у ТС 8 штук дисплеев одновременно. чето седня с погодой или фазой луны…

какие 8 штук?
ты бухой чтоль?

1 лайк

дисплей 1, подключен через конвертер.

нет, но туплю конкретно, сори.

Венера в Раке?
PS
Солнце переходит из Овна в Тельца 19.04.2024 16:59:00
Луна переходит из Близнецов в Рака 13.04.2024 20:44:00
Меркурий переходит из Овна в Тельца 15.05.2024 20:05:00
Венера переходит из Овна в Тельца 29.04.2024 14:31:00
Марс переходит из Рыб в Овна 30.04.2024 18:32:00
Юпитер переходит из Тельца в Близнецы 26.05.2024 02:14:00
Сатурн переходит из Рыб в Овна 25.05.2025 06:35:00
Уран переходит из Тельца в Близнецы 07.07.2025 10:45:00
Нептун переходит из Рыб в Овна 30.03.2025 15:00:00
Плутон переходит из Водолея в Козерога 02.09.2024 03:07:00

Аспекты (Москва, GMT:+3) 16:09:39, 12.04.2024

Секстиль Луна-Меркурий (52°) Квадратура Луна-Марс (89°)
Секстиль Луна-Венера (65°) Квадратура Луна-Сатурн (90°)
Секстиль Венера-Плутон (67°) Соединение Солнце-Меркурий (1°)
Секстиль Марс-Юпитер (64°) Соединение Марс-Сатурн (1°)
Секстиль Марс-Уран (66°) Соединение Юпитер-Уран (2°)
Секстиль Юпитер-Сатурн (65°)
Секстиль Сатурн-Уран (67°)
Секстиль Уран-Нептун (53°)
Секстиль Нептун-Плутон (56°)

квадратура подвела, бобр курва я пердоле

обновленная информация - дисплей начинает бесоёбить в одном случае - если есть команда lcd.print() и в ней есть длинный стринг. Потому что когда я поменял текст на просто букву D, оно начало работать.
Поменял вместо DryTheSoil на WetSoil - все заработало. По крайней мере сейчас не бесоебит
Либо проблема с библиотекой либо я не знаю, бабайка вселился
а ну еще я переставил подключение на 1 контактую дорожку от линии питания подальше, мб это повлияло

длину строки ограничивай 16 символами при выводе из 0 позиции

Было меньше чем 16. DryTheSoil явно меньше чем 16 символов