Большие часы на адресных светодиодах 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
Народ, не пинайте сильно. Битый час сижу, не могу понять каким способом подсунуть одну из трех версий библиотек. С вариантом замены строк в скетче понял мгновенно, там все работает, а вот подсунуть к скетчу из поста 384 библиотеки не получается, пробовал и "установка zip библиотек" и заменой файлов в папках либрари в документах и программм файлс, все тчщетно, после замены файлов в папках ардуино айди даже стал ругаца матом., спас небольшой откат системы, но все же. Подскажите чайнику, что я делаю нетак? Повторюсь, вариант с заменой строк в скетче предложенный в п. 401 сработал, а вот не захотел останавливаться на достигнутом, решил воспользоваться вторым советом, применить "правильную" библиотеку, не получается. Подскажите алгоритм действий, заранее спасибо.
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
Вот в этой библиотеке оба адреса прописаны
Заработало, появились метеоданные. Огромное спасибо!!!! Если не сложно, можно добавить отключаемый (закомментируемый) блок в программу с обработкой сигнала о температуре с датчика ds18b20? о вариантах идентификации где то были предложения ранее в районе стр №8 п. №199
Есть вот такой скетч <ClockStreet3.3.1_BMP280_18b20> с уличной температурой, я его не проверял у меня нет в наличии BMP280. Если нужно выложу.
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
Есть вот такой скетч <ClockStreet3.3.1_BMP280_18b20> с уличной температурой, я его не проверял у меня нет в наличии BMP280. Если нужно выложу.
не он выложен в посте 360? Хотя давайте, буду методом тыка разбираться и заменять блоки в двух скетчах выложенных Вами. Попутно созрел вопрос схемного характера, интересует правильность подключения фоторезистора, а именно один конец фоторезистора вешаем на pin A0, от туда же (c A0) тянем подтяжку "к земле" 10-ти килограмовый резюк на массу, второй вывод фоторезистора куда цеплять: у одного автора программно прописана его запитка "высоким уровнем" с pin D9, у другого автора просто запитывается от "шины" +5в. В Вашем скетче (в комментариях) не обнаружил преобразования пина в выход питания для запитки фоторезистора, из чего делаю вывод что второй вывод фоторезистора в скетче предложенным Вами просто цепляется к +5в ?
 
Изменено:

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
не он выложен в посте 360? Хотя давайте, буду методом тыка разбираться и заменять блоки в двух скетчах выложенных Вами. Попутно созрел вопрос схемного характера, интересует правильность подключения фоторезистора, а именно один конец фоторезистора вешаем на pin A0, от туда же (c A0) тянем подтяжку "к земле" 10-ти килограмовый резюк на массу, второй вывод фоторезистора куда цеплять: у одного автора программно прописана его запитка "высоким уровнем" с pin D9, у другого автора просто запитывается от "шины" +5в. В Вашем скетче (в комментариях) не обнаружил преобразования пина в выход питания для запитки фоторезистора, из чего делаю вывод что второй вывод фоторезистора в скетче предложенным Вами просто цепляется к +5в ?
Если фоторезистор будет работать наоборот, поменяйте резисторы местами т.е. фоторезистор на землю, а 10К на +5

Тоже хотел в этот скетч втулить BME280, в BMP280 нет влажности. BME280 этих у меня полно
 

Вложения

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

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
остается открытым вопрос о "правильной" замене/установке библиотеки с прописанным адресом для bme280.
Я же скинул библиотеки, в них уже прописан адрес, а последняя библиотека в ней оба адреса прописаны

В 406 посте
 
Изменено:

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
Я же скинул библиотеки, в них уже прописан адрес, а последняя библиотека в ней оба адреса прописаны
я их и пытаюсь подружить, просто невкрурю, через менеджер библиотек arduino.ide подключаю zip библиотеку, загружаю скетч в ардуинку ничего не меняется, методом вставки папок из архивов (не из всех а из одного из преложенных, из каждого по очереди) с заменой, тоже безрезультатно. Уверен что что то делаю нетак, но все же попробую разобраться, но и от внешней помощи не отказываюсь
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
я их и пытаюсь подружить, просто невкрурю, через менеджер библиотек arduino.ide подключаю zip библиотеку, загружаю скетч в ардуинку ничего не меняется, методом вставки папок из архивов (не из всех а из одного из преложенных, из каждого по очереди) с заменой, тоже безрезультатно. Уверен что что то делаю нетак, но все же попробую разобраться, но и от внешней помощи не отказываюсь
я их и пытаюсь подружить, просто невкрурю, через менеджер библиотек arduino.ide подключаю zip библиотеку, загружаю скетч в ардуинку ничего не меняется, методом вставки папок из архивов (не из всех а из одного из преложенных, из каждого по очереди) с заменой, тоже безрезультатно. Уверен что что то делаю нетак, но все же попробую разобраться, но и от внешней помощи не отказываюсь
Лучше разархивируй и потом папку закинь в C:\Program Files (x86)\Arduino\libraries

