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

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020

Вот язык без костей у меня, хоть стреляйте напишу. В эталонных часах конечно температура дело хорошее, но оно педназначено для корректировки хода часов и поэтому я хочу сделать датчик  DS18B20 внутри часов как и на улице, но вот вопрос или посадить на другую ножку ардуинки или разделить по адресам датчики, но мы не ищем лёгких путей поэтому прочитав тему про датчики, не понял как найти и записать адрес датчиков без покупки дополнительного оборудования. Скетч Одиночки прописывал адреса, но не факт что у моих датчиков будут такие же. Я видел в интернете где 2 датчика, но были другие адреса.

С Уважением Гена.

      

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

Gen.Aleks пишет:

Задам как пользователь скетча который лежал в открытом доступе.

какого скетча? вы думаете все помнят. что за код вы используете?

Цитата:
вот скетч опроса уличной температуры

Для ответа на ваш вопрос как раз процедура температуры не нужна, нужен весь код целиком. причем. если вы в нем хоть что-то меняли - выкладывайте последнюю измененную версию

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

Несколько градусников вешать однозначно на одну ножку. Желательно на A1 ибо ноги надо экономить.
Они понадобятся для кнопок, датчика освещения, датчика присутствия, выхода звука, выхода реле
и т.д. и т.п.

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

Я рекомендую не тратить лишний градусник
температуру можно брать с датчика давления или RTC
Настенная температура вообще-то не интересна.
Вот лучше измерять концентрацию СО2.

PS рекомендую добавить в "гирлянду" дополнительные светики. Сегменты слева для "минуса"
и сегменты справа вверху для буквы "Т" и для буквы "°С" и ещё две десятичных точки между младшим и вторым разрядами.

https://youtu.be/4MQTrmK2z9M

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020

Хорошо ладно 1й вопрос если сделать таймеры отображения одинаковыми пропадает температура отображения в комнате но не всегда если сделаю задержку чуть меньше на улице. от всё нормально, но иногда на секунду промелькнут часы. И второй вопрос адреса датчиков температуры, если они все на одной нитке висят как определить? Чтобы прописать в скетче.  Датчики DS18B20. В библиотеке от датчика ответ на вопрос не нашёл.

библиотека вот:https://yadi.sk/d/v5VlwK0f0uwf2g

#include <RTC.h>
RTC  time;
#include <DS3231.h>
#include <OneWire.h>
#include <TroykaLight.h>

/*
Подключение к Arduino nano:
Часы DS3231:    SCL -> A5
                SDA -> A4
Датчик освещения    -> A3                
Кнопки: Смена часов -> D2 
        Смена минут -> D3
        Смена цвета -> D4
Лента WS2811(WS2812)-> D13
*/
//---------------------------------------------------------------------------------------------------
#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include <FastLED.h>

#define  RTC_DS3231    1
#define LEDS_IN_SEGMENT 3     // Задаём сколько у нас светодиодов в сегменте
#define DOTS_NUM 2            // Задаём сколько у нас разделительных точек
#define COLOR_CHANGE 2        // Смена цвета ( 0 - никогда, 1 - раз в минуту, 2 - каждые десять минут, 3 - каждый час, 4 - каждые десять часов)
#define NUM_COLORS 16         // Количество цветов
#define COLOR_ORDER BGR       // По умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN 13           // Пин ленты 
#define BRI_PIN A3            // PIN фоторезистора
#define auto_bright 1         // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 250        // максимальная яркость (0 - 255)
#define min_bright 2       // минимальная яркость (0 - 255)
#define bright_constant 1000  // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.9              // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;
int temperature = 0;
int Tout1;
int den;
int ned;
 OneWire ds(5); // Объект OneWire
   long vrem_schit = 0; // Переменная для хранения времени последнего считывания с датчика
  const int period_schit = 1000; // Определяем периодичность проверок
  
//---------------------------------------------------------------------------------------------------
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM) // Вычислемые константы, НЕ РЕДАКТИРОВАТЬ!
//---------------------------------------------------------------------------------------------------
CRGB leds[NUM_LEDS]; //Задаём значение светодиодов
uint8_t  digits[] = {
  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
  0b00011110,     // Digit C         11
  0b01000000,     // Digit -         12
};
//---------------------------------------------------------------------------------------------------
bool Dot = true;
bool TempShow = true ;
bool DenChisloShow = true ;
bool TempOutShow = true ;
int last_digit = 0;
//---------------------------------------------------------------------------------------------------
long ledColor = CRGB::Aqua; // Используемый цвет
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::Red,
  CRGB::Orchid,
  CRGB::DarkOrchid
};
//---------------------------------------------------------------------------------------------------
void setup() {
  Serial.begin(9600);
  //  инициализация модуля RTC
  time.begin(RTC_DS3231);     // на базе чипа DS3231            модуль подключается к аппаратным выводам I2C
  Wire.begin();
  LEDS.addLeds<WS2812, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
//---------------------------------------------------------------------------------------------------
  //LEDS.setBrightness(75); // Задаём яркость
  pinMode(4, INPUT_PULLUP); // Кнопка смены цветов
  pinMode(3, INPUT_PULLUP); // Кнопка смены минут
  pinMode(2, INPUT_PULLUP); // Кнопка смены часов
}
//---------------------------------------------------------------------------------------------------
void BrightDots (boolean Dot_On) {
  for (uint8_t i = 0; i < DOTS_NUM; i++) {
  leds[(LEDS_IN_SEGMENT * 14)+ i] = (Dot_On) ? ledColor : 0;
  }
}
//---------------------------------------------------------------------------------------------------
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) {                         // если включена адаптивная яркость
    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);      // установить новую яркость
    }
  }
};
//---------------------------------------------------------------------------------------------------
//  Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 155  вместо 0155
int GetTime()
{
  tmElements_t Now;
  RTC.read(Now);
  int hour = Now.Hour;
  int minute = Now.Minute;
  int second = Now.Second;
  if (second % 2 == 0)
  {
    Dot = false;
  }
  else {
    Dot = true;
  };
  return (hour * 100 + minute);
};
//---------------------------------------------------------------------------------------------------
// Преобразуем время в массив для отображание

