• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

сдвиг(offset) ws2812b

joy1q2q

New member
Добрый день!
Есть проблема с этими часами. У них полдень (12:00) находится на первом пикселе, после проводов. Можно ли их сдвинуть до середины (пиксель №30). Тогда мои провода будут внизу, а не вверху, как на фото. Я совсем идиот в программировании. Единственное посильное мне решение - перепаять провода к центру, но моя конструкция уже собрана и склеена. Заказывать новую форму довольно дорого. Потому отзовитесь, если можете помочь. Или подсказать.... Я понимаю, что ковыряться в чужом коде никому не нравится... Но очень надеюсь на выход

lightclockwifiv2/lightclockwifi.ino at master · chrismelba/lightclockwifiv2 · GitHub

 

Вложения

Последнее редактирование:

Юрий Ботов

Moderator
Команда форума
Ух ты! Не часто увидишь такой огромный скетч!
Сначала вопросы:
- "часы" которые вы сделали полностью соответствуют скетчу? Ну то есть 120 "пикселов" (так в коде прописано) и тд? Что то оно не совсем у меня вяжется надписью "60 pixel small" и с тем что середина на 30 "пикселе". Может я что пока в идее не понимаю...
- вы можете редактирвать текст скетча и заливать его в esp?
- у вас все работает правильно, но хочется повернуть часы "вверх ногами"?
- вы понимаете что поворачивать придется не только "стрелки" но и вью аларма, секторное вью, и даже какую-то игрушку (я пока не понял в чем она заключается)? Это все в разных местах...

Ну и вопрос всех вопросов: не могу представить себе ситуации, когда НЕВОЗМОЖНО провести провода на другую сторону внутри корпуса часов... поясните поподробнее суть проблемы.
 
Последнее редактирование:

joy1q2q

New member
Ух ты! Не часто увидишь такой огромный скетч!
Сначала вопросы:
- "часы" которые вы сделали полностью соответствуют скетчу? Ну то есть 120 "пикселов" (так в коде прописано) и тд? Что то оно не совсем у меня вяжется надписью "60 pixel small" и с тем что середина на 30 "пикселе". Может я что пока в идее не понимаю...
- вы можете редактирвать текст скетча и заливать его в esp?
- у вас все работает правильно, но хочется повернуть часы "вверх ногами"?
- вы понимаете что поворачивать придется не только "стрелки" но и вью аларма, секторное вью, и даже какую-то игрушку (я пока не понял в чем она заключается)? Это все в разных местах...
да-да. Там есть 3 режима. 120, 60 и можно даже самому выбирать сколько ("min_pos").
Да, я собрал все и оно работает... но вверх ногами. Я понимаю... планировалось сначала использовать другой скетч. Где уже все разбито, но тут нашел вот это чудо с вайфаем и покером. И я понимаю что я сейчас буду писать какие-то глупости, но я очень хочу довести это до ума.
 

Юрий Ботов

Moderator
Команда форума
Начните с того что найдите вот этот код:

