Приветствую вас пользователи nookery.ru! Я уже не один год время от времени создаю проекты на arduino, для себя и друзей. У меня как и у многих из вас, возникают различные вопросы и проблемы, и это нормально ведь главное учиться и не останавливаться на достигнутом. Не давно я достал свой старый проект и вспомнил сколько проблем у меня с ним возникло. Сейчас я опишу одну из них. В моем проекте использовались часы DS1302, с подключением которых у меня особо не возникло проблем. Пробежавшись по не скольким сайтам нашел схему, в основном она была одна и та же на всех сайта.
В моем проекте я подключил на цифровые выводы arduino 8 9 10, вы же можете их подключить как угодно, у меня они просто единственные остались свободные. Установил множество различных библиотек для работы с часами, но рабочими в моем случаи было только две, остальные были либо принципиально с другим вариантом подключения, либо модифицированные, что меня абсолютно не устраивало. Все хорошо, что хорошо кончается, кода я загрузил скетч:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#include <DS1302.h> DS1302 rtc(8, 9, 10); //инициализация платы DS1302 Time t; объявляем ссылку на класс time void setup() { // подключаемся к порту Serial.begin(9600); //инициализируем пины питания //Установим время, и отключить защиту от записи rtc.halt(false); rtc.writeProtect(false); // Если у вас в DS1302 уже сохранено установленное время, то нужно за комментировать rtc.setDOW(FRIDAY); // Устанавливаем день недели FRIDAY rtc.setTime(20, 30, 10); // Устанавливаем время 20:30:10 (24часа формат времени) rtc.setDate(11, 06, 2017); // Устанавливаем число месяц и год } void loop() { t = rtc.getTime(); // Выводим день недели Serial.print(rtc.getDOWStr()); Serial.print(" "); // Выводим дату Serial.print(rtc.getDateStr()); Serial.print(" -- "); // Выводим время Serial.println(rtc.getTimeStr()); if(t.sec==30) { Serial.println("Прошло 30 секунд"); } // Ставим задержку в 1 секунду delay (1000); } |
К моему разочарованию я увидел не то что хотел, а именно каждую секунду выводилось время как и положено дата и время, но в моем случаи выводилось реальное время и еще какое то левое, 2000-00-00 00:00:00 покапавший в библиотеке оказалось что это время вшито внутри нее. Но это никак не помогло мне, так как реальное и фейковое время поочередно выводились у меня на дисплей каждую секунду. Причем в lcd дисплее выводились не время с часов DS1302, а какие то иероглифы, по поочередно. На многих сайтах упоминалось о том что час сломаны, плохая пропайка итд. Но я не опускал руки и все же нашел причину. Оказалось что все дело в не полной схеме, а точнее не хватала резистора 10 кОм на землю -5v. Которые снижали шум внутри цепи, и предотвращали вывод не верной информации с часов. Я накидал полную схему:
С этой схемой все стабилизировалось и часы DS1302 стали работать как надо. Ниже я выложил две библиотеки которые работали у меня, но написаны одна на C# другая на C++ так как же в них разные команды вывода информации, но в обоих есть скетч примеры в архиве с комментариями.
Мужик, спасибо большое!!! хотел было выбрасывать их уже)
Рад что помогло, однако было замечены сбои при продолжительной работе в течении нескольких дней, хотя скорее всего в моем случаи это вызывали реле и элементы питания.
Огромное спасибо. У меня при подключении время шло в 6 раз быстрее. Поставил сопротивление, заработало как надо.
Пожалуйста.
В библиотеке перечислены пины:
DS1302(uint8_t ce_pin, uint8_t data_pin, uint8_t sclk_pin);
У Вас — перепутаны CLK и RST:
DS1302 rtc(8, 9, 10); //инициализация платы DS1302
И в течение!! — учите русский язык — отымённый предлог
В течении только у реки..
Золотой Вы человек! Спасибо за помощь в устранении проблемы с перепутанными пинами!!!!
Спасибо помогли!
Александр, перепутанные порты не при чем. Учить русский — хорошо. А намерение помочь людям — важнее!
Надеюсь не допустил ошибок…)))
Большое спасибо — помогли!
Умный Александр — порты не при чем.
Собрал все по инструкции не работает выводил скажем нули, перевернул провода CLK и RST на плате и часы пошли!!!!!
Большое спасибо за статью! Два дня не мог разобраться что за чушь получаю на выходе с этих часов! :))) РЕЗИСТОР на 10 кОм. Теперь понимаю почему почти все модули реального времени используют аналоговые пины а не цифровые. Теперь буду смотреть как вывести время на 4 матрицы 8х8.
Реально резюк помог.
СПАСИБО!!!!!
А не подскажите как использовать в операторе if и часы и минуты одновременно
Конкретно по методам не подскажу, студии нет ардуина под рукой, но суть сводиться к следующему. Если минуты равны 20 и часы равны 5 то выполняем какое то действие в скобках.
if(минуты==20 && часы==5)
{
}
Огромное спасибо! Тоже уже выкидывать собирался.
Так же чуть не поступил 😀
НЕ РАБОТАЕТ!!!!
До этого у людей работало, у вас нет?)
Подскажите пожалуйста ошибку. При компиляции выдает (‘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);
}
}
}
}
Ошибка в коде, но подсказать конкретно в каком месте не могу, под рукой нет студии.
строка if(hour == …… должна быть такой
if (time.hours == 7 && time.minutes == 30 && time.seconds == 25);
Спасибо. Всё заработало когда подпаял резистор и поменял местами CLK и RST.
Пожалуйста!
Спасибо, буду пробовать!)
У меня просто грелись дико как будто КЗ, и переставал выдвать время.
Я уже подумал что они 3.3 В толерантные только, хотя в даташитах пишут что 5.5 В для них норм.