void TimeToArray() {
  int Now = GetTime(); // Получаем время
  BrightDots(Dot);

  for (int i = 1; i <= 4; i++) {
    int digit = Now % 10; // Получаем последнюю цифру в времени
    int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
    if (i > 2) {
      cursor -= 2;
    }
    if ( (i != 4) || (digit != 0)) BrightDigit(digits[digit], cursor);
    else BrightDigit(0, cursor);
    if ( i == COLOR_CHANGE) {
      if (digit != last_digit)
      {
//        cylon ();                              // цикличное изменение цветов
        ledColor =  ColorTable[random(NUM_COLORS)];    // цикличное изменение цветов
      }
      last_digit = digit;
    }
    Now /= 10;
  };
};
//---------------------------------------------------------------------------------------------------
// Функция вывода даты
  void DenChisloToArray(){
     time.gettime();
   int d = time.day;
    delay(100);
      time.gettime();
  int n = time.weekday;
     delay(100);
         tmElements_t tm;
      RTC.read(tm);
        if (tm.Second != 20)
        {
    DenChisloShow = false;
            return;
        }
    DenChisloShow = true;
        den = d;
        BrightDots(0);  //разделительные мигающие точки выключены
     int  digit = den % 10;
       BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    //  4й блок единицы дней
       den /= 10;
       digit = den % 10;
       BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));    //  3й блок десятки дне
       BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //  2й блок вывода знака "-"
       ned = n;
       digit = ned % 10;
        BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  //  1й блок день недели
                   
           
           }
       
     
      
// Функция вывода температуры

 void detectTemperature()
         {
 byte data[2]; // Место для значения температуры
 ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
 ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство 
 ds.write(0x44); //Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память
 if (millis() - vrem_schit > period_schit)
           {
 lastUpdateTime = millis();
 ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
 ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство
 ds.write(0xBE); // Просим передать нам значение регистров со значением температуры
 data[0] = ds.read(); // Читаем младший байт значения температуры
 data[1] = ds.read(); // А теперь старший
 
 // Формируем значение
 temperature = (data[1] << 8) + data[0]; temperature = temperature >> 4; // Темпиратура правильная.
           }
           tmElements_t tm;
        RTC.read(tm);
        if (tm.Second != 25) 
             {
    TempOutShow = false;
    return;
             };
    TempOutShow = true;
                      
    BrightDots(0);  //разделительные мигающие точки выключены
         if (temperature >= 0) // температура положительная 
           {
  BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14));    // знак градус (*) 3й блок
  BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    // знак Цельсия (*) 4й блок
  int digit = temperature % 10; //пример: 24 % 10 остаток 4 - это единицы темпиратуры
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));   // 2 блок единицы градуса 
  temperature /= 10; // тоже самое, но получаем десятки темпиратуры
  digit = temperature % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  //  1й блок вывода первого символаo
           }
         else  if  (temperature < 0)             // температура отрицательная
           {Tout1 = abs(temperature); // //преобразование отрицательного числа в положительное
          BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); // знак градус (*) 4й блок
      int digit = Tout1 % 10; //пример: 24 % 10 остаток 4 - это единицы темпиратуры
          BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));   // 3й блок единицы градуса
      Tout1 /= 10; // тоже самое, но получаем десятки темпиратуры
      digit = Tout1 % 10;
          BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));  //  2й блок вывода первого символа
          BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //  1й блок вывода знака "-"
           }
           
           }
           
void TempToArray()
         {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 30) 
         {
    TempShow = false;
    return;
         }
  TempShow = true;
  int t = RTC.temperature();
  int celsius = (t / 4.0);
  BrightDots(0);  //разделительные мигающие точки выключены
  BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    // начало знака Цельсия (С) 4й блок
  BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14));   // начало знака Градус (*) 3й блок
  int digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));  // 2й блок вывода второго символа
  celsius /= 10;
  digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  // 1й блок вывода первого символа
         };
