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

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

  • BMP280

    Голосов: 22 28.2%
  • BME280

    Голосов: 56 71.8%

  • Всего проголосовало
    78
[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г.
 

Вложения

Изменено:

Комментарии

wulf

★✩✩✩✩✩✩
1 Дек 2022
168
21
народ уже все прогуглил нифига не могу найти что за датчик используют
STS Датчик температурный
Температурный датчик является не настраиваемым оборудованием. Передача информации производится цифровым способом по протоколу Dallas 1-Wire (TouchMemory).
В случае необходимости допускается наращивание кабеля до 30м.

Срок службы изделия – не менее 10 лет.

ПАРАМЕТРЫ:


Напряжение питания, В9-15
Максимальный потребляемый ток, мА5
Рабочий диапазон температур, гр. С-55...+125
Длина кабеля, м1,8
😭
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
456
67
@wulf, О каком датчике идёт речь? В этом проекте используются два датчика ВМЕ280 и DS18b20
 

wulf

★✩✩✩✩✩✩
1 Дек 2022
168
21
@kym13, да он используется в приборе охраны и ценик на него 1000р
я просто не встречал датчики которые могут питаца от 12в вот и спросил мож кто встречал такие в маркеровке на сайте написано sts но что за тип датчика незнаю
 

maksland

★★★✩✩✩✩
13 Янв 2019
494
116
Omsk
и еще видел в метеозонде такой похожий(отец в поле нашёл)
жаль выбросил всё
 
Изменено:

ASM

★★★★★✩✩
26 Окт 2018
1,558
303
минус ближе к цифре (при показаниях до -9)
попробуй заменить этот код
C++:
 if (tempS <= -1) Digit(digits[13], segment_1);  // если < или = -1, то показываем -
    else
      Digit(digits[12], segment_1);  // иначе выключаем 1 сегмент
на этот
C++:
    if (tempS <= -1) {                 // если < или = -1
      if (tempS <= -10) {              // если < или = -10
        Digit(digits[13], segment_1);  // то показываем - на 1 сегменте
      } else {                         // если от -9 до -1
        Digit(digits[12], segment_1);  // то показываем выключаем 1 сегмент
        Digit(digits[13], segment_2);  // и показываем - на 2 сегменте
      }
    } else {
      Digit(digits[12], segment_1);  // иначе выключаем 1 сегмент
    }
Функция выбора цвета часов из 16-24 фиксированных
в коде есть табличные 16 цветов, сделать выбор среди них?)
C++:
hub.Select(&a, F("Amethyst,Aqua,Blue,Chartreuse,DarkGreen,DarkMagenta,DarkOrange,DeepPink,Fuchsia,Gold,GreenYellow,LightCoral,Tomato,Salmon,Red,Orchid"));
 
Изменено:

ASM

★★★★★✩✩
26 Окт 2018
1,558
303
градация цвета от температур:
от 0 до -20 голубой
от -21 до -30 синий
-31 и ниже фиолетовый
от +1 до +20 зеленый
от +21 до +30 оранжевый
от +31 и выше красный
C++:
CRGB ledColorTemp;
void DigitTemp(uint8_t digit, uint8_t cursor) {  // функция отображения символов
  switch (tempS) {
    case -20 ... 0: ledColorTemp = CRGB::Aqua; break;
    case -30 ... - 21: ledColorTemp = CRGB::Blue; break;
    case -50 ... - 31: ledColorTemp = CRGB::BlueViolet; break;
    case 1 ... 20: ledColorTemp = CRGB::GreenYellow; break;
    case 21 ... 30: ledColorTemp = CRGB::Orange; break;
    case 31 ... 100: ledColorTemp = CRGB::Red; break;
  }
  for (uint8_t mask = 0b01000000; mask > 0; mask = mask >> 1) {
    for (uint8_t i = 0; i < LEDS_IN_SEGMENT; i++) {
      leds[cursor] = (digit & mask) ? ledColorTemp : CRGB(0, 0, 0);
      cursor++;
    }
  }
}
вроде норм))
 

maloir