И насчет фоторезистора, можно в скетче вот эти параметры поменять если наоборот работает. Верхнюю закоментировать нижнюю раскоментировать или в верхней поменять местами слова <max с min>
new_bright = map(analogRead(BRI_PIN), 0, bright_constant, max_bright, min_bright); // когда темно уменьшает яркость
// new_bright = map(analogRead(BRI_PIN), 0, bright_constant, min_bright, max_bright); // когда темно увеличивает яркость

чтобы резисторы местами не менять
 
Изменено:

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
Лучше разархивируй и потом папку закинь в C:\Program Files (x86)\Arduino\libraries
я так и тоже делал, из разархивированных архивов вставлял папку (с папкаМИ) и в библ в с прогр файлс, и в моих документах. В обчем, думать нада, завтра наверное снесу ардуино иде и поставлю заново, и на чистый скину Ваши библиотеки, может получицца.
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
я так и тоже делал, из разархивированных архивов вставлял папку (с папкаМИ) и в библ в с прогр файлс, и в моих документах. В обчем, думать нада, завтра наверное снесу ардуино иде и поставлю заново, и на чистый скину Ваши библиотеки, может получицца.
в моих документах можно все библиотеки удалить, они могут конфликтовать с теми что находятся в програм файлах. Всё спать, у нас уже пол первого ночи:sleep:. У меня кстати все три библиотеки в програм файлах стоят
 
  • Лойс +1
Реакции: начинающий

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
Победил блокнотом. Пришлось поменять местами значения (0Х77) и (0Х76) в файле ---- .h, перезалил скетч и появились все метеоданные. Спасибо огромное всем откликнувшимся!!!
 

poty

★★★★★★✩
19 Фев 2020
3,223
937
В трёх библиотеках просмотрел на пять раз не нашёл bme.begin(); такую строку:rolleyes:
В приведённой Вами библиотеке файл Adafruit_BME280.h линия 218:
C++:
 bool begin(uint8_t addr = BME280_ADDRESS, TwoWire *theWire = &Wire);
Пришлось поменять местами значения (0Х77) и (0Х76) в файле ---- .h
Мдааа... Я этот код привёл для того, чтобы работало с ИСХОДНОЙ библиотекой без всяких в ней правок. И это - правильный вариант! А "правильная библиотека" - лишь костыль, если разбираться неохота.
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909
Победил блокнотом. Пришлось поменять местами значения (0Х77) и (0Х76) в файле ---- .h
пипец, ребята, а язык программирования никто учить не пробовал?
Что, по вашему, означает этот заголовок функции begin() :
C++:
bool begin(uint8_t addr = BME280_ADDRESS, TwoWire *theWire = &Wire);
Он означает что функция принимает адрес датчика КАК ПАРАМЕТР!
А значит можно было просто в скетче часов написать
C++:
bme.begin(0x77);
с нужным адресом и ничего в библиотеке не менять...
 
Изменено:
  • Лойс +1
Реакции: начинающий

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
Сегодня за бортом -3 градуса. Попробовал высунуть bme280 за окно. Наблюдал за падением температуры на часах (скетч из #384), было замечено, что при понижении температуры ниже +10 градусов (датчик ведь был до этого в комнате, и за окном остывал постепенно) появляется "незначащий нуль" как ранее в часах, т.е. последовательность значений температуры выглядит следующим образом: 12, 11, 10, 09, 08, 07.......02, 01, 00, 0 , 0 , а вод при достижении отрицательных значений температуры показания в "младшем" разряде "ЧЧ" (часов, (не минут)) пропали, а в старшем разряде часов (десятки часов) все время светится "0". Занес bme280 в помещение, датчик постепенно нагревался и показания температуры появлялись в обратной последовательности, так же с незначащим нулем перед "единицами" градуса.
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
я их и пытаюсь подружить, просто невкрурю, через менеджер библиотек arduino.ide подключаю zip библиотеку, загружаю скетч в ардуинку ничего не меняется, методом вставки папок из архивов (не из всех а из одного из преложенных, из каждого по очереди) с заменой, тоже безрезультатно. Уверен что что то делаю нетак, но все же попробую разобраться, но и от внешней помощи не отказываюсь
Заходишь в с: программные файлы, ардуино, библиотеки,
Сегодня за бортом -3 градуса. Попробовал высунуть bme280 за окно. Наблюдал за падением температуры на часах (скетч из #384), было замечено, что при понижении температуры ниже +10 градусов (датчик ведь был до этого в комнате, и за окном остывал постепенно) появляется "незначащий нуль" как ранее в часах, т.е. последовательность значений температуры выглядит следующим образом: 12, 11, 10, 09, 08, 07.......02, 01, 00, 0 , 0 , а вод при достижении отрицательных значений температуры показания в "младшем" разряде "ЧЧ" (часов, (не минут)) пропали, а в старшем разряде часов (десятки часов) все время светится "0". Занес bme280 в помещение, датчик постепенно нагревался и показания температуры появлялись в обратной последовательности, так же с незначащим нулем перед "единицами" градуса.
Я не пробовал измерять отрицательные температуры, а сейчас проверить не могу, у нас сейчас даже ночью плюсовая температура
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
В скетче clockstreet3-3-1_bmp280_18b20-ino не отображается двоеточие, давление, температура с BME. пробовал удалить #include <iarduino_Pressure_BMP.h> вместо него подключал #include <Adafruit_BME280.h> при компилировании выдает ошибки:
error: 'class Adafruit_BME280' has no member named 'temperature'; did you mean 'readTemperature'?,
error: 'class Adafruit_BME280' has no member named 'pressure'; did you mean 'readPressure'?
exit status 1
'class Adafruit_BME280' has no member named 'temperature'; did you mean 'readTemperature'?
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909
при понижении температуры ниже +10 градусов (датчик ведь был до этого в комнате, и за окном остывал постепенно) появляется "незначащий нуль" как ранее в часах,
как дети малые :)
Я же вам показал, как убрать нуль в часах - неужели трудно сделать тоже самое для температуры?
Смотрите, сейчас у вас две последние строки процедуры TempToArray() выглядят так:
C++:
digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));
чтобы убрать нуль, меняем на это:
C++:
digit = celsius % 10;
if (digit != 0) BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));
else BrightDigit(0, (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));
 
  • Лойс +1
