Подключаем и разбираемся с ошибками часов DS1302 для arduino

Приветствую вас пользователи nookery.ru! Я уже не один год время от времени создаю проекты на arduino, для себя и друзей. У меня как и у многих из вас, возникают различные вопросы и проблемы, и это нормально ведь главное учиться и не останавливаться на достигнутом. Не давно я достал свой старый проект и вспомнил сколько проблем у меня с ним возникло. Сейчас я опишу одну из них. В моем проекте использовались часы DS1302, с подключением которых у меня особо не возникло проблем. Пробежавшись по не скольким сайтам нашел схему, в основном она была одна и та же на всех сайта.

В моем проекте я подключил на цифровые выводы arduino 8 9 10, вы же можете их подключить как угодно, у меня они просто единственные остались свободные. Установил множество различных библиотек для работы с часами, но рабочими в моем случаи было только две, остальные были либо принципиально с другим вариантом подключения, либо модифицированные, что меня абсолютно не устраивало. Все хорошо, что хорошо кончается, кода я загрузил скетч:

К моему разочарованию я увидел не то что хотел, а именно каждую секунду выводилось время как и положено дата и время, но в моем случаи выводилось реальное время и еще какое то левое,  2000-00-00 00:00:00 покапавший в библиотеке оказалось что это время вшито внутри нее. Но это никак не помогло мне, так как реальное и фейковое время поочередно выводились у меня на дисплей каждую секунду. Причем в lcd дисплее выводились не время с часов DS1302, а какие то иероглифы, по поочередно.  На многих сайтах упоминалось о том что час сломаны, плохая пропайка итд. Но я не опускал руки и все же нашел причину. Оказалось что все дело в не полной схеме, а точнее не хватала резистора 10 кОм на землю -5v. Которые снижали шум внутри цепи, и предотвращали вывод не верной информации с часов. Я накидал полную схему:

С этой схемой все стабилизировалось и часы DS1302 стали работать как надо. Ниже я выложил две библиотеки которые работали у меня, но написаны одна на C# другая на C++ так как же в них разные команды вывода информации, но в обоих есть скетч примеры в архиве с комментариями.

Скачать библиотеку DS1302

Скачать библиотеку DS1302RTC

Обновлено: 13.01.2019 — 15:27

23 комментария

Оставить комментарий
  1. Мужик, спасибо большое!!! хотел было выбрасывать их уже)

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

    2. Валерий Тарасенко

      Огромное спасибо. У меня при подключении время шло в 6 раз быстрее. Поставил сопротивление, заработало как надо.

      1. Пожалуйста.

  2. Александр

    В библиотеке перечислены пины:
    DS1302(uint8_t ce_pin, uint8_t data_pin, uint8_t sclk_pin);
    У Вас — перепутаны CLK и RST:
    DS1302 rtc(8, 9, 10); //инициализация платы DS1302

    И в течение!! — учите русский язык — отымённый предлог
    В течении только у реки..

    1. Евгений

      Золотой Вы человек! Спасибо за помощь в устранении проблемы с перепутанными пинами!!!!

  3. Дмитрий

    Спасибо помогли!

    Александр, перепутанные порты не при чем. Учить русский — хорошо. А намерение помочь людям — важнее!
    Надеюсь не допустил ошибок…)))

  4. Дмитрий

    Большое спасибо — помогли!

    Умный Александр — порты не при чем.

  5. Собрал все по инструкции не работает выводил скажем нули, перевернул провода CLK и RST на плате и часы пошли!!!!!

  6. Большое спасибо за статью! Два дня не мог разобраться что за чушь получаю на выходе с этих часов! :))) РЕЗИСТОР на 10 кОм. Теперь понимаю почему почти все модули реального времени используют аналоговые пины а не цифровые. Теперь буду смотреть как вывести время на 4 матрицы 8х8.

  7. Реально резюк помог.
    СПАСИБО!!!!!

  8. А не подскажите как использовать в операторе if и часы и минуты одновременно

    1. Конкретно по методам не подскажу, студии нет ардуина под рукой, но суть сводиться к следующему. Если минуты равны 20 и часы равны 5 то выполняем какое то действие в скобках.
      if(минуты==20 && часы==5)
      {
      }

  9. Алексей

    Огромное спасибо! Тоже уже выкидывать собирался.

    1. Так же чуть не поступил 😀

  10. НЕ РАБОТАЕТ!!!!

    1. До этого у людей работало, у вас нет?)

  11. Подскажите пожалуйста ошибку. При компиляции выдает (‘hour’ was not declared in this scope)

    #include
    #include // подключение библиотеки
    iarduino_RTC time(RTC_DS1302,8,6,7); // Задаем правильно название нашего модуля, а также указываем к каким цифровым пинам его подключаем(в нашем случае – 8,6,7)
    #include // библиотека для устройств I2C
    #include // подключаем библиотеку для дисплея
    #define feed_period
    LiquidCrystal_I2C LCD(0x27,16,2);
    Servo servo1;

    void setup() {
    servo1.attach(5);
    delay(300); // задержка в 300мс перед началом инициализации
    Serial.begin(9600); // устанавливаем скорость передачи данных с модулей в 9600 бод
    LCD.init(); // инициализация LCD дисплея
    LCD.backlight(); // включение подсветки дисплея
    time.begin(); // функция служит для инициализации работы модуля
    // Ниже у нас прописываются временные значения в виде секунд, минут, часов, даты, включая месяц и год, и также можете указать день недели
    //time.settime(25,20,19,13,6,21,6); // 10 сек, 10 мин, 10 час, 4 , октября, 2017 года, среда
    }
    void loop(){

    if(millis()%1000==0) { // задержка в одну секунду перед выводом времени в последовательный порт
    Serial.println(time.gettime(«d-m-Y, H:i:s, D»)); // выводим время
    LCD.setCursor(0,0);
    LCD.print(time.gettime(«d M Y, D»));
    LCD.setCursor(4,1);
    LCD.print(time.gettime(«H:i:s»));
    delay(1); // делаем небольшую задержку, чтобы не выводить время слишком часто
    {
    if (hour == 7 && minute == 30 && second == 25);
    {
    servo1.write(0);
    delay(1500);
    servo1.write(90);
    delay(1500);
    }
    }
    }
    }

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

    2. строка if(hour == …… должна быть такой
      if (time.hours == 7 && time.minutes == 30 && time.seconds == 25);

  12. Спасибо. Всё заработало когда подпаял резистор и поменял местами CLK и RST.

    1. Пожалуйста!

  13. Спасибо, буду пробовать!)

    У меня просто грелись дико как будто КЗ, и переставал выдвать время.
    Я уже подумал что они 3.3 В толерантные только, хотя в даташитах пишут что 5.5 В для них норм.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.