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

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

AyuOX пишет:
Конечно замутите, например эмитацию пламени в камине из 5 лент по 24 диода, с простым кодом.
https://www.youtube.com/watch?v=GKJtHPJ6qag
Эмиттация пишется с двумя "т" ))
Нее это уже Гайвер сделал.

Есть ещё задумка музыкальный инструментик уровня губной гармошки, только с клавиатуркой
гармошечной или лучше баянной. С простеньким, но качественным приятным звуком.
Механически максимально простой, под возможность самостоятельного изготовления.
Ну и конечно на "дуньке"

AyuOX
AyuOX аватар
Offline
Зарегистрирован: 07.05.2019

b612 пишет:

AyuOX пишет:
Конечно замутите, например эмитацию пламени в камине из 5 лент по 24 диода, с простым кодом.
https://www.youtube.com/watch?v=GKJtHPJ6qag
Эмиттация пишется с двумя "т" ))

Нее это уже Гайвер сделал.

Есть ещё задумка музыкальный инструментик уровня губной гармошки, только с клавиатуркой
гармошечной или лучше баянной. С простеньким, но качественным приятным звуком.
Механически максимально простой, под возможность самостоятельного изготовления.
Ну и конечно на "дуньке"

Пусть будет с двумя т.

Гайвер сделал слишком сложно. Хотелось бы по проще.

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

b612 пишет:

я смотрю, вы скучаете.
Давайте что-нибудь замутим интересное.

у нас с вами интересы разные

Цитата:
Просто 707-ой не может поверить что даже достаточно простые часы могут потребовать достаточно большого кода. Он ведь его и в глаза не видел.

Так вы же не показываете. Присылайте - посмотрю.

Цитата:
Сейчас в часики добавлена фича "вантач таймер", автоинверсия кнопок и вариант с одним светиком на сегмент.

У вас на каждое число светиков в сегменте свой вариант? - Посмотрите в местном "наброске", как сделать общий код, не зависящий от числа диодов в сегменте.

 

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

b707 пишет:
У вас на каждое число светиков в сегменте свой вариант? - Посмотрите в местном "наброске", как сделать общий код, не зависящий от числа диодов в сегменте.
код конечно общий, но есть ньюансы.
Отображение плюса минуса буквы "Т" и значка градусов немножко по разному.
Я решаю это условной компиляцией. Просто прописываешь в начале кода нужную цифру и компилируешь.
Разных опций накопилось довольно много и если их все включить то не хватает памяти.
Приходится выбирать. В прочем все самые ништяковые ништяки умещаются.

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

AyuOX пишет:
Гайвер сделал слишком сложно. Хотелось бы по проще.
А здесь его библиотека вообще зачем ?
На сколько я знаю его фишка в экономии ОЗУ под массив светиков. Тут же светики можно параллелить. Оставить минимальные там 30 ячеек и делов.

 

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

AyuOX

В принципе тут перепаивать не много, чтобы опробовать мою прошивку.
1. Тут очередность разрядов наоборот
2. Очередность сегментов с левым поворотом, а у меня с правым.
3. Двоеточие тут вклинено а у меня после всех цифр
4. Гирлянда у меня не на 5-ом а на 6-ом пине.
Кнопки странным образом совпали. Часики и барометр вроде тоже.
и уже заработает 
А уж дополнительно припаять звук и датчик света это вообще 15 минут

PS У меня ещё есть вариант компиляции под схему от Mishany, так там как раз такой вариант табло.
Правда я не уверен, что тот вариант "заведётся" слишком много изменений было внесено с тех пор как мы его тестировали. Если интересно, можно оживить и без перепайки табла.

 

 

 

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

[quote=b612]ой

AyuOX
AyuOX аватар
Offline
Зарегистрирован: 07.05.2019

b612 пишет:

AyuOX

В принципе тут перепаивать не много, чтобы опробовать мою прошивку.
1. Тут очередность разрядов наоборот
2. Очередность сегментов с левым поворотом, а у меня с правым.
3. Двоеточие тут вклинено а у меня после всех цифр
4. Гирлянда у меня не на 5-ом а на 6-ом пине.
Кнопки странным образом совпали. Часики и барометр вроде тоже.
и уже заработает 
А уж дополнительно припаять звук и датчик света это вообще 15 минут

