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

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

Gen.Aleks - как же вы говорите, что мой рецепт "не работает" - когда вы его не пробовали? :)  Я ведь вам как сказал? - вариант 1)разнесите показ температур и даты каждый отдельно, а между ними сделайте показ времени. Чтобы было понятно - покажите дату на 5 секунд, потом обычные часы на 10 секунд. Потом покажите температуру на 5 секунд - и снова время на 10 секунд. Потом так же третью температуру. И ничего не будет накладываться.

Есть еще вариант - показывайте дату и обе темпетаруры в одной процедуре.

Вы что-нибудь из этого пробовали? - нет! а пишете "не работает"

 

 

И насчет кода . Исходный код не мой. Я в этой ветке появился только на второй или третьей странице. Я лишь помог сделать код чуть менее кривым. 

Этот код - плод коллективного творчества. Каждый следующий приходящий в эту ветку стремится затащить в код все новые и новые "полезности" - с его точки зрения. В начальном коде было только время и одна температура. теперь тут и дата. и куча датчиков. и давление и влажность... а один даже меню хотел вставить с кучей функций :) Естесственно, это сказывается на работоспособности :) Я не лезу в эти фантазии и не берусь править код, когда меня не просят - хотя я вижу в нем кучу "узких мест", которые дают такие следсвия. как подтормаживания точек.

В конце концов. у каждого своя голова.

 

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

Gen.Aleks пишет:

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

по крайней мере с уличным термометром так делать нельзя. температура в минус уходит и теплее -1 не будет))

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

Таймер на точки тоже свой пришлось делать

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

b707 пишет:

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

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

 

 Слеплять вместе и так и сяк пробовал не плучается, в дипрессию скетч уходит)).

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

 

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

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

по поводу вычисления времени проверки температур я сделал как в примере без delay предложили, обойтись якобы так лутчай)). 

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

Gen.Aleks - как же вы говорите, что мой рецепт "не работает" - когда вы его не пробовали? :)  Я ведь вам как сказал? - вариант 1)разнесите показ температур и даты каждый отдельно, а между ними сделайте показ времени. Чтобы было понятно - покажите дату на 5 секунд, потом обычные часы на 10 секунд. Потом покажите температуру на 5 секунд - и снова время на 10 секунд. Потом так же третью температуру. И ничего не будет накладываться.

Самое главное нет опорной точки отсчёта: Закажешь через 10 секунд он через 20 по 2с морганием точек включится. Вообщем это мой самый лучший вариант точки мигают как камертон вся информация уличная домашняя температура, день недели, число, месяц, год, между информициями помежуток секунда во время которого иногда появляется время- это единственный минус который мне не удалось ещё победить. Наверно есть способ через массив как то сделать, но что то не найду.

#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), чем больше - тем медленнее меняется яркость
#define s 4000                 //Время отображения информации
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_izm = 0; // Переменная для хранения времени последнего считывания с датчика
   long vrem1 = 0;
  const int period_izm = 1000; // Определяем периодичность проверок
  const int per1 = 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;
bool MesGodShow = 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 (time.seconds % 2 == 0)
  if ((millis() - vrem1) > per1) //Где long vrem_izm = 0; // Переменная для хранения времени последнего считывания с датчика
                                            //const int period_izm = 1000; // Определяем периодичность проверок
  
  {
    vrem1 = millis();
    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 detectTemperature()
         {
 byte data[2]; // Место для значения температуры
 ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
 ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство 
 ds.write(0x44); //Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память
 if (millis() - vrem_izm > period_izm)
           {
  vrem_izm = 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 != 30) 
             {
    TempOutShow = false;
    return;
             };
    TempOutShow = true;
   int t = temperature;
                      
    BrightDots(0);  //разделительные мигающие точки выключены
         if (t >= 0) // температура положительная 
           {
  BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14));    // знак градус (*) 3й блок
  BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    // знак Цельсия (*) 4й блок
  int digit = t % 10; //пример: 24 % 10 остаток 4 - это единицы темпиратуры
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));   // 2 блок единицы градуса 
  t /= 10; // тоже самое, но получаем десятки темпиратуры
  digit = t % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  //  1й блок вывода первого символаo
           }
         else  if  (t < 0)             // температура отрицательная
           {Tout1 = abs(t); // //преобразование отрицательного числа в положительное
          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 != 35) 
         {
    TempShow = false;
    return;
         }
  TempShow = true;
  int t = RTC.temperature();
  int celsius = (t / 4.0)-5;
  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й блок вывода первого символа
         };
                                                              // Функция вывода ДЕНЬ ЧИСЛО
                                                              //**************************************
  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 != 40)
        {
    DenChisloShow = false;
            return;
        }
    DenChisloShow = true;
        BrightDots(0);  //разделительные мигающие точки выключены
        den = d;
     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 MesGodToArray(){
     time.gettime();
   int m = time.month;
    delay(100);
      time.gettime();
  int g = time.year;
     delay(100);
         tmElements_t tm;
      RTC.read(tm);
        if (tm.Second != 45)
        {
    MesGodShow = false;
            return;
        }
    MesGodShow = true;
        BrightDots(0);  //разделительные мигающие точки выключены
       int god = g;
     int  digit = god % 10;
       BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    //  4й блок единицы года
       god /= 10;
       digit = god % 10;
       BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));    //  3й блок десятки года
      int mes = m;
       digit = mes % 10;
       BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //  2й блок вывода единиц месяца
       mes /= 10;
       digit = mes % 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 цифру
  detectTemperature(); // Проверяем температуру от датчика DS18b20
  TempToArray();  // температура в помещении
  DenChisloToArray() ; // Проверяем день и число
  MesGodToArray(); // Проверяем месяц и год
  FastLED.show(); // Задаём массив светодиодов
  if (TempShow == true) delay (s); // время отображения температуры
   
  if ( TempOutShow == true) delay (s); // время отображения температуры на улице
  
  if ( DenChisloShow == true) delay (s); // время отображения числа и дня 
  
  if ( MesGodShow == true) delay (s); //время отображения месяц и год
  
}

  

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

