Большие часы на адресных светодиодах 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. Кое-что я перевел для лучшего понимания.

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

Комментарии

balent

✩✩✩✩✩✩✩
29 Ноя 2021
53
7
@Leon111_09, ,Опять Ваши прошил ( подправил в коде на 1LED в сегмент), часы не работают, температуру не показывают, добавлю, что LED на модуле часов стал моргать

@kym13,2812

@начинающий,какая связь, если все кроме часов работает
 
Изменено:

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@balent,
Вы фото скиньте ваших часов что-бы было видно все компоненты.
можно в личку.
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
Белый провод возле USB от 3,3в куда то идет
3,3 вольта идет только на датчик давления (БМП/Е),но на фото он у вас не подпаян к выводу. Такое ощущение что он к корпусу УСБ припаян. Если есть другая лента,попробуйте к ней подключить и посмотрите работает или нет.
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@Leon111_09,
Нет, нет он на корпус USB(GND) припаян

balent
Картинка 5 это ваш скетч "clock_ws2812b-30_foto", картинка 6 это скетч "Clock_1.95_bme_final"
 

Вложения

  • 24 KB Просмотры: 15
  • 37.7 KB Просмотры: 15

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
на корпус USB(GND) припаян
не факт что он там есть (на корпусе). Если не хватает пинов по питанию, то у вас есть в запасе еще два пина (+ и -) на разъеме что предназначен для программатора. Оттуда можно запитать. Не могли бы вы сфотографировать непосредственно вашу ленту? Не экран, а именно саму ленту?
 

balent

✩✩✩✩✩✩✩
29 Ноя 2021
53
7
@kym13,Мой скетч "clock_ws2812b-30_foto" работает на этом железе без проблем. Все подключено правильно, датчика давления нет, я его отключаю.Пробую от компа питать и от отдельного БП, ничего не меяется, по00 время, хотя сейчас диод на модуле часов уже мигает, есть связь с Ардуино. Голова уже кругом

@Leon111_09, часов много переделано, на ленте только первые, ошибки монтажа под контролем, год странно устанавливается кнопками
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@balent,
....диод на модуле часов уже мигает .... Как это мигает? он должен постоянно гореть если на него идет питание
 

balent

✩✩✩✩✩✩✩
29 Ноя 2021
53
7
@kym13,Да, раньше просто горел, теперь часто мигает, но в обеих случаях врнемя по 00. На скетче "clock_ws2812b-30_foto" не обращал внимания, тк работал.

Монтаж , видимо, не стоит рассматривать, все подключено. С другим похожим скетчем "clock_ws2812b-30_foto" работает прекрасно, все на тех же выводах, только лента с другой последовательностью LED. Думается два варианта: сам скетч или что-то с библиотеками. С этим я не силен. а вот поменять платы Ардуино и модуль попробую.
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@balent,
.....сам скетч или что-то с библиотеками ... Вам же выше писали, если проблема с библиотеками то у Вас компиляция бы не прошла.
....только лента с другой последовательностью LED.... На скетче "clock_ws2812b-30_foto" работает нормально, а на "Clock_1.95_bme_final" не работает. Вы сами ответили на свой вопрос ....только лента с другой последовательностью LED....

... поменять платы Ардуино и модуль попробую ...... а смысл?
 

Leon111_09

★★★✩✩✩✩
6 Июн 2021
641
149
55
Таганрог
forum.wisecomp.ru
@balent, @kym13 прав: если у вас другая последовательность диодов то наш скетч работать у вас не будет: у нас запрограммировано подключение по восьмерке.
 
Изменено:

Navigator

✩✩✩✩✩✩✩
12 Апр 2021
12
2
Всем привет ! Друзья помогите с одним вопросом , как сделать вместо двух секундных точек одну ? Прошивка 1.9 финал .У меня в конструкции один сегмент . Что поправить в скетче ? Хотел уже второй сегмент паять но сильно ярко получается. Спасибо.

Код:
// Часы на WS2812
// Версия 1.9
// Дата написания 26.09.2021
// Сборка проршивки [email protected]