PS У меня ещё есть вариант компиляции под схему от Mishany, так там как раз такой вариант табло.
Правда я не уверен, что тот вариант "заведётся" слишком много изменений было внесено с тех пор как мы его тестировали. Если интересно, можно оживить и без перепайки табла.

 

 

 

Да дело не в перепайке. Свободных ардуинок нет, две сгорели, одна в часах работает ломать не буду, одна где то потерялась, дома посмотрел не нашел, вот с больничного на работу выйду там ещё посмотрю.

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

AyuOX пишет:
вот с больничного на работу выйду там ещё посмотрю.
да уж. у меня тоже был такой кризис месяц назад. Теперь ещё десяточек приехал и то уже кончается.

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

b612 пишет:

да уж. у меня тоже был такой кризис месяц назад. Теперь ещё десяточек приехал и то уже кончается.

у вас монтаж в том же стиле, что и код? :)

AyuOX
AyuOX аватар
Offline
Зарегистрирован: 07.05.2019

b707 пишет:

 

у вас монтаж в том же стиле, что и код? :)

У меня монтаж вообще полный пипец, код просто нервно курит в сторонке :)

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

AyuOX пишет:

У меня монтаж вообще полный пипец, код просто нервно курит в сторонке :)

с кодом, по вашим собственным признаниям, у вас вообще никак -  ккакой же тогда монтаж....???

Хотя... куча сожженных ардуинок вполне подтверждают ваши слова.

AyuOX
AyuOX аватар
Offline
Зарегистрирован: 07.05.2019

b707 пишет:

 

с кодом, по вашим собственным признаниям, у вас вообще никак -  ккакой же тогда монтаж....???

Хотя... куча сожженных ардуинок вполне подтверждают ваши слова.)

Ну да, программист из меня ещё тот. А гора ардуинок, из 2х штук, сама погорела, я не при делах:). Цветомузыка была, работала 3 месяца, потом включаю, а она не горит.

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

AyuOX пишет:

Цветомузыка была, работала 3 месяца, потом включаю, а она не горит.

Гайвер? :))

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

b707 пишет:
у вас монтаж в том же стиле, что и код? :)
нее код чуток получше
Монтаж можете полюбоваться, где-то на ютубе есть ссылки.
Но всё ништяк работает, не дохнет и не рассыпается.
А дуньки действительно дохнут изредка при прошивке и даже разок попалась мертворожденная.
У меня пара "нано" тоже в мусоре лежит.

А у Вас, если не секрет, какие интересы ?

AyuOX
AyuOX аватар
Offline
Зарегистрирован: 07.05.2019

b707 пишет:

 

Гайвер? :))

Да, его код. Я думаю он многих людей заинтересовал ардуинкой. Понятно объясняет. Вот хочу бумеранг как у него сделать, детская мечта.

AyuOX
AyuOX аватар
Offline
Зарегистрирован: 07.05.2019

b612 пишет:

А у Вас, если не секрет, какие интересы ?

Я на досуге цуцунгели изготавливаю:).

Интересное занятие, очень увлекает:).

 

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

AyuOX пишет:

Я на досуге цуцунгели изготавливаю:).

Интересное занятие, очень увлекает:).

А что это такое, первый раз слышу?

qusha3323
Offline
Зарегистрирован: 12.02.2020

Добрый вечер.

Тема еще актуальна? 

Собрал часики по 2 диода на сегмент, температура с DHT11. Работает, но иногда проскакивают странности. (Завтра выложу видео в надежде на толчок в нужном направлении.)

Сейчас еще хочу добавить дублирование кнопок с ИК-пульта, т.к. часы будут висеть на стене (логично), чтобы можно было менять цвета/время/выводить температуру прямо с рабочего места.

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

Сам ардуинкой начал увлекаться с лета, пытаюсь кодить, но пока с трудом. Зато есть база радиоэлектроники, не зря учился.

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

qusha3323 пишет:

Собрал часики по 2 диода на сегмент

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

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020
Не получается вывести дату в формате день недели тире число месяца. У меня получается 6-62 вместо 5-03.
Мой первый проект с ардуино. Не магу разобратся с библиотекой как её применять. 
С датчиком наружней темпиратуры получилось, всё показывает правильно.
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