Такое впечатление сам с собой разговариваю)). Пошёл дела делать.

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

Gen.Aleks пишет:

Такое впечатление сам с собой разговариваю)).

так и есть - сами себя цитируете, себе же и отвечаете :) шутка.

Если серьезно - не все пенсионеры. некоторые работают. Пока только мельком посмотрел код и вижу что вы опять  не х... нифига не поняли. Неужели так непонятно обьясняю?

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

b707 скажи пожалуйста где по человечески (по русски) описаны вот эти строки в библиотеке:

tmElements_t tm;

  RTC.read(tm);
  if (tm.Second != 35)
b612
Offline
Зарегистрирован: 12.03.2017

У RTC-шек есть аппаратный выход SQ
Его можно настроить на выдачу секундных импульсов. Его и дублировать на светики.
Только нужно убрать из кода все delay-и.

У меня так было сделано пока я не сделал
так, чтобы контроллер считал миллисекунды самостоятельно и раз в 1000 
своих миллисекунд читает время из RTC-хи.
А вызвано это было тем, что с завода RTC-ха вообще не тикает и по этому программу нельзя привязывать к её тиканью.
Если RTC-ха вообще не припаяна, то мой скетч прекрасно обходится и без неё, правда точность ощутимо похуже.

 

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

Gen.Aleks пишет:

b707 скажи пожалуйста где по человечески (по русски) описаны вот эти строки в библиотеке:

не знаю, никогда не интересовался. Попробуй вбить в гугль название библиотеки - вот оно указано в заголовке скетча:

#include <RTC.h>

В гугле точно найдешь исходный код либы, возможно там и описание есть. Или может гугль тебе найдет какую-то статью по использованию этого кода. Но только с вероятностью процентов в 90 это будет на английском. В программировании без английского никуда. А для незнающих человеческий язык (английский) есть гуглопереводчик

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

Ребят всю ночь считал секунды. У меня точки вспыхивают через  const int per1 = 1000; должна быть секунда, у меня после информации точки вспыхивают 32 раза на 33 идёт заново информация. Информация отображается 20 секунд (по 5 секунд на блок) 33+20=53 секунды где ещё 8 секунд них_рена себе замешкался. Хотя часы идут точно. может конфликт библиотек, у меня часы DS3231 , а в скетче аш три библиотеки часов 

#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>

Хотел избавится от библиотеки #include <DS3232RTC.h> изругнулся скетч типа ардуино нано чо-то-там  с регистрацией. Ну вообщем тёмный лес. Эта библиотека со скетчем шла я чтото боюсь что работать не будет. А с новой библиотекой такую красоту не сделаю)).

По этому я спросил про строки:

tmElements_t tm;

RTC.read(tm);

В библиотеке #include <RTC.h> я чтото не нашёл tmElements_t tm;

Или в скетче написать на какой частоте работает ардуино нано  это наверное вернее будет. Автоматически не определяет.

 

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

Gen.Aleks пишет:

Или в скетче написать на какой частоте работает ардуино нано  это наверное вернее будет. Автоматически не определяет.

отвечу на это - остальное какой-то бред. разбираться не буду.

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

 

 

А теперь в общем. Можно не читать. Наболело!

Мужики! Почему вы все уверены. что сможете поправить чужой код, ничего не смысля в программировании? Наверно единственный человек за всю эту ветку. который по-настоящему разобрался в коде, задавал умные вопросы и в итоге создал грамотный скетч - это Одиночка. Все остальные либо добавляли в код свои ошибки. либо просто вопили "Помогите!".