/* Последоватеольность соединения сигментов индикатора 
   {G B A F E D C} {G B A F E D C} {верхняя точка} {нижняя точка} {G B A F E D C} {G B A F E D C}
   Количество светодиодов светодиодов выберается относительно количества светотдиодов на сегмент
   При первом запуске выбрать режим "----" для обнуления памяти
ВОЗМОЖНОСТИ
  Отображают время, температуру, давление, дату, 255 цетов (смена каждую минуту)
  В режиме часов нажатие на "+" отображает температуру, а на "-" дату
  Цвет отображении температуры изменяется от температуры

НАСТРОЙКИ в часах (листаются кнопкой "настройки" по кругу) менять кнопками "+" и "-":
1.  (H) установка часов 0...23
2.  (A) установка минут 0...59
3.  (S) сброс секунд на 0 кнопками ("+" - сбрасывает сек. на 0 добавляет 1 мин.) или ("-" - сбрасывает сек. на 0)
4.  (d) установка дня 1...31
5.  (b) установка месяца 1...12
6.  (отображается полностью) установка года
7.  (C) настройка цвета (если 00 то автоматическая) 0...25
8.  (L) настройка яркости (если 00 то автоматическая) 0...25
9.  (t) включение датчиков температуры (0 - отк. 1 - 1 датчик, 2 - 2 датчик, 3 - оба)
10. (P) включение датчиков температуры (0 - отк. 1 - температура, 2 - давление, 3 - оба)
11. (tt) установка времени отображения температуры, давления 0...8 сек.
12. (td) установка времени отображения даты 0...5 сек.
13. (SH) установка отображениея анимации при смене минут (0 - отк. 1 - вкл. 2 - вкл. ночной режим)
14. (tH) установка количества отображения температуры и даты в минуту 1...5 раз (период 60,30,20,15,12 сек. соответственно)
15. (----) сброс настроек кнопками "+" или "-"
*/

#include <DS3232RTC.h>
#include <FastLED.h>
#include <EEPROMex.h>
#include <microDS18B20.h>