код вставь правильно. 

и, если это твой первый проект, возьми для начала проект попроще

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

Gen.Aleks пишет:

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

 

это просто ЛОЛ - уже на каждую кнопку видео снимать надо? - в "Песочнице" есть прикрепленная тема для новичков, там и про код, и про картинки. читайте

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

не-а. не угадали. Пробуйте еще.

а если серьезно - неужели так трудно прочитать две странички правил?

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

b707 пишет:

а если серьезно - неужели так трудно прочитать две странички правил?

Он из  "визуалов", нихрена не догоняет без мультиков. 

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

b707 Уже читаю ща попробую. меня интерисует место где я вызываю из библиотеки день недели и число месяца. что я сделал не так. Библиотека конечно другаяя, но она больше расписана может её тоже выложить или как вызвать из родной библиотеки. Хотя вызывал ничего не получилось. С новой библиотекой   #include <RTC.h> в монеторе порта пишет правильно всё а у меня 6-62 вместо 5-03.

 

#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 lastUpdateTime = 0; // Переменная для хранения времени последнего считывания с датчика
  // long lastUpdateden = 0; //Последнее время считывание  даты
  const int TEMP_UPDATE_TIME = 1000; // Определяем периодичность проверок
 // const int TEMP_UPDATE_DEN = 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()
              {
    int d = time.gettime("d");
    delay(100);
     int n = time.gettime("w");
     delay(100);
         tmElements_t tm;
      RTC.read(tm);
        if (tm.Second != 20)
        {
    DenChisloShow = false;
            return;
        }
    DenChisloShow = true;
        int den = d;
        BrightDots(0);  //разделительные мигающие точки выключены
       int digit = den % 10;
       BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));    //  3й блок десятки дней
       den /= 10;
        digit = den % 10;
       BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    //  4й блок единицы дней
       BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //  2й блок вывода знака "-"
       int 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() - lastUpdateTime > TEMP_UPDATE_TIME)
           {
 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 (TempShow == true) delay (5000); // время отображения температуры (3000 = 3 сек)
  if ( TempOutShow == true) delay (5000); // время отображения температуры (3000 = 3 сек)
  if ( DenChisloShow == true) delay (5000); // время отображения температуры (3000 = 3 сек)
}

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

вот ссылка на архив библиотеки которой пользовался в скетче https://yadi.sk/d/5CtH9CkQ0lhQ_g

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

Gen.Aleks пишет:

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

укажите номера строк, где вы это делаете

Цитата:
С новой библиотекой   #include <RTC.h> в монеторе порта пишет правильно всё а у меня 6-62 вместо 5-03.

покажите в коде. где у вас "в монеторе пишет правильно"

 

 

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

 

покажите в коде. где у вас "в монеторе пишет правильно"

 

 

[/quote]

Вот скетч который правильно пишет дату и день недели. Когда  я прописываю в программе Serial.println(time.gettime("d-m-Y, H:i:s, D")) у меня в монеторе ни чего не пишет, может я сделал ошибку не поставил кавычки "w" или вызов в порт надо ставить в loop

#include <RTC.h>
RTC	time;

void setup() {
	delay(300);
	Serial.begin(9600);
//	инициализация модуля RTC
	time.begin(RTC_DS3231);			// на базе чипа DS3231						модуль подключается к аппаратным выводам I2C
//	time.begin(RTC_DS1307);			// на базе чипа DS1307						модуль подключается к аппаратным выводам I2C
//	time.begin(RTC_DS1302,10,13,12);	// на базе чипа DS1302, вывод RST, вывод CLK, вывод DAT		доступны любые выводы

//	запись даты и времени
//	time.settime(0,17,15,1,10,15,4);	// 0  сек, 17 мин, 15 час, 1, октября, 2015 года, четверг
//	time.settime(35,10,20);			// 35 сек, 10 мин, 20 час, дату оставить без изменений
//	time.settime(-1,-1,-1,31,12,15);	// 31, декабря, 2015 года, время и день недели оставить без изменений
}