Не умеете программировать - берите готовый код. например от Одиночки. Считаете, что он вам не подходит и вы можете лучше - так разбирайтесь и правьте сами! А сейчас получается - "я хочу сделать часы, готовый код меня не устраивает, у меня такого-то датчика нет... программирование не знаю и учиться не хочу... " ... и начинаем задавать бесконечные тупые вопросы в ветке и "выдавать на гора" все более и более кривые версии кода, засоряя ветку и создавая проблемы для тех, кто потом захочет это повторить.

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

Все, в эту ветку больше заходить не хочу.

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

Ребят требуется помощь зала)). Я сделал мигание точек вот так per1=1000.

получается после четырёх отображений информации по 5 сек.=20 сек. Остаётся 40 секунд. Как сделал b707 между информации 22 сек. 

(мигании точек). Как я сделал 33 сек. но это мало надо 40, изменение периода per1=1000 увеличить можно, но уменьшить нельзя после 

 per1 = 800 отображение точек совсем прекращается. Может здесь что-то изменить: if ((millis() - vrem1) > per1)

//  Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 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)
  if ((millis() - vrem1) > per1) 
  
  {
    vrem1 = millis();
    Dot = false;
  }
  else {
    Dot = true;
  }
  return (hour * 100 + minute);
}

 

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

Gen.Aleks пишет:

Ребят всю ночь считал секунды. У меня точки вспыхивают через  const int per1 = 1000; должна быть секунда, у меня после информации точки вспыхивают 32 раза на 33 идёт заново информация. Информация отображается 20 секунд (по 5 секунд на блок) 33+20=53 секунды где ещё 8 секунд них_рена себе замешкался. Хотя часы идут точно. может конфликт библиотек, у меня часы DS3231 , а в скетче аш три библиотеки часов

достаточно вот этого

#include <DS3232RTC.h> // для работы с модулем часов реального времени
#include <TimeLib.h> // для работы с самим временем 

не нужно в пределах одного цикла несколько раз вызывать millis();
лучше это делать один раз и значение хранить в глобальной переменной
вот так