Код:
void updateface() {
  //Serial.println("Updating Face");
  int hour_pos;
  int min_pos;

  switch(speed) {
    case 0:
      hour_pos = ((hour() % 12) * pixelCount / 12 + minute() * pixelCount / 720);
      min_pos = (minute() * pixelCount / 60 + second() * pixelCount / 3600);
    break;

    case 1:
      hour_pos = ((minute() % 12) * pixelCount / 12 + second() * pixelCount / 720);
      min_pos = (second() * pixelCount / 60);
    break;

    case 2:
      hour_pos = ((10 % 12) * pixelCount / 12 + 10 * pixelCount / 720);
      min_pos = (10 * pixelCount / 60 + 0 * pixelCount / 3600);;
    break;
  }
и замените его на:

Код:
void updateface() {
  //Serial.println("Updating Face");
  int hour_pos;
  int min_pos;

  switch(speed) {
    case 0:
      hour_pos = (((hour()+6) % 12) * pixelCount / 12 + (minute()+30) * pixelCount / 720);
      min_pos = ((minute()+30) * pixelCount / 60 + (second()+30) * pixelCount / 3600);
    break;

    case 1:
      hour_pos = (((minute()+30) % 12) * pixelCount / 12 + (second()+30) * pixelCount / 720);
      min_pos = ((second()+30) * pixelCount / 60);
    break;

    case 2:
      hour_pos = ((10 % 12) * pixelCount / 12 + 10 * pixelCount / 720);
      min_pos = (10 * pixelCount / 60 + 0 * pixelCount / 3600);;
    break;
  }
Загрузите скетч с исправлением, попереключайте разные режимы и расскажите что получилось
 

joy1q2q

New member

первые 12 пикселей постоянно белые. я не могу посмотреть где теперь полдень, но точно не на первом пикселе.
Они перестали обновлять время
 

Юрий Ботов

Moderator
Команда форума
Поясните мне логику их секторной отображалки плииз. где сектор начинается и где заканчивается. И свою цветовую кодировку тоже расскажите.
 

Юрий Ботов

Moderator
Команда форума
я его видел. просто цвета у вас другие. И кстати, время оно отображает у вас текущее или некое случайное(до синхронизации с сервером)?
 

Юрий Ботов

Moderator
Команда форума
Еще раз переспрошу ибо из ответов это не понятно: до изменения в коде часы работали правильно? Показывали правильное время? Или что то там вроде светится красиво...

Время на фотоаппарате правильное?
 

joy1q2q

New member
Еще раз переспрошу ибо из ответов это не понятно: до изменения в коде часы работали правильно? Показывали правильное время? Или что то там вроде светится красиво...

Время на фотоаппарате правильное?
да, время правильное. У меня часовой пояс +7 (21:18 сейчас). Я для этого и добавляю дату на снимки)
часы красные, а минуты синие.

UPD: я не знаю как... но оно работает.... я сейчас проверяю все. Тут есть режим отображения (часы, полдень, четверти) так вот полдень так и остался на первом пикселе, а вот часы считают с 30го

UPD2: они начинают ломаться в том самом месте, как и первый скрин.

 
Последнее редактирование:

Юрий Ботов

Moderator
Команда форума
мои изменения кода пока касаются только положения стрелок ничего другого я не менял
 

Юрий Ботов

Moderator
Команда форума
Пойдем с другой стороны - будем "ломать" библиотеку.
1. Откатываем как было.
2. делаем резервную копию :)
3. везде по тексту скетча производим замену "clockleds->SetPixelColor" на "SetPixClr" естественно без кавычек.
4. Добавляем в хвост новые подменяющие функции:
Код:
void SetPixClr(uint16_t n, uint8_t r, uint8_t g, uint8_t b)
{
    int shifter = 30;
    clockleds->SetPixelColor((n + shifter + pixelCount) % pixelCount, r, g, b);
}

void SetPixClr(uint16_t n, RgbColor c)
{
    SetPixClr(n, c.R, c.G, c.B);
}

void SetPixClr(uint16_t n, RgbColor c, uint8_t brightness)
{
    SetPixClr(n, c.R * ((float)brightness / 255), c.G * ((float)brightness / 255), c.B * ((float)brightness / 255));
}
5. Если не заработала как надо - пробуем подбирать переменную shifter в первой из новых функций
 

joy1q2q

New member
Пойдем с другой стороны - будем "ломать" библиотеку.
1. Откатываем как было.
2. делаем резервную копию :)
3. везде по тексту скетча производим замену "clockleds->SetPixelColor" на "SetPixClr" естественно без кавычек.
4. Добавляем в хвост новые подменяющие функции:
Код:
void SetPixClr(uint16_t n, uint8_t r, uint8_t g, uint8_t b)
{
    int shifter = 30;
    clockleds->SetPixelColor((n + shifter + pixelCount) % pixelCount, r, g, b);
}

void SetPixClr(uint16_t n, RgbColor c)
{
    SetPixClr(n, c.R, c.G, c.B);
}

void SetPixClr(uint16_t n, RgbColor c, uint8_t brightness)
{
    SetPixClr(n, c.R * ((float)brightness / 255), c.G * ((float)brightness / 255), c.B * ((float)brightness / 255));
}
5. Если не заработала как надо - пробуем подбирать переменную shifter в первой из новых функций
оно работает... глазам своим не верю! все работает!) "Ломать библиотеку" это безопасно?)
честно, никогда еще мои скетчи не работали правильно!)
 

Юрий Ботов

Moderator
Команда форума
мы просто ... эдакую прокладку засунули между скетчем и библиотекой. Безопасно.
 
Сверху Снизу