void loop(){
	if(millis()%1000==0){ // если прошла 1 секунда
	  Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время
	  delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
	}
}

//	ОПИСАНИЯ ПАРАМЕТРОВ ФУНКЦИЙ:
//
//	в библиотеке реализованы 4 функции: begin, settime, gettime и period.
//	функция begin вызывается первой и предназначена для инициализации модуля, выбора шины, и выводов arduino
//	количество и порядок вызовов функций settime, gettime и period, значения не имеет.
//
//	инициализация модуля
//	time.begin(название, RST или SS, CLK, DAT) если модуль работает на шине I2C или SPI, то достаточно указать только название модуля, например: time.begin(RTC_DS3231);
//						   если модуль работает на шине SPI, а аппаратный вывод SS занят, то номер назначенного вывода SS для модуля указывается вторым параметром, например: time.begin(RTC_DS1305,22);
//						   если модуль работает на трехпроводной шине, то указываются номера всех выводов, например: time.begin(RTC_DS1302, 1, 2, 3); // RST, CLK, DAT
//	запись даты и времени
//	time.settime(сек,мин,час,д,м,г,дн)	   должен присутствовать хотябы 1 параметр
//						   часы указываются в 24-часовом формате, год указывается от 0 до 99, день недели указывается числом: 1-ПН, 2-ВТ, ... 6-СБ, 0-ВС.
//						   если предыдущий(ие) параметр(ы) надо оставить без изменений, то указывается отрицательное значение
//	чтение даты и времени
//	time.gettime("строка с параметрами")	   функция получает и выводит строку заменяя описанные ниже символы на текущее время
//						   указанные символы эдентичны символам для функции date() в PHP
//						s  секунды                       от      00    до       59  (два знака)
//						i  минуты                        от      00    до       59  (два знака)
//						h  часы в 12-часовом формате     от      01    до       12  (два знака)
//						H  часы в 24-часовом формате     от      00    до       23  (два знака)
//						d  день месяца                   от      01    до       31  (два знака)
//						w  день недели                   от       0    до        6  (один знак: 0-воскресенье, 6-суббота)
//						D  день недели наименование      от     Mon    до      Sun  (три знака: Mon Tue Wed Thu Fri Sat Sun)
//						m  месяц                         от      01    до       12  (два знака)
//						M  месяц наименование            от     Jan    до      Dec  (три знака: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
//						Y  год                           от    2000    до     2099  (четыре знака)
//						y  год                           от      00    до       99  (два знака)
//						a  полдень                               am   или       pm  (два знака, в нижнем регистре)
//						A  полдень                               AM   или       PM  (два знака, в верхнем регистре)
//						   строка не должна превышать 50 символов
//						   пример: gettime("d-m-Y, H:i:s, D"); ответит строкой "01-10-2015, 14:00:05, Thu"
//						   пример: gettime("s");               ответит строкой "05"
//	чтение даты и времени в виде цифр
//	time.gettime()				   без параметра
//						   результат читается из переменных:
//						time.seconds  секунды     0-59
//						time.minutes  минуты      0-59
//						time.hours    часы        1-12
//						time.Hours    часы        0-23
//						time.midday   полдень     0-1 (0-am, 1-pm)
//						time.day      день месяца 1-31
//						time.weekday  день недели 0-6 (1-понедельник, 6-суббота, 0-воскресенье)
//						time.month    месяц       1-12
//						time.year     год         0-99
//	не обязательная функция
//	time.period(минуты)			   указывает минимальный период чтения времени из модуля в минутах. (от 1 до 255 минут)
//						   пример:
//						   если после вызова функции time.period(5); в течении 5 минут несколько раз была вызвана функция gettime,
//						   то запрос времени к модулю пройдёт только в первый раз, а ответом на все остальные вызовы функции gettime
//						   будет результат последнего полученного от модуля времени + время прошедшее с этого запроса
//						   уменьшение числа запросов уменьшает время обработки запросов, разгружает шину, и уменьшает потребляемый модулем ток
//						   при отсутствии вызова функции time.period(минуты), ответ на запрос даты и времени будет всегда читаться из модуля

 

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

Gen.Aleks пишет:

Вот скетч который правильно пишет дату и день недели.

