Ви не увійшли.
Источником нарушения синхронизации могут выступать разные причины. Часы реального времени, скорее всего, имеют относительно высокую точность хода, поэтому смещение сигналов будет наблюдаться лишь по прошествии нескольких часов, а то и дней. Хотя если и кварцы, и сами часы на разных модулях разные, то это может стать заметным в несколько быстрее.
Скорее всего проблема в задержках обусловлена обработкой прерываний от радио части. Особенно это будет заметно, если код написан на основе delay() или usleep(). Радио протокол, будь то WiFi или BLE подразумевает достаточно жесткий тайминг: если в него не успевать вкладываться, то задержки будут приводить к сбоям в соединении. Поэтому эти прерывания имеют обычно самый высокий приоритет, и delay() будет вынужден ждать, пока не закончится обработка такого прерывания.
Чтобы решить эту задачу, включение светодиодов можно синхронизировать с одним из аппаратных таймеров (RTC вполне подходит). Если сигнал строго периодический, то достаточно выровнять фазу включения по некоторому опорному значению таймера. Например, если светодиод должен зажигаться каждую секунду, а значение таймера измеряется в миллисекундах, то достаточно выполнять проверку остатка от деления значения таймера на 1000. Однако при этом нужно учесть, что в момент, когда значение таймера станет кратным 1000, может выполняться обработка другого, более приоритетного прерывания. Поэтому, вероятно, имеет смысл предусмотреть эту возможную задержку и "догонять" реальное время, например, как-то так (извините, код не совместим с Ардуино):
#define TRIGGER_TIME 1000
void
on_rtc_evt()
{
/* the trigger counter follows RTC, but incremented in steps of TRIGGER_TIME */
static uint32_t trigger_counter = 0;
/* how many triggers were overdued and needed to be consumed */
static uint16_t trigger_overdue = 0;
if (RTC->COUNTER - trigger_counter + trigger_bias >= TRIGGER_TIME) {
trigger_overdue += (RTC->COUNTER - trigger_counter) / TRIGGER_TIME;
trigger_counter = RTC->COUNTER - RTC->COUNTER % TRIGGER_TIME;
};
/* XXX the following code is usually better to keep out of an interrupt handler */
while (trigger_overdue-- > 0) {
ledctl(...);
}
}
Здесь глобальная переменная trigger_bias задает смещение в диапазоне (0; TRIGGER_TIME-1) и устанавливается в соответствии с неким распределенным протоколом синхронизации времени между устройствами. Для этого проекта, как мне думается, протокол может быть достаточно простым, на манер RBS: время от времени высылается серия широковещательных пакетов, и часы всех распределенных устройств подстраиваются под эту рассылку. Можно сделать так, чтобы рассылку осуществлял любой узел сети, но он должен это делать строго в момент срабатывания триггера - необходимо иметь референтное время, чтобы все устройства, которые получили этот пакет, понимали, как их таймер смещен относительно часов передатчика.
Контактная информация этого человека "странным образом" совпадает с моей.
А решил я эту проблему написанием кода, время выполнения которого не зависит от соотношения количеств передаваемых нулей и единиц.
Написал вам на почту кинул контактные данные. Готов заплатить за решение этой проблемы
Контактная информация этого человека "странным образом" совпадает с моей.
А решил я эту проблему написанием кода, время выполнения которого не зависит от соотношения количеств передаваемых нулей и единиц.
Причина рассинхронизации может быть в способе реализации управления ws2812b. На них нужно передавать довольно много информации и если эта информация различается между костюмами, то я знаю одного человека, который эту проблему успешно решил )))
Можете мне дать Контакты этого человека? Или какими способом он это решил ?
То есть на всех одинаковый код и они получают только сигнал начала выполнения алгоритма и потом никак не связаны между собой?
Да правильно
Причина рассинхронизации может быть в способе реализации управления ws2812b. На них нужно передавать довольно много информации и если эта информация различается между костюмами, то я знаю одного человека, который эту проблему успешно решил )))
Разбить программу на фрагменты, в пределах которых рассинхронизация не проявляется и запускать каждый фрагмент отдельным внешним воздействием.
Я когда увидел такое в начале сезона "Танців з зірками", тоже загорелся подобной идеей, но не нашёл единомышленников среди служителей Терпсихоры и отложил идею до лучших времён
То есть на всех одинаковый код и они получают только сигнал начала выполнения алгоритма и потом никак не связаны между собой?
А это вообще можно сделать не прерывая код ?
А через что это сделать лучше ? Через код ?
нужно обнулять данные перед приходом новых
Обычная, ткань трикотаж на кофте, а штаны джинс. Но тут точно не в ткани дело. Пытались без подключения к костюму мигать отдельно диодом который на плате стоит. Все равно задержка
Костюмы из какой ткани пошиты ?
Надо именно, такая логика как описана. Что бы сбоев небыло при передаче. Может на stm32 переделать все ?
Кто то может сталкивался именно с таким порядком ?
хотите полной синхронизации - головное даёт команды вкл-выкл, а костюмы выполняют.