//---------------------------------------------------------------------------------------------------
//смена цвета кнопкой DST пин D4
void DSTcheck() {
  int buttonDST = digitalRead(4);
  if (buttonDST == LOW) {
    ledColor =  ColorTable[random(NUM_COLORS)];
  };
  delay(200);
};
//---------------------------------------------------------------------------------------------------
// Массив управляет кнопками с часами и минутами
void TimeAdjust() {
  int buttonH = digitalRead(2);
  int buttonM = digitalRead(3);
  if (buttonH == LOW || buttonM == LOW) {
    delay(200);
    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);
  }
}
//---------------------------------------------------------------------------------------------------
//Меняем эффекты
void fadeall() {
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i].nscale8(250);
  }
}
//---------------------------------------------------------------------------------------------------
// массив отвечает за цикличное изменение цветов
void cylon () {
  static uint8_t hue = 0;
  Serial.print("x");
  // Сдвигаем один светодиод в любом направлении
  for (int i = 0; i < NUM_LEDS; i++) {
    // Устанавливаем 1 светодиод на цвет красный
    leds[i] = CHSV(hue++, 255, 255);
    // Показываем светодиоды
    FastLED.show();
    fadeall();
    // Ждём немного и повторяем цикл
    delay(10);
  }
  Serial.print("x");
//---------------------------------------------------------------------------------------------------
  // Сдвигаем один светодиод в любом направлении
  for (int i = (NUM_LEDS) - 1; i >= 0; i--) {
    // Устанавливаем 1 светодиод на цвет красный
    leds[i] = CHSV(hue++, 255, 255);
    // Показываем светодиоды
    FastLED.show();
    fadeall();
    // Ждём немного и повторяем цикл
    delay(10);
  }
}
//---------------------------------------------------------------------------------------------------
void loop() { 
  BrightnessCheck(); // Проверяем датчик
  DSTcheck(); // Проверяем режимы
  TimeAdjust(); // Проверяем время если сменилось на 1 цифру
  TimeToArray(); // Проверяем часы если сменилось на 1 цифру
  DenChisloToArray() ; // Проверяем дату
  detectTemperature(); // Проверяем температуру от датчика DS18b20
  TempToArray();  // температура
  FastLED.show(); // Задаём массив светодиодов
  if ( DenChisloShow == true) delay (5000); // время отображения числа и дня (5000 = 5 сек)
  if ( TempOutShow == true) delay (4000); // время отображения температуры на улице(5000 = 5 сек)
  if (TempShow == true) delay (5000); // время отображения температуры (5000 = 5 сек)
}

 

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020

Пардон последний скетч не прошёл компиляцию.

#include <RTC.h>
RTC  time;
#include <DS3231.h>
#include <OneWire.h>
#include <TroykaLight.h>

/*
Подключение к Arduino nano:
Часы DS3231:    SCL -> A5
                SDA -> A4
Датчик освещения    -> A3                
Кнопки: Смена часов -> D2 
        Смена минут -> D3
        Смена цвета -> D4
Лента WS2811(WS2812)-> D13
*/
//---------------------------------------------------------------------------------------------------
#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include <FastLED.h>

#define  RTC_DS3231    1
#define LEDS_IN_SEGMENT 3     // Задаём сколько у нас светодиодов в сегменте
#define DOTS_NUM 2            // Задаём сколько у нас разделительных точек
#define COLOR_CHANGE 2        // Смена цвета ( 0 - никогда, 1 - раз в минуту, 2 - каждые десять минут, 3 - каждый час, 4 - каждые десять часов)
#define NUM_COLORS 16         // Количество цветов
#define COLOR_ORDER BGR       // По умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN 13           // Пин ленты 
#define BRI_PIN A3            // PIN фоторезистора
#define auto_bright 1         // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 250        // максимальная яркость (0 - 255)
#define min_bright 2       // минимальная яркость (0 - 255)
#define bright_constant 1000  // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.9              // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;
int temperature = 0;
int Tout1;
int den;
int ned;
 OneWire ds(5); // Объект OneWire
   long vrem_schit = 0; // Переменная для хранения времени последнего считывания с датчика
  const int period_schit = 1000; // Определяем периодичность проверок
  
//---------------------------------------------------------------------------------------------------
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM) // Вычислемые константы, НЕ РЕДАКТИРОВАТЬ!
//---------------------------------------------------------------------------------------------------
CRGB leds[NUM_LEDS]; //Задаём значение светодиодов
uint8_t  digits[] = {
  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
  0b00011110,     // Digit C         11
  0b01000000,     // Digit -         12
};
//---------------------------------------------------------------------------------------------------
bool Dot = true;
bool TempShow = true ;
bool DenChisloShow = true ;
bool TempOutShow = true ;
int last_digit = 0;
//---------------------------------------------------------------------------------------------------
long ledColor = CRGB::Aqua; // Используемый цвет
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::Red,
  CRGB::Orchid,
  CRGB::DarkOrchid
};
//---------------------------------------------------------------------------------------------------
void setup() {
  Serial.begin(9600);
  //  инициализация модуля RTC
  time.begin(RTC_DS3231);     // на базе чипа DS3231            модуль подключается к аппаратным выводам I2C
  Wire.begin();
  LEDS.addLeds<WS2812, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
//---------------------------------------------------------------------------------------------------
  //LEDS.setBrightness(75); // Задаём яркость
  pinMode(4, INPUT_PULLUP); // Кнопка смены цветов
  pinMode(3, INPUT_PULLUP); // Кнопка смены минут
  pinMode(2, INPUT_PULLUP); // Кнопка смены часов
}
//---------------------------------------------------------------------------------------------------
void BrightDots (boolean Dot_On) {
  for (uint8_t i = 0; i < DOTS_NUM; i++) {
  leds[(LEDS_IN_SEGMENT * 14)+ i] = (Dot_On) ? ledColor : 0;
  }
}
//---------------------------------------------------------------------------------------------------
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) {                         // если включена адаптивная яркость
    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);      // установить новую яркость
    }
  }
};
//---------------------------------------------------------------------------------------------------
//  Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 155  вместо 0155
int GetTime()
{
  tmElements_t Now;
  RTC.read(Now);
  int hour = Now.Hour;
  int minute = Now.Minute;
  int second = Now.Second;
  if (second % 2 == 0)
  {
    Dot = false;
  }
  else {
    Dot = true;
  };
  return (hour * 100 + minute);
};
//---------------------------------------------------------------------------------------------------
// Преобразуем время в массив для отображание

