ESP, IoT [BigClock] Большие часы на WS2812, ESP8266, Народный мониторинг

Какой вариант датчика используется у вас? Интересно, использует ли кто BME280, как у меня?)

  • BMP280

    Голосов: 23 29.1%
  • BME280

    Голосов: 56 70.9%

  • Всего проголосовало
    79
[BigClock] Большие часы на WS2812, ESP8266, Народный мониторинг
Создаю отдельную тему по разработке прошивки на базе NodeMCU.

Мой проект сделан на ДВП, на нее наклеил ленту, объем цифрам сделал из сэндвич панели, поверх белый лист бумаги.
Корпус из дерева, покрашен акриловой краской, смесь белой и коричневой.

Данная прошивка проверяет время по NTP, часы RTC теоретически не нужны.
Барометр на базе BME280.
Имеется датчик освещенности и датчик DS18B20
Clock_схема.pngсхема пайки.jpgClock_схема3.jpg
Плата: NodeMCU 1.0 (ESP 12-E Module)
Если в качестве микроконтроллера вы используете Wemos D1 - в менеджере плат для компиляции все равно выбирайте "NodeMCU v1.0 (ESP-12E)", в противном случае, если выберете плату Wemos D1 (xxxx), - будет работать нестабильно.
Выбирайте ядро ESP версии 2.7.4.

ESP8266 (SDK v2.7+)

Необходимые библиотеки находим в репозитории программы IDE.
Настраиваем прошивку под себя, если нужно, меняем пароли для точки и OTA, WiFi можно не задавать.

Если не задавали настройки WiFi, то стартует точка, адрес стандартный 192.168.4.1 пароль по умолчанию administrator, задавать не менее 8 символов, иначе название точки не отобразится, а будет ее внутреннее имя, типа ESP12345.
Адрес портала http://clock.local/ или по IP адресу, выданному роутером.
Данные для OTA: имя: admin пароль: pass

Для подключения к сервису "Народный мониторинг" MAC адрес отображается на соответствующей странице, вводите этот адрес при регистрации устройства.

Новая версия на гитхаб, последние изменения и публикация свежих версий будет там)

Версия от 16.04.2023 CLOCK_ESP_2.0:
  • оптимизация под новый портал
  • переделано давление с инт на флоат для мониторинга
  • переделан интерфейс на UI
  • добавлена ручная синхронизация времени
  • заменена библиотека rtc на microDS3231
  • багфиксы)
  • добавлена в код точка, для десятичного знака уличной температуры
  • добавлена строка с версией прошивки
  • исправление даты
  • добавление DFPlayer, спасибо: @Maxx1200 и @Romshteks
  • добавлен режим с датой (номер 5)
  • обновлена библиотека EEManager (сбросятся настройки!!!)
  • добавлен режим с показом первого нуля в часах
  • добавлена возможность устанавливать цветовое оформление в настройках прошивки, визуальные правки
  • fix GMT
  • заменены библиотеки датчиков
  • визуальные правки
  • может что-то еще))
Проект на гитхаб со всеми библиотеками и mp3
  • Дофига изменений))
  • Появилась web страничка с настройками на базе GyverPortal.
  • Изменены библиотеки.
  • Переписан код, распределил по вкладкам.
исправлено:
  • баг со сменой цвета на последней цифре
добавлен
  • символ давления, включать в настройках
исправлено:
  • переделан вывод сегментов
  • переделана функция показа точек
добавлено:
  • выбор режима мигания секунд 1 и 2 раза в сек
  • можно вручную задать порядок отображения датчиков и время показа каждого датчика
  • откл. WiFi без мониторинга
  • корректировка показания датчиков
внедрение датчика BME280, добавлен режим влажности с возможностью включить символ проценты
[*]багфиксы
багфиксы
незначительные изменения кода (настройки под себя и комментарии)
  • все настройки вынесены в Constants, вроде:)
  • добавлен web сервер, для обновления через браузер, изначально прошить через кабель, потом можете вносить изменения под себя и обновляться через бинарный файл
  • добавлены библиотеки
  • изменение в коде, из-за выноса настроек:)
  • добавлен НГ режим :)
  • возможно исправлена анимация, про которую писали, с точками и цифрами :)
  • теперь при запуске часов идет проверка с датчика времени, и если все ОК, то запускаются часы без синхронизации
  • исправлена функция освещенности заменой switch на if/else
  • подправлен код с switch в других местах
Увидел в коде небольшую ошибку с НГ режимом, не важно, включен он или нет, все равно будет) только разными методами)
leds[cursor] = (digit & mask) ? CHSV(random(0, 255), random(0, 255), random(0, 255)) : CRGB (0, 0, 0);
leds[cursor] = (digit & mask) ? ledColor : CRGB (0, 0, 0);
  • исправлен НГ режим
  • отключена точка доступа за ненадобностью
  • оптимизирован код
  • выбор в настройках кол-во разделительных точек
  • можно запускать с RTC модулем и без него
  • изменена библиотека NTP
  • поправлен код :)
