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

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

  • BMP280

    Голосов: 17 41.5%
  • BME280

    Голосов: 24 58.5%

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

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

Данная прошивка проверяет время по NTP, часы RTC теоретически не нужны.
Барометр на базе BME280.
Имеется датчик освещенности и датчик DS18B20
Clock_схема.pngсхема пайки.jpg
Плата: NodeMCU 1.0 (ESP 12-E Module)

Если в качестве микроконтроллера вы используете Wemos D1 - в менеджере плат для компиляции все равно выбирайте "NodeMCU v1.0 (ESP-12E)", в противном случае, если выберете плату Wemos D1 (xxxx), - будет работать нестабильно.
Выбирайте ядро ESP версии 2.7.4.


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

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

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


изменения 20 ноября 2022 NEW_CLOCK_ESP_1 НЕ РАБОТАЕТ НА НОВОЙ ВЕРСИИ GyverPortal
  • Дофига изменений))
  • Появилась web страничка с настройками на базе GyverPortal.
  • Изменены библиотеки.
  • Переписан код, распределил по вкладкам.
В следующей версии:
  • оптимизация под новый портал
  • переделано давление с инт на флоат для мониторинга
  • переделан интерфейс на UI
  • добавлена ручная синхронизация времени
  • заменена библиотека rtc на microDS3231
  • багфиксы)
  • добавлена в код точка, для десятичного знака уличной температуры
  • добавлена строка с версией прошивки


исправлено:
  • баг со сменой цвета на последней цифре
добавлен
  • символ давления, включать в настройках
исправлено:
  • переделан вывод сегментов
  • переделана функция показа точек
добавлено:
  • выбор режима мигания секунд 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
296
71
Omsk
добавьте второй ds18b20 (комнатный) чтобы в любом месте часов/платы/комнаты можно было разместить
 
  • Лойс +1
Реакции: YADRIN

ASM

★★★✩✩✩✩
26 Окт 2018
1,020
198
Сделано на основе этого проекта пользователем Zaitsi
Материалы для корпуса взяты тут https://www.instructables.com/Retro-7-Segment-Clock-the-Final-Ones/
паял отрезками по два отрезка на сегмент 6 и 8 диодов, и того пайка- 4 отрезка по 6 диодов, 4 по 8 и точки отдельно по диоду
при сборке были нюансы, рефлекторы я полностью не печатал, только верх, в 3 прохода принтера, саму модель уменьшал до 66.67% по иску и игреку , она просто рассчитана на 3 диода на линию, Я использовал 2
 

Вложения

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

maksland

★★✩✩✩✩✩
13 Янв 2019
296
71
Omsk
а количество и расположение светодиодов стандартное ? а то думаю надо подключатся к тесту... закажу модуль nodemcu
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
338
51
ASM
Скетч погонял без BMP но с 18b20, всё работает. Насчет лага последней цифры при смене цвета, оказывается так было задумано, на каком то форуме прочитал, там тоже по этому поводу вопрос задали
... в принципе там сложности нет, вместо нуля указать 1, это в какой строке?

... в принципе там сложности нет, вместо нуля указать 1, это в какой строке? -> это по поводу количества датчиков 18b20
 

ASM

★★★✩✩✩✩
26 Окт 2018
1,020
198
@kym13,
C++:
sensors.getTempCByIndex(0);// датчик 1
sensors.getTempCByIndex(1);// датчик 2
sensors.getTempCByIndex(2);// датчик 3
и т.д.
 
  • Лойс +1
Реакции: kym13

bort707

★★★★★★✩
21 Сен 2020
2,500
760
чтобы при смене цвета последняя цифра не зависала, перепишите вывод времени так:
C++:
void TimeToArray() { // вывод времени на экран
  int Now = GetTime(); // получаем время
  boolean color_change_flag = false;
  boolean Dots = true; // точки
  if (Dot == 0) Dots = false; else Dots = true;
  if (Dots) { // показ точек
    for (uint8_t i = 0; i < DOTS_NUM; i++) {
      leds[(LEDS_IN_SEGMENT * 14) + i] = ledColor;
    }
  }
  else {
    Dots_off(); // выключение точек
  }
  for (int i = 1; i <= 4; i++) { // 4 сегмента
    int digit = Now % 10; // получаем последнюю цифру в времени
    int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
    if (i > 2) {
      cursor -= DOTS_NUM;
    }
    if ( i == 4 & digit == 0)Digit(digits[12], cursor); // если впереди ноль, то выключаем его, например 01:23 будет как 1:23
    else
      Digit(digits[digit], cursor);                     // иначе показываем символ

    if ( i == COLOR_CHANGE) {                           // как часто менять цвет
      if (digit != last_digit) {
          color_change_flag = true;
          last_digit = digit;
         }
      }
    Now /= 10;
  };
if (color_change_flag) ledColor =  ColorTable[random(NUM_COLORS)];     // случайный цвет из таблицы)  
};
 
  • Лойс +1