// Настройки пинов подключения к Ардуино +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#define DATA_PIN 6                 // pin вывод данных на светодиоды
#define LIGHT_PIN A0               // pin датчика освещенности
#define TEMP_1_PIN 10              // pin 1 датчика температуры только плюсовая до десятых
#define TEMP_2_PIN 11              // pin 2 датчика температуры плюсовая и минусовая до целых
#define PIN_UP 3                   // pin кнопки прибавить
#define PIN_ST 4                   // pin кнопки выбор
#define PIN_DW 5                   // pin кнопки убавить
// Настройки +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#define LED_TYPE WS2811            // Тип светодиодов (WS2812, WS2811 и т.д.)
#define COLOR_ORDER GRB            // Порядок цветов (если при включении часы не красные менять буквы местами)
#define SEGMENT_LEDS 1             // Количество светодиодов на сегмент (точки по 1 светодиоду)
#define LIGHT_MIN 4                // Минимальный уровень яркости (0...255) должно быть меньше максимального
#define LIGHT_MAX 250              // Максимальный уровень яркости (0...255) должно быть больше минимального
#define TIME_EXIT 4                // Время выхода из меню после последнего нажатия кнопок (секунд)
#define ANIME_DELAY 20             // Замедление анимации при смемене цвета в миллисекундах (не более 30)
//#define BMP_280                    // Закоментировать строку если датчик BMP280 неиспользуется
#define ADDRESS_BMP280 0x76        // Адрес датчика BMP280 (0x77 или 0x76 или сканировать шину I2C)
#define ZERO_WATCH                 // Закомеентировать строку для отображения первого нуля в часах
// Настройки ночного режима +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#define LIGHT_NIGHT 100            // Яркость ниже которой включается ночной режим (0...255, 255 - не учитывать яркость)
#define TIME_NIGHT_BEGIN 22        // Время включения ночного режима (в часах)
#define TIME_NIGHT_END 7           // Время выключения ночного режима (в часах)
#define COLOR_NIGHT 0xFF0000       // Цвет часов в ночном режиме
// Настройка отображения давления +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#define COLOR_PRES                 // Закоментировать для отключения цветов отображения давления (будет как часы)
#define COLOR_PRES_ST 0x00FF00     // Цвет давления неизменном  относительно предыдушего замера
#define COLOR_PRES_UP 0xFF0000     // Цвет при повышении давления относительно предыдушего замера
#define COLOR_PRES_DW 0x0000FF     // Цвет при понижении давления относительно предыдушего замера
// Настройки отображения температуры ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#define TEMP_1_SYMBOL 10           // Символ градусов 1 датчика температуры  (10 - "0", 11 - "С")
#define TEMP_2_SYMBOL 10           // Символ градусов 2 датчика температуры  (10 - "0", 11 - "С")
#define TEMP_BMP_SYMBOL 10         // Символ градусов датчика температуры с BMP (10 - "0", 11 - "С")
#define TEMP_1_COLOR 1             // Вариант цвета 1 датчика (0 - как часы, 1 - кр-ор-ж-зел-гол-с, 2 - кр-роз-фиол-с)
#define TEMP_2_COLOR 1             // Вариант цвета 2 датчика (0 - как часы, 1 - кр-ор-ж-зел-гол-с, 2 - кр-роз-фиол-с)
#define TEMP_BMP_COLOR 1           // Вариант цвета датчика с BMP (0 - как часы, 1 - кр-ор-ж-зел-гол-с, 2 - кр-роз-фиол-с)
#define TEMP_1_CORRECT 0           // Корректировка показания 1 датчика температуры (в гр. С, десятые через точку)
#define TEMP_2_CORRECT 0           // Корректировка показания 2 датчика температуры (в гр. С, десятые через точку)
#define TEMP_BMP_CORRECT 0         // Корректировка показания датчика температуры с BMP280 (в гр. С, десятые через точку)
#define TEMP_1_MIN 20              // Минимальная температура 1 датчика (отображается синим)
#define TEMP_1_MAX 30              // Максимальная температура 1 датчика (отображается красным)
#define TEMP_2_MIN -20             // Минимальная температура 2 датчика (отображается синим)
#define TEMP_2_MAX 35              // Максимальная температура 2 датчика (отображается красным)
#define TEMP_BMP_MIN 20            // Минимальная температура датчика с BMP (отображается синим)
#define TEMP_BMP_MAX 30            // Максимальная температура датчика с BMP (отображается красным)
// Defauil настройки в часах устанавливаются режимом "----" +++++++++++++++++++++++++++++++++++++++++++++++++++++++
#define TIME_TEMP 4                // Установка времени отображения температуры и давления 0...8 секунд (0 - отк.)
#define TIME_DATE 0                // Установка времени отображения даты 0...3 секунд (0 - отк.)
#define SET_COLOR 0                // Настройка цвета (если 0 то автоматическая) 0...20
#define SET_LIGHT 0                // Настройка яркости (если 0 то автоматическая) 0...25
#define SET_TEMPS 2                // Включение отображения температуры (0 - отк. 1 - 1 датчик, 2 - 2 датчик, 3 - оба)
#define SET_PRESS 0                // Включение отображения температуры и давления с BMP280 (0 - отк. 1 - темп., 2 - давл., 3 - оба)
#define SET_SHOWS 1                // Включение отображения анимации при смене минут (0 - отк. 1 - вкл. 2 - вкл. ночной режим)
#define TIME_TIME 4                // Установка количества отображения температуры и даты в минуту 1...5 раз
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#ifdef BMP_280
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp;
#endif
MicroDS18B20 <TEMP_1_PIN> sensor1;
MicroDS18B20 <TEMP_2_PIN> sensor2;

#define NUM_LEDS ((SEGMENT_LEDS * 28) + 2)
#define POINT_UP (14 * SEGMENT_LEDS)
#define POINT_DW ((14 * SEGMENT_LEDS) + 1)
CRGB leds[NUM_LEDS];
CRGB temp_color;
CRGB led_color;
CRGB pres_color;