Внимание: у кого мигает первый светодиод, необходимо изменить ядро ESP на 2.7.4 (инструменты/Плата/Менеджер плат).
Новые версии нестабильные на октябрь 2021г.
 

Вложения

Изменено:

Комментарии

superflint

✩✩✩✩✩✩✩
14 Авг 2019
34
4
Эх жаль что не на р10 матрицах, а так отличный проект, ищу такой же под матрицы р10, часы, температура и название улицы чтобы выводилось по очереди, так сказать нужна адресная табличка с часами и термометром)
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@superflint, на матрицах смотри ниже) делал уже, но надо обновлять под новую библиотеку)
 
  • Лойс +1
Реакции: superflint

wulf

★✩✩✩✩✩✩
1 Дек 2022
169
22
блин народ есть у ково нить макет часов для печати а то всяких разных дофига а файла не найду блин
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@wulf, какой именно макет?) Тут же каждый под себя размер делал. И под разное количество светодиодов.
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
@wulf, какой именно макет?) Тут же каждый под себя размер делал. И под разное количество светодиодов.
Помнится,Максланд печатал корпус для часов.Но,правда, в самой первой теме.Там где часы на ардуине делали :).
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
я печатал на листочке. Потом вырезал и перечерчивал)
Я еще проще сделал: купил декоративную рамку (дешовую) в фикспрайсе,напечатал картину формата А4 и вмонтировал сзади картины ленту.Получилось красиво: картина-часы :).
 

13O13A

✩✩✩✩✩✩✩
15 Фев 2021
5
0
Вот у этого автора неплохие цифры для печати, проверено...
 

AlChel

✩✩✩✩✩✩✩
20 Апр 2022
18
1
Победил я автояркость. Промониторил я в порту, у меня нижний порог освещенности определяемый фоторезистором оказался не 0, а 7. Соответственно прописао его сюда
C++:
if (o.min_max) {
          new_bright = map(analogRead(BRI_PIN), 7, 1023, o.min_bright, o.max_bright);  // считать показания с фоторезистора, перевести диапазон
        } else {
          new_bright = map(analogRead(BRI_PIN), 7, 1023, o.max_bright, o.min_bright);
и часы стали полностью выключаться. Но ночной режим надо прикручивать, а то если вечером при выключенном свете решишь посмотреть телевизор, начинается светомузыка :)
Еще сделал округление для показаний датчика температуры, а то часы показывают 22 градуса при фактической 22.98, может кому тоже надо будет
C++:
void TempToArray() {  // вывод температуры с датчика BMP/BME280
  if (DOT_TEMP == 1) {
    leds[NUM_LEDS] = 0x000000;
  }
  FtempH = (bmp280.readTemperature()) + o.cor_tempH;
  tempH = round( FtempH);
  Serial.println((String)tempH + " | " + FtempH);
  Dots(!Dot);
  Digit(digits[11], segment_4);  // символ C
  Digit(digits[10], segment_3);  // символ градуса
  int digit = abs(tempH % 10);
  Digit(digits[digit], segment_2);
  digit = tempH / 10;
  if (digit == 0) Digit(digits[12], segment_1);  // если впереди ноль, то выключаем его
   else
    Digit(digits[digit], segment_1);  // иначе показываем как есть
И еще вопрос, не понял как должна работать функция задержки яркости? У меня по моему вообще не работает
 
  • Лойс +1
Реакции: Leon111_09

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@AlChel, вроде отлично работает. Указываешь интервал опроса. Каждые "n" секунд будет проверка значений яркости.
 

AlChel

✩✩✩✩✩✩✩
20 Апр 2022
18
1
Хм, у меня яркость меняется мгновенно... Опять все не как у людей :)
 

wulf

★✩✩✩✩✩✩
1 Дек 2022
169
22
C++:
// ****************** НАСТРОЙКИ ЧАСОВ *****************
#define MIN_COLOR CRGB::White          // цвет минут
#define HOUR_COLOR CRGB::White         // цвет часов
#define DOT_COLOR CRGB::White          // цвет точек

#define NORMAL_CLOCK_COLOR CRGB::White // Нормальный цвет монохромных цветов

#define CONTRAST_COLOR_1 CRGB::Orange  // контрастный цвет часов
#define CONTRAST_COLOR_2 CRGB::Green   // контрастный цвет часов
#define CONTRAST_COLOR_3 CRGB::Yellow  // контрастный цвет часов

#define HUE_STEP 5          // шаг цвета часов в режиме радужной смены
#define HUE_GAP 30          // шаг цвета между цифрами в режиме радужной смены

// ****************** ДЛЯ РАЗРАБОТЧИКОВ ****************
uint8_t clockHue;

CRGB clockLED[5] = {HOUR_COLOR, HOUR_COLOR, DOT_COLOR, MIN_COLOR, MIN_COLOR};

