Большие настенные часы на Arduino

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

начинающий пишет:

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

Отнюдь.

Вы предложили не только идею, Вы предложили - голосовать!

начинающий
Offline
Зарегистрирован: 13.12.2020

andriano пишет:

Отнюдь.

Вы предложили не только идею, Вы предложили - голосовать!

только для того чтобы сдешние программисты видели нужны ли такие изменения и насколько они востребованы "в массах", но покажите мне цитату, где мною написано: предлагаю голосовать за то что бы это сделал я? А в ответ один сплошной флуд.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Чья идея - того и исполнение )

начинающий
Offline
Зарегистрирован: 13.12.2020

Это не идея а подсказка тем кто не знал как впихнуть десятичные дроби и знак минус в одно изображение.

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

начинающий пишет:

А где там написано что именно я берусь за разработку, я просто предложил идею....

как то вы сами себе противоречите.

начинающий пишет:

Это не идея а подсказка тем кто не знал как впихнуть десятичные дроби и знак минус в одно изображение.

 

начинающий
Offline
Зарегистрирован: 13.12.2020

Не цепляйтесь к словам.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

начинающий пишет:

только для того чтобы сдешние программисты видели нужны ли такие изменения и насколько они востребованы "в массах", но покажите мне цитату, где мною написано: предлагаю голосовать за то что бы это сделал я?

"сдешним программистам" это нафиг не нужно. Методом исключения - остаетесь только Вы, значит, и спрос с Вас. Больше не с кого.

Как говорится: назвался груздем - полезай в кузов.

b707
Offline
Зарегистрирован: 26.05.2017

начинающий пишет:

Не цепляйтесь к словам.

начинающий. расслабтесь уже :)

Вас будут троллить до тех пор. пока вы огрызаетесь. Поэтому самый простой метод избежать этого - не огрызаться. а отнестись к этому с юмором

kym13
Offline
Зарегистрирован: 22.11.2020
b707)) Точно. Развели полемику на две страницы. А вообще сначала нужно так сказать экран собрать на 6 сегментах, а то кто нибудь выложит прошивку, а тестировать неначем будет. 
Переделал немного под себя скетч из поста #809 который выложил <Fenicksnet>: убрал десятые доли градусов, добавил добавил значёк градусов в 3 блоке и большой знак цельсия в 4 блоке. Может кому нужно.

//   Скетч доработал <FenickSnet> с Arduino.ru,  проверен на Arduino IDE 1.8.13 
//   Часы на RTC_ds3231,ws2812, bme280, ds18b20, автояркость, кнопки установки: час. мин. цвета, и ещё куча настроек под любые хотелки
//   Вывод давления, влажности, двух температур с разделительной точкой 00.0 и без точки 00 и без первого ноля (в часах тоже) см.настройки
//   ЦВЕТ: цвет цифр температуры зависит от температуры, можно менять, по умолчанию меньше или равно 00 СИНИЙ, выше 00 КРАСНЫЙ
//   ТОЧКИ: если точек 2  могут мигать поочередно, одновременно или вообще не гореть
//   код найден здесь http://arduino.ru/forum/programmirovanie/bolshie-nastennye-chasy-na-arduino ,
//   и  испорчен (но это не точно) --== FenickSnet ==-- .главное "Говнокод" работает.
//   для atmega 168pa (~ 15918 байт (97%) ) загружать через через программатор:
//     >>>     Use bootloater: "No ( ISP Pragrammer Upload)"


#include <Adafruit_BME280.h>  // библиотека для работы c метеодатчиком BME280
#include <DS3232RTC.h>        // библиотека для работы c модулем часов DS3231
#include <FastLED.h>          // библиотека для работы с лентой ws2812

// Пины подключения на Ардуино
//  SDA -> A4      к часам ds3231 и датчику bme280
//  SCL -> A5      подключаются параллельно
//  DS18b20 -> PIN 9 или какой укажете в строке 22

#define DS18_PIN 9                             // 0 нет датчика, пин для датчика ds18b20   
                                               // 5V --> R4.7K -->PIN ( НЕ забыть резистор 4.7кОм), 
                                               // если ds18b20 в виде модуля(на плате) то R4.7k не надо.
#if(DS18_PIN >0)
#include <microDS18B20.h>                      // библиотека для работы с датчиком DS18b20
MicroDS18B20 sensor(DS18_PIN);                 // Создаем термометр без адресации
#define temp2_color  1                         // менять цвет при минусе 1 вкл. , не менять цвет 0 выкл.
long temp_plus2 =  CRGB::Red;                  // цвет цифр температуры при плюсе
long temp_minus2 =  CRGB::Blue;                // цвет цифр температуры при минусе  если включена смена цвета.
#endif

#define DATA_PIN 10            // подключение ленты           PIN --> R100 --> Din
#define BRI_PIN A0             // фоторезистор                GND --> RES --> BRI_PIN --> R10K --> +5V
#define M_PIN 3                // установка часов             GND --> КНОПКА --> PIN
#define H_PIN 4                // установка минут             GND --> КНОПКА --> PIN
#define D_PIN 5                // смена цвета                 GND --> КНОПКА --> PIN
#define Button_Tuoch 0         // 0 - обычные кнопки, 1 - сенсорные кнопки, 

#define LEDS_IN_SEGMENT 3      // Задаём сколько у нас светодиодов в сегменте.
#define DOTS_NUM 2             // Задаём количество разделительных точек
#define DDOT 0                 // РЕЖИМ ТОЧЕК  0 - мигают одновременно, 1 - мигают поочередно, 2 - точки не горят 

