vvip-68 / GyverMatrixWiFi

Адресная матрица на NodeMCU с управлением по WiFi
150 stars 49 forks source link

Ntp сервер, что я делаю не так #25

Closed igorpats closed 4 years ago

igorpats commented 4 years ago

Никак не могу настроить синхронизацию с 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 как в исходнике. Пробовал и другие.

ant1xr1st87 commented 4 years ago

На морозе ни контроллеру ни БП ничего не станется. Мороз и жара критичны только для АКБ. А какова локализация артефактов? По всей ленте? Или может на последних отрезках гирлянды? Питание последовательное? Может стоит сделать параллельное?

AlexxVel commented 4 years ago

Питание параллельное к каждой вертикальной линии из 10 светодиодов. 4 основных точки приложения питания (от БП сечением 1,5мм2) и потом еще питание снизу раскинуто проводами 0.35. Артефакты были по всей ленте - заметны при бегущей строке или при часах, наложенных на полноэкранные эффекты шумов (noise). Сейчас полностью избавился от артефактов. Что сделал: по питанию на Wemos D1 mini был до этого подпаян электролит 1000x25V, заменил его на 3300x6.3V и еще подпаял керамический кондер 100нФ. Кроме того выходную сигнальную линию перенес с контакта D3, на контакт D5 (GPIO14) (он с другой стороны платы - теперь линия управления сразу отходит в сторону от Wemos (ранее пересекала его)). Сейчас вот так вот выглядит: wemos

igorpats commented 4 years ago

А конденсатор на 1000 новым был? Может у него характеристики уплыли или разные ставили. Я даже новые проверяю теперь.

AlexxVel commented 4 years ago

Да, 1000x25V был новым (ESR замерить нечем, тестером сейчас измерил емкость - 926мкФ), производитель Chongx. А вот 3300x6.3V б/у, выпаян со старой материнки 2003 года (еще socket A)...

AlexxVel commented 4 years ago

Шайтан однако. Добавил в код функциональность по выводу строки - До нового года осталось столько-то часов, никакие характеристики платы, ни версию платформы не менял (автообновление отключено). Залил в свой Wemos D1 mini - и снова появились артефакты. Вообще ничего не понимаю...

fsb054c commented 4 years ago

У меня 3 матрицы - на балконе, у детей под потолком и лампа. Этот фликеринг был неприятным сюрпризом. Я перебрал платы, вольтаж питания, длины кабелей, емкостной обвес, резисторы, но занятно было то, что он не проявлялся на конкретных прошивках - все старые и на лампе. В дельте, в районе 13 версии (если правильно помню), убрали следующие параметры

define FASTLED_INTERRUPT_RETRY_COUNT 0

define FASTLED_ALLOW_INTERRUPTS 0

Проблема ушла на 100%. Почему выпилили не знаю, возможно это приводит к другим проблемам, но таковые мной не замечены.

С нетерпением жду комита мода со строкой остатка времени до НГ ;-)

igorpats commented 4 years ago

Alex, скидывай обновление, проверим на других платах.

AlexxVel commented 4 years ago

в 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));
AlexxVel commented 4 years ago

У меня на основе 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
fsb054c commented 4 years ago

Алекс, спасибо за код.

По дефайнам все так. На 15 версии у меня нормально работает только с нулями.

Такие же параметры в GyverLamp_v1.5.5 (и ранее), которая не фликерит. Это и навело на мысль, что проблема решается из софта.

AlexxVel commented 4 years ago

Немного причесал код (вместо 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("С НОВЫМ ГОДОМ!!!");
        }
      }
    }
  }
}
fsb054c commented 4 years ago

Алекс, а фликеринг пропал? Помогло?

AlexxVel commented 4 years ago

Пока за окном еще светло. Через полчаса буду пробовать...

ACKET2009 commented 4 years ago

Ребят, может перезальёте скетчи поправленные? У нас уже время - пора бокалы наливать :) Но ещё успеваем

fsb054c commented 4 years ago

Я подправил вот так

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;

что бы увеличить вероятность выпадения этого режима.

Как времянка для эвента до НГ подойдет :-)

AlexxVel commented 4 years ago

Сделал

define FASTLED_INTERRUPT_RETRY_COUNT 0

define FASTLED_ALLOW_INTERRUPTS 0

до подключения #include "FastLED.h" Такое ощущение, что артефактов стало еще больше. Даже стены в игре Лабиринт теперь иногда моргают красным...

fsb054c commented 4 years ago

У меня так же переопределено до всех инклюдов. Печаль, значит возможно этимология проблемы разная у нас.

igorpats commented 4 years ago

У меня при отсчете выводит просто дату текущую, что-то я не то делаю

AlexxVel commented 4 years ago

Опять избавился от артефактов. Не знаю, надолго-ли... Понизил питание на ленту с 5.01В до 4.3В за счет установки советского выпрямительного диода, рассчитанного на ток 5А) diod

ant1xr1st87 commented 4 years ago

Опять избавился от артефактов. Не знаю, надолго-ли... Понизил питание на ленту с 5.01В до 4.3В за счет установки советского выпрямительного диода, рассчитанного на ток 5А) diod

Почему то сразу вспомнил пост с Пикабу про заземление😁😁😁