★✩✩✩✩✩✩
14 Сен 2019
114
34
В общем надеюсь ASM не обидется на меня. но тут кое что придумал и воплатил (сразу говорю код полотно, как его уменьшить не знаю, так как совсем ноль в этом, даже сам код изнчально подсказал ASM и Maxx1200 мне лишь пришлось его много раз продублировать). Так как просто часы мне показались скучноватыми, я из них сделал календарь. На каждую дату праздника звучит голосовое собщение, что за празник в данный день. Вместо праздников можно добавить день рождени и памятные даты семьи или придумать что еще, все что надо лись поправить стоки в коде. Как говорил к сожелению полотно кода мне ни как не удасться уменьшить из за этого конечно если что то изменить надо полазить по датам и записать свой звуковой файл и разместить в соотвествующей папке на флешке. В данный момент добавил российские праздники и праздники древней - христианкой Руси. Но вы можете записать (добавить) свои даты. Каждый праздник в коде помечен. например 23 февраля и три строки воспроизведения в разные часы дня (время воспроизведения можно тоже менять). Сколько раз в день воспроизводить (озвучивать) так же можно увеличить - уменьшить, например 10 раз в день, каждый час или 2 раза в день или в каждый час 10 раз или каждые 5 минут в часу. НО! как мне сказали у часов первым делом стоит на месте опрос датчиков и если опрос датчиков присходить в тот момент конда должен озвучится праздник. он не озвучится, так как идет опрос датчиков. Поэтому в день у меня стоит именно 3 раза воспроизведение праздника в разные часы и мминуты.
//-----------------7 января---------------------//
if (day == 7 && month == 1 && hour == 13 && minute ==34 && second == 0){ mp3.playFolder(1, 34); }
if (day == 7 && month == 1 && hour == 15 && minute ==34 && second == 0){ mp3.playFolder(1, 34); }
if (day == 7 && month == 1 && hour == 18 && minute ==34 && second == 0){ mp3.playFolder(1, 34); }


по коду, как редактировать

C++:
    //-----------------7 января---------------------//     
if (day == 7 && month == 1 && hour == 13 && minute ==34 && second == 0){ mp3.playFolder(1, 34); }
//7 это день месца, 1 это месц года, 13 это часы дн, 34 это минуты часа, о - секунды.
//(1, 34) - 1 -34 это 1- номер папки, 34 номер трека.
да и еще в файлах у меня некоторые файлы попутаны, так что если хотите менять что то - прослушивайте, файлы могут быть в некоторых местах не попорядку как в коде, то есть файл 10 может быть для праздника 8 марта, а 1 файл может быть для авгута.

Ну и последнее все что надо вам сделать если не хотите что то менять скачать ниже файл кукушка и поместить вместо своего в прошивку, файлы соотвественно залить на флешку. Надеюсь кому то пригодится. Да! еще, прошивка у мен CLOCK_ESP_2.0, но думаю это не важно, подойдет и дл других прошивок.

https://disk.yandex.ru/d/Q2j1d1qcmqU_OA файлы мр3
 

Вложения

ASM

★★★★★✩✩
26 Окт 2018
1,558
303
Поэтому в день у меня стоит именно 3 раза воспроизведение праздника в разные часы и мминуты.
все может быть, поэтому попробуй по образцу сделать
C++:
void kuku_tick() {
  if (dfp.status_kuku) {
    if (hour >= dfp.start_kuku && hour <= dfp.stop_kuku) {
      if (minute == 0 && flag_kuku == 1) {
        DFPlayer();
        flag_kuku = 0;
      }
      if (minute == 59 && flag_kuku == 0) {
        flag_kuku = 1;
      }
      Vremy();
      Utro();
      Vecher();
    }
  }
}
через флаг)

или вот еще)
C++:
void Utro() {
  static uint32_t utroTime;
  if (Utro_flag == 1) {
    utroTime = millis();
    Utro_play_flag = 1;
    Utro_flag = 0;
  }
  if (Utro_play_flag == 1 && (millis() - utroTime) >= 3000) {  // Пауза чтобы выговорилось время
    mp3.playMP3Folder((dfp.golos * 100) + 27);
    Serial.println(" ♫ Доброе утро");  //для отладки
    Utro_play_flag = 0;
  }
}
 

wulf

★✩✩✩✩✩✩
1 Дек 2022
168
21
c:\Users\user\Documents\Arduino\libraries\WebSockets\src\WebSocketsServer.cpp: In member function 'void WebSocketsServer::handleNewClients()':
c:\Users\user\Documents\Arduino\libraries\WebSockets\src\WebSocketsServer.cpp:658:86: error: 'class WiFiServer' has no member named 'accept'
WEBSOCKETS_NETWORK_CLASS * tcpClient = new WEBSOCKETS_NETWORK_CLASS(_server->accept());
^

exit status 1

Compilation error: exit status 1

дайте плиз адекватную библиотеку
 

wulf

★✩✩✩✩✩✩
1 Дек 2022
168
21
ну скажу первое впечатление по поводу цветов по температуре . шикардос если запомнить какой цвет какой критерий температур то на градусы можно принципе не смотреть . тестил при смене цвета часов каждую минуту все ок .

если была переделка
  • минус ближе к цифре (при показаниях до -9) |:|-|2|
сказать не могу у меня -20
 
  • Лойс +1
Реакции: kym13

wulf

★✩✩✩✩✩✩
1 Дек 2022
168
21
@ASM, а можно как то добавить такой же цветовой на комнатный датчик
 

maksland

★★★✩✩✩✩
13 Янв 2019
494
116
Omsk
комнатный в минус входить не должен ! :) для него вполне цвет как и у часов или просто зеленый (зона комфорта )
 
Изменено:
  • Лойс +1
Реакции: maloir

ASM