void loop() { // главный цикл
  //застолбим время
  LooperTime = millis();

основной цикл должен вращаться максимально быстро
в идеале не более 1мсек на проход,
в нём не должно быть никаких тормозов типа delay.
Забудьте вообще эту команду, как плохой сон.
Первым делом в цикле проверяем не сменилась ли миллисекунда

 
 if (oldMillis != *ptrMillis8) {
    oldMillis = *ptrMillis8;
    mSekunda = true; //Флажок, что миллисекунда новая
  };

таким же образом формируем флажки для каждых 30мс для обзона кнопок

  if (uint8_t(*ptrMillis8 - oldMillis32) >= 32) { //30Гц //midi(),Klesh
      oldMillis32 = oldMillis32 + 32;
      millis30=true;
  }  

так же формируем флажки для полусекунд и секунд 

    if (uint16_t(*ptrMillis16 - oldMillis500) >= 500) { //Polsekundy
      oldMillis500 = oldMillis500 + 500;
      Polsekundy = true;
      if (uint16_t(*ptrMillis16 - oldMillis1000) >= 1000) { //Sekunda, Vremya_el ...
        Sekunda = true;
        while (uint16_t(*ptrMillis16 - oldMillis1000) >= 1000) { //Sekunda, Vremya_el ...
          //здесь сделано +1000  а не =*ptrMillis16
          //чтобы если мы гдето прзвенели прощелкали секунду
          //чтобы исполнились все события, за прощелканые секунды
          oldMillis1000 = oldMillis1000 + 1000;
          PoluchitVremya();

И дальше с готовыми флажками и считанным временем уже решаем
какие процедурки вызывать

в конце цикла все флажки надо сбросить

  Polsekundy = false;
  Sekunda = false;
  mSekunda = false;
  millis30 =false;

Можно для этих целей воспользовать библу "Timer master"

она сама вызывает нужные вам подпрограммы с заданными интервалами
ЗЫ не обращайте внимание на звёздочки *ptrMillis8
можете заменить эти выражения на LooperTime

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

b707 специально для тебя замерил время отображения информации секундомером, она составляет 4,46 с. + реакция на  нажатие кнопки 

и так 4 информации 20 с при чём здесь делаи. Точки привязаны к часам в моём скетче были. Сейчас я пытаюсь привязать к счётчику. 

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

К стати о моих хотелках, я хотел сделать чтобы точки отображались с секундомером, номер не удался отображается число в момент проверки(к стати время включения информации о секундах соответствует времени через сколько должна включится информация, это ещё раз доказывает что делаи не причём) и 4 секунды не считает. 

И вторая, кнопка которая при работающих секундах обнуляет их (останавливает часы) и при отпускании кнопки запускает это при колибровке пригодилось-бы (Как на часах Электроника-7)    

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

Gen.Alex, цитата из вашего кода:

#define s 4000

Вы хоть понимаете, что она делает?

Вы идиот? Нафига пишете в код строки, в которых ни черта не понимаете?

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

b707 пишет:
Gen.Alex, цитата из вашего кода: #define s 4000 Вы идиот? Нафига пишете в код строки, в которых ни черта не понимаете?
Зачем столько эмоций ? Видно же что человек совсем новичок.
Надо просто объяснить, что дефайн это замена одной строки на другую, более выразительную по внешнему виду.
В данном случае безликая строка "4000" заменяется на почти столь же безликую букву "s"
Да к тому же такая простая буква может запросто пересечься с какой-нибудь переменной  с именем "s".
 

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

B612, а вы то сами понимаете что эта строка делает? Что-то я начинаю сомневаться:)
Человек не просто новичок, а тупой ленивый неуч. Он лезет править код, абсолютно не вникая, что он значит, а на все отсылки хоть что-то почитать - огрызается.

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

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

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

В данном случае желание общаться пропадает в первую очередь у меня.

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

b612 пишет:

Gen.Aleks пишет:

Ребят всю ночь считал секунды. У меня точки вспыхивают через  const int per1 = 1000; должна быть секунда, у меня после информации точки вспыхивают 32 раза на 33 идёт заново информация. Информация отображается 20 секунд (по 5 секунд на блок) 33+20=53 секунды где ещё 8 секунд них_рена себе замешкался. Хотя часы идут точно. может конфликт библиотек, у меня часы DS3231 , а в скетче аш три библиотеки часов

достаточно вот этого

#include <DS3232RTC.h> // для работы с модулем часов реального времени
#include <TimeLib.h> // для работы с самим временем 

не нужно в пределах одного цикла несколько раз вызывать millis();
лучше это делать один раз и значение хранить в глобальной переменной
вот так

void loop() { // главный цикл
  //застолбим время
  LooperTime = millis();

основной цикл должен вращаться максимально быстро
в идеале не более 1мсек на проход,
в нём не должно быть никаких тормозов типа delay.
Забудьте вообще эту команду, как плохой сон.
Первым делом в цикле проверяем не сменилась ли миллисекунда

 
 if (oldMillis != *ptrMillis8) {
    oldMillis = *ptrMillis8;
    mSekunda = true; //Флажок, что миллисекунда новая
  };

таким же образом формируем флажки для каждых 30мс для обзона кнопок

  if (uint8_t(*ptrMillis8 - oldMillis32) >= 32) { //30Гц //midi(),Klesh
      oldMillis32 = oldMillis32 + 32;
      millis30=true;
  }  

так же формируем флажки для полусекунд и секунд 

    if (uint16_t(*ptrMillis16 - oldMillis500) >= 500) { //Polsekundy
      oldMillis500 = oldMillis500 + 500;
      Polsekundy = true;
      if (uint16_t(*ptrMillis16 - oldMillis1000) >= 1000) { //Sekunda, Vremya_el ...
        Sekunda = true;
        while (uint16_t(*ptrMillis16 - oldMillis1000) >= 1000) { //Sekunda, Vremya_el ...
          //здесь сделано +1000  а не =*ptrMillis16
          //чтобы если мы гдето прзвенели прощелкали секунду
          //чтобы исполнились все события, за прощелканые секунды
          oldMillis1000 = oldMillis1000 + 1000;
          PoluchitVremya();

И дальше с готовыми флажками и считанным временем уже решаем
какие процедурки вызывать

в конце цикла все флажки надо сбросить

  Polsekundy = false;
  Sekunda = false;
  mSekunda = false;
  millis30 =false;

Можно для этих целей воспользовать библу "Timer master"

она сама вызывает нужные вам подпрограммы с заданными интервалами
ЗЫ не обращайте внимание на звёздочки *ptrMillis8
можете заменить эти выражения на LooperTime

Вот за это всё спасибо, буду теперь переваривать всё это. 

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

b612 пишет:

b707 пишет:
Gen.Alex, цитата из вашего кода: #define s 4000 Вы идиот? Нафига пишете в код строки, в которых ни черта не понимаете?
Зачем столько эмоций ? Видно же что человек совсем новичок.
Надо просто объяснить, что дефайн это замена одной строки на другую, более выразительную по внешнему виду.
В данном случае безликая строка "4000" заменяется на почти столь же безликую букву "s"
Да к тому же такая простая буква может запросто пересечься с какой-нибудь переменной  с именем "s".
 

Видео Урок программирования микроконтроллеров AVR рулит. К стати, работает. " Нафига пишете в код строки"- есть притензии так скажи. Буква "s" ни как не отразилась на часах просто писать меньше. Сейчас научусь со временем работать как "b612" может код поменьше будет. А тебе может ссылку на урок по програмированию  AVR посмотри и там поругайся чтоб не учил народ чему не надо.  Вот тебе поучись https://diodov.net/migayushhij-svetodiod-programmirovanie-mikrokontrollerov-avr/

Green
Offline
Зарегистрирован: 01.10.2015

Чувствую что нужно заводить пару тем. Типа, часы и половое бессилие... Либо, влияние часов на развитие пандемии... Не? Глобальные ведь проблемы!))) Это ж надо, сколько сил то людских тратится на какие то часы!))) Вот так вот жизнь то и проходит...

А, кстати. Видать не зря мне человек заказывал обратный таймер. Типа, вот осталось то столько то времени до какой то даты. Причем, поначалу он хотел даже индикацию в миллисекундах. С тем что бы было видно как быстро течёт время. Ага?

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

b707 пишет:

Gen.Aleks пишет:

Или в скетче написать на какой частоте работает ардуино нано  это наверное вернее будет. Автоматически не определяет.

отвечу на это - остальное какой-то бред. разбираться не буду.

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

 

 

А теперь в общем. Можно не читать. Наболело!

Мужики! Почему вы все уверены. что сможете поправить чужой код, ничего не смысля в программировании? Наверно единственный человек за всю эту ветку. который по-настоящему разобрался в коде, задавал умные вопросы и в итоге создал грамотный скетч - это Одиночка. Все остальные либо добавляли в код свои ошибки. либо просто вопили "Помогите!".

Не умеете программировать - берите готовый код. например от Одиночки. Считаете, что он вам не подходит и вы можете лучше - так разбирайтесь и правьте сами! А сейчас получается - "я хочу сделать часы, готовый код меня не устраивает, у меня такого-то датчика нет... программирование не знаю и учиться не хочу... " ... и начинаем задавать бесконечные тупые вопросы в ветке и "выдавать на гора" все более и более кривые версии кода, засоряя ветку и создавая проблемы для тех, кто потом захочет это повторить.

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

b707, я удивляюсь вашему терпению, 200 последних постов просто ни о чём, повторю что нормальный рабочий

код который бес проблем переделывается под все хотелки лежит в посту #113, хотя вы сказали что это не ваш код.

b612 открой тему в готовых проэктах и выкладывай там свои скетчи на тысячи строк, как написал b707  с"блек-джеком и девочками", с десятком термометров и т.д. которые не кому не пригодятся, только поиграться.

 

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

Gen.Aleks пишет:

b612 пишет:

Gen.Aleks пишет:

Ребят всю ночь считал секунды. У меня точки вспыхивают через  const int per1 = 1000; должна быть секунда, у меня после информации точки вспыхивают 32 раза на 33 идёт заново информация. Информация отображается 20 секунд (по 5 секунд на блок) 33+20=53 секунды где ещё 8 секунд них_рена себе замешкался. Хотя часы идут точно. может конфликт библиотек, у меня часы DS3231 , а в скетче аш три библиотеки часов

достаточно вот этого

#include <DS3232RTC.h> // для работы с модулем часов реального времени
#include <TimeLib.h> // для работы с самим временем 

не нужно в пределах одного цикла несколько раз вызывать millis();
лучше это делать один раз и значение хранить в глобальной переменной
вот так

void loop() { // главный цикл
  //застолбим время
  LooperTime = millis();

основной цикл должен вращаться максимально быстро
в идеале не более 1мсек на проход,
в нём не должно быть никаких тормозов типа delay.
Забудьте вообще эту команду, как плохой сон.
Первым делом в цикле проверяем не сменилась ли миллисекунда

 
 if (oldMillis != *ptrMillis8) {
    oldMillis = *ptrMillis8;
    mSekunda = true; //Флажок, что миллисекунда новая
  };

таким же образом формируем флажки для каждых 30мс для обзона кнопок

  if (uint8_t(*ptrMillis8 - oldMillis32) >= 32) { //30Гц //midi(),Klesh
      oldMillis32 = oldMillis32 + 32;
      millis30=true;
  }  

так же формируем флажки для полусекунд и секунд 

    if (uint16_t(*ptrMillis16 - oldMillis500) >= 500) { //Polsekundy
      oldMillis500 = oldMillis500 + 500;
      Polsekundy = true;
      if (uint16_t(*ptrMillis16 - oldMillis1000) >= 1000) { //Sekunda, Vremya_el ...
        Sekunda = true;
        while (uint16_t(*ptrMillis16 - oldMillis1000) >= 1000) { //Sekunda, Vremya_el ...
          //здесь сделано +1000  а не =*ptrMillis16
          //чтобы если мы гдето прзвенели прощелкали секунду
          //чтобы исполнились все события, за прощелканые секунды
          oldMillis1000 = oldMillis1000 + 1000;
          PoluchitVremya();

И дальше с готовыми флажками и считанным временем уже решаем
какие процедурки вызывать

в конце цикла все флажки надо сбросить

  Polsekundy = false;
  Sekunda = false;
  mSekunda = false;
  millis30 =false;

Можно для этих целей воспользовать библу "Timer master"

она сама вызывает нужные вам подпрограммы с заданными интервалами
ЗЫ не обращайте внимание на звёздочки *ptrMillis8
можете заменить эти выражения на LooperTime

Вот за это всё спасибо, буду теперь переваривать всё это. 

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

  

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

Gen.Aleks пишет:
Заколебало, хоть пример откомпелированный привёл одна теория флашками махал махал целый день. Всё назад вернул не получается. 
так всегда по первой каждый шажок даётся большим трудом.

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

если я выложу весь код, вас стошнит от его объёма инепонятности )

Основная идея в том, что

1. по сути вы всегда строите многозадачную систему и нужно делать так, чтобы задачи были максимально независимыми друг от друга
2. алгоритм должен быть ориентирован на объекты, и события, связанные с объектами
3. Поскольку каждая задача самостоятельна, то главный цикл должен крутиться максимально быстро, чтобы каждая задача как можно меньше времени ждала своей очереди.
4. соответственно процедуры, вызываемые из главного цикла должны выполняться без задержек
5. действия в пределах одного прохода не должны повторяться,
6. на главный цикл ещё накладываются некоторые типа административные обязанности, типа отдавать управление каждой задаче не просто по очереди, а по определённому стечению обстоятельств (времени, событий каких-нибудь флажков).

 

 

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


вот не поленился навыдирал
компилируется
//про RTC
#include <DS3232RTC.h> // для работы с модулем часов реального времени
#include <TimeLib.h> // для работы с модулем часов реального времени
#define DS3232_I2C_ADDRESS 0x68

uint8_t EstRTC=1;
//про время
unsigned long LooperTime = 0; //копия системного времени, не изменяется в течение одного цикла loop
uint8_t *ptrMillis8;
uint16_t *ptrMillis16;//16-битный указатель на Millis
uint8_t oldMillis;//старое значение младшего байта счетчика millis
uint8_t oldMillis32;//старое значение младшего байта счетчика millis для периода 20мс
uint16_t oldMillis500;//старое значение младшего байта счетчика millis для периода 500мс
uint16_t oldMillis1000;//старое значение младшего байта счетчика millis для периода 1000мс
bool millis30=true;
bool Polsekundy = true; // флажок устанавливается по изменению уровня сигнала Square в начале главного цикла и сбрасывается в конце главного цикла
bool Sekunda = true; // флажок устанавливается по второму сигналу Square в начале главного цикла и сбрасывается в конце главного цикла
bool mSekunda = true; // флажок устанавливается при изменении счетчика millis
bool UjeKorrektirovali; //сбрасывается при переходе через полночь, устанавливается после суточной корректировки
time_t Vremya_t = 0; //текущее время
tmElements_t Vremya_el; //структура, в которой хранится считанное с РТС
uint8_t HHH = 0; //старший разряд часы
uint8_t HHL = 0; //младший разряд часы
uint8_t MMH = 0; //-- минуты
uint8_t MML = 0; //-- минуты
uint8_t SSH = 0; //-- секунды
uint8_t SSL = 0; //-- секунды
uint8_t YY0 = 0; //-- год
uint8_t YY1 = 0; //-
uint8_t YY2 = 0;
uint8_t YY3 = 0;
uint8_t mh = 0; //-- месяц
uint8_t ml = 0; //-- месяц
uint8_t DDH = 0; //-- день
uint8_t DDL = 0; //---
uint8_t DW = 0; // день недели


void PoluchitVremya() { //вызывается строго раз в секунду актуализирует Vremya_el_t
  if (EstRTC) {
    RTC.read(Vremya_el);
    Vremya_t = makeTime(Vremya_el);
  } else {
    Vremya_t++;
    breakTime(Vremya_t, Vremya_el);
  }
}

void ZapisatVremya() {
  if (EstRTC) {
      RTC.write(Vremya_el);
      RTC.read(Vremya_el);
  } else {
    Vremya_t = makeTime(Vremya_el);
  }
}

void GetTime() { //раскладывает время в 6 циферок
  HHL = Vremya_el.Hour % 10;
  HHH = Vremya_el.Hour / 10;
  MMH = Vremya_el.Minute / 10;
  MML = Vremya_el.Minute % 10;
  SSH = Vremya_el.Second / 10;
  SSL = Vremya_el.Second % 10;
}

void GetDate() { //раскладывает дату в 9 циферок
  YY0 = 2;
  YY1 = 0;
  YY2 = (Vremya_el.Year + 70) % 100 / 10;
  YY3 = (Vremya_el.Year + 70) % 10;
  mh = (Vremya_el.Month) / 10; //-- месяц
  ml = (Vremya_el.Month) % 10; //-- месяц
  DDH = Vremya_el.Day / 10; //-- день
  DDL = Vremya_el.Day % 10; //---
  DW = Vremya_el.Wday;
}

void setup() {
  ptrMillis8 = (uint8_t*)(& LooperTime);//указатель на младший байт счетчика миллисекунд
  ptrMillis16 = (uint16_t*)(& LooperTime);//указатель на младший байт счетчика миллисекунд
  PoluchitVremya();
  if (EstRTC){//на случай первого запуска RTC
    if (Vremya_t < 978350400){//12:00:00 01/01/2001
      #ifdef _otladka
        Serial.println(F("RTC pusk"));
      #endif
      Vremya_t = 978350400;
      ZapisatVremya();
      PoluchitVremya();
    }
  }
  GetTime();
  
}//setup()


void loop() { // главный цикл
  //застолбим время
  LooperTime = millis();

 
 if (oldMillis != *ptrMillis8) {
    oldMillis = *ptrMillis8;
    mSekunda = true; //Флажок, что миллисекунда новая
  };

  if (uint8_t(*ptrMillis8 - oldMillis32) >= 32) { //30Гц //midi(),Klesh
      oldMillis32 = oldMillis32 + 32;
      millis30=true;
  }  

    if (uint16_t(*ptrMillis16 - oldMillis500) >= 500) { //Polsekundy
      oldMillis500 = oldMillis500 + 500;
      Polsekundy = true;
      if (uint16_t(*ptrMillis16 - oldMillis1000) >= 1000) { //Sekunda, Vremya_el ...
        Sekunda = true;
        while (uint16_t(*ptrMillis16 - oldMillis1000) >= 1000) { //Sekunda, Vremya_el ...
          //здесь сделано +1000  а не =*ptrMillis16
          //чтобы если мы гдето прзвенели прощелкали секунду
          //чтобы исполнились все события, за прощелканые секунды
          oldMillis1000 = oldMillis1000 + 1000;
          PoluchitVremya();
    }
    }
  }

  Polsekundy = false;
  Sekunda = false;
  mSekunda = false;
  millis30 =false;
}

 

 

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

На редкость @банутый авнакод. Так можно и 10 тыс. строк набубенить. Лехко, прям. 

Пачистют, канеш, но знай. :-)

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

DetSimen пишет:

На редкость @банутый авнакод. Так можно и 10 тыс. строк набубенить. Лехко, прям. 

Пачистют, канеш, но знай. :-)

ага, строки 109, 114 и 122 дают ошибку переполнения.

А вот зачем он устраивает эту свистопляску указателей на отдельные байти миллис - я вообще не въехал. Ты что-нить понял?

что видно уже есйчас - если он будет "помогать" Gen.Aleks - последнему, имхо, проще сразу удавится :)

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

b707 пишет:

последнему, имхо, проще сразу удавится :)