void TimeToArray() {
  int Now = GetTime(); // Получаем время
  BrightDots(Dot);

  for (int i = 1; i <= 4; i++) {
    int digit = Now % 10; // Получаем последнюю цифру в времени
    int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
    if (i > 2) {
      cursor -= 2;
    }
    if ( (i != 4) || (digit != 0)) BrightDigit(digits[digit], cursor);
    else BrightDigit(0, cursor);
    if ( i == COLOR_CHANGE) {
      if (digit != last_digit)
      {
//        cylon ();                              // цикличное изменение цветов
        ledColor =  ColorTable[random(NUM_COLORS)];    // цикличное изменение цветов
      }
      last_digit = digit;
    }
    Now /= 10;
  };
};
//---------------------------------------------------------------------------------------------------
// Функция вывода даты
  void DenChisloToArray(){
     time.gettime();
   int d = time.day;
    delay(100);
      time.gettime();
  int n = time.weekday;
     delay(100);
         tmElements_t tm;
      RTC.read(tm);
        if (tm.Second != 20)
        {
    DenChisloShow = false;
            return;
        }
    DenChisloShow = true;
        den = d;
        BrightDots(0);  //разделительные мигающие точки выключены
     int  digit = den % 10;
       BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    //  4й блок единицы дней
       den /= 10;
       digit = den % 10;
       BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));    //  3й блок десятки дне
       BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //  2й блок вывода знака "-"
       ned = n;
       digit = ned % 10;
        BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  //  1й блок день недели
                   
           
           }
       
     
      
// Функция вывода температуры

 void detectTemperature()
         {
 byte data[2]; // Место для значения температуры
 ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
 ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство 
 ds.write(0x44); //Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память
 if (millis() - vrem_schit > period_schit)
           {
  vrem_schit = millis();
 ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
 ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство
 ds.write(0xBE); // Просим передать нам значение регистров со значением температуры
 data[0] = ds.read(); // Читаем младший байт значения температуры
 data[1] = ds.read(); // А теперь старший
 
 // Формируем значение
 temperature = (data[1] << 8) + data[0]; temperature = temperature >> 4; // Темпиратура правильная.
           }
           tmElements_t tm;
        RTC.read(tm);
        if (tm.Second != 25) 
             {
    TempOutShow = false;
    return;
             };
    TempOutShow = true;
                      
    BrightDots(0);  //разделительные мигающие точки выключены
         if (temperature >= 0) // температура положительная 
           {
  BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14));    // знак градус (*) 3й блок
  BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    // знак Цельсия (*) 4й блок
  int digit = temperature % 10; //пример: 24 % 10 остаток 4 - это единицы темпиратуры
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));   // 2 блок единицы градуса 
  temperature /= 10; // тоже самое, но получаем десятки темпиратуры
  digit = temperature % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  //  1й блок вывода первого символаo
           }
         else  if  (temperature < 0)             // температура отрицательная
           {Tout1 = abs(temperature); // //преобразование отрицательного числа в положительное
          BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); // знак градус (*) 4й блок
      int digit = Tout1 % 10; //пример: 24 % 10 остаток 4 - это единицы темпиратуры
          BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));   // 3й блок единицы градуса
      Tout1 /= 10; // тоже самое, но получаем десятки темпиратуры
      digit = Tout1 % 10;
          BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));  //  2й блок вывода первого символа
          BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //  1й блок вывода знака "-"
           }
           
           }
           
void TempToArray()
         {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 30) 
         {
    TempShow = false;
    return;
         }
  TempShow = true;
  int t = RTC.temperature();
  int celsius = (t / 4.0);
  BrightDots(0);  //разделительные мигающие точки выключены
  BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    // начало знака Цельсия (С) 4й блок
  BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14));   // начало знака Градус (*) 3й блок
  int digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));  // 2й блок вывода второго символа
  celsius /= 10;
  digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  // 1й блок вывода первого символа
         };
