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

Вложения

Изменено:

Комментарии

maksland

★★★✩✩✩✩
13 Янв 2019
513
117
Omsk
-30, CRGB:: MediumSlateBlue 0x7B68EE
-20, CRGB:: Blue, 0x0000FF
-10, CRGB:: DeepSkyBlue,0x00BFFF
0, CRGB:: DeepSkyBlue,0x00BFFF
10, CRGB:: MediumSpringGreen 0x00FA9A
20, CRGB:: Lime 0x00FF00 или LimeGreen 0x32CD32
30, CRGB:: DarkOrange 0xFF8C00 или Orange 0xFFA500

предложение Сотнег тоже интересно
 
Изменено:

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
-10, CRGB:: DeepSkyBlue,0x00BFFF
0, CRGB:: DeepSkyBlue,0x00BFFF
одинаковы же?)
предложение @Сотнег тоже интересно
не один из вариантов не рабочий, судя по эмулятору)

возможно палитра не работает с минусовыми диапазонами...
 
Изменено:

Сотнег

★★★★★★★
15 Янв 2020
4,346
1,492
@ASM,
CRGBPalette256 работает ведь.

В моём примере кода отрицательные значения приводятся к положительным.
 

maksland

★★★✩✩✩✩
13 Янв 2019
513
117
Omsk
да "0" это такая штука ...то она есть, то её нет
время жизни нуля мимолетно, жирно какой то цвет для него отдельно делать, вот +1 уже да !
 

wulf

★✩✩✩✩✩✩
1 Дек 2022
169
22
Прикольнулся задал неро сити вот её ответ
C++:
#include <iostream>
#include <cmath>

int main() {
    double temperature = -10.0;
    double red, green, blue;

    if (temperature < 0) {
        blue = 255;
        red = 0;
        green = 0;
    } else if (temperature > 0) {
        blue = 0;
        red = 255;
        green = 0;
    } else {
        blue = 0;
        red = 0;
        green = 255;
    }

    double t = std::abs(temperature);
    double factor = t / 10.0;

    red *= factor;
    green *= factor;
    blue *= factor;

    std::cout << "RGB Color: (" << red << ", " << green << ", " << blue << ")" << std::endl;

    return 0;
}
 

Сотнег

★★★★★★★
15 Янв 2020
4,346
1,492
@ASM,
1. Зайти по ссылке на эмулятор.
2. Заменить в коде в эмуляторе палитру после строки DEFINE_GRADIENT_PALETTE (оставив название).
3. Заменить CRGBPalette16 на CRGBPalette256.
4. Выбрать размер "экрана" 16х16.

Помигать цветом нужной температуры можно, если заменить число 51 в коде на (128 - температура).
Либо на (128 - температура *2), если брать второй вариант палитры с удвоенной градацией.
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@Сотнег, я так и делал)
в общем, подобрал код ColorFromPalette(MyPalette, color_index, 255, NOBLEND);
тогда градиент работает, не двоится, теперь попробую адаптировать под свои цвета.

получилось)
C++:
 DEFINE_GRADIENT_PALETTE( Temperature ) {
         0,  123,   104,   238,   //MediumSlateBlue
128 -30 *2,    0,     0,   255,   //Blue
128 -20 *2,    0,   191,   255,   //DeepSkyBlue
128  +0 *2,  176,   224,   230,   //PowderBlue
128 +10 *2,  238,   232,   170,   //PaleGoldenrod
128 +20 *2,  255,   255,     0,   //Yellow
       255,  255,     0,     0 }; //Red
 
Изменено:

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
Подобрал плавную смену цвета, получилось красиво)
C++:
         0,    0,     0,   139,   //DarkBlue
