Большие часы на адресных светодиодах WS2812B

Большие часы на адресных светодиодах WS2812B
Всем привет, хочу рассказать о том как я попробовал повторить проект, но столкнулся с некоторыми проблемами.

Как-то раз на просторах зарубежного интернета я нашел вот такой проект часов на базе светодиодной ленты WS2812B: Big, Auto Dim, Room Clock, и мне захотелось его повторить. Часы устроены как семи сегментный циферблат и работают на RTC модуле DS3231 . Часы умеют показывать температуру, имеют кнопки для настройки и перевода на зимнее время и обратно, позже я добавил датчик влажности DHT11. Температура уже вместе с влажностью считывалась с этого датчика и выводилась раз в минуту. Хоть и в модуле часов есть температурный датчик, но похоже он показывал температуру не корректно из-за самонагрева (ИМХО).




Untitled Sketch_МП.png
И главное нанести много горячих соплей

IMG_20180907_120755.jpg


Когда все было собрано, повозившись с библиотеками, все заработало. И тут возникло одно большое НО: положения яркости в только в двух позициях меня не устраивало. Тем более на границе значений происходило мерцание. Установка яркости на статичном значении меня тоже не очень устраивала ибо днем при установленном тусклом свете ничего не было видно, а ночью даже со значениями близким к минимуму можно было осветить всю Москву. Поинтересовавшись как в других проектах с этим справляется Alex было решено заменить такой код настройки яркости.

C:
void BrightnessCheck(){
  const byte sensorPin = BRI_PIN; // light sensor pin
  const byte brightnessLow = 1; // Low brightness value
  const byte brightnessHigh = 50; // High brightness value
  int sensorValue = analogRead(sensorPin); // Read sensor
  Serial.print("Sensor is: ");Serial.println(sensorValue);
  sensorValue = map(sensorValue, 0, 255, 1, 100);
  LEDS.setBrightness(sensorValue);
  };
вот такими строчками:
C:
void BrightnessCheck() {

  if (auto_bright) {                         // если включена адаптивная яркость
    if (millis() - bright_timer > 100) {     // каждые 100 мс
      bright_timer = millis();               // сброить таймер
      new_bright = map(analogRead(BRI_PIN), 0, bright_constant, min_bright, max_bright);   // считать показания с фоторезистора, перевести диапазон
      new_bright = constrain(new_bright, min_bright, max_bright);
      new_bright_f = new_bright_f * coef + new_bright * (1 - coef);
      LEDS.setBrightness(new_bright_f);      // установить новую яркость
    }
  }
};

Тут стоит упомянуть что программистом я не являюсь и большинство проблем я пытаюсь решить методом тыка и перебора.

И тут все заработало, моей радости не было придела, пока не наступила ночь. Появилась проблема с отключением ленты при полной темноте. Иногда это было только на минуту, а иногда на целую ночь. Еще есть проблема со слабим мерцанием светодиодов если освещения в комнате было мало (например когда работал телик), но это было редко и длилось это одну минуту.

Что касается кода вот сылка на GitHub. Кое-что я перевел для лучшего понимания.

Давно хотел поделиться готовым и работоспособным проектом в кругах аудитории Алекса, но вышло так что собственно нормальной работоспособностью тут не пахнет. Буду благодарени, если у кто сможет помочь.
 
Изменено:

Комментарии

maksland

★★★✩✩✩✩
13 Янв 2019
463
105
Omsk
Часы у Вячеслава получились просто отличные !
Хочу ещё в Китае сделать плату но подготовить её как надо для завода мало опыта.
Корпус надо тоже печатать, "рассеиватель" уже вырезали и надо как то из города забрать
несмотря на 4 мм толщины и обработку с двух сторон, свет хорошо пропускает
P.S.
Вячеслав_45, схему только не меняйте а то я платы заказал :)
 

Вложения

Изменено:

PrototypeMinion

✩✩✩✩✩✩✩
31 Окт 2020
2
1
Всем привет! Допилил себе часы, данные по температуре и влажности выводятся с датчика DHT22. Скетч под любое количество светодиодов.
Добрый вечер,у меня вопрос,совместимы ли DHT22 и DHT11,можно ли просто вместо DHT22 поставить DHT11,или нужно будет изменять скетч?
 
  • Лойс +1
Реакции: aнатолий

Somikv

✩✩✩✩✩✩✩
27 Фев 2019
14
7
новая версия прошивки часов
  • добавлено отображение минусовой температуры
  • еще пункт в меню
  • поправлен выбор цвета при смене минут
  • изменены некоторые обозначения пунктов меню (подробнее описание в архиве)
  • немного изменен процесс опроса датчика температуры
Доброго времени суток. Температуру с DS3231 не считывает или это у меня что-то не работает?
 

maksland

★★★✩✩✩✩
13 Янв 2019
463
105
Omsk
а можно температуру положительную красным а отрицательную синим отображать ?
 
  • Лойс +1
Реакции: hvorostov78

bort707