Реакции: ASM

kym13

★★✩✩✩✩✩
14 Ноя 2020
338
51
bort707
Вставил в скетч Ваш кусок кода из 10 поста, глюк на последней цифре пропал.
 

foka44

✩✩✩✩✩✩✩
1 Мар 2021
10
0
перевел скетч на библиотеку SparkFunBME280, работает стабильнее, адаптация на BME будет простая))
@maksland, добавил описание, в принципе там сложности нет, вместо нуля указать 1, если датчика два, если три, то 0, 1, 2 и т.д.))
C++:
/*Блокнотик
  +  задержка wifi при вкл эл-ва
  +  загрузка при старте
  + ограничение по току
  - MQTT
  + IoT
*/
#include <ESP8266WiFi.h>
#include <EasyNTPClient.h>
#include <WiFiUdp.h>
#include <RTClib.h>
RTC_DS3231 rtc;
#include <FastLED.h>
//#include <BMP280_DEV.h>
//BMP280_DEV bmp280;
#include <Wire.h>
#include <SparkFunBME280.h>
BME280 bmp280;
#include <OneWire.h>
#include <DallasTemperature.h>
WiFiUDP udp;

/////////////////////НАСТРОЙКИ И СХЕМА//////////////////
//питание платы от БП не выше 5В
//DS3231 SDA=>D2 SCL+>D1 питание с 5В БП или с 3.3В
//BMP/BME 280 SDA=>D2 SCL+>D1 питание 3.3В
//DS18B20 питание 5В, если уличный без модуля ставим резистор между питанием и сигнальным на 4.7К
const char *ssid = "";  //имя WiFi сети вашего роутера
const char *password = "";    //пароль от сети
#define ONE_WIRE_BUS_2 D5     // PIN датчика ds18b20
int UpdatePeriod = 12;        // период в часах, как часто обновлять время из интернета, лучше не пишите маленькие числа:)
#define LEDS_IN_SEGMENT 4     // задаём сколько у нас светодиодов в сегменте
#define DOTS_NUM 2            // задаём сколько у нас разделительных точек
#define NUM_COLORS 16         // количество цветов, записаны в ColorTable
#define COLOR_CHANGE 0        // смена цвета ( 0 - никогда, 1 - раз в минуту, 2 - каждые десять минут, 3 - каждый час, 4 - каждые десять часов)
// если в схеме один фоторезистор не модулем, то вешаем резистор от 1К до 10К. Если у вас высокая освещенность, то 1К, если слабая, то до 10К
// один вывод фоторезистора на пин A0, или любой другой, второй на GND. Между GND и питанием ставим резистор
#define BRI_PIN A0            // PIN фоторезистора
#define max_bright 255        // максимальная яркость (0 - 255)
#define min_bright 5          // минимальная яркость (0 - 255)
#define bright_constant 1023  // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.4              // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
#define auto_bright 1         // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
EasyNTPClient ntpClient(udp, "pool.ntp.org", (3 * 60 * 60)); //заменить первую цифру на свой часовой пояс, 3 для МСК
#define COLOR_ORDER GRB       // тип ленты, поменять порядок GRB на свой тип, если неправильные цвета
#define LED_PIN 6             // PIN дата от ленты, подключать через резистор 330Ом
int brg = 10000;              // как часто проверять изменение по датчику освещенности в мс, 10000 соответствуют 10сек
byte type_brg = 0;            // выбрать тип датчика, 0 - аналог, 1 - цифровой
byte cnctd = 20;              // кол-во попыток подключиться к роутеру, 2 запроса в сек
uint32_t milliamps = 1000;    // ограничение по току в мА
int delay_narod = 600;        // как часто отправлять значения датчиков на мониторинг, минимум 5 минут, значение в секундах, плюс запас в 5 сек, на всякий случай, получается минимум 305
// при отправке больше 2х запросов в 5 минут, получите бан по IP
// регистрирумся на narodmon.ru, загружаем настроенный скетч, в меню профиль, отладка по IP копируем Mac
// снова профиль, мои датчики, вводим Mac и настраиваем датчики по усмотрению и радуемся их работе :)
static bool Monitoring = true; // включаем мониторинг, иначе false
/////////////////////КОНЕЦ НАСТРОЕК/////////////////