//---------------------------------------------------------------------------------------------------
//смена цвета кнопкой DST пин D4
void DSTcheck() {
  int buttonDST = digitalRead(4);
  if (buttonDST == LOW) {
    ledColor =  ColorTable[random(NUM_COLORS)];
  };
  delay(200);
};
//---------------------------------------------------------------------------------------------------
// Массив управляет кнопками с часами и минутами
void TimeAdjust() {
  int buttonH = digitalRead(2);
  int buttonM = digitalRead(3);
  if (buttonH == LOW || buttonM == LOW) {
    delay(200);
    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);
  }
}
//---------------------------------------------------------------------------------------------------
//Меняем эффекты
void fadeall() {
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i].nscale8(250);
  }
}
//---------------------------------------------------------------------------------------------------
// массив отвечает за цикличное изменение цветов
void cylon () {
  static uint8_t hue = 0;
  Serial.print("x");
  // Сдвигаем один светодиод в любом направлении
  for (int i = 0; i < NUM_LEDS; i++) {
    // Устанавливаем 1 светодиод на цвет красный
    leds[i] = CHSV(hue++, 255, 255);
    // Показываем светодиоды
    FastLED.show();
    fadeall();
    // Ждём немного и повторяем цикл
    delay(10);
  }
  Serial.print("x");
//---------------------------------------------------------------------------------------------------
  // Сдвигаем один светодиод в любом направлении
  for (int i = (NUM_LEDS) - 1; i >= 0; i--) {
    // Устанавливаем 1 светодиод на цвет красный
    leds[i] = CHSV(hue++, 255, 255);
    // Показываем светодиоды
    FastLED.show();
    fadeall();
    // Ждём немного и повторяем цикл
    delay(10);
  }
}
//---------------------------------------------------------------------------------------------------
void loop() { 
  BrightnessCheck(); // Проверяем датчик
  DSTcheck(); // Проверяем режимы
  TimeAdjust(); // Проверяем время если сменилось на 1 цифру
  TimeToArray(); // Проверяем часы если сменилось на 1 цифру
  DenChisloToArray() ; // Проверяем дату
  detectTemperature(); // Проверяем температуру от датчика DS18b20
  TempToArray();  // температура
  FastLED.show(); // Задаём массив светодиодов
  if ( DenChisloShow == true) delay (5000); // время отображения числа и дня (5000 = 5 сек)
  if ( TempOutShow == true) delay (4000); // время отображения температуры на улице(5000 = 5 сек)
  if (TempShow == true) delay (5000); // время отображения температуры (5000 = 5 сек)
}

 

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

Код ковырять сейчас не досуг.
1. У меня сделан массив под 5 градусников. Это могут быть всё DS-ки или частично BMP .
2. Ещё сделан массив последовательности показа. Он дефолтно заполнен всеми возможными показами.
При включении происходит поиск доступных градусников, датчиков и часиков.
По результатам этого поиска этот массив последовательности показа корректируется (банятся отсутствующие датчики).
В этом же массиве пользователь может настраивать сколько секунд нужно показывать каждый параметр.
3. есть массив раскраски градусников, где пользователь может назначить цвета для каждого из пяти градусников

Ессно для настройки всей этой хрени нужна система менюшек и сохранения настроек, код которой занимает 2 тысячи строк ))

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

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

Gen.Aleks пишет:

Хорошо ладно 1й вопрос если сделать таймеры отображения одинаковыми пропадает температура отображения в комнате

у вас дата показывается. когда на часах 20 секунд, одна температура - когда на часах 25 секунд, а вторая - когда 30. И время показа у каждой - 5 секунд.

Стоит вашему коду чуть замешкаться. например если показ даты начнется не с начала 20-й секугды, а например в 20сек и 90 сотых - как одна или обе температуры могут не успеть.

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

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020

Ну я так и сделал просто я боюсь как бы это не отразилось на точности часов ведь этот градусник для правки точности часов. По этому хочу повесть датчик внутри часов как и на улице, но надо как то определять адреса датчиков. и по поводу точек они ходят через 2 секунды иногда с неравномерным периодом, хотя на точность часов не влияют но напрягает. Хочу сделать чтоб каждую секунду но будет наверно не равномерно. По моему они с часами ничего общего не имеют)).  

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

Gen.Aleks пишет:
они ходят через 2 секунды иногда с неравномерным периодом, хотя на точность часов не влияют но напрягает. Хочу сделать чтоб каждую секунду но будет наверно не равномерно. По моему они с часами ничего общего не имеют)). 
практика показала, что мигать точками особенно ночью это вообще не по фэншую. 
Когда конструируешь БОЛЬШИЕ электронные часы, возникает проблема:
Чем больше часы тем силнее скачек освещенности при смене показателей.
Следовательно надо мигать как можно реже, плавнее и сообразуясь с общей освещенностью.

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

Gen.Aleks пишет:

Ну я так и сделал просто я боюсь как бы это не отразилось на точности часов ведь этот градусник для правки точности часов.

Вы так и сделали? - где? в коде этого нет

Кроме того, непонятно, как чтение температуры с датчика может повлиять на точность кода...

 

 

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

b612 пишет:

Когда конструируешь БОЛЬШИЕ электронные часы, возникает проблема:
Чем больше часы тем силнее скачек освещенности при смене показателей.

это проблема кривых рук, не более. Откуда появится "скачок освещенности", если яркость показа всех режимов адаптирована по внешней освещенности?

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020