//+++++++++++++++++++++++++++ ЕСЛИ НУЖНЫ ТОЧКИ РАСКОМЕНТИРУЙТЕ В БЛОКЕ ВЫВОДА ТЕМПЕРАТУРЫ там есть коментирии ++++++++++++++++++++++++++
#if (DOTS_NUM==2)
#define DOT_UP 1               // если точек 2 и нижняя  разделительная ставим 1, если верхняя 0
                               // точка разделения показа температуры
                               
#endif                        

#define Time_Zero 0            // показывать 0 или нет, если время 01:11 --> показать 1:11 (1 - показать 0, 0 - не показывать 0)
#define Csec  2                // на какой секунде смена цвета ( 0 > Csec < 60 и не попадать в диапазон (temp1_sec + work_sec) 
                               // и (temp2 + work_sec_sec) иначе смены не будет)
                               
#define COLOR_CHANGE 1         // смена цвета в мунутах ( 0 - НИКОГДА, 1 - каждую минуту, 2 - каждые 2 мин, 3 - каждые 3 мин,.....10 - каждые 10 минут.... и т.д.
                               // 60 каждый час, 120 - 2 часа.... первая смена цвета в 00.00 далее через каждые COLOR_CHANGE минут  )

#define NUM_COLORS 18          // цветовая гамма
#define COLOR_ORDER GRB        // 12V ( BRG )   5V ( GRB )( если цвета диодов не сотвествуют, меняем )
#define auto_bright 1          // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 70          // максимальная яркость (0 - 255) если автоматическая подстройка яркости выключена, то яркость будет равна указаной 
#define min_bright 2           // минимальная яркость (0 - 255)
#define bright_constant 1021   // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.9               // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
#define bri_time 100           // период опроса фоторезистора в мс, чем больше цифра тем медленней реагирует

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Настройка показа метеоданных +++++++++++++++++++++++++++

//++++++++++++++++++++++++++++++++++++++++++++++  ПРОЧТИ НИЖЕ  +++++++++++++++++++++++++++++++++++++++++++++++++++++

//     на каких секундах показывать данные, можно менять по своему, в любой последовательности,
//     НО! желательно, чтобы диапазоны не накладывались.
//     например:  pres_sec был БОЛЬШЕ или РАВЕН temp1_sec  (temp_sec 10 + work_sec 4),  в данном случае pres_sec будет РАВЕН минимум 14.
//     соотвественно следующий ,будет минимум 18 ( pres_sec 14 + work_sec 4 ). и т.д. НЕ КРИТИЧНО.
//     если равно 0 то, не показываем (пропускаем или если есть промежуток то показываем время)
//     например: temp1_sec - 10, а temp2_sec - 15, а work_sec 4 то 1 сек будет отображаться время

//+++++++++++++++++++++++ Настройка на каких секундах показывать данные ++++++++++++++++++

#define Temp_Zero 0                 //  показывать 0 или нет, если температура 03.4 --> показать 3.4 (1 - показать 0, 0 - не показывать 0)
#define temp1_sec 17                //  показ температуры bme280, если 0 то вместо температуры отображается время
#define temp2_sec 10                //  показ температуры  ds18b20 или второй раз с вме280 при отсутствии ds18b20, если 0 то не отображается
#define pres_sec 24                 //  показ давления, если 0 то вместо давления отображается время
#define himy_sec 31                 //  показ влажности, если 0 то вместо влажности отображается время
#define work_sec 7                  //  сколько секунд показывать, для всех. если 0 то показываем только время.

#define temp1_color  1              // менять цвет при минусе 1 вкл. , не менять цвет 0 выкл.
long temp_plus =  CRGB::Red;        // цвет цифр температуры при плюсе bme280
long temp_minus = CRGB::Blue;       // цвет цифр температуры при минусе bme280 если включена смена цвета.

#if(DS18_PIN == 0)                  //если нет ds18b20 используем вме280
#define temp2_color (temp1_color)
long temp_plus2 =  temp_plus;       // цвет цифр температуры при плюсе
long temp_minus2 = temp_minus;      // цвет цифр температуры при минусе, если включена смена цвета.
#endif

int bri ;                           // яркость
int newTime;                        // время для времени
int ChangeTime;                     // время для смены цвета
int sec;                            // секунды
int c;                              // температура
int h;                              // влажность
int p;                              // давление
int c2;                             // температура ds18b20
int flag = 0;
int m = 0;

#if(DOTS_NUM>2)
// бред конечно
int n = 0;
int o = 1;

#endif
int new_bright, new_bright_f;
unsigned long bright_timer;        // off_timer;

Adafruit_BME280 bme;               // BME280 давление, влажность, температура   I2C (А4, А5)


//++++++++++++++++++++++++++++++++++++++++ Вычислемые константы, НЕ РЕДАКТИРОВАТЬ! +++++++++++++++++++++++++++++++++

#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM)      //общее количество светодиодов в ленте
#define DOT_X (LEDS_IN_SEGMENT * 14 )                   // координата начала точек
CRGB leds[NUM_LEDS];

#define DIG1 (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)   // 1 ЦИФРА
#define DIG2 (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)   // 2 ЦИФРА
#define DIG3 (NUM_LEDS - LEDS_IN_SEGMENT * 14 )             // 3 ЦИФРА
#define DIG4 (NUM_LEDS - LEDS_IN_SEGMENT * 7 )              // 4 ЦИФРА

uint8_t  digits[] = { // определяем символы для отображения
// код начинается с 0b0, далее идут 7 цифр, каждая цифра это номер фрагмента, 1 - включен, 0- отключен
// далее указан получающийся символ и порядковый номер в массиве
  0b00111111,     // Digit 0
  0b00100001,     // Digit 1
  0b01110110,     // Digit 2
  0b01110011,     // Digit 3
  0b01101001,     // Digit 4
  0b01011011,     // Digit 5
  0b01011111,     // Digit 6
  0b00110001,     // Digit 7
  0b01111111,     // Digit 8
  0b01111011,     // Digit 9
  0b01111000,     // Digit * градус  10
  0b00000000,     // Digit  пусто    11 ничего не показывать
  0b01111100,     // Digit P         12
  0b01111000,     // Digit % знак % из двух частей 13
  0b01000111,     // Digit % знак % из двух частей 14
  // 0b01011000,     // Digit с  маленькая "С" справа вверху 15  если нужна большая закоментируйте эту строку и наоборот
  0b00011110,     // Digit с  большая "С" справа  15             если нужна большая раскоментируйте эту строку и наоборот
  // 0b01000000,     // знак (-) минус 16
};

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int last_digit = 0;
long ledColor;

long 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::Green,
  CRGB::Orchid,
  CRGB::DarkOrchid,
  CRGB::Red,
  CRGB::Orchid 
};
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

void setup()
{
  LEDS.addLeds<WS2812, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
  bme.begin(0x76); //датчик температуры bme280
  pinMode(BRI_PIN, INPUT_PULLUP);    // фоторезистор                        GND --> фоторез --> PIN --> R10K --> +5V

#if (Button_Tuoch == 0)
  pinMode(D_PIN, INPUT_PULLUP);      // Кнопка смены цветов                 GND --> КНОПКА --> PIN
  pinMode(H_PIN, INPUT_PULLUP);      // Кнопка установка часов              GND --> КНОПКА --> PIN
  pinMode(M_PIN, INPUT_PULLUP);      // Кнопка установки минут              GND --> КНОПКА --> PIN

#elif(Button_Tuoch == 1)      // для сенсорных кнопок. у меня меньше глючит такое подключение  КНОПКА --> PIN --> R10K --> GND
  pinMode(D_PIN, INPUT);      // Кнопка смены цветов                   КНОПКА --> PIN --> R10K --> GND
  pinMode(H_PIN, INPUT);      // Кнопка установка часов                КНОПКА --> PIN --> R10K --> GND
  pinMode(M_PIN, INPUT);      // Кнопка установки минут                КНОПКА --> PIN --> R10K --> GND

#endif
  
  ledColor = ColorTable[random(NUM_COLORS)];
  New();                             // опрос при включении, иначе придется подождать
}
void BrightDigit (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 : 0;
      cursor ++;
    }
  }
}

//++++++++++++++++++++++++++++++++++++++++++++++++ Управление яркостью +++++++++++++++++++++++++++++++++++++++++++++

void BrightnessCheck() {                          // управление яркостью
  if (auto_bright == 1)  {                        // если включена адаптивная яркость
    if (millis() - bright_timer > bri_time) {     // каждые  мс
      bright_timer = millis();                    // сброить таймер
      new_bright = map(analogRead(BRI_PIN), 0, bright_constant, max_bright, min_bright);   // когда темно яркость уменьшается
  //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);     // new_bright_f = new_bright_f * coef + new_bright * (1 - coef);   //  300*0.9-300*(1-0.9)
      bri = 255 - new_bright_f;
    }
  }
  else  {
    bri = max_bright;                     // если выключена адаптивная яркость
  }
}

//+++++++++++++++++++++++++++++++++++++++++++++++++ Функция вывода метеоданных +++++++++++++++++++++++++++++++++++++++

//++++++++++++++++++++++++++++++ температура с bme280 ++++++++++++++++++++++++++++

void TempToArray()                        // температура bme280
{
  int celsius = c;                        //
  dot_off();                              // погасим все точки
  if (temp2_color == 1) {                 // покажем при минусе другой цвет или нет
    if (celsius > 0)  {                   // если + красные цифры
      ledColor = temp_plus;
 //     leds[DOT_X + DOT_UP] = temp_plus;  // включает разделительную точку при показе температуры если надо раскоментируйте
   
    }
    else if (celsius <= 0 )  {             // если -  синие цифры
      ledColor = temp_minus;
    //  leds[DOT_X + DOT_UP] = temp_minus; // включает разделительную точку при показе температуры если надо раскоментируйте
    
    }
  }
  else {                                   // плюс и минус одним цветом
    ledColor = temp_plus;
 //   leds[DOT_X + DOT_UP] = temp_plus;    // включает разделительную точку при показе температуры если надо раскоментируйте
 
  }
  BrightDigit(digits[15], DIG4 );          //  маленький или большой знак Цельсия (с) 4й блок
  int digit = celsius % 10;
//  BrightDigit(digits[digit], DIG3);       // вывод 1/10 градуса при вкл. раделительной точки см. чуть выше то раскоментировать
   BrightDigit(digits[10], DIG3);          // знак градуса (*) 3й блок если включать показ 1/10 градуса закоментировать
  celsius /= 10;
  digit = celsius % 10;
  BrightDigit(digits[digit], DIG2);       // вторая цифра градусов
  celsius /= 10;
  digit = celsius % 10;
  if (digit == 0 && Temp_Zero == 0) {
    BrightDigit(digits[11], DIG1);        // если [digit] то показывает ноль (07 градусов), если [11]  то без ноля (7 градусов)
  }                                       // если включать показ 1/10 градуса вместо [11] вставить [digit]
  else {
    BrightDigit(digits[digit], DIG1);     // первая цифра градусов  
  } 
}

//++++++++++++++++++++++++++++++++++++ Температурa ds18b20 или ВМЕ280 ++++++++++++++++++++++++++++

void TempToArray2()                       // температурa ds18b20 или вме280
{
  int celsius = c2;                       //
  dot_off();                              // погасим все точки

  if (temp2_color == 1)  {                // покажем при минусе другой цвет
    if (celsius > 0)    {                 // если плюс такой цвет цифр
      ledColor = temp_plus2;
//      leds[DOT_X + DOT_UP] = temp_plus2; // включает разделительную точку при показе температуры если нужна раскоментируйте
    }
    else if (celsius <= 0 )    {          // если минус  другой цвет цифр
      ledColor = temp_minus2;
//   leds[DOT_X + DOT_UP] = temp_minus2;  // включает разделительную точку при показе температуры если нужна раскоментируйте
     
    }
  }
  else  {                                 // плюс и минус одним цветом
    ledColor = temp_plus2;
//    leds[DOT_X + DOT_UP] = temp_plus2;  // включает разделительную точку при показе температуры если нужна раскоментируйте
  }

  BrightDigit(digits[15], DIG4 );         //  маленький или большой знак Цельсия (с) 4й блок см.строки (134-151)там поймешь
  int digit = celsius % 10;
 // BrightDigit(digits[digit], DIG3);     // вывод 1/10 градуса если вкл. раделительная точка см. чуть выше то раскоментировать
  BrightDigit(digits[10], DIG3);          // знак градуса (*) 3й блок, если включать показ 1/10 градуса то закоментировать
  celsius /= 10;  
  digit = celsius % 10;
  BrightDigit(digits[digit], DIG2);       // вторая цифра градусов
  celsius /= 10;
  digit = celsius % 10;
  if (digit == 0 && Temp_Zero == 0) {
    BrightDigit(digits[11], DIG1);        // если [digit] то показывает ноль (07 градусов), если [11]  то без ноля (7 градусов)
  }                                       // если включать показ 1/10 градуса вместо [11] вставить [digit]
                                          // что такое [11] [15] [10] (см. строки 134-151)
  else {
    BrightDigit(digits[digit], DIG1);     // первая цифра градусов  
      }
}
    
//+++++++++++++++++++++++++++++++++++++ Вывод давления с датчика ВМЕ280 +++++++++++++++++++++++++++++

void PressureToArray()                    // показ давления
{
  int Pressure = p;

  BrightDigit(digits[12], DIG1);          //  начало знака Давления (Р) 1й блок
  int digit = Pressure % 10;
  BrightDigit(digits[digit], DIG4);       //
  Pressure /= 10;
  digit = Pressure % 10;
  BrightDigit(digits[digit], DIG3);       //
  Pressure /= 10;
  digit = Pressure % 10;
  BrightDigit(digits[digit], DIG2);       //
}

//+++++++++++++++++++++++++++++++++++++++++++++ Вывод влажности с датчика ВМЕ280 +++++++++++++++++++++++++++++++

void HumidityToArray()                    //показ влажности
{
  int humidity = h;

  BrightDigit(digits[14], DIG4);          //  конец знака процентов (%) 4й блок
  BrightDigit(digits[13], DIG3);          //  начало знака процентов (%) 3й блок
  int digit = humidity % 10;
  BrightDigit(digits[digit], DIG2);       //
  humidity /= 10;
  digit = humidity % 10;
  BrightDigit(digits[digit], DIG1);       //
}

//+++++++++++++++++++++++++++++++++++++++++++ Смена цвета ленты кнопкой DST +++++++++++++++++++

void DSTcheck()                           //смена цвета ленты кнопкой DST Pin
{
  int buttonDST = digitalRead(D_PIN);

  if (Button_Tuoch == 0 && buttonDST == LOW) {
    ledColor =  ColorTable[random(NUM_COLORS)];
  }
  else if (Button_Tuoch == 1 && buttonDST == HIGH) {
    ledColor =  ColorTable[random(NUM_COLORS)];
  }
  delay(100);   //время реакции на нажатие
}

//+++++++++++++++++++++++++++++++++++++++++++++ Установка часов и минут +++++++++++++++++++++++

void TimeAdjust()                         // установка часов и минут
{
#if (Button_Tuoch == 0)
  int buttonH = digitalRead(H_PIN);
  int buttonM = digitalRead(M_PIN);
  if (buttonH == LOW || buttonM == LOW)
  {
    delay(100);          //время реакции на нажатие
    tmElements_t Now;
    RTC.read(Now);
    int hour = Now.Hour;
    int minutes = Now.Minute;
    int second = Now.Second;
    if (buttonH == LOW)    {
      if (Now.Hour == 23) {
        Now.Hour = 0;
      }
      else      {
        Now.Hour += 1;
      }
    }
    else  {
      if (Now.Minute == 59) {
        Now.Minute = 0;
      }
      else  {
        Now.Minute += 1;
      }
    }
    RTC.write(Now);
    New();
  }
  newTimeToArray();

#elif(Button_Tuoch == 1)

  int buttonH = digitalRead(H_PIN);
  int buttonM = digitalRead(M_PIN);
  if (buttonH == HIGH || buttonM == HIGH)
  {
    delay(100);          //время реакции на нажатие
    tmElements_t Now;
    RTC.read(Now);
    int hour = Now.Hour;
    int minutes = Now.Minute;
    int second = Now.Second;
    if (buttonH == HIGH)    {
      if (Now.Hour == 23) {
        Now.Hour = 0;
      }
      else      {
        Now.Hour += 1;
      }
    }
    else  {
      if (Now.Minute == 59) {
        Now.Minute = 0;
      }
      else  {
        Now.Minute += 1;
      }
    }
    RTC.write(Now);
    New();
  }
  newTimeToArray();
#endif
}

//++++++++++++++++++++++++++++++++++++++ ТОЧКИ +++++++++++++++++++++++++++++++++++++++++

void dots()    // мигаем точкам
{
#if (DOTS_NUM == 2)               // если тoчек 2
  if (DDOT == 1) {                // мигаем поочереди
    if (sec % 2 == 0)      {
      leds[DOT_X ] = ledColor;
      leds[DOT_X + 1 ] = CRGB::Black;
    }
    else      {
      leds[DOT_X ] = CRGB::Black;
      leds[DOT_X + 1] = ledColor;
    }
  }
  else  if (DDOT == 0 ) {        // мигают одновременно
    if (sec % 2 == 0)      {
      for (int y = 0; y < DOTS_NUM ; y++)        {
        leds[DOT_X + y ] = ledColor;
      }
    }
    else {
      dot_off();              // погасим точки
    }
  }
#elif (DOTS_NUM > 2)        // если точек больше двух(незнаю зачем)
  if (DDOT == 1)
  {
    many_dot();
  }
  else if (DDOT == 0)    {
    if (sec % 2 == 0)      {
      for (int y = 0; y < DOTS_NUM ; y++)        {
        leds[DOT_X + y ] = ledColor;
      }
    }
    else      {
      dot_off();        // погасим точки
    }
  }

#else                    // если всего 1 точка
  if (sec % 2 == 0)    {
    leds[DOT_X ] = ledColor;
  }
  else    {
    leds[DOT_X ] = CRGB::Black;
  }
#endif
}
#if (DOTS_NUM>2)
void many_dot()   // знаю знаю
{
  if (sec == 59 || m == DOTS_NUM + 1 )  {
    n = 0;
    o = 1;
    m = 0;
  }
  if (sec % 2 == 0)  {
    if (n == 0 && o == 1)    {
      leds[DOT_X + m] = ledColor;
      leds[DOT_X + m - 1] = CRGB::Black;
      m = m + 1;
      n = 1;
      o = 0;
    }
  }
  else  {
    if ( n == 1 && o == 0)    {
      leds[DOT_X + m] = ledColor;
      leds[DOT_X + m - 1] = CRGB::Black;
      m = m + 1;
      o = 1;
      n = 0;
    }
  }
}
#endif
void dot_off()    // Функция гасит все точки
{
  m = 0;
  for (int y = 0; y < DOTS_NUM ; y++)  {
    leds[DOT_X + y ] = CRGB::Black;
  }
}

//++++++++++++++++++++++++++++++++++++++++++++++++++++ Вывод времени ++++++++++++++++++++++++++++++

void newTimeToArray()              // кажем  время
{
  int NEWtime = newTime;                    //
  int digit = NEWtime % 10;
  BrightDigit(digits[digit], DIG4);         //
  NEWtime /= 10;
  digit = NEWtime % 10;
  BrightDigit(digits[digit], DIG3);         //
  NEWtime /= 10;
  digit = NEWtime % 10;
  BrightDigit(digits[digit], DIG2);         //
  NEWtime /= 10;
  digit = NEWtime % 10;
  if (digit == 0 && Time_Zero == 0)  {
    BrightDigit(digits[11], DIG1);
  }
  else   {
    BrightDigit(digits[digit], DIG1);
  }
}

//++++++++++++++++++++++++++++++++++++++++++++++++ Получаем время ++++++++++++++++++++++++++++++++++++++

void New()        //
{
  //=========  Получаем время
  tmElements_t New;
  RTC.read(New);
  newTime =  New.Hour * 100 + New.Minute;      // время для отображения
  ChangeTime =  New.Hour * 60 + New.Minute;    // для расчета смены цвета
  //  ======= Получаем данные с bme280
  c = bme.readTemperature() * 10;
  h = bme.readHumidity();
  p = bme.readPressure() / 133.322;
  //  ======= Получаем температуру с DS18В20 или вме280
#if (DS18_PIN >0)
  sensor.requestTemp();
  c2 = sensor.getTemp() * 10;
#else
  c2 = bme.readTemperature() * 10;
#endif
  FastLED.clear ();
}


void loop()
{
  tmElements_t ti;
  RTC.read(ti);
  sec = ti.Second;
  BrightnessCheck();                  // Проверяем датчик освещения
  LEDS.setBrightness(bri);            // установим яркость
  DSTcheck();                         // СМЕНА цвета кнопкой (ненужная функция, имхо).
  TimeAdjust();                       // Проверяем время если сменилось на 1 цифру

  if (sec == 0) {                      // допросим всех в
    New();
    flag = 0 ;
  }
#if(Csec !=0 && COLOR_CHANGE > 0 )
  if (sec == Csec) {                     // смена цвета на какой секунде

    if ( COLOR_CHANGE == 1 && flag == 0 )  {                                               // каждую минуту
      ledColor =  ColorTable[random(NUM_COLORS)]; flag = 1;
    }
    else if ( COLOR_CHANGE > 1 && flag == 0 && ChangeTime % COLOR_CHANGE == 0 )  {         // каждые COLOR_CHANGE мин
      ledColor =  ColorTable[random(NUM_COLORS)]; flag = 1;
    }
  }
#endif

#if (temp1_sec != 0)
  if (sec >= temp1_sec && sec < temp1_sec + work_sec) {   //
    long preledColor = ledColor;      // запомним цвет
    TempToArray();                    // покажем температура
    ledColor = preledColor;           // вернем цвет
    FastLED.show();
  }
#endif

#if (temp2_sec != 0)
  else if ( sec >= temp2_sec && sec < temp2_sec + work_sec) {
    long preledColor = ledColor;      // запомним цвет
    TempToArray2();                   // покажем температура
    ledColor = preledColor;           // вернем цвет
    FastLED.show();
  }
#endif

#if (himy_sec != 0)
  else if (sec >= himy_sec && sec < himy_sec + work_sec )    //
  {
    dot_off();                        // погасим точки
    HumidityToArray();                // покажем влажность
    FastLED.show();
  }
#endif

#if ( pres_sec != 0 )
  else  if (sec >= pres_sec && sec < pres_sec + work_sec)   //
  {
    dot_off();                        // погасим точки
    PressureToArray();                // покажем давление
    FastLED.show();
  }
#endif

  else
  {
    dots();                               // точки
    newTimeToArray();                     // покажем время
    FastLED.show();
  }
}

к градусов в 3 блоке и большой знак цельсия в 4 блоке. Может кому нужно.

 
Fenicksnet
Offline
Зарегистрирован: 25.03.2019

А чего не последнюю версию переделали?

b612
Offline
Зарегистрирован: 12.03.2017

начинающий пишет:

или как вариант приступить к разработке новой версии (V2.0) с шестиразрядным дисплеем
пройденный этап.
практика показывает, что 6 разрядов это перебор.

для дисплея с фиксированым количеством разрядов и поочередной сменой показателей
вырисовывается такая картина
смена показателей не чаще 2 секунд и количество значащих разрядов не более 4-5.
Если менять показатели реже, то с одного взгляда "НЕ ДОЖДЁШЬСЯ"
если будет больше 4-5 разрядов, то за 2 секунды "НЕ УСЕЧЕШЬ"

Есть версия подобных часов v. 84 с анимацией, с боем, будильниками и прочими фишками
https://radiokot.ru/forum/viewtopic.php?p=3765988#p3765988
и есть необходимость разработать под неё печатную плату

kym13
Offline
Зарегистрирован: 22.11.2020

Fenicksnet))  Это последняя которую Вы выложили, в предыдущей был ноль не значащий. Или я чего то пропустил.

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

kym13 пишет:

Fenicksnet))  Это последняя которую Вы выложили, в предыдущей был ноль не значащий. Или я чего то пропустил.

последняя на сегодня https://disk.yandex.ru/d/4hG8js2oYEantQ

не понимаю почему меня эти часы так зацепили, ( не только меня, уже 3 шт друзьям сделал , 2 в очереди.),и у каждого свои хотелки.   последняя хотелка , цвет темперутуры в зависимости от температуры. т.е. чем теплее тем цифры краснее ну и соответственно чем холоднее тем синее. вот думаю как реализовать.

b612
Offline
Зарегистрирован: 12.03.2017

Fenicksnet пишет:
чем теплее тем цифры краснее ну и соответственно чем холоднее тем синее. вот думаю как реализовать.
никак.
Если показываете только одну скажем уличную температуру, то смысла мало, потому, что градация цвета будет плохо отражать изменение температуры 22 градуса не будет отличаться на вид от 25 и это уже делает задачу бессмысленной.
А если у вас два или более градусника, то к этому добавится ещё и путаница.

Я делал индикацию температуры двумя полноцветными светиками. или одним, перемигивающимся.
так чтобы температура "кодивалась" не одним цветом а двумя.
Таким образом можно получить 30 градаций, но это тоже мало по сравнению даже с двузначным числом.
скажем -30 - +30  это уже 60 градаций

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

Так только наружную и нужно. 20 градаций  на плюс 0-20 и 20 на минус т.е. основа Палыча красный при +20 и выше (255,0,0) при уменьшении температуры до 0 (255.255.0), тоже с минусом 0(0,255,255) -20(0,0,255). В принципе наверное можно функцией t=map (t, 0,20,255,0) менять один цвет, должно получится , что то типа лед(x)=crgb ( 255,t,0), 

b612
Offline
Зарегистрирован: 12.03.2017

Fenicksnet пишет:

Так только наружную и нужно. 20 градаций  на плюс 0-20 и 20 на минус т.е. основа Палыча красный при +20 и выше (255,0,0) при уменьшении температуры до 0 (255.255.0), тоже с минусом 0(0,255,255) -20(0,0,255). В принципе наверное можно функцией t=map (t, 0,20,255,0) менять один цвет, должно получится , что то типа лед(x)=crgb ( 255,t,0), 

0 - ФИОЛЕТОВЫЙ а не чёрный иначе +10 будет таким же красным как и +20
нормальный глаз сппросонья отличит не более 14 цветов, среди которых будет и два разных желтых и два разных оранжевых и два зелёных и фиолетовых и красных

b707
Offline
Зарегистрирован: 26.05.2017

Fenicksnet пишет:

не понимаю почему меня эти часы так зацепили, ( не только меня, уже 3 шт друзьям сделал , 2 в очереди.),

у меня наоборот - жена как увидела их на картинке - так сразу сказала, что в своем доме не хочет "часы как на вокзале". Или "как в цеху"

Поэтому я сделал свои часы, откатал код и разобрал обратно.

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:
Поэтому я сделал свои часы, откатал код и разобрал обратно.
а я выгнал жену ))

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

А у меня на даче на сарае висят. Со всего участка видно. 

b612
Offline
Зарегистрирован: 12.03.2017

Fenicksnet пишет:
А у меня на даче на сарае висят. Со всего участка видно.
чтобы не было сомнений где забор а где обед ))

kym13
Offline
Зарегистрирован: 22.11.2020

Fenicksnet)) Чето я не вижу особой разницы между скетчем из поста 809  и из поста 863. Загрузил, погонял вроде всё одинаково. 

...на даче на сарае висят..  Тоже сделал двое часов, одни себе другие родителям, теперь делаю на дачу, табло размером  40х18см.

Fenicksnet
Offline
Зарегистрирован: 25.03.2019



#include <Adafruit_BME280.h>
#include <FastLED.h>
#define NUM_LEDS 30
Adafruit_BME280 bme;
CRGB leds[NUM_LEDS];

unsigned long timer;
int i ;
int c ;
int t ;


void setup()
{
  Serial.begin(9600);
  LEDS.addLeds<WS2812, 10, GRB>(leds, NUM_LEDS);
  bme.begin(0x76);
}

void loop()
{
  if (millis() - timer > 500)
  {
    if (c > 0)
    {
      if (c > 20)
      {
        c = 20;
      }
      int Bt = map(c, 1, 20, 100, 1);
      int Gt = map (c, 1, 20, 100, 1);
      int Rt = map (c, 1, 20, 100, 255);
      leds[i] = CRGB( Rt, Gt, Bt);
      //FastLED.show();
      i = i + 1;
      c = c + 1 ;

      Serial.print(" R = "); Serial.print(Rt); Serial.print(" G ="); Serial.print(Gt); Serial.print(" B = "); Serial.print(Bt); Serial.print(" C = "); Serial.println(c);
      timer = millis();
    }
    if (c <= 0)
    {
      if (c < -20)
      {
        c = -20;
      }
      int Bt = map(c, 0, -20, 150, 255);
      int Gt = map (c, 0, -20, 150, 0);
      int Rt = map (c, 0, -20, 20, 0);
      leds[i] = CRGB( Rt, Gt, Bt);
      // FastLED.show();
      i = i + 1;
      c = c - 1 ;

      Serial.print(" R = "); Serial.print(Rt); Serial.print(" G ="); Serial.print(Gt); Serial.print(" B = "); Serial.print(Bt); Serial.print(" C = "); Serial.println(c);
      timer = millis();
    }
  }
  if ( c > 20)
  {
    c = 0; FastLED.clear (); i = 0;
  }
  if (c < -20)
  {
    c = 1; FastLED.clear (); i = 0;
  }
  FastLED.show();
}

в принципе адаптивная смена цвета температуры работает, но как CRGB( Rt, Gt, Bt); привести к long ledcolor = = CRGB::mycolor; например.  

b707
Offline
Зарегистрирован: 26.05.2017

Fenicksnet пишет:
как CRGB( Rt, Gt, Bt); привести к long ledcolor = = CRGB::mycolor; например.  

поясните, в чем проблема. И то и другое - тип данных CRGB, что к чему приводить надо?

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

b707 пишет:

Fenicksnet пишет:
как CRGB( Rt, Gt, Bt); привести к long ledcolor = = CRGB::mycolor; например.  

поясните, в чем проблема. И то и другое - тип данных CRGB, что к чему приводить надо?

если мы записывает это так то проблем нет.

      int Bt = map(c, 1, 20, 100, 1);
      int Gt = map (c, 1, 20, 100, 1);
      int Rt = map (c, 1, 20, 100, 255);
      leds[i]= CRGB(Rt , Gt, Bt);

суть, присвоить переменной ledColor получившийся цвет и дальше использовать, грубо говоря надо чтобы ledСolor=CRGB(Rt , Gt, Bt);

вот как то так....

      
b707
Offline
Зарегистрирован: 26.05.2017

Fenicksnet пишет:

если мы записывает это так то проблем нет.

      int Bt = map(c, 1, 20, 100, 1);
      int Gt = map (c, 1, 20, 100, 1);
      int Rt = map (c, 1, 20, 100, 255);
      leds[i]= CRGB(Rt , Gt, Bt);

суть, присвоить переменной ledColor получившийся цвет и дальше использовать, грубо говоря надо чтобы ledСolor=CRGB(Rt , Gt, Bt);



продолжаю не понимать, в чем проблема. Что мешает так и записать?

У вас в существующем коде есть строчки:

long temp_plus =  CRGB::Red;        // цвет цифр температуры при плюсе bme280
long temp_minus = CRGB::Blue;   

чем они принципиально отличаются от

ledСolor=CRGB(Rt , Gt, Bt);

??

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

[quote=b707]

тем что так он не работает.


#include <FastLED.h>
#define NUM_LEDS 30
CRGB leds[NUM_LEDS];
long ledColor;

void setup()
{
  LEDS.addLeds<WS2812, 10, GRB>(leds, NUM_LEDS);
}

void loop()
{
  for (int l = 0; l <= NUM_LEDS; l++)
  {
    // leds[l] = CRGB(250 , 50, 50);
    ledColor = CRGB(250 , 50, 50);
    leds[l] = ledColor;
    FastLED.show();
    delay(1000);
  }
  delay(1000);
  FastLED.clear();
}
      

а вот так работает.


#include <FastLED.h>
#define NUM_LEDS 30
CRGB leds[NUM_LEDS];
long ledColor;

void setup()
{
  LEDS.addLeds<WS2812, 10, GRB>(leds, NUM_LEDS);
}

void loop()
{
  for (int l = 0; l <= NUM_LEDS; l++)
  {
    leds[l] = CRGB(250 , 50, 50);
    // ledColor = CRGB(250 , 50, 50);
   //  leds[l] = ledColor;
    FastLED.show();
    delay(1000);
  }
  delay(1000);
  FastLED.clear();
}

вот и вопрос как присвоить это ledColor. предполагаю, что надо как то перевести в 16, типа 0x000000, ......

b707
Offline
Зарегистрирован: 26.05.2017

опишите ledcolor как uint32_t или, еще лучше, как CRGB

 

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

b707 пишет:

опишите ledcolor как uint32_t или, еще лучше, как CRGB

 

не понимаю я как, маленький еще. можно пример.

b707
Offline
Зарегистрирован: 26.05.2017

Fenicksnet пишет:

не понимаю я как, маленький еще. можно пример.

ну вы ваще :)

какой пример вам нужен? Такой?

CRGB ledColor;

 

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

#include <FastLED.h>
#define NUM_LEDS 30
CRGB leds[NUM_LEDS];
CRGB  ledColor;
//long ledColor ;//= CRGB::Red;
int r = 250;
int g = 250;
int b = 0;
CRGB tempColor;
void setup()
{
  LEDS.addLeds<WS2812, 10, GRB>(leds, NUM_LEDS);
}
void loop()
{
  for (int l = 0; l <= NUM_LEDS; l++)
  {
    tempColor = CRGB (r, g, b);
    ledColor = tempColor;
    leds[l] =  ledColor;
    FastLED.show();
    g = g - 15;
    r = r - 15;
    b = b + 15;
    delay(500);
  }
  delay(1000);
  FastLED.clear();
}

тут то оно так работает, но там то ledColor объявлен long. и не может быть как CRGB  ledColor.

b707
Offline
Зарегистрирован: 26.05.2017

Fenicksnet пишет:
тут то оно так работает, но там то ledColor объявлен long. и не может быть как CRGB  ledColor.

почему не может? Что мешает его в вашем коде обьявить CRGB?

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

b707 пишет:

Fenicksnet пишет:
тут то оно так работает, но там то ledColor объявлен long. и не может быть как CRGB  ledColor.

почему не может? Что мешает его в вашем коде обьявить CRGB?

тогда как минимум наверное придется и все остальные объявлять как CRGB.

b707
Offline
Зарегистрирован: 26.05.2017

Fenicksnet , мы что-то топчемся на одном месте.

Вы спросили, как сделать так, чтобы первый код в #876 работал. Я показал.

По мне так применить это знание по аналогии ко всему коду - как нефиг делать. предлагаю вам попробовать - а если будут ошибки - тогда уже задавать вопросы.

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

да, согласен. Вы не понимаете чего я хочу, а я не могу вам объяснить. попробую ещё раз. Как переменной типа long  (в данном случае это long ledColor)   Присвоить значение CRGB(r,g,b,);  не конкретно к коду из #876 , а применить к коду например из #859. Где Переменные типа int r, g, b ; будут зависеть от температуры и учавствовать только в функции показа температуры.

kym13
Offline
Зарегистрирован: 22.11.2020

Уважаемый < Fenicksnet>  после переустановки среды Arduino IDE у меня перестал компилироваться код из #863, я думаю дело в библиотеках. Если Вам не тяжело выложите здесь библиотеки которые Вы использовали.

b612
Offline
Зарегистрирован: 12.03.2017

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

kym13
Offline
Зарегистрирован: 22.11.2020

Скорее всего дело в библиотеке <Adafruit_BME280.h>, закоментировал всё что относится к BME280 в скетче и компиляция прошла.

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

kym13 пишет:

Уважаемый < Fenicksnet>  после переустановки среды Arduino IDE у меня перестал компилироваться код из #863, я думаю дело в библиотеках. Если Вам не тяжело выложите здесь библиотеки которые Вы использовали.

https://disk.yandex.ru/d/y-2_ERHPsiXgFw

kym13
Offline
Зарегистрирован: 22.11.2020

< Fenicksnet> Спасибо. Заработало.

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

leon-32125670 пишет:
Помогите с программой я хочю сделать чтобы часы горели на 61-74 пихселяк а минуты и секунды шли кругу по 0-60пихс еляк
,>

 а хоть как-то уже работает? судя по коду нет. код и схему в студию ( по фен шую).

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

leon-32125670 пишет:

часы показывает 61-74 пихели

Ну а и если так то тут тогда сразу все понятно ясно.

kym13
Offline
Зарегистрирован: 22.11.2020

dj-toxa

 ....режим работы переливаются радугой каждую минуту и горят новую минуту новым рандомным цветом..... А скетч если не жалко можно выложить, давно искал чтобы радугой переливались.

DIM425
Offline
Зарегистрирован: 11.01.2022

Доброго времени форумчане и просто умные люди!!!:))) У меня вот такой вопрос...Есть лента WS2812b IR Bluetooth, есть модуль точного времени Tiny RTC 12C Modules, датчик температуры и влажности SHT3X и Плата для разработки ESP8266, ESP-12, ESP-12F, ESP12F, CH340G, CH340 V2, USB WeMos D1, Mini, Wi-Fi, NodeMCU, Lua IOT, плата 3,3 В с контактами....Возможно ли имея эти детали собрать часы ? Не судите строго, я первый раз с этим сталкиваюсь...Покупал все как советовали в статьях...по их ссылочкам, но теперь я как то не уверен в этом, а тут смотрю сидят грамотные люди....

b707
Offline
Зарегистрирован: 26.05.2017

что такое "лента WS2812b IR Bluetooth" ?

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

DIM425 пишет:
....Возможно ли имея эти детали собрать часы ? ....

и возможно и можно.

DIM425
Offline
Зарегистрирован: 11.01.2022

Адресная лента с Алека...

DIM425
Offline
Зарегистрирован: 11.01.2022

Ваш ответ меня так порадовал так порадовал...!! Уже думал старых черт понакупал всякой ереси по незнанию....А вы бы не могли полному нубу указать раздел сайта или какую то еще информацию, чтоб я смог хоть что то понять..

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

IR Bluetooth скорее всего не понадобится ...

DIM425
Offline
Зарегистрирован: 11.01.2022

Может что то надо докупить....просто хочу на даче на лето сделать большие часы на улице...У меня висят метровые стрелочные, но ночью то их не видно:)))

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Главное это что бы хватило диодов в ленте и проводов хватило на ваш любимый размер часов ...