★★★★★★✩
21 Сен 2020
2,898
862
а можно температуру положительную красным а отрицательную синим отображать ?
можно конечно. Это буквально одна строка кода.

На самом деле, первые три или четыре страницы этой темы обсуждалась доступная всем открытая прошивка, куда каждый мог легко внести свои собственные улучшения. Например "температуру положительную красным а отрицательную синим " вы легко могли добавить сами.
А потом пришел замчеательный Вячеслав со своей закрытой прошивкой и фактически узурпировал ветку. Его код, конечно, неплохой... но то что исходник закрыт - ставит всех других в зависимое положение, теперь вместо того чтоб запросто добавить нужные функции - вам придется просить его выпустить новый релиз. Вот например хочется вам сделать часы с 3-4 диодами на сегмент - на открытом исходнике это запросто, а так сидите и ждите, пока Вячеслав смилостивится...

Вячеслав, было бы более правильно, если бы вы выложили исходник - тогда и другие могли бы участвовать в развитии проекта.
Чтобы не было ощущения, что тупо критикую - я один из авторов той прошивки. что обсуждалась тут до третьей страницы и уж точно мог бы помочь улучшить и оптимизировать код.
 
Изменено:

Вячеслав_45

★★✩✩✩✩✩
10 Июл 2020
72
64
можно конечно. Это буквально одна строка кода.

Вячеслав, было бы более правильно, если бы вы выложили исходник - тогда и другие могли бы участвовать в развитии проекта.
Чтобы не было ощущения, что тупо критикую - я один из авторов той прошивки. что обсуждалась тут до третьей страницы и уж точно мог бы помочь улучшить и оптимизировать код.
Дело не в жадности. Просто это так сказать вторая моя прошивка (первая мигание светодиодом), и мне немного стыдно выкладывать тот хаос что там написан, я только начинаю изучать всю эту тему. На данном этапе исходник приведен хоть немного в читабельное состояние, с коментами. Как доберусь до компа выложу. В планах было выложить исходники версии 1.7 но пока нет времени дописать. Так что извиняюсь за узурпирование. В скором времени выложу исходник 1.6.
 
  • Лойс +1
Реакции: maksland и LVit

bort707

★★★★★★✩
21 Сен 2020
2,898
862
Дело не в жадности. Просто это так сказать вторая моя прошивка (первая мигание светодиодом), и мне немного стыдно выкладывать тот хаос что там написан, я только начинаю изучать всю эту тему.
Вячеслав, если хотите, могу попробовать помочь привести исходник в более читабельное состояние вместе (ну если окажется, что исходник в том нуждается). Абсолютно бесплатно, естесственно.
И да, у меня нет никакой скрытой заинтересованности завладеть вашей прошивкой :) - мне просто кажется, что от открытости проекта выиграют все.
 

Вячеслав_45

★★✩✩✩✩✩
10 Июл 2020
72
64
исходники 1.6 и 1.7
в 1.7 добавлено выбор кол-во светодиодов на сегмент, функционал как у 1.6. проверил символически, но вроде должно работать
по крайней мере при настройках на 1 светодиод на сегмент отображается правильно.
библиотеки стандартные + одна от Гайвера.
P.S. сделал понятно как мог, строго не судите.
 

Вложения

bort707

★★★★★★✩
21 Сен 2020
2,898
862
@Вячеслав_45, спасибо!
И зря вы этого кода стеснялись, не так уж плохо. Особенно если это один из первых Ваших проектов. Сильно лучше чем у многих.
Замечания нужны? есть кое-каие шероховатости, включая и ошибки...
 
Изменено:

Вячеслав_45

★★✩✩✩✩✩
10 Июл 2020
72
64
@bort707, Ну это по Вашему желанию. Я сам понимаю что там много косяков, и оптимизации никакой, но как говорится главное работает. Про память можно не говорить, т.к. её хватает поэтому много глобальных переменных и типы такие, сильно с этим незаморачивался.
 

bort707

★★★★★★✩
21 Сен 2020
2,898
862
ну просто для примера, установка месяца (строка 339 версия 1.7)
C++:
case 7: {             // Режим установки месяца
        if (key == 1)   { //увеличиваем месяц
          delay(200);
          if (Now.Month == 12) Now.Month = 1; else Now.Month += 1;
        }
        if (key == 3)   { //уменьшаем месяц
          delay(200);
          if (Now.Month == 1) Now.Month = 12; else Now.Month -= 1;
        }
        RTC.write(Now);
        leds[point_dw] = 0x000000;
        leds[point_up] = 0x000000;
        DigitOut(figure_1, 17);
        DigitOut(figure_2, 15);
        DigitOut(figure_3, month / 10);
        DigitOut(figure_4, month % 10);
        break;
      }
Логика кода понятна - если нажата первая кнопка - месяц увеличиваем, если нажата третья - уменьшаем.
А в строке 10 записываем новую дату в RTC и далее выводим на экран. Вроде все ОК.