Это уже у меня 3ие часы двое других были наши цеховые Электроника 7. Я эти просто играючи сделал а с теми помучился. В них как и везде перестали светить неоновые лампочки а электроника исправна была , вот я её оставил а сегменты подсветил каждый 4мя светодиодами сегмент сделал из оргстекла сколько плат перетравил, блок питания и драйвера светодиодов сам сочинял, всё получилось сейчас по ним на работу и с работы идут . Есть конечно мечта сделать как эти часы но сделать чтобы ещё сирена срабатывала когда смена начнётся или обед с обеда и выход из цеха. А то у нас уже за секунды начали штрафовать кто раньше уйдёт.   

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

b707 пишет:
Откуда появится "скачок освещенности", если яркость показа всех режимов адаптирована по внешней освещенности?
согласен, наверно как-то можно
при смене допустим цифры 8 на 9, в тот же момент изменить яркость свечения
всех остальных светящихся сегментов так, чтобы компенсировать 1 пропадающий сегмент.
Хуже когда меняется например 1 на 2 . В прочем это тоже можно реализовать.
А когда меняется ЦВЕТ это вообще задница, потому, что скачек освещенности будет разным в разных интерьерах.

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020

b707 это для тебя:

if ( DenChisloShow == true) delay (5000); // время отображения числа и дня (5000 = 5 сек)
  if ( TempOutShow == true) delay (4000); // время отображения температуры на улице(5000 = 5 сек)
  if (TempShow == true) delay (5000); // время отображения температуры (5000 = 5 сек)
}

 

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

Gen.Aleks пишет:
сделать чтобы ещё сирена срабатывала когда смена начнётся или обед с обеда и выход из цеха
лучше курантовый бой
я в своих сделал
+ будильник
При этом обошелся даже безо всяких mp3 и SD

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020

b612 пишет:

b707 пишет:
Откуда появится "скачок освещенности", если яркость показа всех режимов адаптирована по внешней освещенности?
согласен, наверно как-то можно
при смене допустим цифры 8 на 9, в тот же момент изменить яркость свечения
всех остальных светящихся сегментов так, чтобы компенсировать 1 пропадающий сегмент.
Хуже когда меняется например 1 на 2 . В прочем это тоже можно реализовать.
А когда меняется ЦВЕТ это вообще задница, потому, что скачек освещенности будет разным в разных интерьерах.

Блок питания плохой.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Gen.Aleks пишет:

b707 это для тебя:

if ( DenChisloShow == true) delay (5000); // время отображения числа и дня (5000 = 5 сек)
  if ( TempOutShow == true) delay (4000); // время отображения температуры на улице(5000 = 5 сек)
  if (TempShow == true) delay (5000); // время отображения температуры (5000 = 5 сек)
}

 

Шыдевр. 

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

Gen.Aleks пишет:
Блок питания плохой.
были у меня в детстве часы с плохим блоком питания, так вот у них реально была реализована эта функция. Как больше сегментов загорается так яркость уменьшалась.
И не надо было никаких программных извращений )

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

Gen.Aleks пишет:
Блок питания плохой.
были у меня в детстве часы с плохим блоком питания, так вот у них реально была реализована эта функция. Как больше сегментов загорается так яркость уменьшалась.
И не надо было никаких программных извращений )

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

Gen.Aleks пишет:

b707 это для тебя:

if ( DenChisloShow == true) delay (5000); // время отображения числа и дня (5000 = 5 сек)
  if ( TempOutShow == true) delay (4000); // время отображения температуры на улице(5000 = 5 сек)
  if (TempShow == true) delay (5000); // время отображения температуры (5000 = 5 сек)
}

это не имеет ни малейшего отношения к тому. о чем я говорил

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

DetSimen пишет:
Шыдевр.
Так ему !
Ему такой кусок кода как кувалдой по причинному месту )))

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020

DetSimen пишет:

Gen.Aleks пишет:

b707 это для тебя:

if ( DenChisloShow == true) delay (5000); // время отображения числа и дня (5000 = 5 сек)
  if ( TempOutShow == true) delay (4000); // время отображения температуры на улице(5000 = 5 сек)
  if (TempShow == true) delay (5000); // время отображения температуры (5000 = 5 сек)
}

 

Шыдевр. 

А то))

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020

b707 пишет:

Gen.Aleks пишет:

b707 это для тебя:

if ( DenChisloShow == true) delay (5000); // время отображения числа и дня (5000 = 5 сек)
  if ( TempOutShow == true) delay (4000); // время отображения температуры на улице(5000 = 5 сек)
  if (TempShow == true) delay (5000); // время отображения температуры (5000 = 5 сек)
}

это не имеет ни малейшего отношения к тому. о чем я говорил

Но ведь работает. Температура не пропадает.

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

Gen.Aleks пишет:

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

добавить выход на сирену в определенное время - 3-5 строчек кода

мечтать надо о чем-то более высоком :)

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020

Начальство за ардуинку повесится. А за свой щёт покупать жалко))

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

Gen.Aleks пишет:
Начальство за ардуинку повесится. А за свой щёт покупать жалко))
суровая Челябинская действительность.
....И алкотестер на проходной.
 

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

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

размер 32х16, кроме времени нет абсолютно ничего, даже кнопок установки. Часы сами устанавливают время из интернета. Яркость автоматически подстраивается по датчику освещенности.

 

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020