// настроим библиотеку 1-Wire для связи с датчиком
OneWire oneWire_out(ONE_WIRE_BUS_2);
// создадим объект для работы с библиотекой DallasTemperature
DallasTemperature sensors(&oneWire_out); //уличный ds18b20
int Period = UpdatePeriod * 3600; //вычисление секунд
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM) // вычисляем кол-во светодиодов
/////////////////////////////////////////////
CRGB leds[NUM_LEDS];  // определение СД ленты
uint8_t  digits[] = { // определяем символы для отображения
  // код начинается с 0b0, далее идут 7 цифр, каждая цифра это номер фрагмента, 1 - включен, 0- отключен
  // далее указан получающийся символ и порядковый номер в массиве
  0b00111111,     // Символ 0          0
  0b00100001,     // Символ 1          1
  0b01110110,     // Символ 2          2
  0b01110011,     // Символ 3          3
  0b01101001,     // Символ 4          4
  0b01011011,     // Символ 5          5
  0b01011111,     // Символ 6          6
  0b00110001,     // Символ 7          7
  0b01111111,     // Символ 8          8
  0b01111011,     // Символ 9          9
  0b01111000,     // Символ * градус  10
  0b00011110,     // Символ C         11
  0b00000000,     // Без символа      12
  0b01000000      // Символ -         13
};
bool Dot = true;    // переменная для точек
int last_digit = 0; // последний символ равен нулю
byte set_light;     // переменная для освещенности
byte brightness;    // переменная для освещенности
int new_bright, new_bright_f; // переменная для освещенности
unsigned long bright_timer, off_timer; // переменная для освещенности
unsigned long timing;                  // переменная для мониторинга
float temperature, pressure, altitude; // переменные для библиотеки датчика bmp280
float tempH, tempS, presH;             // переменные для мониторинга
CRGB ledColor = CRGB::Blue;   // цвет в hex
CRGB ColorTable[NUM_COLORS] = { // Таблица цветов
  CRGB::Amethyst,
  CRGB::Aqua,
  CRGB::Blue,
  CRGB::Chartreuse,
  CRGB::DarkGreen,
  CRGB::DarkMagenta,
  CRGB::DarkOrange,
  CRGB::DeepPink,
  CRGB::Fuchsia,
  CRGB::Gold,
  CRGB::GreenYellow,
  CRGB::LightCoral,
  CRGB::Tomato,
  CRGB::Salmon,
  CRGB::Red,
  CRGB::Orchid
};
/////////////////////////////////////////////
void setup() {
  Serial.begin(115200);
  Wire.begin();
  bmp280.setI2CAddress(0x76); //Connect to a second sensor
  if (bmp280.beginI2C() == false) Serial.println("Sensor B connect failed");

  LEDS.setBrightness(50);
  FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS); // подключение ленты
  FastLED.setMaxPowerInVoltsAndMilliamps (5, milliamps);
  //  bmp280.begin(BMP280_I2C_ALT_ADDR);
  //  bmp280.setTimeStandby(TIME_STANDBY_2000MS);
  //  bmp280.startNormalConversion();
  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
  /*
    if (!bmp.begin()) {                               // Проверка инициализации датчика
    Serial.println("Could not find a valid BME280 sensor, check wiring!"); // Печать, об ошибки инициализации.
    while (1);                                          // Зацикливаем
    }*/
  syncTime();

}
/////////////////////////////////////////////
void BrightnessCheck() { // функция освещенности
  static uint32_t last_br = millis();
  if ((millis() - last_br) < brg) return;
  last_br = millis();
  if (auto_bright) {                         // если включена адаптивная яркость
    if (millis() - bright_timer > 100) {     // каждые 100 мс
      bright_timer = millis();               // сбросить таймер
      switch (type_brg) {
        case 1:
          new_bright = map(digitalRead(BRI_PIN), 0, bright_constant, max_bright, min_bright);   // считать показания с фоторезистора, перевести диапазон
          break;
        default:
          new_bright = map(analogRead(BRI_PIN), 0, bright_constant, max_bright, min_bright);   // считать показания с фоторезистора, перевести диапазон
      }
      //      Serial.println((String)"Освещенность: " + new_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);      // установить новую яркость
    }
  }
};
/////////////////////////////////////////////
void syncTime() {
  WiFi.begin(ssid, password);
  byte trys = 0;
  Serial.println("");
  while (WiFi.status() != WL_CONNECTED) {
    trys++;
    //    delay(500);
    NoSignal();
    Serial.print(".");
    if (trys > cnctd)
    {
      Serial.println("Нет связи с роутером при старте!");
      return;
    }
  }
  long ntpTime = ntpClient.getUnixTime();
  if (ntpTime > 1609459200) {
    rtc.adjust(DateTime(ntpTime));
    Serial.println("");
    Serial.println("Время записано!");
  }
  else
  {
    Serial.println("");
    Serial.println("Отказ в записи! Время получено неправильное!");
    GetTime();
  }/*
  // Выключаем WIFI после обновления
  // похоже теперь не нужна, раз подключили мониторинг :)
  WiFi.disconnect();
  WiFi.mode(WIFI_OFF);
  WiFi.forceSleepBegin();
  delay(1000);*/
}
/////////////////////////////////////////////
int GetTime() {
  DateTime now = rtc.now();
  int hour = now.hour();
  int minute = now.minute();
  int second = now.second();
  Serial.println((String)hour + ":" + minute + ":" + second);
  Dot = second % 2; // точки мигают раз в сек
  return (hour * 100 + minute);
};
/////////////////////////////////////////////
void TimeToArray() { // вывод времени на экран
  int Now = GetTime(); // получаем время
  boolean Dots = true; // точки
  if (Dot == 0) Dots = false; else Dots = true;
  if (Dots) { // показ точек
    for (uint8_t i = 0; i < DOTS_NUM; i++) {
      leds[(LEDS_IN_SEGMENT * 14) + i] = ledColor;
    }
  }
  else {
    Dots_off(); // выключение точек
  }
  for (int i = 1; i <= 4; i++) { // 4 сегмента
    int digit = Now % 10; // получаем последнюю цифру в времени
    int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
    if (i > 2) {
      cursor -= DOTS_NUM;
    }
    if ( i == 4 & digit == 0)Digit(digits[12], cursor); // если впереди ноль, то выключаем его, например 01:23 будет как 1:23
    else
      Digit(digits[digit], cursor);                     // иначе показываем символ

    if ( i == COLOR_CHANGE) {                           // как часто менять цвет
      if (digit != last_digit) {
        ledColor =  ColorTable[random(NUM_COLORS)];     // случайный цвет из таблицы
      }
      last_digit = digit;
    }
    Now /= 10;
  };
};
/////////////////////////////////////////////
void Dots_off()  { // отключаем точки принудительно, где не нужны
  for (uint8_t i = 0; i < DOTS_NUM; i++) {
    leds[(LEDS_IN_SEGMENT * 14) + i] = 0x000000;
  }
}
/////////////////////////////////////////////
void Digit (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++) {
      leds[cursor] = (digit & mask) ? ledColor : CRGB (0, 0, 0);
      cursor ++;
    }
  }
}
/////////////////////////////////////////////
void TempToArray() { // вывод температуры с датчика BMP280 на экран
  bmp280.beginI2C();
  //  bmp280.getMeasurements(temperature, pressure, altitude);
  tempH = (bmp280.readTempC());
  int celsius = tempH;
  //  int celsius = temperature; //датчик на стене, выше роста, корректировка минус 1 градус, сейчас на столе стенд
  //  tempH = temperature;


  Serial.println ((String) celsius + " | " + tempH);
  Dots_off(); // выключаем точки
  Digit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); // символ градуса

  int digit = abs (celsius % 10);
  Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));

  digit = celsius / 10;
  if (digit == 0)Digit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); // если впереди ноль, то выключаем его
  else
    Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); // иначе показываем как есть

  Digit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); // отключаем 1 сегмент
};
/////////////////////////////////////////////
void PressToArray() { // вывод давления на экран
  bmp280.beginI2C();
  presH = (bmp280.readFloatPressure() * 0.0075);
  int davlenie = presH;
  //  bmp280.getMeasurements(temperature, pressure, altitude);
  //  int davlenie = pressure * 0.75;

  //  presH = pressure * 0.75;

  Serial.println ((String) davlenie + " | " + presH);

  Dots_off(); // выключаем точки

  int digit = davlenie % 10;
  Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7));

  digit = davlenie % 100 / 10;
  Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));

  digit = davlenie / 100;
  Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));

  Digit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); // отключаем первый сегмент
};
/////////////////////////////////////////////
void TempStreetToArray() { // вывод уличной температуры на экран
  sensors.requestTemperatures(); // опрос датчика уличной температуры
  int celsius = sensors.getTempCByIndex(0); // чтение уличной температуры с датчика 0, налогично следующий будет 1
  tempS = sensors.getTempCByIndex(0);
  Serial.println ((String) celsius + " | " + sensors.getTempCByIndex(0));

  Dots_off(); // выключаем точки

  Digit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); // символ градуса

  int digit = abs (celsius % 10);
  Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));

  digit = abs (celsius / 10);
  if (digit == 0)Digit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); // если впереди ноль, то выключаем его
  else
    Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); // иначе показываем как есть

  if (sensors.getTempCByIndex(0) <= -1)Digit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); // если < или = -1, то показываем -
  else
    Digit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); // иначе выключаем 1 сегмент
};
/////////////////////////////////////////////
void body() { // вывод информации
  static bool TempShow = true; // флаг для температуры в помещении
  static bool TempSShow = true; // флаг для температуры на улице
  static bool PressShow = true; // флаг для давления
  uint32_t tmrall = millis() % 12000 / 1000; //берем интервал в 12сек
  static uint32_t tmrall_old = 10000;        //в расчет берутся 10сек, в исключение 2 сек, ниже будет понятно:)
  if (tmrall_old != tmrall)
  {
    tmrall_old = tmrall;
    if (tmrall < 6) //6 сек показывают часы
    {
      TimeToArray();
      TempShow = true;
      TempSShow = true;
      PressShow = true;
    }
    else if (tmrall < 8) //2 секунды показывается температура, добавляем +2
    {
      if (TempShow)
      {
        TempToArray();
        TempShow = false;
      }
    }
    else if (tmrall < 10) //2 секунды показывается температура, добавляем +2
    {
      if (TempSShow)
      {
        TempStreetToArray();
        TempSShow = false;
      }
    }
    else
    {
      if (PressShow) // остальное время показывается давление
      {
        PressToArray();
        PressShow = false;
      }
    }
    FastLED.show(); // команда для включения светодиодов
  };
}
/////////////////////////////////////////////
void loop() {
  BrightnessCheck();
  if (millis() % 1000 < Period - 1)
  {
    body();
  }
  else {
    syncTime();
  }

  if (Monitoring) {
    if (millis() - timing > delay_narod * 1000) {
      timing = millis();
      narod();
    }
  }
}
/////////////////////////////////////////////
void narod() { //функция для народного мониторинга
  WiFi.begin(ssid, password);
  byte tryss = 0;
  Serial.println("Start_narod");
  while (WiFi.status() != WL_CONNECTED) {
    tryss++;
    delay(500);
    Serial.print("_");
    if (tryss > 20)
    {
      Serial.println("Нет связи с роутером, narod!");
      return;
    }
  }
  String buf = "#" + WiFi.macAddress();
  // добавление и удаление датчиков по шаблону
  buf = buf + "\n#T1#" + tempH;
  buf = buf + "\n#T2#" + tempS;
  buf = buf + "\n#T3#" + presH;
  buf = buf + "\n##";
  WiFiClient client;
  client.connect("narodmon.ru", 8283);
  client.print(buf);
  Serial.println("Показания отправлены!");
}
/////////////////////////////////////////////
void NoSignal() { // анимация загрузки :)
  Digit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));
  FastLED.show(); delay(125);
  Digit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));
  FastLED.show(); delay(125);
  Digit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 14));
  FastLED.show(); delay(125);
  Digit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 7));
  FastLED.show(); delay(125);
  LEDS.clear();
}
Попробовал этот код, точки моргают раз в две секунды, как это можно подправить, у Вас так же моргают редко?
 