Обоим. Один писать не умеет, второй очень похож на хорошо знакомого нам пенсионэра. 

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

DetSimen пишет:

Обоим. Один писать не умеет, второй очень похож на хорошо знакомого нам пенсионэра. 

ага, нашли друг друга....

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

Ок. Напишите конкретно, где мои ошибки ? 
Я про это с самого начала прошу.
Как написать такой функционал более коротко ?

На счет указателей это для скорости. Если вы будете каждый раз работать с 4-ёхбайтным числом, это займёт кучу машинных тактов.

Переполнение и хрен бы с ним.

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

b612 пишет:

На счет указателей это для скорости. Если вы будете каждый раз работать с 4-ёхбайтным числом, это займёт кучу машинных тактов.

в часах?

Цитата:
Переполнение и хрен бы с ним.

опять же - в часах? серьезно? :)

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

b707 пишет:
в часах? серьезно? :)
В этом вся моя ошибка ?

Да в часах.
Ибо проц занимается анимацией и синтезом звука

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

вот по этим строчкам два вопроса:

uint8_t HHH = 0; //старший разряд часы
uint8_t HHL = 0; //младший разряд часы
uint8_t MMH = 0; //-- минуты
uint8_t MML = 0; //-- минуты
uint8_t SSH = 0; //-- секунды
uint8_t SSL = 0; //-- секунды
uint8_t YY0 = 0; //-- год
uint8_t YY1 = 0; //-
uint8_t YY2 = 0;
uint8_t YY3 = 0;
uint8_t mh = 0; //-- месяц
uint8_t ml = 0; //-- месяц
uint8_t DDH = 0; //-- день
uint8_t DDL = 0; //---
uint8_t DW = 0; // день недели

