Большие часы на адресных светодиодах 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
"аналогию" надо уметь видеть :)
Если просто перенести код показа температуры из #360 - тут не заработает. Нужно еще добавить в таблицу символов "минус" и "пробел" и поменять их индексы в коде. Пробуйте
да пробую третий день уже, но даже немогу запустить bme280? т.к. в коде в нескольких местах привязка к BMP280, возможно всего не вижу, да и кроме того двоеточие у меня не моргает и не светится, хотя с кодом предложенным #384 двоеточие мигало даже с неинициализированным BME280, спасибо умные люди #424 подсказали самый простой выход, куда вписать адрес датчика.
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
а в #425 вы что описывали, разве не температуру с bme280? - значит он у вас работает... возьмите оттуда запуск bme и перенесите в тот скетч, что вы пилите
Тут возможно координаты не совпадают, хотя время показывает (без двоеточия) давление=000, т1=1, т2=0. ну 1 градус появляется по условию из скетча, хотя там написано т-1, тут для начала хотя бы заставить мигать точками. Что касается бме, разве недостаточно подключить <Adafruit_BME280.h> вместо <iarduino_Pressure_BMP.h> , там где бмп объявляется переменной iarduino_Pressure_BMP sensor(0x76) переписать так: Adafruit_BME280 sensor(0x76) а остальное оставить как есть т.к. бме обозван сенсором, и далее по скетчу будет обращение к сенсору? Ну сделал так, но одни ошибки при компиляции, придется наверное переписывать запуск бме через
bool begin(uint8_t addr = BME280_ADDRESS, TwoWire *theWire = &Wire); Но как всегда хочется найти самый короткий путь лечения. Как для начала заставить мигать точки в #410 ?
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909
разве недостаточно подключить <Adafruit_BME280.h> вместо <iarduino_Pressure_BMP.h> , там где бмп объявляется переменной iarduino_Pressure_BMP sensor(0x76) переписать так: Adafruit_BME280 sensor(0x76) а остальное оставить как есть т.к. бме обозван сенсором, и далее по скетчу будет обращение к сенсору?
если методы в двух библиотеках разные(если честно - не смотрел), так просто не выйдет
 

aleksis7

✩✩✩✩✩✩✩
20 Фев 2019
5
6
@начинающий,вот на данный момент скетч.
Температура с DS18B20.. Температура, давление, влажность с BME280.. Температура с RTC. Число, месяц. Радуга при смене цвета.
Незначащие ноли отключены.
 

Вложения

Изменено:
  • Лойс +1
Реакции: начинающий

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
@начинающий,вот на данный момент скетч.
Температура с DS18B20.. Температура, давление, влажность с BME280.. Температура с RTC. Число, месяц. Радуга при смене цвета.
Незначащие ноли отключены.
работает, но одна из температур, тем более все находится еще в помещении, отображается как -27 градусов, куда копать что менять?
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
Подключение DS18B20
Спасибо, дествительно, воткнул в d10 заработало, сразу не заметил что в скетче другой пин прописан. Теперь в догонку еще вопрос: какие есть варианты установки даты (кнопки, программно в скетче) ?
 
Изменено:

aleksis7

✩✩✩✩✩✩✩
20 Фев 2019
5
6
Спасибо, дествительно, воткнул в d10 заработало, сразу не заметил что в скетче другой пин прописан. Теперь в догонку еще вопрос: какие есть варианты установки даты (кнопки, программно в скетче) ?
Минусовая температура с BME280 и DS18B20, Дату и время синхронизирую с компа в программе FLProg
 
  • Лойс +1
Реакции: начинающий

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
@начинающий,вот на данный момент скетч.
Температура с DS18B20.. Температура, давление, влажность с BME280.. Температура с RTC. Число, месяц. Радуга при смене цвета.
Незначащие ноли отключены.
Афигительно, то что нужно. Спасибо огромное!!!
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
ох, сколько понаписали) неужели столько сложности, заменить bmp на bme?) надо попробовать)
заменил bmp на bme, никаких проблем не вызвало, проверить не могу, нет датчика) влажность в код не прописывал, думаю сложности нет, в примерах к библиотеке он есть)
 

Вложения

Изменено:
  • Лойс +1
Реакции: Старик Похабыч

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
Скетч из 442 поста это просто праздник какой то, то что доктор прописал. Можно даже сказать избыточен(температура с RTC и дата). Автору респект и уважуха.
Залил, всё работает, радугу отключил(не нравится свистопляска каждую минуту) и фоторезистор работал наоборот. При максимальной яркости на белом цвете потребляет 470 мА при 2 LED на сегмент.

Вот что получилось голубым данные с BME280, желтым с 18b20 кроме часов разумеется.

У меня еще вопрос к знающим людям. Какая допустимая максимальная длина провода между DS18b20 и ардуиной(у меня модуль с распаянными на нем резисторами и конденсаторами)?
 

Вложения

  • 26.9 KB Просмотры: 11
  • 40.2 KB Просмотры: 13
  • 32.9 KB Просмотры: 12
  • 38.6 KB Просмотры: 11
  • 33.2 KB Просмотры: 10
  • Лойс +1
