Closed igorpats closed 4 years ago
На морозе ни контроллеру ни БП ничего не станется. Мороз и жара критичны только для АКБ. А какова локализация артефактов? По всей ленте? Или может на последних отрезках гирлянды? Питание последовательное? Может стоит сделать параллельное?
Питание параллельное к каждой вертикальной линии из 10 светодиодов. 4 основных точки приложения питания (от БП сечением 1,5мм2) и потом еще питание снизу раскинуто проводами 0.35. Артефакты были по всей ленте - заметны при бегущей строке или при часах, наложенных на полноэкранные эффекты шумов (noise). Сейчас полностью избавился от артефактов. Что сделал: по питанию на Wemos D1 mini был до этого подпаян электролит 1000x25V, заменил его на 3300x6.3V и еще подпаял керамический кондер 100нФ. Кроме того выходную сигнальную линию перенес с контакта D3, на контакт D5 (GPIO14) (он с другой стороны платы - теперь линия управления сразу отходит в сторону от Wemos (ранее пересекала его)). Сейчас вот так вот выглядит:
А конденсатор на 1000 новым был? Может у него характеристики уплыли или разные ставили. Я даже новые проверяю теперь.
Да, 1000x25V был новым (ESR замерить нечем, тестером сейчас измерил емкость - 926мкФ), производитель Chongx. А вот 3300x6.3V б/у, выпаян со старой материнки 2003 года (еще socket A)...
Шайтан однако. Добавил в код функциональность по выводу строки - До нового года осталось столько-то часов, никакие характеристики платы, ни версию платформы не менял (автообновление отключено). Залил в свой Wemos D1 mini - и снова появились артефакты. Вообще ничего не понимаю...
У меня 3 матрицы - на балконе, у детей под потолком и лампа. Этот фликеринг был неприятным сюрпризом. Я перебрал платы, вольтаж питания, длины кабелей, емкостной обвес, резисторы, но занятно было то, что он не проявлялся на конкретных прошивках - все старые и на лампе. В дельте, в районе 13 версии (если правильно помню), убрали следующие параметры
Проблема ушла на 100%. Почему выпилили не знаю, возможно это приводит к другим проблемам, но таковые мной не замечены.
С нетерпением жду комита мода со строкой остатка времени до НГ ;-)
Alex, скидывай обновление, проверим на других платах.
в custom.ino добавляем
String WriteDays(int iDays){
if ((iDays >= 5) && (iDays <= 20)) return " ДНЕЙ";
else {
iDays = iDays %10;
if (iDays == 1) return " ДЕНЬ";
else if ((iDays >= 2) && (iDays <=4)) return " ДНЯ";
else return " ДНЕЙ";
}
}
String WriteHours(int iHours){
if ((iHours >= 5) && (iHours <= 20)) return " ЧАСОВ";
else {
iHours = iHours %10;
if (iHours == 1) return " ЧАС";
else if ((iHours >= 2) && (iHours <=4)) return " ЧАСА";
else return " ЧАСОВ";
}
}
String WriteMinutes(int iMinutes){
if ((iMinutes >= 5) && (iMinutes <= 20)) return " МИНУТ";
else {
iMinutes = iMinutes %10;
if (iMinutes == 1) return " МИНУТА";
else if ((iMinutes >= 2) && (iMinutes <=4)) return " МИНУТЫ";
else return " МИНУТ";
}
}
String WriteSeconds(int iSeconds){
if ((iSeconds >= 5) && (iSeconds <= 20)) return " СЕКУНД";
else {
iSeconds = iSeconds %10;
if (iSeconds == 1) return " СЕКУНДА";
else if ((iSeconds >= 2) && (iSeconds <=4)) return " СЕКУНДЫ";
else return " СЕКУНД";
}
}
String DO_NY = "ДО НОВОГО ГОДА ОСТАЛОСЬ - ";
String WriteCounter(unsigned long tsCurRemained){
int iDays = tsCurRemained/(24*3600);
int iHours = tsCurRemained/3600;
int iMinutes = tsCurRemained/60;
int iSeconds = tsCurRemained;
if (iDays > 1) return DO_NY + String(iDays,DEC) + WriteDays(iDays);
else {
if (iHours >= 1) return DO_NY + String(iHours,DEC) + WriteHours(iHours);
else {
if (iMinutes >= 1)return DO_NY + String(iMinutes,DEC) + WriteMinutes(iMinutes);
else {
if (iSeconds > 1)return DO_NY + String(iSeconds,DEC) + WriteSeconds(iSeconds);
else {
return String("С НОВЫМ ГОДОМ!!!");
}
}
}
}
}
в void customModes(byte aMode) {
case DEMO_TEXT_2: //fillString(TEXT_3, 2); break;
{
long DiffTime=1577836800-now();
if (DiffTime<0) fillString(TEXT_3, 2);
else fillString(WriteCounter(DiffTime),1);
}
break;
Ну и в clock.ino в конец функции parseNTP() добавил для отладки (контроля правильности):
long DiffTime=1577836800-now();
Serial.println(DiffTime);
if (DiffTime>0) Serial.println(WriteCounter(DiffTime));
У меня на основе 15-й версии. Сделал поиск по коду - параметры FASTLED_INTERRUPT_RETRY_COUNT и FASTLED_ALLOW_INTERRUPTS дефайнами в коде не определены. Соответственно исходя из led_sysdefs_esp8266.h получаем
#ifndef FASTLED_ALLOW_INTERRUPTS
# define FASTLED_ALLOW_INTERRUPTS 1
# define INTERRUPT_THRESHOLD 0
#endif
а исходя из кода fastled_config.h
#ifndef FASTLED_INTERRUPT_RETRY_COUNT
#define FASTLED_INTERRUPT_RETRY_COUNT 2
#endif
Алекс, спасибо за код.
По дефайнам все так. На 15 версии у меня нормально работает только с нулями.
Такие же параметры в GyverLamp_v1.5.5 (и ранее), которая не фликерит. Это и навело на мысль, что проблема решается из софта.
Немного причесал код (вместо 4-х функций: WriteDays,WriteMinutes,WriteHours,WriteSeconds сделал одну WriteVremOtr, остальное как 3 поста назад):
static const String NamesVrem1[4] = { " ДНЕЙ", " ЧАСОВ", " МИНУТ", " СЕКУНД"};
static const String NamesVrem2[4] = { " ДЕНЬ", " ЧАС", " МИНУТА", " СЕКУНДА"};
static const String NamesVrem3[4] = { " ДНЯ", " ЧАСА", " МИНУТЫ", " СЕКУНДЫ"};
String WriteVremOtr(int iVrOtr, byte typeVrOtr){
if ((iVrOtr >= 5) && (iVrOtr <= 20)) return NamesVrem1[typeVrOtr];
else {
iVrOtr = iVrOtr %10;
if (iVrOtr == 1) return NamesVrem2[typeVrOtr];
else if ((iVrOtr >= 2) && (iVrOtr <=4)) return NamesVrem3[typeVrOtr];
else return NamesVrem1[typeVrOtr];
}
}
String DO_NY = "ДО НОВОГО ГОДА ОСТАЛОСЬ - ";
String WriteCounter(unsigned long tsCurRemained){
int iDays = tsCurRemained/(24*3600);
int iHours = tsCurRemained/3600;
int iMinutes = tsCurRemained/60;
int iSeconds = tsCurRemained;
if (iDays > 1) return DO_NY + String(iDays,DEC) + WriteVremOtr(iDays,0);
else {
if (iHours >= 1) return DO_NY + String(iHours,DEC) + WriteVremOtr(iHours,1);
else {
if (iMinutes >= 1)return DO_NY + String(iMinutes,DEC) + WriteVremOtr(iMinutes,2);
else {
if (iSeconds > 1)return DO_NY + String(iSeconds,DEC) + WriteVremOtr(iSeconds,3);
else {
return String("С НОВЫМ ГОДОМ!!!");
}
}
}
}
}
Алекс, а фликеринг пропал? Помогло?
Пока за окном еще светло. Через полчаса буду пробовать...
Ребят, может перезальёте скетчи поправленные? У нас уже время - пора бокалы наливать :) Но ещё успеваем
Я подправил вот так
String WriteCounter(unsigned long tsCurRemained){
int iDays = tsCurRemained/(24*3600);
int iHours = tsCurRemained/3600;
int iMinutes = tsCurRemained/60;
int iSeconds = tsCurRemained;
if (iDays > 1) return DO_NY + String(iDays,DEC) + WriteVremOtr(iDays,0) + ", " + String(iHours,DEC) + WriteVremOtr(iHours,1) + ", " + String(iMinutes,DEC) + WriteVremOtr(iMinutes,2) + ", " + String(iSeconds,DEC) + WriteVremOtr(iSeconds,3);
else {
if (iHours >= 1) return DO_NY + String(iHours,DEC) + WriteVremOtr(iHours,1) + ", " + String(iMinutes,DEC) + WriteVremOtr(iMinutes,2) + ", " + String(iSeconds,DEC) + WriteVremOtr(iSeconds,3);
else {
if (iMinutes >= 1)return DO_NY + String(iMinutes,DEC) + WriteVremOtr(iMinutes,2) + ", " + String(iSeconds,DEC) + WriteVremOtr(iSeconds,3);
else {
if (iSeconds > 1)return DO_NY + String(iSeconds,DEC) + WriteVremOtr(iSeconds,3);
else {
return String("С НОВЫМ ГОДОМ!!!");
}
}
}
}
}
Получаются бегущие часы, минуты и секунды уменьшающиеся в процессе движения
Еще в setRandomMode2() сделал после byte newMode = random(0, MODES_AMOUNT - 1);" вставку
byte counterToNY = random(0, 2);
if (counterToNY==0) newMode=DEMO_TEXT_2;
что бы увеличить вероятность выпадения этого режима.
Как времянка для эвента до НГ подойдет :-)
Сделал
до подключения #include "FastLED.h" Такое ощущение, что артефактов стало еще больше. Даже стены в игре Лабиринт теперь иногда моргают красным...
У меня так же переопределено до всех инклюдов. Печаль, значит возможно этимология проблемы разная у нас.
У меня при отсчете выводит просто дату текущую, что-то я не то делаю
Опять избавился от артефактов. Не знаю, надолго-ли... Понизил питание на ленту с 5.01В до 4.3В за счет установки советского выпрямительного диода, рассчитанного на ток 5А)
Опять избавился от артефактов. Не знаю, надолго-ли... Понизил питание на ленту с 5.01В до 4.3В за счет установки советского выпрямительного диода, рассчитанного на ток 5А)
Почему то сразу вспомнил пост с Пикабу про заземление😁😁😁
Никак не могу настроить синхронизацию с ntp сервером. Проблема в следующем: 22:36:02.254 -> NTP-сервер www.belgim.by -> 178.124.164.107 22:36:02.254 -> Отправка NTP пакета на сервер www.belgim.by 22:36:07.075 -> UDP пакeт размером 6 от 192.168.1.218, порт 2390 22:36:07.075 -> Содержимое: $18 0; 22:36:07.244 -> Таймаут NTP запроса! И так постоянно какой-бы адрес не указывал. Не могу понять почему оно пакеты не принимает от сервера. Порт использовал 123 как в исходнике. Пробовал и другие.