1. Зачем нужны эти переменные вообще?

2. А если нужны - зачем они глобальные?

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

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

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

b707 пишет:

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

Вот как-то, матьтваю,  категорически поддерживаю. :-)

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

b707 пишет:
1. Зачем нужны эти переменные вообще?

2. А если нужны - зачем они глобальные?

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

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

DetSimen пишет:
Вот как-то, матьтваю,  категорически поддерживаю. :-)
сидеть здесь обоим
и учиться учиться и учиться у старичков практическому пердению ))

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

b707 пишет:
Цитата:
Переполнение и хрен бы с ним.
опять же - в часах? серьезно? :)
Переполнение есть, но в данном случае оно 
вызывает только вашу когнитивную ошибку.
код отрабатывается корректно
if (uint8_t(*ptrMillis8 - oldMillis32) >= 32) { 
     oldMillis32 = oldMillis32 + 32;

к примеру uint8_t(255 - 254) даст 1, это будет < 32
uint8_t(000 - 254) даст, как ни странно, 2,  это будет по прежнему < 32
uint8_t(030 - 254) даст 32,  это будет >= 32 , условие сработает и
к 254 сразу прибавится 32  и получится 030
и далее
uint8_t(031 - 030) опять даст 1,  это будет по прежнему < 30

ЗЫ: не пердежу, не попёрдыванию, а именно пердению )

 

 

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