byte digits[22] = {0b01111110,  // 0   
                   0b01000010,  // 1
                   0b00110111,  // 2
                   0b01100111,  // 3
                   0b01001011,  // 4
                   0b01101101,  // 5
                   0b01111101,  // 6
                   0b01000110,  // 7
                   0b01111111,  // 8
                   0b01101111,  // 9  
                   0b00001111,  // º 10
                   0b00111100,  // C 11
                   0b01011011,  // H 12
                   0b01011111,  // A 13
                   0b01101101,  // S 14
                   0b00000001,  // - 15
                   0b01110011,  // d 16
                   0b01111001,  // b 17
                   0b00000000,  //   18
                   0b00111001,  // t 19 
                   0b00111000,  // L 20 
                   0b00011111}; // P 21
boolean eeprom_flag;
boolean temp_flag = false;
boolean read_eeprom = true;
boolean mode_flag = true;
boolean night_flag = false;
unsigned long key_pressed;
unsigned long t;
unsigned long opdating_time;
byte color;
byte old_color = 0;
byte mode = 55;     // Режим работы
byte brightness;    // Яркость
byte znak;          // Для вывода знака минуса
byte points = 0;    // Состотяние точек
byte figure[4];     // Цыфры часов
byte setups[9];     // 0, TIME_TEMP, TIME_DATE, SET_COLOR, SET_LIGHT, SET_TEMPS, SET_SHOWS, TIME_TIME, SET_PRESS
int temp1;          // Температура
int temp2;          // Температура
int time_tp = 2000; // Промежуточное время вывода температуры
byte tp = 0;
int old_pres = 0;
#ifdef BMP_280
int pres;           // Давление
int temp;           // Температура с BMP280
#endif


class button {      // Работа с кнопками
  public:
    button (byte pin) {
    _pin = pin;
    pinMode(_pin, INPUT_PULLUP);}
    static byte key;
  boolean click() {
    boolean btnState = digitalRead(_pin);
    if (!btnState && !_flag && millis() - _tmr >= 100) {
       _flag = true;
       key = true;
       _tmr = millis();
       return true;}
    if (!btnState && _flag && millis() - _tmr >= 400) {
       _tmr = millis ();
       key = true;
       return true;}
    if (btnState && _flag) {
       _flag = false;
       key = false;
       _tmr = millis();}
    return false;}
  private:
    byte _pin;
    uint32_t _tmr;
    boolean _flag;};

button up(PIN_UP);
button st(PIN_ST);
button dw(PIN_DW);
byte button::key;

void setup(){
  LEDS.addLeds <LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // Установить тип светодиодной ленты
  figure[0] = 0;
  figure[1] = 7 * SEGMENT_LEDS;
  figure[2] = (14 * SEGMENT_LEDS) + 2;
  figure[3] = (21 * SEGMENT_LEDS) + 2;
  t = millis();
  opdating_time = millis();
#ifdef BMP_280
  bmp.begin(ADDRESS_BMP280);
#endif
  }
// END setup

void BrightnessCheck(){   // Установка яркости по датчику освещенности
  if (setups[4] == 0) brightness = map(analogRead(LIGHT_PIN), 0, 1023, LIGHT_MIN, LIGHT_MAX);
  else brightness = setups[4] * 10;
  LEDS.setBrightness(brightness);} 

void TempColor(byte set_sh, int temp_x, int temp_min, int temp_max){ // Функция изменения цвета от температуры
  byte sum_color;
  if (set_sh == 0) temp_color = led_color;
  if (temp_x < temp_min * 10) temp_x = temp_min * 10;
  if (temp_x > temp_max * 10) temp_x = temp_max * 10;
  if (set_sh == 1) sum_color = map(temp_x, temp_min * 10, temp_max * 10, 170, 0);
  if (set_sh == 2) sum_color = map(temp_x, temp_min * 10, temp_max * 10, 170, 255);
    temp_color = CHSV(sum_color, 255, 255);}

#ifdef BMP_280
void PresColor(){ // Функция изменения цвета давления
  int p;
   p = bmp.readPressure();
#ifdef COLOR_PRES 
  if (p == 0 || p == old_pres) pres_color = COLOR_PRES_ST;
  if (p < old_pres) pres_color = COLOR_PRES_DW;
  if (p > old_pres) pres_color = COLOR_PRES_UP;
  old_pres = p;
#else
pres_color = led_color;
#endif
  }
#endif

