Большие часы на адресных светодиодах WS2812B

Большие часы на адресных светодиодах WS2812B
Всем привет, хочу рассказать о том как я попробовал повторить проект, но столкнулся с некоторыми проблемами.

Как-то раз на просторах зарубежного интернета я нашел вот такой проект часов на базе светодиодной ленты WS2812B: Big, Auto Dim, Room Clock, и мне захотелось его повторить. Часы устроены как семи сегментный циферблат и работают на RTC модуле DS3231 . Часы умеют показывать температуру, имеют кнопки для настройки и перевода на зимнее время и обратно, позже я добавил датчик влажности DHT11. Температура уже вместе с влажностью считывалась с этого датчика и выводилась раз в минуту. Хоть и в модуле часов есть температурный датчик, но похоже он показывал температуру не корректно из-за самонагрева (ИМХО).




Untitled Sketch_МП.png
И главное нанести много горячих соплей

IMG_20180907_120755.jpg


Когда все было собрано, повозившись с библиотеками, все заработало. И тут возникло одно большое НО: положения яркости в только в двух позициях меня не устраивало. Тем более на границе значений происходило мерцание. Установка яркости на статичном значении меня тоже не очень устраивала ибо днем при установленном тусклом свете ничего не было видно, а ночью даже со значениями близким к минимуму можно было осветить всю Москву. Поинтересовавшись как в других проектах с этим справляется Alex было решено заменить такой код настройки яркости.

C:
void BrightnessCheck(){
  const byte sensorPin = BRI_PIN; // light sensor pin
  const byte brightnessLow = 1; // Low brightness value
  const byte brightnessHigh = 50; // High brightness value
  int sensorValue = analogRead(sensorPin); // Read sensor
  Serial.print("Sensor is: ");Serial.println(sensorValue);
  sensorValue = map(sensorValue, 0, 255, 1, 100);
  LEDS.setBrightness(sensorValue);
  };
вот такими строчками:
C:
void BrightnessCheck() {

  if (auto_bright) {                         // если включена адаптивная яркость
    if (millis() - bright_timer > 100) {     // каждые 100 мс
      bright_timer = millis();               // сброить таймер
      new_bright = map(analogRead(BRI_PIN), 0, bright_constant, min_bright, max_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);      // установить новую яркость
    }
  }
};

Тут стоит упомянуть что программистом я не являюсь и большинство проблем я пытаюсь решить методом тыка и перебора.

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

Что касается кода вот сылка на GitHub. Кое-что я перевел для лучшего понимания.

Давно хотел поделиться готовым и работоспособным проектом в кругах аудитории Алекса, но вышло так что собственно нормальной работоспособностью тут не пахнет. Буду благодарени, если у кто сможет помочь.
 
Изменено:

Комментарии

bort707

★★★★★★✩
21 Сен 2020
2,926
868
@Старик Похабыч, как записать данные с ntp в rtc. В каком виде там хранятся?) Раз в сутки достаточно) Если в unix, то все просто, принимать можно в unix...
в юникс
Описание к библиотеке почитали бы
Юникстайм с NTP принимаете и прямо в RTC записываете:

rtc.adjust(DateTime( unixtime ));
 

ASM

★★★★✩✩✩
26 Окт 2018
1,526
296
@bort707, ну, если с unix дружит, то думаю все будет просто)
В примерах нет этого, только вывод в сериал разных вариантов, которые возможно высчитывает библиотека.

Получается что-то из этого?)
RTC.adjust (DateTime(ntpClient.getUnixTime()))

@kym13, попробуй этот вариант) пропиши только данные WiFi свои и часовой пояс
Записываю UNIX во время включения
C++:
// подключаем библиотеку «ESP8266WiFi»:
#include <ESP8266WiFi.h>
#include <EasyNTPClient.h>
#include <WiFiUdp.h>
//#include <OneWire.h>
//#include <DallasTemperature.h>
#include <RTClib.h>
RTC_DS3231 rtc;
//#include <Wire.h>
//#include <SPI.h>
//#include <Adafruit_Sensor.h>
//#include <Adafruit_BMP280.h>
#include <FastLED.h>   // библиотека светодиодов из менеджера библиотек

const char *ssid = "NAME";             // your network SSID (name)
const char *password = "PASS";         // your network password

WiFiUDP udp;

EasyNTPClient ntpClient(udp, "pool.ntp.org", (3 * 60 * 60));  //часовой пояс у меня +3 Мск

/////////////////////////////////////////////
#define LEDS_IN_SEGMENT 4     // задаём сколько у нас светодиодов в сегменте
#define DOTS_NUM 2            // задаём сколько у нас разделительных точек
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM) // вычисляем кол-во светодиодов
#define NUM_COLORS 16         // количество цветов
#define COLOR_CHANGE 0        // смена цвета ( 0 - никогда, 1 - раз в минуту, 2 - каждые десять минут, 3 - каждый час, 4 - каждые десять часов)
#define max_bright 255        // максимальная яркость (0 - 255)
#define min_bright 10         // минимальная яркость (0 - 255)
#define bright_constant 1023  // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.4              // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
#define auto_bright 1         // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
/////////////////////////////////////////////
#define COLOR_ORDER GRB  // тип ленты
#define LED_PIN 6  // пин дата от ленты
#define MIN_PIN 5  // пин минутной кнопки
#define HUR_PIN 4  // пин часовой кнопки
#define BRI_PIN A0 // PIN фоторезистора
/////////////////////////////////////////////
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; // переменная для освещенности
/////////////////////////////////////////////
//управление цветом
//int ledColor = 0x00FFFF;    // цвет в hex
//long ledColor = CRGB::Blue; // цвет в hex
CRGB ledColor = CRGB::Blue;   // цвет в hex
// массив цветов, для рандом при включенном режиме cylon(); ledColor =  ColorTable[random(16)];
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);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  rtc.adjust (DateTime(ntpClient.getUnixTime()));

  FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS); // подключение ленты
}
/////////////////////////////////////////////
int GetTime() { // функция времени
  DateTime now = rtc.now();
  int hour = now.hour();
  int minute = now.minute();
  int second = now.second();
  Serial.print(hour);   Serial.print(":");  // вывод часов
  Serial.print(minute); Serial.print(":");  // вывод минут
  Serial.print(second); Serial.println(""); // вывод секунд
  Dot = second % 2; // точки мигают раз в сек
  return (hour * 100 + minute);
};
/////////////////////////////////////////////
void BrightnessCheck() { // функция освещенности
  static uint32_t last_br = millis();
  if ((millis() - last_br) < 10000) return;
  last_br = millis();
  if (auto_bright) {                         // если включена адаптивная яркость
    if (millis() - bright_timer > 100) {     // каждые 100 мс
      bright_timer = millis();               // сбросить таймер
      new_bright = map(analogRead(BRI_PIN), 0, bright_constant, max_bright, min_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 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 loop() {
  BrightnessCheck();
  TimeToArray();
  FastLED.show(); // команда для включения светодиодов

  //  Serial.println(ntpClient.getUnixTime());

  delay(1000); // wait for 20 seconds before refreshing.

}
 
Изменено:

kym13

★★✩✩✩✩✩
14 Ноя 2020
454
67
Избыточное цитирование
@kym13, попробуй этот вариант) пропиши только данные WiFi свои и часовой пояс
Записываю UNIX во время включения
C++:
// подключаем библиотеку «ESP8266WiFi»:
#include <ESP8266WiFi.h>
#include <EasyNTPClient.h>
#include <WiFiUdp.h>
//#include <OneWire.h>
//#include <DallasTemperature.h>
#include <RTClib.h>
RTC_DS3231 rtc;
//#include <Wire.h>
//#include <SPI.h>
//#include <Adafruit_Sensor.h>
//#include <Adafruit_BMP280.h>
#include <FastLED.h>   // библиотека светодиодов из менеджера библиотек

const char *ssid = "NAME";             // your network SSID (name)
const char *password = "PASS";         // your network password

WiFiUDP udp;

EasyNTPClient ntpClient(udp, "pool.ntp.org", (3 * 60 * 60));  //часовой пояс у меня +3 Мск

/////////////////////////////////////////////
#define LEDS_IN_SEGMENT 4     // задаём сколько у нас светодиодов в сегменте
#define DOTS_NUM 2            // задаём сколько у нас разделительных точек
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM) // вычисляем кол-во светодиодов
#define NUM_COLORS 16         // количество цветов
#define COLOR_CHANGE 0        // смена цвета ( 0 - никогда, 1 - раз в минуту, 2 - каждые десять минут, 3 - каждый час, 4 - каждые десять часов)
#define max_bright 255        // максимальная яркость (0 - 255)
#define min_bright 10         // минимальная яркость (0 - 255)
#define bright_constant 1023  // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.4              // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
#define auto_bright 1         // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
/////////////////////////////////////////////
#define COLOR_ORDER GRB  // тип ленты
#define LED_PIN 6  // пин дата от ленты
#define MIN_PIN 5  // пин минутной кнопки
#define HUR_PIN 4  // пин часовой кнопки
#define BRI_PIN A0 // PIN фоторезистора
/////////////////////////////////////////////
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; // переменная для освещенности
/////////////////////////////////////////////
//управление цветом
//int ledColor = 0x00FFFF;    // цвет в hex
//long ledColor = CRGB::Blue; // цвет в hex
CRGB ledColor = CRGB::Blue;   // цвет в hex
// массив цветов, для рандом при включенном режиме cylon(); ledColor =  ColorTable[random(16)];
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);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  rtc.adjust (DateTime(ntpClient.getUnixTime()));

  FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS); // подключение ленты
}
/////////////////////////////////////////////
int GetTime() { // функция времени
  DateTime now = rtc.now();
  int hour = now.hour();
  int minute = now.minute();
  int second = now.second();
  Serial.print(hour);   Serial.print(":");  // вывод часов
  Serial.print(minute); Serial.print(":");  // вывод минут
  Serial.print(second); Serial.println(""); // вывод секунд
  Dot = second % 2; // точки мигают раз в сек
  return (hour * 100 + minute);
};
/////////////////////////////////////////////
void BrightnessCheck() { // функция освещенности
  static uint32_t last_br = millis();
  if ((millis() - last_br) < 10000) return;
  last_br = millis();
  if (auto_bright) {                         // если включена адаптивная яркость
    if (millis() - bright_timer > 100) {     // каждые 100 мс
      bright_timer = millis();               // сбросить таймер
      new_bright = map(analogRead(BRI_PIN), 0, bright_constant, max_bright, min_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 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 loop() {
  BrightnessCheck();
  TimeToArray();
  FastLED.show(); // команда для включения светодиодов

  //  Serial.println(ntpClient.getUnixTime());

  delay(1000); // wait for 20 seconds before refreshing.

}
Загрузил, у меня тоже время +3, вот что в мониторе порта. Время кажет точно.


немного погодя
 

Вложения

  • 113.9 KB Просмотры: 15
  • 109.4 KB Просмотры: 14
  • 112.7 KB Просмотры: 11
Изменено:

ASM

★★★★✩✩✩
26 Окт 2018
1,526
296
@kym13, у меня аналогично кажет и без модуля)
осталось понять, что за цифры такие) у меня есть модуль DS1302, но чувствую, его не подружить с ESP, очень древний модуль)
подключил его как DS1307, какие-то странные логи в мониторе пошли, такого в скетче даже не было)

@bort707, @Старик Похабыч, какие ваши мысли, что за цифры?)
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
454
67
@kym13, у меня аналогично кажет и без модуля)
осталось понять, что за цифры такие) у меня есть модуль DS1302, но чувствую, его не подружить с ESP, очень древний модуль)
подключил его как DS1307, какие-то странные логи в мониторе пошли, такого в скетче даже не было)

@bort707, @Старик Похабыч, какие ваши мысли, что за цифры?)
Ну первые цифры это время, причём правильное, а вот после времени фиг знает что это. Дисплей показывает вот это(см. фото)
и ещё подключил фоторезистор, на него не реагирует
 

Вложения

  • 70.5 KB Просмотры: 4

ASM

★★★★✩✩✩
26 Окт 2018
1,526
296
@kym13,
2165/165/165 () 165:165:85
since midnight 1/1/1970 = 1122162385s = 12987d
now + 7d + 12h + 30m + 6s: 2005/7/31 12:16:31
Temperature: -0.25 C
это ответ из примера кода
C++:
    DateTime now = rtc.now();

    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
//    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();

    Serial.print(" since midnight 1/1/1970 = ");
    Serial.print(now.unixtime());
    Serial.print("s = ");
    Serial.print(now.unixtime() / 86400L);
    Serial.println("d");

    // calculate a date which is 7 days, 12 hours, 30 minutes, 6 seconds into the future
    DateTime future (now + TimeSpan(7,12,30,6));

    Serial.print(" now + 7d + 12h + 30m + 6s: ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();

    Serial.print("Temperature: ");
    Serial.print(rtc.getTemperature());
    Serial.println(" C");

    Serial.println();
    delay(3000);

пока мысли только одни, DS3231 не знает, что такое UNIX))

Ну первые цифры это время, причём правильное
походу это предельные числа)
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
454
67
Ну первые цифры это время, причём правильное, а вот после времени фиг знает что это. Дисплей показывает вот это(см. фото)
и ещё подключил фоторезистор, на него не реагирует
У меня есть два модуля один 1307 и RTC_PCF_8563
 

ASM

★★★★✩✩✩
26 Окт 2018
1,526
296
упростил код по минимум, чтобы удобнее смотрелось)
C++:
#include <ESP8266WiFi.h>
#include <EasyNTPClient.h>
#include <WiFiUdp.h>
#include <RTClib.h>
RTC_DS3231 rtc;

const char *ssid = "";            
const char *password = "";        

WiFiUDP udp;
EasyNTPClient ntpClient(udp, "pool.ntp.org", (3 * 60 * 60));

void setup() { 

  Serial.begin(115200);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  rtc.adjust (DateTime(ntpClient.getUnixTime()));
}
int GetTime() {
  DateTime now = rtc.now();
  int hour = now.hour();
  int minute = now.minute();
  int second = now.second();

  Serial.print(hour);   Serial.print(":");  // вывод часов
  Serial.print(minute); Serial.print(":");  // вывод минут
  Serial.print(second); Serial.println(""); // вывод секунд
  return (hour * 100 + minute);
};
void loop() {
  GetTime();
    Serial.println(ntpClient.getUnixTime());
  delay(1000);
}
выводит
C++:
....165:165:85
1615558678
165:165:85
1615558679
UNIX время в мониторе корректное
 
Изменено:

ASM

★★★★✩✩✩
26 Окт 2018
1,526
296
сделал чуть по другому, сейчас точно время в UNIX должно записаться)
надо разбираться с EEPROM и туда записывать для опытов...
@kym13,
C++:
#include <ESP8266WiFi.h>
#include <EasyNTPClient.h>
#include <WiFiUdp.h>
#include <RTClib.h>
RTC_DS3231 rtc;

const char *ssid = "";             
const char *password = "";         

WiFiUDP udp;
EasyNTPClient ntpClient(udp, "pool.ntp.org", (3 * 60 * 60));

void setup() {

  Serial.begin(115200);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  long actualTime = ntpClient.getUnixTime();
  rtc.adjust (DateTime(actualTime));
}
int GetTime() {
  DateTime now = rtc.now();
  int hour = now.hour();
  int minute = now.minute();
  int second = now.second();

  Serial.print(hour);   Serial.print(":");  // вывод часов
  Serial.print(minute); Serial.print(":");  // вывод минут
  Serial.print(second); Serial.println(""); // вывод секунд
  return (hour * 100 + minute);
};

void loop() {
  GetTime();
  delay(1000);
}
 

ASM

★★★★✩✩✩
26 Окт 2018
1,526
296
@kym13, и такой вариант с EEPROM и поиском rtc проверь)
C++:
#include <ESP8266WiFi.h>
#include <EasyNTPClient.h>
#include <WiFiUdp.h>
#include <RTClib.h>
RTC_DS3231 rtc;
#include <EEPROM.h>

const char *ssid = "";
const char *password = "";

WiFiUDP udp;
EasyNTPClient ntpClient(udp, "pool.ntp.org", (3 * 60 * 60));
int timeUpdated = 0;
// Принудительное обновление RTC и сохранение в EEPROM
// измените это на случайное число от 0 до 255, чтобы принудительно обновить время
#define FORCE_RTC_UPDATE 2

void setup() {
  Serial.begin(115200);
  EEPROM.begin(4);
  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
  Serial.println("Waiting to Start....");
  delay(5000);

  // Считываем EEPROM, чтобы проверить, синхронизировано ли время
  byte addvalue = EEPROM.read(timeUpdated);
  Serial.print("EEPROM: ");
  Serial.print(addvalue);
  Serial.print(" == ");
  Serial.print(FORCE_RTC_UPDATE);
  Serial.println(" ?");
  if (addvalue != FORCE_RTC_UPDATE) {
    Serial.println("Forcing Time Update");
    syncTime();
    Serial.println("Updating EEPROM..");
    EEPROM.write(timeUpdated, FORCE_RTC_UPDATE);
    EEPROM.commit();

  } else {
    Serial.println("Time has been updated before...EEPROM CHECKED");
    Serial.print("EEPROM: ");
    Serial.print(addvalue);
    Serial.print(" = ");
    Serial.print(FORCE_RTC_UPDATE);
    Serial.println("!");
  }
}
void syncTime(void) {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  long actualTime = ntpClient.getUnixTime();
  rtc.adjust (DateTime(actualTime));

  // Выключаем WIFI после обновления
  WiFi.disconnect();
  WiFi.mode(WIFI_OFF);
  WiFi.forceSleepBegin();
}
int GetTime() {
  DateTime now = rtc.now();
  int hour = now.hour();
  int minute = now.minute();
  int second = now.second();
  Serial.print(hour);   Serial.print(":");  // вывод часов
  Serial.print(minute); Serial.print(":");  // вывод минут
  Serial.print(second); Serial.println(""); // вывод секунд
  return (hour * 100 + minute);
};
void loop() {
  GetTime();
  delay(1000);
}
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
454
67
ASM
У меня есть скетч на ESP "Часы на ESP8266 с подключением к сети" может в нём найдешь нужные примеры?
Он компилируется и данные в монитор порта выводит.
Я то в программировании минус ноль.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,526
296
@kym13, давай посмотрим) мой код как сейчас работает?) у меня как и должно, ищет модуль)
 

alli

✩✩✩✩✩✩✩
9 Мар 2020
6
0
почему при отключении питания часы сбиваются
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
454
67
На модуле 3231 на батарейку идет 5 вольт с питания что не есть хорошо для батарейки, эти модули рассчитаны на аккумуляторы LIR2032. Нужно отпаять диод на модуле.
 

Вложения

  • 40.1 KB Просмотры: 25

kym13

★★✩✩✩✩✩
14 Ноя 2020
454
67
На модуле DS1307 тоже если ставишь батарейку CR2032 нужно удалить несколько резисторов и диод, но вместо резистора R6 нужно впаять перемычку.
 

Вложения

  • 108.5 KB Просмотры: 20

alli

✩✩✩✩✩✩✩
9 Мар 2020
6
0
вернее не так. после отключения питания часы показывают то время которое установил при заливке скетча. может причина в ардуинке
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
454
67
вернее не так. после отключения питания часы показывают то время которое установил при заливке скетча. может причина в ардуинке
Чё за скетч? Скинь посмотрим
Вот скетч который при загрузке автоматически установит в модуль время компьютера в момент загрузки
 

Вложения

alli

✩✩✩✩✩✩✩
9 Мар 2020
6
0
вот скетч. и если не трудно закомментируй строку со временем или подскажите где это сделать . я не силен в ардуино.
 

Вложения