void clockColor() {

  int8_t color_idx = 0;
// switch (thisMode) {
    case MC_CLOCK:
      // Если режим часов включен как "Ночные часы" - цвет определять по настроенному цвету ночных часов
      // Иначе - цвет часов зависит от режима (Монохром, Каждая цифра свой цвет, Цвет часов-точек-минут" и т.д)
      color_idx = isNightClock ? -2 : COLOR_MODE;
      break;
    case MC_COLORS:
    case MC_FILL_COLOR:
      color_idx = -1;
      break;
    default:
      color_idx = COLOR_MODE;
      break;
  }
   
  if (color_idx == -2) {
    // Цвет по индексу настроек текущего ночного цвета    
    CRGB color = getNightClockColorByIndex(nightClockColor);
    for (uint8_t i = 0; i < 5; i++) clockLED[i] = color;
  } else if (color_idx == -1) {    
    // Инверсный от основного цвет
    CRGB color = globalColor == 0xFFFFFF
      ? color = CRGB::Navy
      : -CRGB(globalColor);
    for (uint8_t i = 0; i < 5; i++) clockLED[i] = color;
  } else if (color_idx == 0) {    
    // Монохромные часы
    uint8_t hue = effectScaleParam[MC_CLOCK];
    CHSV color = hue <= 1 ? CHSV(255, 0, 255): CHSV(hue, 255, 255);
    for (uint8_t i = 0; i < 5; i++) clockLED[i] = color;
  } else if (color_idx == 1) {
    // Каждая цифра своим цветом, плавная смена цвета
    for (uint8_t i = 0; i < 5; i++) clockLED[i] = CHSV(clockHue + HUE_GAP * i, 255, 255);
    clockLED[2] = CHSV(clockHue + 128 + HUE_GAP * 1, 255, 255); // точки делаем другой цвет
  } else if (color_idx == 2) {
    // Часы, точки, минуты своим цветом, плавная смена цвета
    clockLED[0] = CHSV(clockHue + HUE_GAP * 0, 255, 255);
    clockLED[1] = CHSV(clockHue + HUE_GAP * 0, 255, 255);
    clockLED[2] = CHSV(clockHue + 128 + HUE_GAP * 1, 255, 255); // точки делаем другой цвет
    clockLED[3] = CHSV(clockHue + HUE_GAP * 2, 255, 255);
    clockLED[4] = CHSV(clockHue + HUE_GAP * 2, 255, 255);
  } else {
    CRGB color = getGlobalClockColor();
    for (uint8_t i = 0; i < 5; i++) clockLED[i] = color;
  }
}
на сколько понял там вот этот там и отвечает за цвет часов и тп
и файлик с которого выдрал кусок . пробовал заставить его компилироваться но моих познаний в этом очень мало не осиливаю :( ну или как вариант этот фаил прикрутить
 

Вложения

Изменено:

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
@ASM, За неделю тестирования последней прошивки обнаружился один небольшой баг с авто-яркостью.Сразу после прошивки она не работает.Для запуска надо посветить фонариком в датчик и она запускается.Последние два/три дня в темное время суток она перестает работать. Помогает все тот же фонарик.Со вчерашнего вечера вернул в скетч старый кусок кода,что я выкладывал раньше: авто-яркость пришла в норму.
Из пожеланий: а нельзя включить в прошивку одну кнопку-для "экстренного",внепланового,принудительного показа данных с датчиков?
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@Leon111_09, у меня у самого последняя прошивка стоит. Выше перечисленных проблем нету)) Ночью слабо светит, днем ярко) Свет выключался несколько раз. Пожелания не понял, о чем речь)
 

Leon111_09

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

Divin

★★★✩✩✩✩
30 Янв 2021
436
192
@ASM, они выводятся с некой переодичностью, а хочется по требованию, нажал - узнал.
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@Divin, не понимаю логику, всё показания одновременно не вывести. Если перебирать на каждое нажатие, то по сути тоже самое, что и переключение. Можно поставить минимальное время и будут быстро меняться показания. Если уж так важно, то реализовать сложности нет. В кастом добавить функцию с показом показаниями по старинке через делэй и повесить на кнопку.
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
Если перебирать на каждое нажатие,
Не надо перебирать.По сути,кнопка будет давать старт показаниям с датчиков.А показывать будет именно те,что уже включены в настройках.Кнопка будет одноразово обнулять таймер отсчета вывода информации.А нужно это бывает для того,что перед выходом из дома надо стоять и ждать чтоб посмотреть температуру на улице :).Это как пример того,зачем ставить кнопку :)
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@Leon111_09, так можно поставить секунды на две, и времени хватает увидеть и быстро, у себя поставил, больше ворчаний не было, что долго ждать) Можно в телефоне смотреть, через нм.

А городить ради этого кнопку...
 

wulf

★✩✩✩✩✩✩
1 Дек 2022
169
22
вот такие у меня получились пока без датчиков еще в дороге
IMG_20230409_002241.jpgIMG_20230409_002336.jpg

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