а вы в этом коде комментарии читать пробовали? - они ж там как раз для обучения новичков вставлены! И там в комментариях написано, что выдает каждый метод библиотеки. Строка 40 -

time.gettime("строка с параметрами")	  -  функция получает и выводит строку ...

 "выводит СТРОКУ" - понятно? - а вы эту строку в число запихиваете...

Дальше продолжать? или может сами догадаетесь? - читайте внимательнее описание формата в этом файле, там есть и как число и день недели получить в числовом формате, а не в строчном.

 

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

Сейчас попробую с первоначальной библиотекой, но там во первых часы другие #include <DS3232RTC.h> а у меня DS3231 и там помоему нет дня недели. Часы сейчас вставлены в компьютер, сейчас можно и пробовать. Ещё пока не забыл в вашем скетче после прошивка ярко вспыхивают светодиоды наверно на полную яркость 255 потом гаснут наверно это не слишком хорошо светодиодам.

Ага сейчас принял сообщение, что не правильно строку вывел, я и цифру выводил, но наверно каряво ща, ещё напишу.   

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

Gen.Aleks пишет:

Сейчас попробую с первоначальной библиотекой

зачем? - все отлично можно сделать и в этой. читайте внимательнее описание

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020
// Функция вывода даты
  void DenChisloToArray()
              {
    int d = time.gettime();
    delay(100);
     int n = time.gettime();
     delay(100);
         tmElements_t tm;
      RTC.read(tm);
        if (tm.Second != 20)
        {
    DenChisloShow = false;
            return;
        }
    DenChisloShow = true;
        time.day = d;
        BrightDots(0);  //разделительные мигающие точки выключены
       int digit = time.day % 10;
       BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));    //  3й блок десятки дней
       time.day /= 10;
        digit = time.day % 10;
       BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    //  4й блок единицы дней
       BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //  2й блок вывода знака "-"
       time.weekday = n;
       digit = time.weekday % 10;
        BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  //  1й блок день недели
                   
           
           }

Так пойдёт или промежуточную переменную вводить.

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

Там в часиках(которые 3231) ещё градусник есть, правда врёт маленько, прибавляет примерно на 1 градус.
И ещё поговаривают, что на них можно детектор нечистой силы реализовать
если сравнивать сигнал на выходе SQ с собственным дуинькиным кварцем или со вторыми такими же часиками.

 

 

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

Вот такой вариант выдал 5-30 вместо 5-03 Уже лучше )).

// Функция вывода даты
  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 * 14));    //  3й блок десятки дней
       den /= 10;
        digit = den % 10;
       BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    //  4й блок единицы дней
       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й блок день недели
                   
           
           }

  


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

b612 пишет:

Там в часиках(которые 3231) ещё градусник есть, правда врёт маленько, прибавляет примерно на 1 градус.
И ещё поговаривают, что на них можно детектор нечистой силы реализовать
если сравнивать сигнал на выходе SQ с собственным дуинькиным кварцем или со вторыми такими же часиками.

 

 

Термометр в часах что надо даже не хочу трогать. Мне точность не нужна. в разных местах комнаты разная темпиратура.

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

Ну что пока цифры поменял местами дальше посмотрим завтра что отобразится. Респект и уважуха  b707 Спасибо тебе Привет из Липецка.

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

Gen.Aleks пишет:

Вот такой вариант выдал 5-30 вместо 5-03 Уже лучше )).

советую сесть и подумать. что делают строки 20, 22 и 23

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

Gen.Aleks пишет:

Ну что пока цифры поменял местами дальше посмотрим завтра что отобразится. Респект и уважуха  b707 Спасибо тебе Привет из Липецка.

не надо цифры менять, разберитесь с математическими операциями - там в математике ошибка

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

b707 пишет:

Gen.Aleks пишет:

Ну что пока цифры поменял местами дальше посмотрим завтра что отобразится. Респект и уважуха  b707 Спасибо тебе Привет из Липецка.

не надо цифры менять, разберитесь с математическими операциями - там в математике ошибка

я про эти цифры и так хотел спросить, но стеснялся. Вы где-то на форуме разъясняли о % 10, это перестановка на одну цифру, ну как бы единицы, если ещё % 10, это будут десятки, а вот  /= 10 это не понятно хотя при изучении программирования AVR это знак похоже инверсии, но как он сдесь работает не могу представить.

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