void DigitOut(byte digit_1, byte digit_2, byte digit_3, byte digit_4, byte point, CRGB d_color){  // Функция вывода на диоды
  byte digit[4] = {digit_1, digit_2, digit_3, digit_4};
  for (byte s = 0; s <= 3; s++){
  byte cursor = figure[s];
  for(byte k = 0; k <= 6; k++){
    for(byte i = 1; i <= SEGMENT_LEDS; i++){
    if ((digits[digit[s]] & 1 << k) == 1 << k)
           leds[cursor] = d_color;
      else leds[cursor] = 0x000000;
      cursor++;}}}
         if (point == 0){leds[POINT_DW] = 0x000000; leds[POINT_UP] = 0x000000;}
    else if (point == 1){leds[POINT_DW] = d_color; leds[POINT_UP] = 0x000000;}
    else if (point == 2){leds[POINT_DW] = d_color; leds[POINT_UP] = d_color;}}

int PressingButton(byte variable, byte var_min, byte var_max){  // Функция работы кнопок + и -
  if (up.click())   { //увеличиваем
     if (variable == var_max) variable = var_min; else variable += 1;}
  if (dw.click())   { //уменьшаем
     if (variable == var_min) variable = var_max; else variable -= 1;}
  return variable;}

void Animate(int v) {    // Функция анимации
  static uint8_t hue = 0;
  leds[v] = CHSV(hue++, 255, 255);
  FastLED.show();
  for(byte m = 0; m < NUM_LEDS; m++) {
  leds[m].nscale8(250);}
  delay(ANIME_DELAY / SEGMENT_LEDS);}

void Animation() {  // Фунция анимации при смене минуты
  for(int i = 0; i < NUM_LEDS; i++) Animate(i);
  for(int i = NUM_LEDS - 1; i >= 0; i--) Animate(i);}

void ColorSelect(){ // Функция выбора цвета часов
  if (night_flag) led_color = COLOR_NIGHT;
  else if (setups[3] == 0){
  while (abs(color - old_color) < 25) color = random8();
  led_color = CHSV(color, 255, 255);}
  else if (setups[3] != 0)led_color = CHSV(setups[3] * 10, 255, 255);}

// Работа с памятью ===============================================================================================

void ReadEEPROM() {      // Чтение
  for (byte i = 1; i <= 8; i++) setups[i] = EEPROM.readByte(i);
  read_eeprom = false;}

void UpdateEEPROM() {    // Запись
  for (byte i = 1; i <= 8; i++) EEPROM.updateByte(i, setups[i]);}

void EepromTick() {      // Проверка
  if (eeprom_flag && mode_flag){
   for (byte i = 1; i <= 8; i++){
   if (setups[i] != EEPROM.readByte(i)){
     UpdateEEPROM();
     break;}}
     eeprom_flag = false;}}
    
void(* resetFunc) (void) = 0; // Функция перезагрузкки МК.

void ResetClock(){       // Сброс на настройки по умолчанию
  byte def_setup[9] = {0, TIME_TEMP, TIME_DATE, SET_COLOR, SET_LIGHT, SET_TEMPS, SET_SHOWS, TIME_TIME, SET_PRESS};
   // setups[i]  i  =  _      1          2         3          4          5          6           7         8
  for (byte i = 1; i <= 8; i++) EEPROM.updateByte(i, def_setup[i]);
  delay(100);
  resetFunc();}

// ==================================================================================================================