Реакции: начинающий

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
как дети малые :)
Я же вам показал, как убрать нуль в часах - неужели трудно сделать тоже самое для температуры?
Смотрите, сейчас у вас две последние строки процедуры TempToArray() выглядят так:
C++:
digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));
чтобы убрать нуль, меняем на это:
C++:
digit = celsius % 10;
if (digit != 0) BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));
else BrightDigit(0, (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));
А отрицательные температуры начнут отображаться после устранения первого косяка?
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909
А отрицательные температуры начнут отображаться после устранения первого косяка?
посмотрел в код - нет, не начнут, у вас в наборе символов нет "минуса", да и впроцедуре обработка отрицательных значений вовсе не предусмотрена

Да, еще - при двузначных отрицательных темературах вместе со знаком Цельсия получается пять символов - то есть все не влезет, надо знак "С" убирать, оставить только кружок
 
Изменено:

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
пипец, ребята, а язык программирования никто учить не пробовал?
Что, по вашему, означает этот заголовок функции begin() :
C++:
bool begin(uint8_t addr = BME280_ADDRESS, TwoWire *theWire = &Wire);
Он означает что функция принимает адрес датчика КАК ПАРАМЕТР!
А значит можно было просто в скетче часов написать
C++:
bme.begin(0x77);
с нужным адресом и ничего в библиотеке не менять...
огромное спасибо, действительно все намного проще, ну не нашлось на момент тестирования больше советчиков. ЗАРАБОТАЛО просто добавлением адреса в строке 112 скетча из #384:
bme.begin(0x76); Спасибо. Вот так мало по малу накапливается опыт и знания.
 
Изменено:

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
посмотрел в код - нет, не начнут, у вас в наборе символов нет "минуса", да и впроцедуре обработка отрицательных значений вовсе не предусмотрена
Вот только хотел сказать, что нет в коде отображения отрицательных температур. Уважаемый bort707 , а Вы можете добавить в код отображение отрицательных температур, так сказать чтобы помочь двум "чайникам":rolleyes:
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
посмотрел в код - нет, не начнут, у вас в наборе символов нет "минуса", да и впроцедуре обработка отрицательных значений вовсе не предусмотрена
В таком случае возник вопрос, есть ли смысл пилить дальше этот скетч? Или лучше переключить внимание на устранение траблов с подключением bme280 в скетче от ASM clockstreet3-3-1_final-ino пост #360 ?

Да, в принципе ничего страшного в том нет если пропадет значек цельсия "С", символ градуса "°" ведь останется, этого думаю будет достаточно для идентификации размерности и наименования отображаемого метеопараметра.
 
Изменено:

bort707

★★★★★★✩
21 Сен 2020
3,046
909
В таком случае возник вопрос, есть ли смысл пилить дальше этот скетч? Или лучше переключить внимание на устранение траблов с подключением bme280 в скетче от ASM clockstreet3-3-1_final-ino пост #360 ?
реально оба кода на 95% совпадают, какой больше нравится - тот и пилите. В коде #360 обработка отрицательных температур, на первый взгляд, расписана верно - можно посмотреть как там и сделать тут по аналогии
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
реально оба кода на 95% совпадают, какой больше нравится - тот и пилите. В коде #360 обработка отрицательных температур, на первый взгляд, расписана верно - можно посмотреть как там и сделать тут по аналогии
что то на предмет "по аналогии" не очень получается, пробовал "по аналогии" в #360 заменить датчик BMP280 на BME280 при компиляции выпадают ошибки о не соответствующих или не существующих параметрах. #427
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909
на предмет "по аналогии" не очень получается
"аналогию" надо уметь видеть :)
Если просто перенести код показа температуры из #360 - тут не заработает. Нужно еще добавить в таблицу символов "минус" и "пробел" и поменять их индексы в коде. Пробуйте
 
  • Лойс +1
Реакции: начинающий