b612 мы с вами наверно ближе по возрасту мне 50 дочь замужем, сын в армию пойдёт, у вас тоже дети, я бы хотел не в рамках форума пообщаться,  чтобы не засарять эфир как говорится. Часы чёрт с ними если у всех нормально идут наверно китайцы ардуино нано с кварцем другим подсунули я слышал на форумах бывает такое, а конкретно встретил вас на форуме где вы делали драйвер из ардуинки для компьютерной программы осцилографа, я работаю на заводе и мне для ремонта приводов требуется по возможности маленький осцилограф и не важно большую частоту чтоб он ловил буквально от 0 до 100 Гц но чтоб чётко ловил меандр и постоянное напряжение, до кучи в этот прибор хочу воткнуть и частотомер, задатчик скорости для длигателей постоянного тока. генератор частоты тоже всё без фанатизма. простенький, ну если уж получится определитель короткозамкнутых витков в моторах. А то приходится ремонтировать не отходя от станка и пока принесёшь все приборы полдня пройдёт а так положил в карман и готово. Так как ноубук нам ещё не купили заинтересовала меня тема с жидкокресталическими дисплеями от сотового телефона и ардуино нано, у меня есть дисплей от не работающего телефона    Alcatel BF4 весь итернет перерыл не могу найти ни схему телефона ни цокалёвку дисплея, фирма французская. Вот фото дисплея, может кто даст наводку как определить цоколёвку: 

 

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