128 -30 *2,    0,     0,   255,   //Blue
128 -20 *2,   30,   144,   255,   //DodgerBlue
128 -10 *2,    0,   191,   255,   //DeepSkyBlue
128  +0 *2,  176,   224,   230,   //PowderBlue
128 +10 *2,  238,   232,   170,   //PaleGoldenrod
128 +20 *2,  255,   255,     0,   //Yellow
128 +30 *2,  255,   165,     0,   //Orange
       255,  255,     0,     0    //Red
 
Изменено:

wulf

★✩✩✩✩✩✩
1 Дек 2022
169
22
@ASM,я конечно понимаю что уже спрашивал но я никак не пойму почему уличный опрашивает вовремя запуска и все больше не меняет температуру до следующей перезагрузки сейчас уже датчик взял другой опять от платы 10см резюк 4.7 советский поставил но все равно ни в какую . и похоже проблема ток у меня такая
 

ASM

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

wulf

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

может можно где то и частотой опроса поиграть?
 

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
Тестируйте, экспериментируйте)
сделал для уличной и домашней, чтобы можно было тестировать)
немного работает не так, если не решит никто, потом гляну)
 

Вложения

  • Лойс +1
Реакции: maksland

maksland

★★★✩✩✩✩
13 Янв 2019
513
117
Omsk
в общем так - скомпилировал дома, по удаленке (1.4 км) залил в часы.
поигрался с настройками наблюдая через камеру видеонаблюдения в телефоне (картинка ЧБ но вижу что цвет меняется )
"сделал для ........ и домашней" смена цвета от температуры?

-28 показывает почти белым
 
Изменено:

wulf

★✩✩✩✩✩✩
1 Дек 2022
169
22
чет купил не подумав а dht22 будит ли работать тут 🤔
C++:
void TempToArray() {  // Display temperature from DTH22 sensor on the screen
  if (DOT_TEMP == 1) {
    leds[NUM_LEDS - 1] = CRGB(0, 0, 0);
  }
  FtempH = (dht.readTemperature()) + other.cor_tempH;
  tempH = FtempH;
  //Serial.println((String)tempH + " | " + FtempH);
  Dots(!Dot);
  DigitTempH(digits[10], segment_4);  // degree symbol
  int digit = abs(tempH % 10);
  DigitTempH(digits[digit], segment_3);
  digit = tempH / 10;
  if (digit == 0) {
    DigitTempH(digits[12], segment_2);  // turn off leading zero if present
  } else {
    DigitTempH(digits[digit], segment_2);  // display as it is
    DigitTempH(digits[12], segment_1);     // disable segment 1
  }
}
я так понимаю должно выглядить вот так для считывания
а библиотеки менять надо нет?
и на какие
 
Изменено:

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
dht22 будит ли работать тут
без библиотеки не будет) находим библиотеку с dht, например тут есть пример...
смотрим как работает и правим запросы)
-28 показывает почти белым
значит на все цвета так показывает, не работает этот код)
у тебя тоже на оба дачика один цвет работает
немного работает не так, если не решит никто, потом гляну)
нашел один косяк, в главном файле исправьте 53 строку CRGBPalette256 myPalette = Temperature;

множитель *2 еще можно убрать у положительных температур, тогда цвета поинтереснее будут)
 
Изменено:

ASM

★★★★★✩✩
26 Окт 2018
1,602
311
@maksland, попробуй поиграться корректировкой температуры, как будет меняться яркость?)
осторожно, в мониторинг не отправь эти данные) посмотри интервал и проверь)
у меня -4 корректирую до -13 появляется желтый оттенок)
 

wulf

