Нужна помощь насчет часов реального времени...

Тема в разделе "Arduino & Shields", создана пользователем Nigga, 10 янв 2015.

  1. Nigga

    Nigga Нуб

    Нужна помощь насчет часов реального времени.
    Появилась идея, и для ее исполнения нужно сделать что-то наподобие двух таймеров или будильников. Например в 4:00 чтобы подавалась нагрузка и через минуту прекращалась и также в 19:00.
    Как это сделать?
     
  2. Unixon

    Unixon Оракул Модератор

    А что у вас есть из железок?
     
  3. Тоже интересно, насчет часов реального времени.

    Думаю просто взять и приобрести http://amperka.ru/product/real-time-clock

    Но так как Ардуино нужно питать, можно и другими способами, это сделать....

    Интересно, какие решения предложат....
     
  4. В Ардуино часы врут by design.

    Часы реального времени (у меня есть в GSM-шилде) врут поменьше,
    но показания тоже существенно дрейфуют.

    Самым точным вариантом оказалось спрашивать через Интернет время у NTP-серверов по протоколу SNTP, не заморачиваясь никакими специальными алгоритмами, меня точность в секунды устраивает.
     
  5. Nigga

    Nigga Нуб

    У меня есть RTC 1307, хочу чтобы в определенное время допустим сервопривод поворачивался с 90 градусов до 180.
     
  6. Через интернет может каждый, а нету интернета как быть???
     
  7. geher

    geher Гуру

    Расшифровать сигнал системы радиосинхронизации, который применяется в часах, и ориентироваться на него (придется делать приемник на частоты доступных источников). Или подключить более точные электронные часы, только придется найти контакты, к которым можно подпаяться (например, дисплей) с целью получения либо текущего времени либо регулярных отсчетов.
    Еще вариант - синхронизироваться с ПК (при условии, что интернет есть там, ибо внутренние часы ПК - тот еще хлам по точности). Нужно только набросать программку, которая передаст время на ардуину через последовательный порт (конкретная физическая реализация, например, через USB или BT, не имеет значентя).

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

    У себя сделал установку точного времени синхронизацией с ПК и через NTP (через подключенный WiFi Bee V2). А так в основном и часы реального времени достаточно точно работают. Если без синхронизации, корректировать на пару-тройку минут раз в несколько месяцев приходится.
     
    Последнее редактирование: 11 янв 2015
  8. geher

    geher Гуру

    Достаточно просто. Считывать показания часов. Чтобы не заморачиваться со сравнением времени, состоящего из часов и минут, лучше по каким-либо правилам преобразовать время в целое число (например, часы*10000+минуты*100+секунды).
    Периодически проверяем время.
    Как только время совпало с заданным, включаем нагрузку.
    Как только время совпало с заданным+минута - выключаем нагрузку.
     
  9. Искать часы реального времени с приемлемой для вас точностью/ценой и понятным интерфейсом.
    В тех, что продаются на Амперке - точность не специфицирована вообще никак, в Инете про используемую схему говорят про 1-2 секунды в сутки. Это не часы реального времени, это калькулятор календаря с функцией часов.

    Еще можно использовать сигналы GPS.
    Еще можно использовать радиосигналы точного времени.
     
  10. Unixon

    Unixon Оракул Модератор

    Точность часового кварца порядка 20ppm (ppm = parts per million), т.е. 2*10^-5. Отсюда можно прикинуть уход часов за месяц 30*24*3600*2*10^-5 = 12.96 c, в сутки соответственно 0.432 с. Если нужны более точные часы, то... На обычных кварцах дальше 10..5ppm не уехать, потом начинаются прецизионные термостабилизированные генераторы, там можно получить точность в 2~0.1ppm, но это уже совсем другая история. В обычные часы никто такого не ставит. Получить, скажем, 5ppm можно еще достаточно просто, но дальше уже начнутся сложности.

    Ну еще как вариант - взять много много часов с точностью 30..10ppm и высчитывать по ним статистически достоверное среднее значение времени. :)
     
    Последнее редактирование: 12 янв 2015
  11. Unixon

    Unixon Оракул Модератор

    Не проще ли будет честно перевести время в секунды?
     
  12. geher

    geher Гуру

    Может и проще, но так время в виде десятичного числа выглядит как время, а не как абстрактное число.
    Конечно, арифметические операции с таким временем (например, прибавить минуту) будут несколько затруднены, но для простого сравнения сгодится.
     
  13. Вы, дорогой, путаете точность кварца с точностью совершенно конкретной микросхемы DS1307, использованной в шилде.
    Которая точность микросхемы, как пишет производитель, зависит даже от длины проводов, к этой микросхеме подключенных. 1-2 секунды в сутки, не точнее.
     
  14. Unixon

    Unixon Оракул Модератор

    Что вы конкретно понимаете под "точностью микросхемы" и в каком месте даташита вы такое увидели?
     
  15. http://www.maximintegrated.com/en/app-notes/index.mvp/id/58
     
  16. Unixon

    Unixon Оракул Модератор

    Необходимость согласовывать цепь резонатора и оберегать ее от помех вполне понятна и к "точности микросхемы" не относится. С любым другим чипом RTC пришлось бы следовать ровно тем же самым рекомендациям.

    Единственное, что действительно имеет значение, это значение и точность нагрузочных емкостей (да, у DS1307 они прямо на чипе), но там зависимость частоты от емкости такая, что при согласованности нагрузочных емкостей по номиналу до единиц pF их точность уже не будет играть особой роли, т.к. единицы процентов к емкости будут давать доли ppm к частоте и частота будет в основном определяться характеристиками самого резонатора.

    p.s. С калькуляцией ухода часов я действительно что-то напутал, наверное считал для 5ppm резонатора, для обычного 20ppm действительно получается минута в месяц при 25C, а при крайних температурах там совсем всё плохо.
     
  17. Djvan

    Djvan Нерд

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

    Код (Text):
    #include <DS1307new.h>
    #include <OneWire.h>
    #include <Wire.h>

    uint16_t startAddr = 0x0000;            // Начальный адрес для хранения в NV-RAM
    uint16_t lastAddr;                      // новый адрес для хранения в NV-RAM
    uint16_t TimeIsSet = 0xaa55;            // По этой переменной проверяется то, что время не нужно устанавливать заново

    int Relay1 = 3;

    void setup(void)
    {
        pinMode(Relay1, OUTPUT);
       
        digitalWrite(3, HIGH);
       
    // Запускаем наши часики (RTC)
    RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));
      RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
      if (TimeIsSet != 0xaa55)
      {
        RTC.stopClock();
           
        RTC.fillByYMD(2015,01,20); //устанавливаем дату
        RTC.fillByHMS(23,49,0); //устанавливаем время
        RTC.setTime();
        TimeIsSet = 0xaa55;
        RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
        RTC.startClock();  }
      else
      { RTC.getTime();  }
      RTC.setCTRL();}
     
    void loop(){
     
      RTC.getTime();
            if ( RTC.hour = 10)  // если время равно 10 часам ( можно так же поставить rtc.minute секунды дни месяцы годы
            {digitalWrite(Relay1, LOW);}
          else
          {digitalWrite(Relay1, HIGH);}
               
    }
     
     
  18. Максим B

    Максим B Гуру

  19. absolut

    absolut Нерд

    Здравствуйте. Помогите разобраться. У меня ни как не запускается связка RTC 1307 I2C и LCD 1602 I2C.
    Часы работают отдельно в порт выдают время и дату. А с экраном показывают странные значения. Этот же модуль работает на Atmega 32, но дисплей подключен не по I2C.

    1.jpg

    2.jpg

    Код (Text):
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #include <DS1307.h>
    #include "RTClib.h"
    #include "Wire.h"

    // Указываем пины подключения  DS1307  к Arduino
    #define pinSDA  A4 // SDA
    #define pinSCL  A5 // SCL
    #define DS1307_I2C_ADDRESS 0x68



      DS1307 rtc(pinSDA, pinSCL); // Подключаем часы DS1307


      LiquidCrystal_I2C lcd(0x20, 4, 5, 6, 0, 1, 2, 3, 7, NEGATIVE);


    void setup()
    {
      rtc.halt(false); // Запускаем ход чаов
      lcd.begin(16, 2); // Инициализация работы с дисплеем размером 16х2

        // The following lines can be commented out to use the values already stored in the DS1307
      rtc.setDOW(SUNDAY);        // Set Day-of-Week to SUNDAY
      rtc.setTime(12, 0, 0);    // Set the time to 12:00:00 (24hr format)
      rtc.setDate(3, 03, 2015);  // Set the date to October 3th, 2010

      // Set SQW/Out rate to 1Hz, and enable SQW
      rtc.setSQWRate(SQW_RATE_1);
      rtc.enableSQW(true);

    }

    void loop()
    {
      // Display time centered on the upper line
      lcd.setCursor(4, 0);
      lcd.print(rtc.getTimeStr());

      // Display abbreviated Day-of-Week in the lower left corner
      lcd.setCursor(0, 1);
      lcd.print(rtc.getDOWStr(FORMAT_SHORT));

      // Display date in the lower right corner
      lcd.setCursor(6, 1);
      lcd.print(rtc.getDateStr());

      // Wait one second before repeating :)
      delay (1000);
    }
    Дисплей по I2C заработал только с такой строчкой инициализации. По отдельности оба устройства работают, вместе никак. Перепробовал кучу библиотек и примеров.
     
  20. absolut

    absolut Нерд

    Посмотрите кто может на скетч. Уже всю голову себе сломал.