void loop() {         // Основной цикл -------------------------------------------------------------------------------
if (read_eeprom) ReadEEPROM();
BrightnessCheck();      // Проверка яркости
time_t tm;
if (millis() - opdating_time > 100){
tm = RTC.get();  // Получение времени
opdating_time = millis();}
tmElements_t Now;

if (mode == 0){   
    Now.Hour = hour(tm);
    Now.Minute = minute(tm);
    Now.Second = second(tm);
    Now.Day = day(tm);
    Now.Month = month(tm);
    Now.Year = year(tm) - 1970;
    if (setups[6] == 2 && brightness < LIGHT_NIGHT && (Now.Hour <= TIME_NIGHT_END || Now.Hour >= TIME_NIGHT_BEGIN)) night_flag = true;
    else night_flag = false;}

  if (mode < 20 && mode != 0 && (millis() - key_pressed) > (TIME_EXIT * 1000)) mode = 0; // Переход в режим часов
 
if (!night_flag && (setups[5] != 0 || setups[8] != 0))  {
  if ((mode == 0 && up.click()) || (mode == 0 && (second(tm) % (60 / setups[7]) == 1))) { // Переход в режим запроса температуры
    t = millis();
  if (setups[5] != 0) {
    sensor1.requestTemp();
    sensor2.requestTemp();
    temp_flag = true;}
#ifdef BMP_280
    else if (setups[8] == 2) mode = 23;
    else if (setups[8] == 1 || setups[8] == 3) mode = 22;
    temp = 10 * (bmp.readTemperature() + TEMP_BMP_CORRECT);
    pres = bmp.readPressure() * 0.00750063;
      if (setups[8] == 3) tp += 2;
      if (setups[8] < 3 && setups[8] > 0) tp += 1;
     PresColor();
#else
  setups[8] = 0;
#endif 
      if (setups[5] == 3) tp += 2;
      if (setups[5] != 0 && setups[5] < 3) tp += 1;
      if (setups[2] != 0) tp += 1;
       time_tp = (setups[1] * 1000) / tp;}}

  if (temp_flag && mode == 0 && millis() - t > 1900) {  // Запрос температуры
    temp_flag = false;
    t = millis();
    temp1 = 10 * (sensor1.getTemp() + TEMP_1_CORRECT);
    temp2 = 10 * (sensor2.getTemp() + TEMP_2_CORRECT);
    if (setups[5] == 1 || setups[5] == 3) mode = 20;
    else if (setups[5] == 2) mode = 21;}
  
  if ((mode == 0 && dw.click()) || (!night_flag && setups[5] == 0 && setups[8] == 0 && setups[2] != 0 && mode == 0 && (second(tm) % (60 / setups[7]) == 1))) { // Переход в режим даты
    t = millis();
    mode = 25;}
   
  if (mode < 20 && st.click()){                   // если нажата кнопка 2, то гоняем меню по кругу
    if (mode == 15) mode = 1; else mode++;}  
 
  if (mode < 20 && button::key) {           // Отслеживание нажатия любой кнопки
      key_pressed = millis();
    if (mode >= 7 && mode <= 14) {
      eeprom_flag = true;
      mode_flag = false;}}
   if (second(tm) == 2) old_color = color;  
   if (setups[7] == 5 && (setups[1] + setups[2]) > 8 && (setups[5] + setups[8]) > 5) setups[7] = 4;
// ------------------------------------------   switch   -----------------------------------
  switch (mode) {
    case 0: {             // Нормальный режим отображение времени
           if (second(tm) == 0) {ColorSelect();
            if (setups[6] != 0 && !night_flag) Animation();}
          if (second(tm) % 2 == 0) points = 2; else points = 0;
#ifdef ZERO_WATCH       
        if (hour(tm) < 10) DigitOut(18, hour(tm) % 10, minute(tm) / 10, minute(tm) % 10, points, led_color);
        else
#endif       
        DigitOut(hour(tm) / 10, hour(tm) % 10, minute(tm) / 10, minute(tm) % 10, points, led_color);
        mode_flag = true;
        tp = 0;
        break;}                                          
   
    case 1: {             // Режим установки часов
        Now.Hour = PressingButton(Now.Hour, 0, 23);
          if (Now.Hour != hour(tm)) RTC.write(Now);
        DigitOut(12, 15, Now.Hour / 10, Now.Hour % 10, 0, led_color);
        break;}
   
    case 2: {             // Режим установки минут
        Now.Minute = PressingButton(Now.Minute, 0, 59);
          if (Now.Minute != minute(tm)) RTC.write(Now);
        DigitOut(13, 15, Now.Minute / 10, Now.Minute % 10, 0, led_color);
        break;}
   
    case 3: {             // Режим установки секунд
        if (up.click())   { //обнуляем секунды + 1 минута
         Now.Second = 0;
         Now.Minute = Now.Minute + 1;
         RTC.write(Now);}
        if (dw.click())   { //обнуляем секунды
         Now.Second = 0;
         RTC.write(Now);}
         key_pressed = millis();     
         DigitOut(14, 15, second(tm) / 10, second(tm) % 10, 0, led_color);
       break;}

    case 4: {             // Режим установки дня
        Now.Day = PressingButton(Now.Day, 1, 31);
          if (Now.Day != day(tm)) RTC.write(Now);
        DigitOut(16, 15, Now.Day / 10, Now.Day % 10, 0, led_color);
        break;}
   
    case 5: {             // Режим установки месяца
        Now.Month = PressingButton(Now.Month, 1, 12);
         if (Now.Month != month(tm)) RTC.write(Now);
        DigitOut(17, 15, Now.Month / 10, Now.Month % 10, 0, led_color);
        break;}

    case 6: {             // Режим установки года
        Now.Year = PressingButton(Now.Year, 50, 99);
          if (Now.Year != year(tm)) RTC.write(Now);
        DigitOut(2, 0, ((Now.Year - 30) / 10) % 100, ((Now.Year - 30) % 10), 0, led_color);
        break;}
       
    case 7: {             // Режим установки цвета
        setups[3] = PressingButton(setups[3], 0, 25);
          if (setups[3] > 0) led_color = CHSV(setups[3] * 10, 255, 255);
        DigitOut(11, 15, setups[3] / 10, setups[3] % 10, 0, led_color);
        break;}

    case 8: {             // Режим установки яркости
        setups[4] = PressingButton(setups[4], 0, 25);
        DigitOut(20, 15, setups[4] / 10, setups[4] % 10, 0, led_color);
        break;}
       
    case 9: {             // Режим установки датчиков температуры
        setups[5] = PressingButton(setups[5], 0, 3);
        DigitOut(18, 19, 15, setups[5], 0, led_color);
        break;}
#ifdef BMP_280          
    case 10: {             // Режим установки датчиков BMP280
        setups[8] = PressingButton(setups[8], 0, 3);
        DigitOut(18, 21, 15, setups[8], 0, led_color);
        break;}
#else
    case 10: {mode = 11;
        break;}
#endif
    case 11: {             // Режим установки времени отображения температуры, давления
        setups[1] = PressingButton(setups[1], 0, 8);
        DigitOut(19, 19, 15, setups[1], 0, led_color);
        break;}

    case 12: {            // Режим установки времени отображения даты
        setups[2] = PressingButton(setups[2], 0, 3);
        DigitOut(19, 16, 15, setups[2], 0, led_color);
        break;}

    case 13: {             // Режим установки отображения анимации при смене минут
        setups[6] = PressingButton(setups[6], 0, 2);
        DigitOut(14, 12, 15, setups[6], 0, led_color);
        break;}

    case 14: {            // Режим установки количества отображения часов
        setups[7] = PressingButton(setups[7], 1, 5);
        DigitOut(19, 12, 15, setups[7], 0, led_color);
        break;}
   
    case 15: {            // Режим сброса
        if (up.click() || dw.click())   {
          ResetClock();}
          DigitOut(15, 15, 15, 15, 0, led_color);
        break;}
         
    case 20: {            // Режим вывода температуры 1 датчик
      TempColor(TEMP_1_COLOR, temp1, TEMP_1_MIN, TEMP_1_MAX);
      if (temp1 < 100) DigitOut(18, (temp1 % 100) / 10, temp1 % 10, TEMP_1_SYMBOL, 1, temp_color);
      else DigitOut(temp1 / 100, (temp1 % 100) / 10, temp1 % 10, TEMP_1_SYMBOL, 1, temp_color);
        if (millis() - t > time_tp) {
          if (setups[5] >= 2) {
            mode = 21;
            t = millis();}
#ifdef BMP_280
          else if (setups[8] == 2) {
            mode = 23;
            t = millis();}
          else if (setups[8] != 0) {
            mode = 22;
            t = millis();}
#endif
          else if (setups[2] != 0) {
            mode = 25;
            t = millis();}
          else mode = 0;}
      break;}

    case 21: {            // Режим вывода температуры без десятых 2 датчик
       if (temp2 < 0) znak = 15;
       else znak = 18;   
       TempColor(TEMP_2_COLOR, temp2, TEMP_2_MIN, TEMP_2_MAX);
       if (abs(temp2) < 100) DigitOut(18, znak, (abs(temp2) % 100) / 10, TEMP_2_SYMBOL, 0, temp_color);
       else DigitOut(znak, abs(temp2) / 100, (abs(temp2) % 100) / 10, TEMP_2_SYMBOL, 0, temp_color);
     if (millis() - t > time_tp) {
#ifdef BMP_280
       if (setups[8] == 2) {
          mode = 23;
          t = millis();}
       else if (setups[8] != 0) {
          mode = 22;
          t = millis();}
       else if (setups[2] != 0) {
          mode = 25;
          t = millis();}
#else
       if (setups[2] != 0) {
          mode = 25;
          t = millis();}
#endif         
       else mode = 0;}
      break;}
     
#ifdef BMP_280
   
    case 22: {            // Режим вывода температуры BMP280
      TempColor(TEMP_BMP_COLOR, temp, TEMP_BMP_MIN, TEMP_BMP_MAX);
      if (temp < 100) DigitOut(18, (temp % 100) / 10, temp % 10, TEMP_BMP_SYMBOL, 1, temp_color);
      else DigitOut(temp / 100, (temp % 100) / 10, temp % 10, TEMP_BMP_SYMBOL, 1, temp_color);
        if (millis() - t > time_tp) {
          if (setups[8] >= 2) {
            mode = 23;
            t = millis();}
          else if (setups[2] != 0) {
            mode = 25;
            t = millis();}
          else mode = 0;}
      break;}

    case 23: {            // Режим вывода давления
       DigitOut(21, pres / 100, (pres % 100) / 10, pres % 10, 0, pres_color);
        if (millis() - t > time_tp) {
          if (setups[2] != 0) {
            mode = 25;
            t = millis();}
          else mode = 0;}
      break;}
     
#endif     
  
    case 25: {            // Режим вывода даты
          DigitOut(day(tm) / 10, day(tm) % 10, month(tm) / 10, month(tm) % 10, 1, led_color);
        if (setups[2] == 0 && millis() - t > 2000) mode = 0;
        else if (setups[2] != 0 && millis() - t > (setups[2] * 1000)) mode = 0;
      break;}

    case 55: {            // Режим вывода версии проошивки
          led_color = 0xFF0000;
          DigitOut(15, 1, 9, 15, 1, led_color);
        if (millis() - t > 3000) mode = 0;
      break;}
  }                       // Конец switch
EepromTick();     // Проверка на сохранение в пямать
FastLED.show();   // Вывод на диоды
}
// END. -----------------------------------------------------------------------------------------------------------
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909