У нас ещё не ввели только пластиковые пропуска. А на НЛМК давно уже дышат)).

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

Gen.Aleks пишет:

Но ведь работает. Температура не пропадает.

ну как хотите, я написал вам как сделать правильно, а дальше сами

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

Gen.Aleks пишет:

У нас ещё не ввели только пластиковые пропуска. А на НЛМК давно уже дышат)).

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

На руки и на ноги и чтобы током били если координаты рук удалились от координат ног.
Всё на ESP32-ых
И будет у вас их куча

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

Gen.Aleks пишет:

Начальство за ардуинку повесится. А за свой щёт покупать жалко))

100 рублей жалко? - а диоды в часы вам бесплатно выдали?

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020

b707 ты для меня авторитет не прирекаемый, каждое твоё предложение расходится на цитаты. Я понял что ты хотел сказать, но мне просто хочется чтобы информация лилась каскадом. Я сыну говорю сколько в комнате температуры и знаю что 23 тычку точек по 2 секунды, он мне минуты 2 ждал.  Ну так про адреса датчиков температуры, ни кто незнает как определять? Или покупать приблуду надо ещё одну.

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

тогда сделай показ по времени только даты. а температуры показывай после даты подряд не по времени, а по признаку DenChisloShow == true

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

 

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

Gen.Aleks пишет:
Или покупать приблуду надо ещё одну.

пример который идёт с библиотекой DallasTemperature

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 9

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

int numberOfDevices; // Number of temperature devices found

DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
  
  // Grab a count of devices on the wire
  numberOfDevices = sensors.getDeviceCount();
  
  // locate devices on the bus
  Serial.print("Locating devices...");
  
  Serial.print("Found ");
  Serial.print(numberOfDevices, DEC);
  Serial.println(" devices.");

  // report parasite power requirements
  Serial.print("Parasite power is: "); 
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");
  
  // Loop through each device, print out address
  for(int i=0;i<numberOfDevices; i++)
  {
    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i))
	{
		Serial.print("Found device ");
		Serial.print(i, DEC);
		Serial.print(" with address: ");
		printAddress(tempDeviceAddress);
		Serial.println();
		
		Serial.print("Setting resolution to ");
		Serial.println(TEMPERATURE_PRECISION, DEC);
		
		// set the resolution to TEMPERATURE_PRECISION bit (Each Dallas/Maxim device is capable of several different resolutions)
		sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION);
		
		 Serial.print("Resolution actually set to: ");
		Serial.print(sensors.getResolution(tempDeviceAddress), DEC); 
		Serial.println();
	}else{
		Serial.print("Found ghost device at ");
		Serial.print(i, DEC);
		Serial.print(" but could not detect address. Check power and cabling");
	}
  }

}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  // method 1 - slower
  //Serial.print("Temp C: ");
  //Serial.print(sensors.getTempC(deviceAddress));
  //Serial.print(" Temp F: ");
  //Serial.print(sensors.getTempF(deviceAddress)); // Makes a second call to getTempC and then converts to Fahrenheit

  // method 2 - faster
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Temp C: ");
  Serial.print(tempC);
  Serial.print(" Temp F: ");
  Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit
}

void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  
  
  // Loop through each device, print out temperature data
  for(int i=0;i<numberOfDevices; i++)
  {
    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i))
	{
		// Output the device ID
		Serial.print("Temperature for device: ");
		Serial.println(i,DEC);
		
		// It responds almost immediately. Let's print out the data
		printTemperature(tempDeviceAddress); // Use a simple function to print out the data
	} 
	//else ghost device! Check your power requirements and cabling
	
  }
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

 

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020

Диоды это от сетодиодных  ламп у которых сгорели драйверы. Я их феном выпаивал и припаивал вокруг матового оргстекла каждого сигмента. Я сейчас спешу попозже выложу фото.

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

Gen.Aleks пишет:

Ну так про адреса датчиков температуры, ни кто незнает как определять? Или покупать приблуду надо ещё одну.

приблуду-то зачем? Либо определяй адреса датчиков как в библиотеке, либо вешай датчики на разные пины, неужто у тебя в контроллере свободных пинов нет

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

Gen.Aleks пишет:

Диоды это от сетодиодных  ламп у которых сгорели драйверы. Я их феном выпаивал и припаивал вокруг матового оргстекла каждого сигмента. Я сейчас спешу попозже выложу фото.

Гена, заканчивай трындеть. ладно? этот код - на адрессных диодах. ну-ка ну-ка покажи. из каких таких ламп ты их выпаивал?

если вы тут с b612 собрались поболтать. обсудить как вам начальство 100 руб на ардуину не дает -  - то тогда без меня

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

b707 пишет:
свободных пинов нет
никаких пинов на вас не напасёшься

RX,TX как без них ?
гирлянда
4 кнопки
датчик движения
датчик света
SQ
градусник
реле
звук 1
BMP,RTC
2 ШИМа
и на прочие фантазии типа датчик жестов и СО2, остаётся всего 2 полноценных пина и 2 аналоговых входа

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

4 кнопки можно на 1 аналоговый вход повесить

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

DetSimen пишет:
4 кнопки можно на 1 аналоговый вход повесить
можно, но это ж обвеску городить..
Да и память в ардуинке уже полгода назад кончилась.

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020

