Часы на arduino

Тема в разделе "Глядите, что я сделал", создана пользователем Максим B, 28 май 2013.

  1. Максим B

    Максим B Гуру

    Всем привет. Искал проекты в интернете и вот нашел такой http://cxem.net/arduino/arduino34.php. Вопрос: как сделать часы без подключения дополнительного модуля "Часы реального времени"
     
  2. Mitrandir

    Mitrandir Гуру

    millis()

    Возвращает количество миллисекунд с момента начала выполнения текущей программы на плате Arduino. Это количество сбрасывается на ноль, в следствие переполнения значения, приблизительно через 50 дней.
     
  3. Megakoteyka

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

    Еще есть таймер, можно настроить его на прерывание каждую секунду и по прерыванию приращивать переменные, в которых хранится время. И никакого переполнения не будет ))
    Вот и библиотека для работы с таймером умеется...
     
  4. Максим B

    Максим B Гуру

    Спасибо. Будем разбираться.
     
  5. roggedhorse

    roggedhorse Гик

    RTC как отдельное устройство решает 2 основных задачи:
    - точность
    - автономная работа (не зависимо от того, включено материнское устройство или нет)

    Вам придется повозиться, чтобы получить сносное решение первой задачи на Arduino.
     
  6. Максим B

    Максим B Гуру

    Да я пока не забочусь об автономной работе- пока еще учусь, но в будущем да хотелось бы такой модуль.
     
  7. roggedhorse

    roggedhorse Гик

    дело в точности таких часов
     
  8. Я делал Часы на Ардуине без модуля реального времени.
    http://forum.amperka.ru/threads/Говорящие-часы.1255/
    В результате пришлось вводить поправочный коэффициент. За неделю часы могли отставать до нескольких минут.
    Сейчас бы я обязательно использовал Модуль реального времени.
     
  9. Megakoteyka

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

    А от температуры величина убегания сильно зависела или внимания не обращали?
     
  10. Не обращал.
     
  11. Максим B

    Максим B Гуру

    Всем еще раз привет. Собрал по схеме на "монтажной плате" http://fixled.ru/components/ds1307.html. Только использовал вместо 4,7 кОм - 10кОм резисторы. Суть: получаю данные на serial monitor -все ok, но как отключаю от usb
    плату - от батарейки не хочет работать ((( Батарейка cr2032
    Код ( (Unknown Language)):
    #include <Wire.h>
    #include "DS1307.h"

    DS1307 clock;//define a object of DS1307 class
    void setup()
    {
        Serial.begin(9600);
        clock.begin();
        clock.fillByYMD(2013,1,19);//Jan 19,2013
        clock.fillByHMS(15,28,30);//15:28 30"
        clock.fillDayOfWeek(SAT);//Saturday
        clock.setTime();//write time to the RTC chip
    }
    void loop()
    {
        printTime();
    }
    /*Function: Display time on the serial monitor*/
    void printTime()
    {
        clock.getTime();
        Serial.print(clock.hour, DEC);
        Serial.print(":");
        Serial.print(clock.minute, DEC);
        Serial.print(":");
        Serial.print(clock.second, DEC);
        Serial.print("  ");
        Serial.print(clock.month, DEC);
        Serial.print("/");
        Serial.print(clock.dayOfMonth, DEC);
        Serial.print("/");
        Serial.print(clock.year+2000, DEC);
        Serial.print(" ");
        Serial.print(clock.dayOfMonth);
        Serial.print("*");
        switch (clock.dayOfWeek)// Friendly printout the weekday
        {
            case MON:
              Serial.print("MON");
              break;
            case TUE:
              Serial.print("TUE");
              break;
            case WED:
              Serial.print("WED");
              break;
            case THU:
              Serial.print("THU");
              break;
            case FRI:
              Serial.print("FRI");
              break;
            case SAT:
              Serial.print("SAT");
              break;
            case SUN:
              Serial.print("SUN");
              break;
        }
        Serial.println(" ");
    }
     
  12. Serdg

    Serdg Нерд

    что значит не хочет работать? если вы про одно и тоже время при каждом запуске, то
    Код (C):
        clock.fillByYMD(2013,1,19);//Jan 19,2013
        clock.fillByHMS(15,28,30);//15:28 30"
        clock.fillDayOfWeek(SAT);//Saturday
        clock.setTime();//write time to the RTC chip
    эти строки его и устанавливают. (посмотрите, как сделать установку времени при компиляции в примере http://wiki.amperka.ru/время:rtc-индикатор)
     
  13. Максим B

    Максим B Гуру

    Вот за это спасибо. Будем разбираться.
     
  14. Максим B

    Максим B Гуру

    Просто в "си" не силен.
     
  15. Максим B

    Максим B Гуру

    Ну вот почему на "wiki" примеры не для того, что хочеться сделать ))) . Просто я подключаю к дисплею 2x16 и вроде все просто, а на деле придется как ни крути учить язык ((
     
  16. Unixon

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

    Как говорится, "Без труда не вытащишь и рыбку из пруда" :)
     
  17. Максим B

    Максим B Гуру

    Абсолютно с тобой согласен.
     
  18. Максим B

    Максим B Гуру

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

    Код (C):
    #include <Wire.h>
    #include <LiquidCrystal.h>
    #include <EEPROM.h>
    #include "DS1307.h"

     
    //Массив, содержащий время компиляции
    char compileTime[] = __TIME__;
     
    //Номера пинов Arduino, к которым подключается индикатор
    #define DISPLAY_CLK_PIN 12  
    #define DISPLAY_DIO_PIN 13
     
    //Для работы с микросхемой часов и индикатором мы используем библиотеки
    DS1307 clock;
     
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);//инициализация портов
     
    void setup()
    {
     {
     lcd.begin(16, 2);//инициализация дисплея
      }


      //Запускаем часы реального времени
      clock.begin();
     
      //Получаем число из строки, зная номер первого символа
      byte hour = getInt(compileTime, 0);
      byte minute = getInt(compileTime, 3);
      byte second = getInt(compileTime, 6);
     
      //Импровизированный хэш времени
      //Содержит в себе количество секунд с начала дня
      unsigned int hash =  hour * 60 * 60 + minute  * 60 + second;
     
      //Проверяем несовпадение нового хэша с хэшем в EEPROM
      if (EEPROMReadInt(0) != hash) {
     
        //Сохраняем новый хэш
        EEPROMWriteInt(0, hash);
     
        //Готовим для записи в RTC часы, минуты, секунды
        clock.fillByHMS(hour, minute, second);
     
        //Записываем эти данные во внутреннюю память часов.
        //С этого момента они начинают считать нужное для нас время
        clock.setTime();
      }
     
    }
     
     
    void loop()
    {
      //Значения для отображения на каждом из 4 разрядов
      int8_t timeDisp[4];
     
      //Запрашиваем время с часов
      clock.getTime();
     
      //Получаем десятки часов с помощью целочисленного деления
      timeDisp[0] = clock.hour / 10;
     
      //Получаем единицы часов с помощью остатка от деления
      timeDisp[1] = clock.hour % 10;
     
      //Проделываем то же самое с минутами
      timeDisp[2] = clock.minute / 10;
      timeDisp[3] = clock.minute % 10;
     
      //... а затем выводим его на экран
       lcd.setCursor(0,0);
       lcd.print(timeDisp[0]);
       lcd.print(timeDisp[1]);
       lcd.print(timeDisp[2]);
       lcd.print(timeDisp[3]);
     

     
    }
     
    char getInt(const char* string, int startIndex) {
      return int(string[startIndex] - '0') * 10 + int(string[startIndex+1]) - '0';
    }
     
    //Запись двухбайтового числа в память
    void EEPROMWriteInt(int address, int value)
    {
      EEPROM.write(address, lowByte(value));
      EEPROM.write(address + 1, highByte(value));
    }
     
    //Чтение числа из памяти
    unsigned int EEPROMReadInt(int address)
    {
      byte lowByte = EEPROM.read(address);
      byte highByte = EEPROM.read(address + 1);
     
      return (highByte << 8) | lowByte;
    }
     
     
  19. warman

    warman Гик

    Зачем в setup() вставлять каждый раз проверку времени? RTC на то и RTC, что время настраивается 1 раз в их жизни, и отсчитывается, пока батарейка жива (больше 4 лет). Так что делать хеши времени - абсолютно лишнее.
    У вас же при каждом перезапуске мк (свет моргнул в квартире) часы устанавливаются заново.
     
  20. Максим B

    Максим B Гуру

    Время показывает, от батарейки CR2032 работает. Но вот дату не показывает ((( Будем дорабатывать. RTC модуль сам паял по схеме