Gen.Aleks -  "/" и "%" - обычные операции деления и взятия остатка, стандартные для языка Си... а так же Явы, Перла и многих других ЯВУ.

Прочитать о них можно в любом учебнике, в том числе и в гугле

Gen.Aleks
Offline
Зарегистрирован: 03.04.2020
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й блок вывода первого символа

Ну вот твой код темпиратуры работает правильно, а у меня косорукого теже букавки не работают переставляют 3 и 0 местами в чём подвох? 

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

Gen.Aleks пишет:
Ну вот твой код темпиратуры работает правильно, а у меня косорукого теже букавки не работают переставляют 3 и 0 местами в чём подвох? 

Алекс, вы вообще читаете, что я вам пишу?  вы про операторы % и / прочитали? - какие мысли?

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

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

b707

Всё разобрался я цифры не те обрабатывал вот что получилось, всё работает как надо. Спасибо хороший человек

// Функция вывода даты
  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й блок день недели
                   
           
           }

 

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

А про % это 7 % 5 = 2 то есть возвращает  остаток. А /- деление это делит 7 / 5 = 1 возвращает 1 а остаток убирает потому-что int.

А вот х / = 10 то же наверно делит х на 10 и присваивает х десятки. И поэтому моя ошибка была я потерял ориентацию))) не понял с чем работаю. Поэтому где тут тебе B707 лайк поставить)). Какой форум тяжёлый приходит письмо по ссылке переходишь попадаешь неизвестно куда пока найдёшь пока напишешь сто лет пройдёт. А вообще меня зовут Геннадий Алексеевич  можно просто Гена без всяких там генацвали и т.д. 

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

b707]</p> <p>[quote=Gen.Aleks пишет:

 

time.gettime("строка с параметрами")	  -  функция получает и выводит строку ...

 "выводит СТРОКУ" - понятно? - а вы эту строку в число запихиваете...

 

У меня не скромный вопрос. Если напрягает, перенаправте где новичкам ответят безо всяких. Если имею дело со строкой. но вызываю один параметр например "w" чем цифра отличается от строки цыфр.  

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

Gen.Aleks пишет:

чем цифра отличается от строки цыфр.  

Вы что-нибудь о таблице ASCII слышали? Каждый символ - буквы. цифры. знаки препинания - кодируется в компьютере каким-то кодом. Например латинской букве 'a' соответвует код 65, пробелу - 32, а цифре 0 - 48.

таким образом, если у вас из порта приходит байт 49, то если прочитать его как число - то и будет 49, а если прочитать как символ - будет '1'

Если у вас команда возвращает дату в виде строки. например "15" - то когда вы ее читаете в числовую переменную, как у вас в коде - возникает две ошибки.

во-первых - в строке "15" два символа, а читаете вы их в одну переменную, поэтому туда читается только первый символ '1'

во-вторых - поскольку '1' это символ, то при чтении в числовую переменную читаетсе не единица. а ее код ASCII - то есть в результате вы вместо "15" получаете 49

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

Gen.Aleks пишет:

У меня не скромный вопрос. Если напрягает, перенаправте где новичкам ответят безо всяких. Если имею дело со строкой. но вызываю один параметр например "w" чем цифра отличается от строки цыфр.  

Вообще-то вопрос, ответ на который содержится в ЛЮБОМ учебнике по программированию, на любом программистском форуме считается дурным тоном.

Прочитайте же, наконец, учебник!

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

Не буду больше ученические вопросы задавать и тратить ваше время. Задам как пользователь скетча который лежал в открытом доступе. И к тому же вы писали что за меня никто писать не будет. Короче вопрос такой на часах прописаны задержки вот такие:

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

когда было по 5 секунд задержки пропадала опрос температуры в помещении (причём с начала было нормально), мне пришлось уменьшить время отображения уличной температуры вроде стало нормально но чувствуется гуляет время, между уличной и домашней температурой то появятся часы то нет. вот скетч опроса уличной температуры:

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

 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й блок вывода знака "-"
           }
           
           }
           

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