★★★★★✩✩
26 Окт 2018
1,558
303
сказать не могу у меня -20
у меня -6 уже) но заливать пока не буду, я после последней заливки долго восстанавливался из-за разных версий библиотек...
а подскажите пожалусто, где сам код в скетче отвечающий за цвета?
потом в коде с датчиком заменить Digit на DigiitTemp
а можно как то добавить такой же цветовой на комнатный датчик
так аналогично, пример очень простой и быстрый)
 
  • Лойс +1
Реакции: maloir

ASM

★★★★★✩✩
26 Окт 2018
1,558
303
Залил прошивку, все ок, минус сдвинулся при -2
градиент работает
тогда, раз обновление хаба не предвидится, сделаю обновление с исправлениями текущей версии
 
  • Лойс +1
Реакции: maksland

ASM

★★★★★✩✩
26 Окт 2018
1,558
303
@wulf, теоретически рабочий файл выложен)
останется только привести порядок)

градиент бы еще реализовать плавную смену цвета, а не интервалами...

@maksland
тебе задачка
давай попробуем такой вариант, задать контрольные точки для определенных температур, а промежуточные цвета будут подбираться кодом)
C++:
GRADIENT () {
-30, CRGB:: Black,  
-20, CRGB:: Red,
   0, CRGB:: Yellow,
  20, CRGB:: White
};
таблица цветов есть тут) https://projectalt.ru/publ/arduino_...ed_opisanie_i_primery_ispolzovanija/10-1-0-29
потом приведу в нужный вид)
 
Изменено:

Сотнег

★★★★★★★
15 Янв 2020
4,281
1,475
@ASM,
C-like:
DEFINE_GRADIENT_PALETTE( tempmap_gp ) {
      0,   0,   0,   0,   //стартуем от -128°C
128 -30,   0,   0,   0,   //black
128 -20, 255,   0,   0,   //red
128  +0, 255, 255,   0,   //yellow
128 +20, 255, 255, 255,   //white
    255, 255, 255, 255 }; //заканчиваем на +127°C


CRGBPalette256 tempPal = tempmap_gp; // вроде ведь, должно работать и с CRGBPalette16 tempPal = tempmap_gp;

ledColorTemp = ColorFromPalette( tempPal, 128 + currentTemperature, 255, NOBLEND);
Проверять, по идее, здесь можно:
Только брать цвета желательно с параметром NOBLEND,
и разрядность палитры не забыть поменять на CRGBPalette256.
 
Изменено:

maksland

★★★✩✩✩✩
13 Янв 2019
494
116
Omsk
А что от меня надо ?, не понял немного.
Кстати как сейчас обновлять по сети ? просто бинарник формируем и через интерфейс закидываем ?
и модуля у меня такие есть, флешка на борту уже
 
Изменено:

ASM

★★★★★✩✩
26 Окт 2018
1,558
303
и разрядность палитры не забыть поменять на CRGBPalette256.
тут иначе) https://github.com/FastLED/FastLED/wiki/Gradient-color-palettes
А что от меня надо ?, не понял немного
составить градиент температуры, не как раньше, а с контрольными точками, чтобы цвета менялись плавно, ориентируясь на эти точки, показание температуры
C++:
-30, CRGB:: Black,
-20, CRGB:: Red,
  0, CRGB:: Yellow,
 20, CRGB:: White
 
Изменено:

Сотнег

★★★★★★★
15 Янв 2020
4,281
1,475
@ASM,
вроде бы, FastLED преобразует пользовательскую палитру DEFINE_GRADIENT_PALETTE
к своему собственному формату с равными интервалами CRGBPalette16.
То есть она имеет 16 якорных точек с 16 градациями цвета между ними,
что плохо ложится на вашу шкалу температур с шагом в 10 градусов.

В эмуляторе с опцией NOBLEND всё очень плохо выглядит.
Раньше я думал, что она нужна, чтобы не закольцевать палитру, но теперь как-то не уверен.
Потому что даже если удвоить разрешение шкалы температур, эмулятор рисует ерунду...
C-like:
DEFINE_GRADIENT_PALETTE( tempmap_gp ) {
         0,   0,   0,   0,   //стартуем от -64°C
128 -30 *2,   0,   0,   0,   //black
128 -20 *2, 255,   0,   0,   //red
128  +0 *2, 255, 255,   0,   //yellow
128 +20 *2, 255, 255, 255,   //white
       255, 255, 255, 255 }; //заканчиваем на +63°C


CRGBPalette16 tempPal = tempmap_gp;

ledColorTemp = ColorFromPalette( tempPal, 128 + currentTemperature *2, 255, NOBLEND);
Палитру на 256 якорных точек рисует нормально...
 
Изменено:
  • Лойс +1
Реакции: maksland

wulf

★✩✩✩✩✩✩
1 Дек 2022
168
21
C++:
-30, CRGB:: Blue,
-20, CRGB:: DeepSkyBlue,
  0, CRGB:: LightCyan,  -  White 
 10, CRGB:: MediumSpringGreen
 20, CRGB:: YellowGreen
 30, CRGB:: IndianRed
может примерно такую расцветовку сделать