Gen.Aleks пишет:
b612 мы с вами наверно ближе по возрасту мне 50
мне 48
Gen.Aleks пишет:
а конкретно встретил вас на форуме где вы делали драйвер из ардуинки для компьютерной программы осцилографа
это наверно был не я. Но я делал кардиограф с выводом кардиограммы через блютус на андроид.
Gen.Aleks пишет:
по возможности маленький осцилограф и не важно большую частоту чтоб он ловил буквально от 0 до 100 Гц но чтоб чётко ловил меандр и постоянное напряжение, до кучи в этот прибор хочу воткнуть и частотомер, задатчик скорости для длигателей постоянного тока. генератор частоты тоже всё без фанатизма. простенький, ну если уж получится определитель короткозамкнутых витков в моторах.
для работы то проще наверно купить портативный осциллограф. Но если интересно, то почему-бы нет. Всё это даже не сложно.
Хотя мне уже поднадоели эти мелкие глупые проекты.
Выжимать из АЦП ардуины несчастные килосэмплы после того как научился синтезировать на ней нормальный звук..
Уже давненько мечтаю оседлать нейросети.

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

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

b612 пишет:

Gen.Aleks пишет:
b612 мы с вами наверно ближе по возрасту мне 50

мне 48

что ж вы оба такие старички по духу? :) я старше вас обоих :))) А по настроению - млпдше лет на 20 :)

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

b707 пишет:
что ж вы оба такие старички по духу? :) я старше вас обоих :)))
и в этом он круче !
b707 пишет:
А по настроению - млпдше лет на 20 :)
и в этом !
ай! да! дедушка ! мне бы такого

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

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

Что то уже самому расхотелось. Точно лучше купить.Вот b612 это был ты))).

b612 пишет:

Okmor пишет:

b612 пишет:

Или дайте исходники, если не жалко.

Исходники DelphiXE6

Спасибо.

Правда я уже заканчиваю свою прогу.

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

Gen.Aleks пишет:
Что то уже самому расхотелось. Точно лучше купить.Вот b612 это был ты))).
точно, я !
это вот как раз про кардиограф было или может даже ещё про фолль
как давно это было !
Сейчас есть в планах сделать на таком ЖК-шнике свой "сталкер" (фонарь-таймер-градусник-сторож)
Прототип уже во всю трудится в районе кухни, но он здоровенный и тяжелый и светики слабенькие.
Уже приехал и ЖК-шник и светик CreeXM и мощный светик с глубоким УФ, дело за моделью корпуса.

lafrof
Offline
Зарегистрирован: 21.06.2020

Добрый день! Люди может кто подскажет собрал часы на ds1307 все работало, выключил питание включил теперь показывают 8954 и всё, весь день ковыряюсь. может модуль накрылся?

 

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

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

lafrof
Offline
Зарегистрирован: 21.06.2020

выдаёт ошибку в мониторинге.