@Navigator,
легко не выйдет, код не особо рассчитан на изменения, в коде число точек закодировано цифрами в куче мест, надо сидеть и тупо исправлять.
Если кто возьмется - делайте сразу правильно, меняйте на константу или дефайн
 
  • Лойс +1
Реакции: Boroda22

Navigator

✩✩✩✩✩✩✩
12 Апр 2021
12
2

Вложения

Navigator

✩✩✩✩✩✩✩
12 Апр 2021
12
2
Проверил скетч , секундный не моргает .Моргает десяток минут средний сегмент. И идет смещение всех сегментов на минутах.
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@Navigator,
А у Вас диоды какие? WS2811 или WS2812
Я проверял на табло с WS2812 всё работает
 

Вложения

  • 53.4 KB Просмотры: 7
  • Лойс +1
Реакции: Navigator

Navigator

✩✩✩✩✩✩✩
12 Апр 2021
12
2
Да лента WS2811 в скетче она указана , а вы не обратили внимания при эффектах не горящая точка начинает светиться ? У меня получается что секундная не горит но при переходе она включается. Я так понимаю что нужно сместить все сегменты после часов на один. То есть 28+1 , а в скетче видно +2. И огромное спасибо что помогаете !
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@Navigator,
В скетче я изменил ленту на WS2812, странно но у меня при смене минут нет анимации хотя она включена.
...в скетче видно +2 .. не трогайте иначе в минутах будет абракатабра.
В Вашем случае я поменял местами значения "d_color" и "0x000000" в строке 246.
У Вас лента какая та что вверху или нижняя?
 

Вложения

  • 126.7 KB Просмотры: 22