Большие часы на адресных светодиодах 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. Кое-что я перевел для лучшего понимания.

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

Комментарии

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
Ребзя ,кто в силах допилить скетч Вячеслава и добавить в него BME280 с возможностью замеров не только температуры и давления, но еще и влажности, очень хочецца, честно, поверьте. Помогите пожалуйста увидеть часы с температурами внешней и внутренней, давлением и влажностью, вот это и будет версия 2.0 окончательно допиленная со всеми наворотами.
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
,кто в силах допилить скетч Вячеслава и добавить в него BME280
насколько мне не изменяет память, в теме уже есть скетч с этим датчиком. кто мешает скопировать из него все, что касается БМЕ, и заменить в финальном скетче все,что касается БМП?
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
в теме уже есть скетч с этим датчиком. кто мешает скопировать из него все, что касается БМЕ, и заменить в финальном скетче все,что касается БМП?
Пытался сравнивать, Но или я совсем "начинающий" или "оно все таки тонет", не смог найти "подобных" для замены, скетч #482 и скетч Вячеслава как бы кардинально отличаются друг от друга, совершенно разная структура алгоритма, нет ничего друг на друга похожего что бы можно было просто взять и заменить один блок другим, т.е. даже процедуры считывания данных с датчиков реализованы по разному, что вводит в заблуждение а для меня, как это совместить и заменить это уже темный лес, Ну неужели никто не задумывался о полнофункциональной замене BMP280 на BME280?
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
не смог найти "подобных" для замены
а что там сравнивать? заменяйте одну библиотеку на другую, вставляете в финишный скетч опрос датчика и вывод влажности в финальный скетч и все. только не забудьте обьявить БМЕ, ато будет ругаться компилятор.
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
а вот как достать оттуда влажность
да все элементарно: в секции БМЕ в вашем скетче продублируйте секцию давления и замените в ней одно значение: давление на влажность и все. я правда, не помню как влажность в скетче называется, но в выделенной строке замените pres на влажность и все. у вас должно быть в том куске скетча три раздела: температура,давление и влажность.

БМЕ:
[CODE lang="cpp" highlight="pres"]  case 22: {            // Режим вывода температуры BME280

      TempColor(TEMP_BME_COLOR, temp, TEMP_BME_MIN, TEMP_BME_MAX);

      if (temp < 100) DigitOut(18, (temp % 100) / 10, temp % 10, TEMP_BME_SYMBOL, 1, temp_color);

      else DigitOut(temp / 100, (temp % 100) / 10, temp % 10, TEMP_BME_SYMBOL, 1, temp_color);

        if (millis() - t > time_tp) {

          if (setups[8] >= 2) {

            mode = 23;

            t = millis();}

          else if (setups[2] != 0) {

            mode = 25;

            t = millis();}

          else mode = 0;}

      break;}



    case 23: {            // Режим вывода давления

       DigitOut(21, pres / 100, (pres % 100) / 10, pres % 10, 0, pres_color);

        if (millis() - t > time_tp) {

          if (setups[2] != 0) {

            mode = 25;

            t = millis();}

          else mode = 0;}

      break;}

     

#endif
[/CODE]
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
...да все элементарно: в секции БМЕ в вашем скетче продублируйте секцию давления..
Не получится, в этот массив <byte digits[22] = {0b01111110, // 0 ...> тоже нужно вносить изменения (значок влажности) и не только в этот. Попробовал внести изменения, проверил, скетч компилируется но кроме часов ни чего не отображается.
PS: Если нужно проверить скидывайте, у меня схема собрана. DS3231, DS18b20, BME280
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
Не получится, в этот массив <byte digits[22] = {0b01111110, // 0 ...> тоже нужно вносить изменения (значок влажности)
можно пока без значка вывод сделать. главное чтоб заработал. я не планирую ставить БМЕ, просто начинающий подсказываю. мне сейчас переделкой скетча не с руки заниматься: жена с приступом под боком лежит.
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
@начинающий, попробуйте в сектор,отвечающий за БМЕ вставить этот кусок кода
C++:
case 24: {            // Режим вывода влажности

       DigitOut(21, humi / 100, (humi % 100) / 10, humi % 10, 0, humi_color);

        if (millis() - t > time_tp) {

          if (setups[2] != 0) {

            mode = 25;

            t = millis();}

          else mode = 0;}
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
Хорошо попробую, но только завтра, сегодня дома поздно буду. А что касается кода символа % для обозначения единиц измерения влажности, то относительно кодов символов из скетча Вячеслава получается вот так: 0b000001111 // % 22 верхний левый нолик, 0b01110001 // % 23 нижний правый нолик, могу и ошибаться... .
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
А что касается кода символа % для обозначения единиц измерения влажности, то относительно кодов символов из скетча Вячеслава получается вот так: 0b000001111 // % 22 верхний левый нолик, 0b01110001 // % 23 нижний правый нолик, могу и ошибаться... .
ну это вы уже сами поэкспериментируете :)
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
Начинающий
В 132 строке фигурную скобку не убрали, а в 134 не поставили. Если строку DigitOut(22,humi / 100, (humi % 100) / 10, humi % 10, 0, humi_color); оставить в таком виде то компилируется, а если как у Вас в скетче то ругается на нее.
 
  • Лойс +1
Реакции: Leon111_09

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
исправил, если строка такого вида
DigitOut(22, 23 humi / 100, (humi % 100) / 10, humi % 10, 0, humi_color);
то ругается на нее, если удалить "23", то ругается на фигурную скобку в строке 593
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
ну вот а я то дума что 22 и 23 это коды символов знака "процент", ща попробуем компильнуть. с 24
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
Он не ругается на фигурную скобку в 593 строке, а показывает что нужно поставить еще одну.
У меня компилируется.
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
Он не ругается на фигурную скобку в 593 строке, а показывает что нужно поставить еще одну.
У меня компилируется.
а еще одну через пробел, через запятую, или подряд (рядом) без пробелов и запятых?
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
даже давление? может еще с меню надо что то изобретать, ну там где t, tt, td добавлять включение датчика влажности и время отображения его показаний? у меня в первый раз даже давления небыло, пока не выбрал в меню P=3, и время отображения каждого по 4 сек, только потом появились давление и температура с бме280
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
Скетч скинь у меня стенд готов и через пару минут будет результат