LCD2004 не выводит изображение по I2C

Добрый вечер, господа ардуинщики. Делаю что то типа домашнего газоанализатора с кучкой датчиков (MHZ19; pms5003; ZE08-CH2O; BME280;) в дальнейшем хотел бы прикрутить еще счетчик гейгера. Написал небольшую прошивку не без помощи чата гпт вики и гайдов в интернете. Но ничего не работает, при самом банальном соединении самой esp8266 с lcd2004 без подключения остальных элементов никакого изображения на экран не выводится, хотя экран заведомо рабочий, пробовал с другим скетчем. Вот сам код, прошу помочь разобраться.

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <LiquidCrystal_I2C.h>
#include <pms.h>
#include "MHZ19.h"

#ifndef STASSID
#define STASSID "MGTS_48"
#define STAPSK  "Zz123456"
#endif
#define interruptPin D5
#define SEALEVELPRESSURE_HPA (1013.25)

#define LOG_PERIOD 10000
const char* ssid = STASSID;
const char* password = STAPSK;

const int rx_pin = 13; //Serial rx pin no
const int tx_pin = 15; //Serial tx pin no

MHZ19 *mhz19_uart = new MHZ19(rx_pin,tx_pin);
LiquidCrystal_I2C lcd(0x27, 20, 4);
ESP8266WebServer server(80);
Adafruit_BME280 bme;
Pmsx003 pms(D1, D2);
const auto n = Pmsx003::Reserved;
Pmsx003::pmsData data[n];

measurement_t m;

unsigned long previousMillis;
unsigned long counts;
unsigned long radiation;
float ch20;
float temperature, humidity, pressure, altitude;

void handleRoot() {
  server.send(200, "text/html", SendHTML());
}

String SendHTML(){
  String ptr = "<!DOCTYPE html> <html>\n";
  ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
  ptr +="<title>ESP8266 Weather Station</title>\n";
  ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
  ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
  ptr +="p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
  ptr +="</style>\n";
  ptr +="</head>\n";
  ptr +="<body>\n";
  ptr +="<div id=\"webpage\">\n";
  ptr +="<h1>ESP8266 Weather Station</h1>\n";
  ptr +="<p>Temperature: ";
  ptr +=temperature;
  ptr +="&deg;C</p>";
  ptr +="<p>Humidity: ";
  ptr +=humidity;
  ptr +="%</p>";
  ptr +="<p>Pressure: ";
  ptr +=pressure;
  ptr +="hPa</p>";
  ptr +="<p>Altitude: ";
  ptr +=altitude;
  ptr +="m</p>";
  for (size_t i = Pmsx003::PM1dot0; i < n; ++i) { 
         ptr +="<p>";
         ptr +=data[i];
         ptr+="\t";
         ptr+=Pmsx003::dataNames[i];   
         ptr+=" [";  
         ptr+=Pmsx003::metrics[i];
         ptr+="]";
         ptr +="</p>";
      }
  ptr +="<p>";
  ptr +="CO2 level ";
  ptr +=m.co2_ppm;
  ptr +=" ppm";
  ptr +="</p>";
  ptr +="<p>";
  ptr +="CO2 temperature ";
  ptr +=m.temperature;
  ptr +="&deg;C</p>";
  ptr +="<p>";
  ptr +=6*radiation;
  ptr +=" puls/min";
  ptr +="</p>";
  ptr +="<p>";
  ptr +=ch20;
  ptr +=" CH20 ppm";
  ptr +="</p>";
  ptr +="</div>\n";
  ptr +="</body>\n";
  ptr +="</html>\n";
  return ptr;
}

void handleNotFound() {
  String message = "ERROR";
  server.send(404, "text/plain", message);
}

void IRAM_ATTR tube_impulse(){       //Функция подсчета имульсов
  counts++;
}

