GyverLibs / GyverDB

Простая база данных для Arduino
MIT License
9 stars 1 forks source link

Мерцает LED Panel 16x16 при использовании db.begin(); #3

Closed Striagor closed 1 day ago

Striagor commented 3 days ago

Делаю светофор с использованием платы WT32-S1. и LED панелью гибкой 16x16 пикселей 2024-11-27_17-34-26

по библиотекам: `

include

include

include

include

include "button.h"

include "IRremote.h"

include

include

include

include

// настройки led панели

define PIN 33 // Пин для управления RGB панелью 14

define MW 16 // Ширина rgb пенели (колличество пикселей)

define MH 16 // Высота rgb пенели (колличество пикселей)

define BRIGHTNESS 20 // Яркость панели

define DELAY_SHOW 5000 // Задержка

Adafruit_NeoMatrix *matrix = new Adafruit_NeoMatrix(MW, MH, PIN, NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ800);`

код в котором происходит глюк/мерцание `void Init_DataBase(){ // запуск файловой системы

ifdef ESP32

  LittleFS.begin(true); // format on fail
#else
  LittleFS.begin();
#endif

// запуск БД и чтение из файла 
db.begin();   
// инициализация БД начальными значениями
db.init(keys::wifi_ssid, "WiFiName");
db.init(keys::wifi_pass, "pass");
// посмотрим что записалось
db.dump(Serial);

}`

проблема заключается в том что при использовании данных библиотек, у меня возникает мерцание на led панели раз в 3 секунды, мультиметр мне говорит что на пине который отправляет данные в led панель происходит просадка раз в 3 секунды, как только я комментирую строку db.begin(); , то мерцание проходит, но оно также проявляется в момент когда я захожу в веб интерфейс в раздел ввести пароль для авторизации и мерцает когда я выхожу из этого раздела, подскажите как решить данную проблему и с чем она может быть связана?

GyverLibs commented 3 days ago

Вывод на ленту где и как организован?

GyverLibs commented 3 days ago

Мультиметром измерять напряжение цифрового сигнала с частотой почти 1 МГц это конечно сильно)

Striagor commented 3 days ago

Вывод на ленту где и как организован?

хахаха) знаю про это) ну чем богаты как говориться

Striagor commented 3 days ago

Вывод на ленту где и как организован?

на момент последних тестов был подключен 33 пин, он на самой плате подписан как rs485, также добавлю что пробовал многие пины, везде ситуация одинаковая, пробовал пины ( 2,4,14,15,32,23,33,17... )

GyverLibs commented 3 days ago

Часть программы, где обновляется лента

Striagor commented 1 day ago

Часть программы, где обновляется лента

void setup() { Serial.begin(115200); Serial.println();

matrix->begin();
matrix->setBrightness(BRIGHTNESS);
matrix->show();

}

void display_fillMatrix(uint16_t color) { matrix->fillRect(0,0, MW, MH, color); matrix->show(); }

вызов функции происходит по надобности, не чаще чем раз в 100 мс, а то и реже

GyverLibs commented 1 day ago

Так, а что представляет собой мерцание?

GyverLibs commented 1 day ago

Ladno

Striagor commented 1 day ago

Так, а что представляет собой мерцание?

так... сегодня снова искал проблему и понял что в целом мерцание еще возможно происходит из за многопоточности

есть три потока xTaskCreatePinnedToCore( Task_SwitchModeLight, "Task_SwitchModeLight", 5000, NULL, 2, &Task1, 1);
delay(500);

xTaskCreatePinnedToCore(Task_IRRemoteControl, "Task IRRemoteControl", 5000, NULL, 2, &Task2, 1);
delay(500);

xTaskCreatePinnedToCore(Task_UpdateRGBPanel, "Task UpdateRGBPanel", 5000, NULL, 1, &Task3, 0);
delay(500);

так вот если использовать вместо xTaskCreatePinnedToCore(Task_UpdateRGBPanel...

другую библиотеку многопоточности (псевдо многопоточность)

include //ArduinoThread

Thread thread_UpdateRGBPanel = Thread(); // создаём поток обновления rgb панели void setup() { ... thread_UpdateRGBPanel.onRun(updateRGBPanel); // назначаем потоку задачу thread_UpdateRGBPanel.setInterval(0.02); // задаём интервал срабатывания, мсек ... }

void loop() { // обработчик UI sett.tick(); if (thread_UpdateRGBPanel.shouldRun()) thread_UpdateRGBPanel.run(); // запускаем поток } мерцание проходит и появляется только в момент входа в web интерфейс, а именно в раздел авторизации. В целом возможно проблема и не с библиотекой GyverDBFile

GyverLibs commented 1 day ago

DB здесь вообще последнее из за чего может быть проблема)

Striagor commented 1 day ago

DB здесь вообще последнее из за чего может быть проблема)

есть теория о том что в момент отправки шим сигнала по обновлению светодиодов на панели, поток прерывается и отдается приоритет на выполнения других операций, как бы принудительно заставить выполнить функцию до конца и только после этого отдать ресурсы цп на выполнения других операций...

GyverLibs commented 1 day ago

Не использовать ртос или наоборот изучать его подробнее)

Striagor commented 1 day ago

Не использовать ртос или наоборот изучать его подробнее)

пойду изучать его, спасибо за отклик)

Striagor commented 1 day ago

может кому пригодится, решение своей проблемы нашел в руководстве FreeRTOS https://narodstream.ru/esp32-urok-14-freertos-myuteksy/

Проблема была в многопоточности, а именно в неправильной организации, другие потоки прерывали поток в котором происходило обновление RGB панели, когда стал использовать мьютекс для обновления RGB панели, все мерцания прошли

GyverLibs commented 1 day ago

ну во