Всё молчу. Согласен пустой звон. 

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020

Ребят спасибо за подсказку с библиотекой DallasTemperature что то про неё я совсем забыл.

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020

b707 пишет:

тогда сделай показ по времени только даты. а температуры показывай после даты подряд не по времени, а по признаку DenChisloShow == true

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

 

Я думал что у меня с датчика уличного код какой-то не правильный поменял время местами уличную и домашнюю температуру получается последнее показание секунду на что то тратится и то не всегда. Пока буду сочинять через == как-то организую 2 сообщения подряд. Но мне кажется это не поможет все равно какое-то сообщение последним будет. По этому рациональней думаю последним на короткое время сделаю год. Его каждый раз не надо, но жена захотела)).  

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020

А с адресами с температурных датчиков, тоже заморачиватся не буду, закажу с али-экспрес датчик температуры давления и влажности, а мой уличный датчик будет внутри часов, к стати брешит на градус где-то, вода на улице кашица появилась из кресталов а он ниже нуля не опускался решил вопрос легко t = temperature - 1; сейчас хочу с часовым термометром такой же фокус провернуть, тот брешит аш на 5 градусов наверно светодиоды нагрели хотя ночью греться будет меньше светодиоды еле горят. Ещё цвета не все с одинаковой яркостью горят красный меньше всего на самой маленькой яркости. Как бы откалибровать?

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

Хорошая тема для изобретания велосипедов.
Прикольно наблюдать как народ парится над тем, над чем ты парился несколько лет назад )
Перепаяй десяток проводочков под мою схему, и улучшай уже готовую прошивку.
Не надо будет тратить пару тройку лишних месяцев на делание рутинной работы.

Что интересно когда к делу относишься с умом, то практически вся работа
оказывается рутинной. 
Потому, что как правило оптимальное решение всегда одно на всех.

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

Gen.Alex, я вам дал рецепт решения. Он полностью рабочий. Вы же вместо этого городите какую-то ерунду

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020

b707 пишет:
Gen.Alex, я вам дал рецепт решения. Он полностью рабочий. Вы же вместо этого городите какую-то ерунду

Во первых не рабочий потому-что точки мигают по 2 секунды и не равномерно. Я добился чтобы считало секунды. 

Меня бесит когда секундная точка подтормаживает. Добился чтобы не подтормаживала и считала секунды вот так


//  Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 155  вместо 0155
int GetTime()
{
  tmElements_t Now;
  RTC.read(Now);
  int hour = Now.Hour;
  int minute = Now.Minute;
  int second = Now.Second;
  //if (time.seconds % 2 == 0)
  if ((millis() - vrem_izm) > period_izm) //Где long vrem_izm = 0; // Переменная для хранения времени последнего считывания с датчика
                                            //const int period_izm = 1000; // Определяем периодичность проверок
  
  {
    vrem_izm = millis();
    Dot = false;
  }
  else {
    Dot = true;
  }
  return (hour * 100 + minute);
}

 Конечно не секунды делит на чётные и не чётные, но за то работает по системному таймеру. переодичность взял из проверки датчика температуры. Мне кажется функция вызова секунд перегружена int second. 

   И во вторых не один Скетч не подходит потому что у меня нет датчика темпиратуры давления и влажности, я просто адаптирую под то что у меня есть. И то что вы сказали замешкался это же цифровая техника токого не должно быть. То появилась информация, то нет. 

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020

Там в микроконтроллере есть RC цепочка, кварц на ардуинке стоит, да ещё часы точного времени)), Это же Атомное время должно быть, супер точное.

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

b612 пишет:

Хорошая тема для изобретания велосипедов.
Прикольно наблюдать как народ парится над тем, над чем ты парился несколько лет назад )

Перепаяй десяток проводочков под мою схему, и улучшай уже готовую прошивку.

Не надо будет тратить пару тройку лишних месяцев на делание рутинной работы.

Что интересно когда к делу относишься с умом, то практически вся работа
оказывается рутинной. 
Потому, что как правило оптимальное решение всегда одно на всех.

b612 хватит пиарить свой код на хххх строк.

нормальный рабочий код лежит в посте #113 от d707 и всякие хотелки к нему легко приделываются. 

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020

oleg_kazakof пишет:

b612 пишет:

Хорошая тема для изобретания велосипедов.
Прикольно наблюдать как народ парится над тем, над чем ты парился несколько лет назад )

Перепаяй десяток проводочков под мою схему, и улучшай уже готовую прошивку.

Не надо будет тратить пару тройку лишних месяцев на делание рутинной работы.

Что интересно когда к делу относишься с умом, то практически вся работа
оказывается рутинной. 
Потому, что как правило оптимальное решение всегда одно на всех.

b612 хватит пиарить свой код на хххх строк.

нормальный рабочий код лежит в посте #113 от d707 и всякие хотелки к нему легко приделываются. 

Я не спорю может и Одиночка что на вертел, но скетч его очень похож и в заголовке он написал что b707 разработал. Вы иЗвените если чего я до этого проекта только читал скетчи. да и то от станков с ЧПУ и там другой язык. Там операнды логические +(это или), *(это и). Вообщем FMS3000.