Skip to content

Display Reboot when try to use Wi-Fi #193

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
razarahil opened this issue Apr 29, 2025 · 1 comment
Open

Display Reboot when try to use Wi-Fi #193

razarahil opened this issue Apr 29, 2025 · 1 comment

Comments

@razarahil
Copy link

razarahil commented Apr 29, 2025

I've created the UI using Squareline and added the UI to the code with the help of lvgl port.
When I run just UI, it works fine and as soon as I add Wi-Fi code, the display start rebooting.

lvgl v8.4.4
esp display panel: v1.0.0
esp32 aduino core: v3.1.3
Display: Waveshare ESP32S3-LCD-Touch-5B

`#include <Arduino.h>
#include <esp_display_panel.hpp>
#include <lvgl.h>
#include "lvgl_v8_port.h"
#include <ui.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

using namespace esp_panel::drivers;
using namespace esp_panel::board;

// WiFi configuration
const char* ssid = "YOUR_WIFI_SSID"; // Replace with your WiFi SSID
const char* password = "YOUR_WIFI_PASSWORD"; // Replace with your WiFi password

// Home Assistant configuration
const char* ha_url = "https://homeassistant.local";
const char* ha_token = "YOUR_LONG_LIVED_TOKEN"; // Replace with your Home Assistant long-lived token

// Sensor IDs
const char* outdoor_humidity_id = "sensor.outdoor_outside_humidity";
const char* outdoor_temp_id = "sensor.outdoor_outside_temperature";
const char* indoor_temp_id = "sensor.sonoff_temperature_temperature";
const char* indoor_humidity_id = "sensor.sonoff_temperature_humidity";
const char* energy_consumption_id = "sensor.tapo_this_month_s_consumption";

// Update interval (10 minutes = 600000 milliseconds)
const unsigned long updateInterval = 600000;
unsigned long lastUpdateTime = 0;

// Function declarations
void connectWiFi();
void fetchHAData();
String getSensorValue(const char* sensorId);

void setup() {
String title = "LVGL porting example";

Serial.begin(115200);
Serial.println("Initializing board");

// Initialize board
Board *board = new Board();
board->init();

#if LVGL_PORT_AVOID_TEARING_MODE
auto lcd = board->getLCD();
// When avoid tearing function is enabled, the frame buffer number should be set in the board driver
lcd->configFrameBufferNumber(LVGL_PORT_DISP_BUFFER_NUM);

#if ESP_PANEL_DRIVERS_BUS_ENABLE_RGB && CONFIG_IDF_TARGET_ESP32S3
auto lcd_bus = lcd->getBus();
/**

  • As the anti-tearing feature typically consumes more PSRAM bandwidth, for the ESP32-S3, we need to utilize the
  • "bounce buffer" functionality to enhance the RGB data bandwidth.
  • This feature will consume bounce_buffer_size * bytes_per_pixel * 2 of SRAM memory.
    */
    if (lcd_bus->getBasicAttributes().type == ESP_PANEL_BUS_TYPE_RGB) {
    static_cast<BusRGB *>(lcd_bus)->configRGB_BounceBufferSize(lcd->getFrameWidth() * 10);
    }
    #endif
    #endif

assert(board->begin());

Serial.println("Initializing LVGL");
lvgl_port_init(board->getLCD(), board->getTouch());

Serial.println("Creating UI");
/* Lock the mutex due to the LVGL APIs are not thread-safe /
lvgl_port_lock(-1);
ui_init();
/
Release the mutex */
lvgl_port_unlock();

// PRIORITY 2: Connect to WiFi
connectWiFi();

// PRIORITY 3: First data fetch
if (WiFi.status() == WL_CONNECTED) {
fetchHAData();
}
}

void loop() {
// Handle display updates
lvgl_port_task_handler();

// Check WiFi connection
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi connection lost, reconnecting...");
connectWiFi();
}

// Check if it's time to update data from Home Assistant (every 10 minutes)
unsigned long currentTime = millis();
if (currentTime - lastUpdateTime >= updateInterval || lastUpdateTime == 0) {
if (WiFi.status() == WL_CONNECTED) {
fetchHAData();
lastUpdateTime = currentTime;
}
}

delay(10); // Small delay to prevent watchdog issues
}

// Connect to WiFi
void connectWiFi() {
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, password);

// Wait for connection with timeout
int timeout = 20; // 10 seconds timeout
while (WiFi.status() != WL_CONNECTED && timeout > 0) {
delay(500);
Serial.print(".");
timeout--;
}

if (WiFi.status() == WL_CONNECTED) {
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
} else {
Serial.println("");
Serial.println("WiFi connection failed");
}
}

// Fetch data from Home Assistant
void fetchHAData() {
Serial.println("Fetching data from Home Assistant...");

// Update UI with values from Home Assistant
lvgl_port_lock(-1);

// Get and set outdoor temperature
String outdoorTemp = getSensorValue(outdoor_temp_id);
if (outdoorTemp != "") {
lv_label_set_text(ui_outdoorTemp, outdoorTemp.c_str());
}

// Get and set outdoor humidity
String outdoorHumi = getSensorValue(outdoor_humidity_id);
if (outdoorHumi != "") {
lv_label_set_text(ui_outdoorHumi, outdoorHumi.c_str());
}

// Get and set indoor temperature
String indoorTemp = getSensorValue(indoor_temp_id);
if (indoorTemp != "") {
lv_label_set_text(ui_indoorTemp, indoorTemp.c_str());
}

// Get and set indoor humidity
String indoorHumi = getSensorValue(indoor_humidity_id);
if (indoorHumi != "") {
lv_label_set_text(ui_indoorHumi, indoorHumi.c_str());
}

// Get and set energy consumption
String energy = getSensorValue(energy_consumption_id);
if (energy != "") {
lv_label_set_text(ui_energyConsum, energy.c_str());
}

lvgl_port_unlock();

Serial.println("Home Assistant data updated");
}

// Helper function to get sensor value from Home Assistant
String getSensorValue(const char* sensorId) {
String value = "";
HTTPClient http;

// Construct the API URL
String url = String(ha_url) + "/api/states/" + String(sensorId);

// Begin HTTP request
http.begin(url);

// Add authorization header
http.addHeader("Authorization", "Bearer " + String(ha_token));
http.addHeader("Content-Type", "application/json");

// Send GET request
int httpCode = http.GET();

if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();

// Parse JSON response
DynamicJsonDocument doc(1024);
DeserializationError error = deserializeJson(doc, payload);

if (!error) {
  value = doc["state"].as<String>();
  
  // Include unit of measurement if available
  if (doc.containsKey("attributes") && doc["attributes"].containsKey("unit_of_measurement")) {
    value += " " + doc["attributes"]["unit_of_measurement"].as<String>();
  }
} else {
  Serial.print("JSON parsing failed: ");
  Serial.println(error.c_str());
}

} else {
Serial.print("HTTP GET failed, error: ");
Serial.println(httpCode);
}

http.end();
return value;
}`

@Lzw655
Copy link
Collaborator

Lzw655 commented Apr 30, 2025

Hi @razarahil,

Could you provide the complete error logs?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants