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г.
 

Вложения

Изменено:

Комментарии

Sergo_ST

★★★★★★✩
15 Мар 2020
944
820
@ASM, Я видел этот пост. Мне нужно понимать как сейчас работает программа и что от неё ожидается на самом деле. Опишите по подробнее...
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@Sergo_ST, работает только если выставить диапазон с нуля, если с 23 часов и т.д., то нет)
 

Влад78

✩✩✩✩✩✩✩
6 Июн 2023
28
0
Всем добрый день.
Часы работают. На этой неделе с мониторинга приходили уведомления о том, что не передаёт данные. Через пару часов все норм. Ничего не менял, т к. Не смогу к ним подключиться в браузере. IP есть, но не видны настройки часов... Белый экран, что с телефона, что с компьютера
 
Изменено:

Sergo_ST

★★★★★★✩
15 Мар 2020
944
820
@ASM, А, там про яркость речь была...
Используйте просто эту функцию:
C++:
boolean checkHourStrart(uint8_t _start, uint8_t _end, uint8_t _hour) //установка яркости от времени суток(час начала ночного режима, час окончания ночного режима, текущий час)
{
  return ((_start > _end && (_hour >= _start || _hour < _end)) || (_start < _end && _hour >= _start && _hour < _end));
}
Передаёте час начала ночного режима, час окончания ночного режима и текущий час. Возвращает ночной режим сейчас(true) или нет(false).
 
Изменено:
  • Лойс +1
Реакции: poty

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@Влад78, такие проблемы периодически бывают. Тут много факторов, чаще всего проблемы с интернетом у провайдера. Или отключали электричество.

@Sergo_ST, спасибо, буду за ПК, постараюсь разобраться)
 

Влад78

✩✩✩✩✩✩✩
6 Июн 2023
28
0
@ASM,
Или отключали электричество.
Вчера в этот момент я был дома и все работало, интернет был, электричество в наличии, часы работали штатно (визуально). Стал подключаться к ним и меня постигла беда, никак не могу через хаб.
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@Sergo_ST, Проблема такая, точки не переключается на 2 раза в сек. и не переходят в ночной режим
 
  • Лойс +1
Реакции: maksland

Sergo_ST

★★★★★★✩
15 Мар 2020
944
820
@kym13, Ну с точками всё просто, интервал применяется только при запуске программы, тк условие находится в объявлении экземпляра класса:
C++:
static gh::Timer timer(c.mode_sec ? 500 : 1000);
А нужно во первых объявить таймер глобально и задать какой нибудь интервал по умолчанию, например 1сек.
C++:
gh::Timer timerDot(1000);
А при запуске программы/изменении режима из программы изменять уже интервал соответствующим методом:
C++:
timerDot.setTime(c.mode_sec ? 500 : 1000);
 
  • Лойс +1
Реакции: maksland

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
Ну с точками всё просто
поправил, проблема осталась) я думаю проблема не в коде)
в проекте проблема есть, а на новой ESP проблемы нет) надо будет попробовать удалить настройки или установить на чистую)
сейчас пока занят, позже попробую...
 

Sergo_ST

★★★★★★✩
15 Мар 2020
944
820
@ASM, Покажите как сделали, куда что добавили/удалили. И опишите тогда ещё раз проблему по подробнее.
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@Sergo_ST,
C++:
gh::Timer timerDot(1000);
void timeToDots() {
  static bool showDot = false;
  showDot ? Dots(Dot) : Dots(!Dot);
  timerDot.setTime(c.mode_sec ? 500 : 1000);
  if (timerDot) {
    showDot = !showDot;
    hlog.println((String)NTP.second() + "   " + showDot);
  }
}
 

Sergo_ST

★★★★★★✩
15 Мар 2020
944
820
@ASM, Нус, так делать не совсем правильно, устанавливать интервал всё же стоит по событию, например изменения настройки, ну или хотяб в условии самого таймера... Но для отладки пойдет...
Так-же в отладку неплохо бы было вывести текущее состояние переменной c.mode_sec...

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

И вы так не ответили на вопрос - что именно не так с миганием? Может я не совсем понял о чём речь...

Просто в моём понимании "мигание два раза в секунду" это два включения и два выключения точки за одну секунду. А у вас получается или переключение состояния точки раз в секунду, или одно включение и одно выключение раз в секунду.
 
Изменено:

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@Sergo_ST, точки меняют состояние либо раз в секунду, либо два раза в секунду) кому как нравится)
C++:
hlog.println((String)NTP.second() + "   " + showDot + "   " + timerDot + "   " + c.mode_sec);
я сделал лог в таком виде, и вижу, что таймер нулевой...
попробую тот же лог в оригинальном коде, без переделки) делаю все на ходу)
 

