Часы DS1307 не идут и не устанавливаются
- Войдите на сайт для отправки комментариев
Здравствуйте. Проблема такая: собрал для Arduino Uno на макетке модуль из часов DS1307 и ЖК дисплея 16х2, залил с помощью Arduino 1.0.1 нижеприведенный скетч следующего содержания,который должен отображать по идее то что изображено на фото 2,он компилируется,заливается, но в итоге мало того что что ни часы ни идут,ни дата в нужном формате не отображается, еще и нули в обоих строчках и при том они не устойчиво горят,а мерцают.
Модуль подключал к цифровым входам,дисплей согласно статье в Амперке
http://wiki.amperka.ru/схемы-подключения:подключение-текстового-экрана
Фото того что имею на данный момент также прикрепляю к теме.
Никак не пойму что делаю не так,время и дату так и не смог установить, в чем проблемы и ошибки могут быть явные? Какие будут ваши мнения?
//******************************************************************
// Программа часов на DS1307 и LCD 16x2
//******************************************************************
#include <LiquidCrystalRus.h> // Подключение библиотеки для LCD с кириллицей
#include <DS1307.h> //Подключение библиотеки для DS1307
// Указываем пины подключения LCD 16х2 к Arduino
// Можно указать любые пины, в соответствии с фактическим подключением
#define pinRS 14 // RS к аналоговому пину 0
#define pinE 15 // E к аналоговому пину 1
#define pinDB4 10 // DB4 к цифровому пину 10
#define pinDB5 11 // DB5 к цифровому пину 11
#define pinDB6 12 // DB6 к цифровому пину 12
#define pinDB7 13 // DB7 к цифровому пину 13
// Указываем пины подключения DS1307 к Arduino
#define pinSDA 2 // SDA к цифровому пину 2
#define pinSCL 4 // SCL к цифровому пину 4
DS1307 rtc(pinSDA, pinSCL); // Подключаем часы DS1307
Time t; //Объявление класса t типа Time
LiquidCrystalRus lcd(pinRS, pinE, pinDB4, pinDB5, pinDB6, pinDB7); //Подключаем дисплей
//***********************************************************************
//Блок настроек, выполняется однократно
void setup()
{
rtc.halt(false); // Запускаем ход чаов
lcd.begin(16, 2); // Инициализация работы с дисплеем размером 16х2
}
//*******************************************************************
//Объявляем функцию установки даты и времени
void ustanovkaChasov()
{
rtc.setDOW(6); // Установка дня недели, пн-1, вт-2 и т.д.
rtc.setTime(14, 11, 0); // Установка времени (час, минута, секунда, 24 ч.)
rtc.setDate(6, 10, 2012); // Установка даты (день, месяц, год)
}
//**************************************************************
// Основной блок программы, выполняется бесконечно, циклично
void loop()
{
// Опрос часов для получения значений даты и времени
t = rtc.getTime();
lcd.clear(); // очистка экрана, не обязательно, но на всякий случай
// Вывод единиц в сегменте единиц дней
if (t.date<=9)//если едициц дней меньше-равно 9, то выводим на 1 шаг правее
{ lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(1, 0);
lcd.print (t.date);}
else // иначе (т.е. если единиц дней больше 9, то выводим на 1 шаг левее
{ lcd.setCursor(0, 0);
lcd.print (t.date);}
//Отображение текущего месяца
lcd.setCursor(2, 0); //указываем место печати названия месяца
switch (t.mon) // в зависимости от значения месяца печатаем название
{
case 1: lcd.print("-янв-"); break;
case 2: lcd.print("-фев-"); break;
case 3: lcd.print("-мар-"); break;
case 4: lcd.print("-апр-"); break;
case 5: lcd.print("-мая-"); break;
case 6: lcd.print("-июн-"); break;
case 7: lcd.print("-июл-"); break;
case 8: lcd.print("-авг-"); break;
case 9: lcd.print("-сен-"); break;
case 10: lcd.print("-окт-"); break;
case 11: lcd.print("-ноя-"); break;
case 12: lcd.print("-дек-"); break;
}
//Отображение текущего года гггг
lcd.setCursor(7, 0); // указываем место печати значения года
lcd.print(t.year); // печатаем год
// Отображение текущего дня недели
lcd.setCursor(12,0); //указываем место печати дня недели
switch (t.dow)// в зависимости от номера дня недели выводим на экран
{
case 1: lcd.print("/ПН/"); break;
case 2: lcd.print("/ВТ/"); break;
case 3: lcd.print("/СР/"); break;
case 4: lcd.print("/ЧТ/"); break;
case 5: lcd.print("/ПТ/"); break;
case 6: lcd.print("/СБ/"); break;
case 7: lcd.print("/ВС/"); break;
}
// Отображение времени чч:мм:сс
lcd.setCursor(3,1);
lcd.print(rtc.getTimeStr()); // время выводится готовой строкой с разделителями ":"
delay(50);
}



Вообще SDA/SCL это A4,A5 и произвольно их ставить нельзя. Перекиньте "часики" на них и все заработает (скетч не смотрел, но это увидел).
Вообще SDA/SCL это A4,A5 и произвольно их ставить нельзя. Перекиньте "часики" на них и все заработает (скетч не смотрел, но это увидел).
Вот тема, может быть будет полезно. http://arduino.ru/forum/programmirovanie/ds1307-pokazyvayut-strannoe-vremya-kotoroe-stoit#comment-22002
Мне очень понравилась предложенная maxim библиотека. И там замечательные примеры. Установка часов, старт, стоп, все через монитор.
Много всего перебробовал, но часы по-прежнему стоят показывают 2000 и 00:00:00. Проблема видимо в SDA SCL линиях,как обнаружить ее,проверить и устранить?
А это?
/* * * Read and set through serial port demo sketch for DS1307 I2C rtc clock * * DS1307 library provided by mattt & D.Sjunnesson, corrected by bricofoy. * See DS1307.h for more details. * * This exemple code is under GNU GPL * * (c) bricofoy 2012 * */ // This is for compatibility with both arduino 1.0 and previous versions #if defined(ARDUINO) && ARDUINO >= 100 #include "Arduino.h" #else #include "WProgram.h" #endif #include <Wire.h> #include <DS1307.h> void setup() { Serial.begin(9600); use(); read_RTC(); } // use explanation message void use() { Serial.println("\nUSE : u U r R h[00-23]m[00-59]s[00-59]j0[1-7]D[01-31]M[01-12]A[00-49]"); Serial.println("\nEXEMPLE : h09m35d03 set time to 09h35 and day of week 3 (thuesday)."); Serial.println("\nCommands : h** : hour, m** : minutes, s** : seconds, d0* : day of week"); Serial.println(" M** : month, Y** : year, D** : day of month."); Serial.println(" r stops clock, R starts it. "); Serial.println(" u or U shows this message, all other caracter shows time."); } // DS1307 time read function void read_RTC() { Serial.print("\nActual time : "); Serial.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true Serial.print(":"); Serial.print(RTC.get(DS1307_MIN,false));//read minutes without update (false) Serial.print(":"); Serial.print(RTC.get(DS1307_SEC,false));//read seconds Serial.print(" "); // some space for a more happy life Serial.print(RTC.get(DS1307_DOW,false)); Serial.print(" "); Serial.print(RTC.get(DS1307_DATE,false));//read date Serial.print("/"); Serial.print(RTC.get(DS1307_MTH,false));//read month Serial.print("/"); Serial.println(RTC.get(DS1307_YR,false)); //read year } // set clock values void write_RTC() { char value=0; char command=0; command = Serial.read(); delay(50); //delay to allow good serial port reading value=byte((Serial.read()-48)*10); //-48 becaus ASCII value for 0 is 48, 1 is 49, etc and *10 because we read tens first delay(50); value+=byte((Serial.read()-48)); //and then we read units switch (command) { case 'h' : RTC.set(DS1307_HR,value); Serial.print("hours set to "); Serial.println(value,DEC); break; case 'm' : RTC.set(DS1307_MIN,value); Serial.print("minutes set to "); Serial.println(value,DEC); break; case 's' : RTC.set(DS1307_SEC,value); Serial.print("seconds set to "); Serial.println(value,DEC); break; case 'D' : RTC.set(DS1307_DATE,value); Serial.print("day of month set to "); Serial.println(value,DEC); break; case 'd' : RTC.set(DS1307_DOW,value); Serial.print("day of week set to "); Serial.println(value,DEC); break; case 'M' : RTC.set(DS1307_MTH,value); Serial.print("month set to "); Serial.println(value,DEC); break; case 'Y' : RTC.set(DS1307_YR,value); Serial.print("year set to "); Serial.println(value,DEC); break; case 'u' : case 'U' : use(); break; case 'r' : RTC.stop(); Serial.println("Clock stopped"); break; case 'R' : RTC.start(); Serial.println("Clock running"); break; default : break; } read_RTC(); } void loop() { if (Serial.available()) { write_RTC(); } }Желтый и зеленый... На контакты Analog IN A4 A5!!! после заливки послать "на" R в мониторе :)
Будут останавливаться - емкость параллельно питанию 5вольт.
А это?
/* * * Read and set through serial port demo sketch for DS1307 I2C rtc clock * * DS1307 library provided by mattt & D.Sjunnesson, corrected by bricofoy. * See DS1307.h for more details. * * This exemple code is under GNU GPL * * (c) bricofoy 2012 * */ // This is for compatibility with both arduino 1.0 and previous versions #if defined(ARDUINO) && ARDUINO >= 100 #include "Arduino.h" #else #include "WProgram.h" #endif #include <Wire.h> #include <DS1307.h> void setup() { Serial.begin(9600); use(); read_RTC(); } // use explanation message void use() { Serial.println("\nUSE : u U r R h[00-23]m[00-59]s[00-59]j0[1-7]D[01-31]M[01-12]A[00-49]"); Serial.println("\nEXEMPLE : h09m35d03 set time to 09h35 and day of week 3 (thuesday)."); Serial.println("\nCommands : h** : hour, m** : minutes, s** : seconds, d0* : day of week"); Serial.println(" M** : month, Y** : year, D** : day of month."); Serial.println(" r stops clock, R starts it. "); Serial.println(" u or U shows this message, all other caracter shows time."); } // DS1307 time read function void read_RTC() { Serial.print("\nActual time : "); Serial.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true Serial.print(":"); Serial.print(RTC.get(DS1307_MIN,false));//read minutes without update (false) Serial.print(":"); Serial.print(RTC.get(DS1307_SEC,false));//read seconds Serial.print(" "); // some space for a more happy life Serial.print(RTC.get(DS1307_DOW,false)); Serial.print(" "); Serial.print(RTC.get(DS1307_DATE,false));//read date Serial.print("/"); Serial.print(RTC.get(DS1307_MTH,false));//read month Serial.print("/"); Serial.println(RTC.get(DS1307_YR,false)); //read year } // set clock values void write_RTC() { char value=0; char command=0; command = Serial.read(); delay(50); //delay to allow good serial port reading value=byte((Serial.read()-48)*10); //-48 becaus ASCII value for 0 is 48, 1 is 49, etc and *10 because we read tens first delay(50); value+=byte((Serial.read()-48)); //and then we read units switch (command) { case 'h' : RTC.set(DS1307_HR,value); Serial.print("hours set to "); Serial.println(value,DEC); break; case 'm' : RTC.set(DS1307_MIN,value); Serial.print("minutes set to "); Serial.println(value,DEC); break; case 's' : RTC.set(DS1307_SEC,value); Serial.print("seconds set to "); Serial.println(value,DEC); break; case 'D' : RTC.set(DS1307_DATE,value); Serial.print("day of month set to "); Serial.println(value,DEC); break; case 'd' : RTC.set(DS1307_DOW,value); Serial.print("day of week set to "); Serial.println(value,DEC); break; case 'M' : RTC.set(DS1307_MTH,value); Serial.print("month set to "); Serial.println(value,DEC); break; case 'Y' : RTC.set(DS1307_YR,value); Serial.print("year set to "); Serial.println(value,DEC); break; case 'u' : case 'U' : use(); break; case 'r' : RTC.stop(); Serial.println("Clock stopped"); break; case 'R' : RTC.start(); Serial.println("Clock running"); break; default : break; } read_RTC(); } void loop() { if (Serial.available()) { write_RTC(); } }Желтый и зеленый... На контакты Analog IN A4 A5!!! после заливки послать "на" R в мониторе :)
Заливал в IDE 1.0.1 Выдает вот,что
Analog IN A4 A5 кажут бред? Ну наоборот.
Таким образом:
А что это за циферень слева?! В окне ArduinoIDE?! Крайний левый столбец строк?
Старая библиотека удалена?
В какой версии все же надо проверить твой код? Скачал IDE 1.0.3,проверил в нем,библиотеки на DS1307 изначально там не было,добавил туда-там не компилится. В 1.0.1 не пробовал.
У меня 1.0.2 ... все работает как ... часы! Ты не ответил - код в IDE скопировал вместе нумерацией строк? Это не пройдет!
код вытаскивается без нумерации кнопочкой <> в правом верхнем углу окошка с кодом.
У меня минуты вместо 01; .... 09 кажут 1....9, без нуля. Как бы исправить без "мороки про строки"?
У меня минуты вместо 01; .... 09 кажут 1....9, без нуля. Как бы исправить без "мороки про строки"?
Форматироваием вывода примерно в таком духе:
if (minute < 10) {serial.print("0"); serial.print(minute);}
"А-аа!!! - Семён Семёныч...!" Но это слишком просто... Спасибо, Андрей. Интересно, а что ж я собрался городить?! Интересно...
В свое время достаточно много времени убил на настройку RTC DS1307. Пробовал подключить на 4-5 аналоговые порта безуспешно. Как оказалось в Arduino Mega нужно подключить в разъемы comunication, в 20 и 21-ый разъемы с надписью SDA и SCL, после у меня все заработало. Может кому-то пригодится.
В свое время достаточно много времени убил на настройку RTC DS1307. Пробовал подключить на 4-5 аналоговые порта безуспешно. Как оказалось в Arduino Mega нужно подключить в разъемы comunication, в 20 и 21-ый разъемы с надписью SDA и SCL, после у меня все заработало. Может кому-то пригодится.
Дима, ты просто СПАСИТЕЛЬ :)
Сам парился с неделю пытаясь понять почему не идут данные с реал-тайма. Все перепробывал: менял батарею (думал сдохла), укорачивал провода до часиков до ардуинки - невкакую!
А тут случайно наткнулся на твой коментарий, пришёл домой тупо переткнул проводки... и О ЧУДО! Все заработало.
Спасибо, ещё раз!
Вопрос снят