void measure(){                              
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > LOG_PERIOD){
    previousMillis = currentMillis;
    temperature = bme.readTemperature();
    humidity = bme.readHumidity();
    pressure = bme.readPressure() / 100.0F;
    altitude = bme.readAltitude(SEALEVELPRESSURE_HPA);
    radiation=counts;
    Pmsx003::PmsStatus status = pms.read(data, n);
    m = mhz19_uart->getMeasurement();
    counts = 0;
    ch20=(analogRead(A0)-124)/99.2;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("T=");
    lcd.print(int(temperature));
    lcd.print(" H=");
    lcd.print(int(humidity));
    lcd.print(" P=");
    lcd.print(int(pressure));
    lcd.setCursor(0, 1);
    lcd.print("C=");
    lcd.print(int(m.co2_ppm));
    
    lcd.print(" R=");
    lcd.print(int(6*radiation));
    lcd.print(" CH2=");
    lcd.print(ch20);
    lcd.setCursor(0, 2);
    lcd.print("PM1="); 
    lcd.print(data[Pmsx003::PM1dot0]);
    lcd.print(" PM2.5="); 
    lcd.print(data[Pmsx003::PM1dot0+1]);
    lcd.setCursor(0, 3);
    lcd.print("PM10="); 
    lcd.print(data[Pmsx003::PM1dot0+2]);
  //  lcd.print(" ");
    //
  }
}
void setup(void) {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");
 // interrupts();
  pinMode(interruptPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(interruptPin), tube_impulse, RISING);
  lcd.begin(20,4);
  lcd.init();
  lcd.backlight();
  bme.begin(0x76); 
  pms.begin();
  pms.waitForData(Pmsx003::wakeupTime);
  pms.write(Pmsx003::cmdModeActive);  
  mhz19_uart->begin(rx_pin, tx_pin);
  mhz19_uart->setAutoCalibration(false);
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(WiFi.localIP());

  if (MDNS.begin("esp8266")) {
    Serial.println("MDNS responder started");
  }

  server.on("/", handleRoot);
  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");
}

void loop(void) {
  server.handleClient();
  MDNS.update();
  measure();
}

Ну так может потому и не выводится, что система ждет подключения к сети и ищет датчики - а без них до вывода на экран просто не доходит.

Если бы вы добавили вывод сообщений в Монитор на каждом этапе инициализации - можно было бы видеть, на каком шаге зависает.

То есть если я подключу все датчики все в принципе заработает ?

я такого не обещал :slight_smile:

Вы не на то обращаете внимание.

Хорошо, я понял, а как возможно добавить вывод сообщений на каждом этапе инициализации?

Serial.println("Сообщение");

Выдает ошибку Compilation error: ‘Serial’ does not name a type

Такую строку можно вставить ТОЛЬКО внутрь функций.

Попробовал, в монитор выводиться несуразный бред, видимо от каких то других сообщений
image

а монитор об этом знает?

не понял

вот не понятливый)
в мониторе порта скорость соответствует?

Благодарю, теперь заработало. Но в мониторь из всех сообщений вывелось только сообщение вставленное в функцию setup, хотя сообщение я вставил в каждую функцию кроме лупа

Вас это и в правду удивляет?

Так, эта … “чат гпт вики и гайды в интернете” в помощь!

Я просто попросил помощи, в чем проблема?

Что вывелось в монитор порта мы должны угадать ???

примерно как я вам и написал в первом ответе

Попробуйте решать проблему постепенно. Если вас интересует экран - выкиньте из скетча все остальное - датчики, вебсервер, ДНС. Когда экран зраработает - начинайте постепенно добавлять другие части кода обратно, тестируя после каждого изменения. Так вы поймете, что именно вешает программу.

Этому дисплею при инициализации надо явно указывать адрес
в 161 строке
LiquidCrystal_I2C lcd(ADDR,20,4);

Адрес можно поискать к примеру так

   Wire.begin();
  while ( nDevices < 10 )
  {
     
  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    if (address==24){ address++;}
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      ADDR=address;
         nDevices=11;
    }
  }

Спасибо, буду пробовать

У кого проблема? У меня? Ни в чём нет. А у Вас – Вам виднее.