Реакции: bort707

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
ох, сколько понаписали) неужели столько сложности, заменить bmp на bme?) надо попробовать)
заменил bmp на bme, никаких проблем не вызвало, проверить не могу, нет датчика) влажность в код не прописывал, думаю сложности нет, в примерах к библиотеке он есть)
Код не компилируется выдает ошибку в 211 строке ( invalid type argument of unary '*' (have 'int') )
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
У меня еще вопрос к знающим людям. Какая допустимая максимальная длина провода между DS18b20 и ардуиной(у меня модуль с распаянными на нем резисторами и конденсаторами)?
думаю модуль с распаянным резистором и конденсатором ближе к ардуине, а сам датчик на вынос трех проводным кабелем, думаю может лучше экранированным, экран припаять к "минус" питания датчика с двух сторон кабеля. длина подбирается экспериментально, тут же цифра а не аналог, т.е. в аналоге падение амплитуды сигнала от длины кабеля может способствовать искажению результата, а в цифре все иначе, даже если амплитуда сигнала упадет, к примеру на 30% логическая единица/ноль таковыми и останутся в соотношении. Т.е. в цифре измеряется частота сигнала в виде прямоугольных импульсов, длина кабеля на изменение частоты не повлияет, только если накрутить километр кабеля уровень сигнала может стать настолько мал, что прямоугольный импульс перестанет быть таковым и будет восприниматься ардуиной как "прямая линия" (кардиограмма пациента выпрямиться) и такой сигнал будет просто означать "отсутствие датчика". По вопросу можно предложить имитацию длинной линии тремя сопротивлениями номиналом равным сопротивлению каждой жилы кабеля планируемого к использованию. Както так. При необходимости можно будет применить преобразователь логических уровней, для восстановления амплитуды импульсов, к примеру CD4050 если очень надо далеко засунуть датчик.
 
Изменено:

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
Код не компилируется выдает ошибку в 211 строке ( invalid type argument of unary '*' (have 'int') )
Скетч использует 15206 байт (49%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 948 байт (46%) динамической памяти, оставляя 1100 байт для локальных переменных. Максимум: 2048 байт.
у меня нет проблем)
длина не помню, в гугл можно спросить, у меня около 13-15 метров, насколько помню)
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
длина не помню, в гугл можно спросить, у меня около 13-15 метров, насколько помню)
13-15 метров....... мне метра 4 максимум

ASM. #455. Скачал по новой, всё норм. Могу проверить если надо, у меня стенд собран.
 
Изменено:
  • Лойс +1
Реакции: начинающий

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
ASM. #455. Скачал по новой, всё норм. Могу проверить если надо, у меня стенд собран.
проверьте пожалуйста, мне тоже интересен результат. Завтра буду изучать что делал я правильно и не правильно, и почему у меня не получилось, надеюсь гдето запятую пропустил, не более.
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909
У меня еще вопрос к знающим людям. Какая допустимая максимальная длина провода между DS18b20 и ардуиной(у меня модуль с распаянными на нем резисторами и конденсаторами)?
3-5м должно работать в любом случае, а так некоторые и на 25м датчик выносят
 
  • Лойс +1
Реакции: kym13

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
попробовал #448, все что у меня не работало - не заработало, даже двоеточие не мигает, а только время светится и то в старшем разряде часов двойка (у нас сейчас 21:48) двухцветная. Есть подозрение что данный скетч написан под другое направление соединений ленты, НО хотя время же показывает правильно, странно, что тогда, ждем результатов от экспертов.
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
проверьте пожалуйста, мне тоже интересен результат. Завтра буду изучать что делал я правильно и не правильно, и почему у меня не получилось, надеюсь гдето запятую пропустил, не более.
Вот что получилось. Больше ни чего не показывает, часы не идут.
Всё спать, час ночи уже.
 

Вложения

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
может и у меня тот же эфект, думаю просто "картинка зависает" на той, что была на момент начала загрузки скетча в ардуину, и далее просто висяк.
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
void setup() { // настройки
Serial.begin(9600);
FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS); // подключение ленты
pinMode(MIN_PIN, INPUT_PULLUP); // кнопка минутная
pinMode(HUR_PIN, INPUT_PULLUP); // кнопка часовая

//pinMode(A3, OUTPUT); // контакт GND барометра
//digitalWrite(A3, LOW); // подача земли на барометр
//pinMode(9, OUTPUT); // контакт VCC датчика осв
//digitalWrite(9, HIGH); // подача питания на датчик осв
}
Закоментировал эти строки(вообще не понимаю зачем они, если BME подключается через I2C, а датчик освещения к А0) часы стали отображатся, но точки не мигают часы не идут и ещё сразу после заливки появляются часы потом секунд через 5 появляется знак минус и в таком виде зависают
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
вообще не понимаю зачем они
я так у себя сделал) сейчас попробую на своем варианте, только без BME)
все исправно работает)
часы есть, точки мигают, только температуру и давление не показывает, т.к. датчик стоит BMP, но скетч исправен)
только заменить BMP на BME и добавить влажность)
Что еще заметил
BMP 19060 байт (62%) памяти
BME 15206 байт (49%) памяти
что-то большая разница) с влажностью думаю немного прибавится)
BME 15802 байт (51%) памяти
 
Изменено:

bort707

★★★★★★✩
21 Сен 2020
3,046
909
@kym13, я не настоящий сварщик - то бишь электронщик, я больше в коде разбираюсь.
Мне кажется, что на 3м пойдет практически любой провод.
Если бы такой вопрос стоял передо мной - я бы просто попробовал.
Не забудьте только читать контрольную сумму с датчика - в этом случае вы будете уверенны, что обмен по кабелю идет без ошибок.