Sergo_ST

★★★★★★✩
15 Мар 2020
944
820
@ASM, Что имеется ввиду под фразой "таймер нулевой"? То что "timerDot" возвращает "0" в логе отладки после условия "if (timerDot)"?
Так это нормально, вы же уже прочитали его состояние в условии, получили в ответ "1", и в следующий раз там будет "1" только после истечения заданного интервала...
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
C++:
  static gh::Timer timerDot(500);
  if (timerDot) {
    showDot = !showDot;
    hlog.println((String)NTP.second() + "   " + showDot + "   " + a);
    showDot ? Dots(Dot) : Dots(!Dot);
  }
лог работы
Код:
52   0   500
53   1   500
54   0   500
55   1   500
а вот лог работы этого же кода на другой плате)
Код:
42   0   500
43   1   500
43   0   500
44   1   500
как видно, на 43 секунде две смены, как и должно быть
 
Изменено:

Elektronik777

✩✩✩✩✩✩✩
8 Апр 2023
3
0
Уважаемые форумчане, я заканчиваю сборку своего экземпляра и хочу сказать огромнейшее спасибо Алексу Гайверу за начало проекта, разработчику ПО сего чудного девайса и всем тем, кто помогает в допиливании проекта.

От себя хочу внести правки в комментарий в прошивке.
В разделе Constants 21 строка.
Как написан комментарий.
21 // один вывод фоторезистора на пин A0, или любой другой, второй на GND. Между GND и питанием ставим резистор

Как вижу я должен быть написан (исходя из своего небольшого опыта и схемы к проекту).
21 // один вывод фоторезистора на пин A0 (если у вас wemos D1mini), или любой другой (если на плате есть аналоговые входы АЦП), второй на GND. Между выводом фоторезистора (А0) и питанием ставим резистор.
 

Sergo_ST

★★★★★★✩
15 Мар 2020
944
820
@ASM, Попробуйте вот так, что будет в логе на обеих платах?
C++:
gh::Timer timerDot(1000);
void timeToDots() {
  static bool showDot = false;
  if (timerDot) {
    timerDot.setTime(c.mode_sec ? 500 : 1000);
    showDot = !showDot;
    Dots(showDot);
    hlog.println(String(NTP.second()) + "   " + millis() + "   " + timerDot.getTime() + "   " + showDot);
  }
}
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@Sergo_ST,
проект:
19   33330   500   0
20   34331   500   1
21   35330   500   0
плата:
49   10612   500   1
50   11113   500   0
50   11614   500   1
 

Sergo_ST

★★★★★★✩
15 Мар 2020
944
820
@ASM, Интересно... А так?
C++:
void timeToDots() {
  static bool showDot = false;
  static uint16_t period = 0;
  static uint32_t timer = millis();
  if ((millis() - timer) >= period) {
    timer = millis();
    period = (c.mode_sec) ? 500 : 1000;
    showDot = !showDot;
    Dots(showDot);
    hlog.println(String(NTP.second()) + " " + millis() + " " + period + " " + showDot);
  }
}
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@Sergo_ST,
проект:
19 18830 500 1
20 19830 500 0
21 20830 500 1
22 21830 500 0
плата:
3 22559 500 0
4 23062 500 1
4 23564 500 0
5 24067 500 1
 

Sergo_ST

★★★★★★✩
15 Мар 2020
944
820
@ASM, Уточните, что обозначают подписи "проект" и "плата"? Вы где-то в симуляторе запускаете код в первом варианте?
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@Sergo_ST, проект, это готовые часы, т.е. эта тема.
плата, чистая ESP из ящика.
 

Sergo_ST

★★★★★★✩
15 Мар 2020
944
820
@ASM, Вы собираете исходник тот что на гит-хабе сейчас актуальный?
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@Sergo_ST, нет, но он похожий. в том тоже проблема эта сохраняется, раз люди пишут)
 

Sergo_ST

★★★★★★✩
15 Мар 2020
944
820
@ASM, Скиньте в лс ту прошивку что вы сейчас используете, или же, попробуйте процедуру из поста 2270 на прошивке из гит-хаба.

По всей видимости есть ещё какой-то вложенный таймер или задержка на 1 секунду, который(ая) и ограничивает частоту мигания...

И я даже уже понял что... У вас раз в секунду идёт блокирующий опрос датчика ds18b20. Вот и ответ, на плате с датчиком - есть задержка(тк датчик отвечает и мы ждём ответа), а на плате без - нет задержки(тк датчика нет и процедура ожидания скипается)...

Варианта два - или уменьшить разрешение датчика до 9 бит(тогда задержка будет всего 100мс), либо использовать асинхронное чтение датчика(либа вроде поддерживает это).
 
  • Лойс +1
Реакции: ASM