Но - во-первых, строка 10 исполняется всегда, даже если кнопки не нажаты и месяц и не менялся. Зачем?
А-вторых - тут уже хуже - в строчках 13-16 мы выводим на дисплей... но что? переменную month мы же заново не вычисляли, там осталось старое значение...
То есть юзер кнопку нажал, месяц поменял, а на экране ничего не изменилось.
Ровно такой же косяк с днем и годом... может и с другими величинами, некогда было смотреть.

Это просто как пример.
 

Вячеслав_45

★★✩✩✩✩✩
10 Июл 2020
72
64
@bort707, про 10 строку полностью согласен, даже понял какой косяк происходит (если долго листать настройки часы начинают отставать).
Про строки 13-16 несогласен, чтение переменных происходит в начале loop постоянно поэтому переменные меняют свое значение а при изменении их кнопками сразу записывается в RTC. В данное время версия 1.7 стоит у меня на часах и все работает.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Тут даже дело не в том, что начнут отставать. Все действия требуют определенного машинного времени. Сколько времени занимает одна запись часов ? Я не знаю. Но сколько таких записей происходит в секунду ? А это время могло быть использовано по другому, с больше пользой. Да даже если это позволит считывать состояние кнопок чаще , то уже отзывчивость будет выше.
По поводу 13-16 у вас работает только потому, что очень сложно попасть в промежуток между присвоением и анализом нажатия кнопок. Но можно, есть такая теоретическая вероятность. В данном случае это не критично, т.к. через 0.1 секунды все обновиться , но это ошибка с точки зрения программирования и в определенных кусках может быть критичной. Почему бы просто не написать DigitOut(figure_3,Now.Month/ 10); ?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Или так. Если они обновляются где то еще, то да. Я по отрывку смотрю.

Где то я такое уже видел.. А, товарищ хотел газон по таймерам поливать. Там жутко тормозилось все, а энкодер это не любит.
 

bort707

★★★★★★✩
21 Сен 2020
2,898
862
@Вячеслав_45, если позволите - еще.
строчка 102
C++:
led_color = color_table[set_color - 1];
- дает очень грубую ошибку, если set_color =0.
А оно так и будет при первом запуске... или если кто-то нажмет кнопку сброса, потому что в функции ResetClock() вы во все настройки пишете нули.

Вместо записи нулей было бы правильно создать некий дефолтный набор настроек(присвоив им разумные значения, а не просто нули), оформить их в процедуру что-то типа Set_default() и вызывать в setup() до считывания настроек из ЕЕПРОМ и когда нужен сброс.

Ну и собственно, изначально ошибка в строке 102 возникла от того, что в таблице цветов у вас номера с единицы, а в массиве - с нуля. Лучше никогда так не делать, в Си все массивы с нуля и именно так стоит всегда организовать все свои структуры.

ЗЫ Вячеслав, надеюсь вы не станете обижаться на эти правки.
 
Изменено:

suhorukov-p

✩✩✩✩✩✩✩
16 Фев 2019
47
6
всем привет!!! Вижу продвижение по часовикам Вячеслав_45. Судя по тому, как есть на духу, часы собрали и они прекрасно работают, проявляя высокую температуру, пока максимум был только -22 С, но зима уже близка.
Как всегда хочется чего то нового, могу мне сказать, как люди понимающие как делать прошивки, возможно ли одну по шине , подключить второй датчик температуры DS18B20.
Затея происходит в том, чтобы один датчик был на улице, а второй в прослушивании. Ну естественно чтобы были разные цвета предложений.
 
Изменено:
  • Лойс +1
Реакции: Вячеслав_45

suhorukov-p

✩✩✩✩✩✩✩
16 Фев 2019
47
6
А можно воплотить в реальность? чтоб было два температурных датчика?
 

Вячеслав_45

★★✩✩✩✩✩
10 Июл 2020
72
64
@bort707, какие обиды. Я не против довести все до ума. Буду у компа посмотрю.

@Старик Похабыч, можно и на разные шинки, на сколько я знаю, и не маяться с адресами DS18B20. Если на одну там вроде надо адреса вытягивать с них с помощью другой прошивки через монитор.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Да нет никакой маяты..
Единственная сложность если надо точно знать где какой датчик стоит, а температура похожа.
 

suhorukov-p

✩✩✩✩✩✩✩
16 Фев 2019
47
6
А как вам такое разделение, думаю со временем можно привыкнуть, Что к примеру со знаком "С" показывает датчик дома, а со знаком "0" уличное показание температуры 10,11,20.jpg

так же можно и цвет отображения поменять
10,11,2020.jpg
 

maksland

★★★✩✩✩✩
13 Янв 2019
463
105
Omsk
у меня на термостате погреба (блок управления в доме ) температура в погребе "п" а на улице "u"
но у меня индикатор 5 разрядный
 
Изменено:
  • Лойс +1
Реакции: VANANIDAKI

Вячеслав_45

★★✩✩✩✩✩
10 Июл 2020
72
64
@bort707, на заметку строка
led_color = color_table[set_color - 1];
при set_color = 0 ошибку не вызывает, просто led_color = последнему элементу массива color_table [ ]