ASM

★★★✩✩✩✩
26 Окт 2018
1,020
198
@foka44, да, мигание завязаны на секунды, гаснут и загораются по секунде) исправить можно, надо разбираться только) хотя можно принудительно зажигать и гасить их каждые 500мс) подожду других идей)

@foka44, позже посмотрю вариант) в других скетчах также мигает?)
 

foka44

✩✩✩✩✩✩✩
1 Мар 2021
10
0
@foka44, позже посмотрю вариант) в других скетчах также мигает?)
Я другие не пробовал, только начал повторять этот проект на ESP8266 wemos d1 mini с модулем часов DS3231, ws2812, фоторезистор LDR 5528D и датчик DHT22.
Запустил, сейчас работает
вывод времени, синхронизация времени через интернет,
автоматическая яркость, обновление прошивки по wi-fi.
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
338
51
Протестировал скетч из 11 поста, точки моргают как положено раз в секунду, но глюк при смене цвета на последней цифре остался bort707 выложил же кусок кода в 9 посте, его вставил глюк прошел. Еще при подключении 2-х датчиков 18b20 на экран выводится температура только с одного без BMP ?
 

ASM

★★★✩✩✩✩
26 Окт 2018
1,020
198
@kym13, глюк исправил, но не обновил тут)
Если не нужен bmp, закомментируй его и добавь на вывод другой датчик, можешь заменить sensors на sensors1, sensors2 и соответственно сделать по ним запросы)