★✩✩✩✩✩✩
1 Дек 2022
169
22
не знаю но у меня цвета улечного дачика работают в инверсии сменил чвета немного чтобы лутше видно было но расцветка минуса работает при плюсе и наобород
C++:
DEFINE_GRADIENT_PALETTE(Temperature){
  0, 0, 0, 139,                 //DarkBlue
  128 - 30 * 2, 0, 0, 255,      //Blue
  128 - 20 * 2, 70, 130, 180,   //SteelBlue
  128 - 10 * 2, 0, 255, 255,    //Aqua
  128 + 0 * 2, 255, 255, 255,   //White
  128 + 10 * 2, 0, 255, 0,  //Lime
  128 + 20 * 2, 240, 128, 128,    //LightCoral
  128 + 30 * 2, 255, 165, 0,    //Orange
  255, 255, 0, 0
};  //Red
нашол должно быть так
C++:
void DigitTemp(uint8_t digit, uint8_t cursor) {  // функция отображения символов
  for (uint8_t mask = 0b01000000; mask > 0; mask = mask >> 1) {
    for (uint8_t i = 0; i < LEDS_IN_SEGMENT; i++) {
      if (clck.new_god) {
        leds[cursor] = (digit & mask) ? ColorTable[rand() % NUM_COLORS - 1] : CRGB(0, 0, 0);
      } else {
        leds[cursor] = (digit & mask) ? ColorFromPalette(myPalette, 128 + tempS, 255, NOBLEND) : CRGB(0, 0, 0);
      }
      cursor++;
    }
  }
}
ну у меня это выглядит вот так на часах специально сменил цвет
IMG_20240220_230224.jpgIMG_20240220_230224.jpgIMG_20240220_230226.jpgIMG_20240220_230226.jpgIMG_20240220_230230.jpgIMG_20240220_230230.jpg
 
Изменено:

wulf

★✩✩✩✩✩✩
1 Дек 2022
169
22
@ASM,подскажи . буду делать часы человеку а он гипертоник спрашивал можно ли на давление палитру сделать .
насколько я понял нужно дабавить
C++:
void DigitPres(uint8_t digit, uint8_t cursor) {  // функция отображения символов
  for (uint8_t mask = 0b01000000; mask > 0; mask = mask >> 1) {
    for (uint8_t i = 0; i < LEDS_IN_SEGMENT; i++) {
      if (clck.new_god) {
        leds[cursor] = (digit & mask) ? ColorTable[rand() % NUM_COLORS - 1] : CRGB(0, 0, 0);
      } else {
        leds[cursor] = (digit & mask) ? ColorFromPalette(myPalette1, 128 + pres, 255, NOBLEND) : CRGB(0, 0, 0);
      }
      cursor++;
    }
  }
}
и палитру
C++:
CRGB ledColorPres;

DEFINE_GRADIENT_PALETTE(Pressure){
  0, 0, 0, 139,                 //DarkBlue
  128 - 30 * 2, 0, 0, 255,      //Blue
  128 - 20 * 2, 30, 144, 255,   //DodgerBlue
  128 - 10 * 2, 0, 191, 255,    //DeepSkyBlue
  128 + 0 * 2, 176, 224, 230,   //PowderBlue
  128 + 10 * 2, 238, 232, 170,  //PaleGoldenrod
  128 + 20 * 2, 255, 215, 0,    //Gold
  128 + 30 * 2, 255, 165, 0,    //Orange
  255, 255, 0, 0
};  //Red

CRGBPalette16 myPalette1 = Pressure;
ток не пойму как показания давления прописать или я еще где то ошибаюсь
 

wulf

★✩✩✩✩✩✩
1 Дек 2022
169
22
@Сотнег, так чтоль
C++:
DEFINE_GRADIENT_PALETTE(Pressure){
  0, 0, 0, 139,                 //DarkBlue
  128 + Pres * 2, 0, 0, 255,      //Blue
  128 + Pres * 2, 30, 144, 255,   //DodgerBlue
  128 + Pres * 2, 0, 191, 255,    //DeepSkyBlue
  128 + Pres * 2, 176, 224, 230,   //PowderBlue
  128 + Pres * 2, 238, 232, 170,  //PaleGoldenrod
  128 + Pres * 2, 255, 215, 0,    //Gold
  128 + Pres * 2, 255, 165, 0,    //Orange
  255, 255, 0, 0
};  //Red

CRGBPalette16 myPalette1 = Pressure;