П.С. с освещённостью надо что-то делать, сейчас пасмурно, дома света мало, часы еле светятся, т.к. думают что почти ночь)
Какие мысли по этому поводу, надо как-то завязать и на время и на освещенность) Если привязать по часам, то надо определиться с яркостью. В темную погоду тогда будут ярко, в светлую наоборот)
 
Изменено:

kym13

★★✩✩✩✩✩
14 Ноя 2020
338
51
У тебя модуль фоторезистора или фото и просто резистор? У меня модуль на нём есть подстроечник для регулировки чувствительности, поэтому проблем с этим нет.
 

ASM

★★★✩✩✩✩
26 Окт 2018
1,020
198
@kym13, сейчас просто фоторезистор с резистором, можно вернуть на модуль)
 

foka44

✩✩✩✩✩✩✩
1 Мар 2021
10
0
Протестировал скетч из 11 поста, точки моргают как положено раз в секунду, но глюк при смене цвета на последней цифре остался bort707 выложил же кусок кода в 9 посте, его вставил глюк прошел. Еще при подключении 2-х датчиков 18b20 на экран выводится температура только с одного без BMP ?
Эти части кода и используются, все сверял проверял, все равно моргают раз в 2 секунды (30 раз в минуту).
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
338
51
ASM )) А значек давления "Р" должен быть на экране?
 

ASM

★★★✩✩✩✩
26 Окт 2018
1,020
198
@kym13, не вижу в нем смысла, как-то не вписывается он) Р765 как-то странно смотрится, в отличии от 765) если нужно, могу добавить, там делов-то на пару минут)
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
338
51
ASM )) Если не тяжело то добавьте

foka44)) Dot = second % 2; // точки мигают раз в сек... у вас в этом параметре 2 стоит?

ASM )) А почему давление умножаем на 0.0075 ( presH = (bmp280.readFloatPressure() * 0.0075); , разве не делить нужно на 133.322;?
 

ASM

★★★✩✩✩✩
26 Окт 2018
1,020
198
@kym13, а разница?)
умножать хоть красивее число))
 
Изменено:

ASM

★★★✩✩✩✩
26 Окт 2018
1,020
198
Обновил код, описание в первом сообщении)
 

ASM

★★★✩✩✩✩
26 Окт 2018
1,020
198
@foka44, 2 это остаток от деления, либо 0, либо 1
C++:
  if (Dot == 0) Dots = false; else Dots = true;