Часы DS1307 не идут и не устанавливаются

km77
Offline
Зарегистрирован: 10.12.2012

 

Здравствуйте. Проблема такая: собрал для 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);
}

ustas
Offline
Зарегистрирован: 12.03.2012

Вообще SDA/SCL это A4,A5 и произвольно их ставить нельзя. Перекиньте "часики" на них и все заработает (скетч не смотрел, но это увидел).

maksim
Offline
Зарегистрирован: 12.02.2012

ustas пишет:

Вообще SDA/SCL это A4,A5 и произвольно их ставить нельзя. Перекиньте "часики" на них и все заработает (скетч не смотрел, но это увидел).

Это зависит от библиотеки. Некоторые используют аппартный I2C, некоторые программный. Во втором случае можно подключать к любым выводам.

paf
Offline
Зарегистрирован: 25.01.2013

Вот тема, может быть будет полезно. http://arduino.ru/forum/programmirovanie/ds1307-pokazyvayut-strannoe-vremya-kotoroe-stoit#comment-22002

Мне очень понравилась предложенная maxim библиотека. И там замечательные примеры. Установка часов, старт, стоп, все через монитор.

km77
Offline
Зарегистрирован: 10.12.2012

Много всего перебробовал, но часы по-прежнему стоят показывают 2000 и 00:00:00. Проблема видимо в SDA SCL линиях,как обнаружить ее,проверить и устранить?

paf
Offline
Зарегистрирован: 25.01.2013

А это?





/*
 *
 * 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вольт.

 

km77
Offline
Зарегистрирован: 10.12.2012

paf пишет:

А это?







/*
 *
 * 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 Выдает вот,что

paf
Offline
Зарегистрирован: 25.01.2013

Analog IN   A4 A5  кажут бред? Ну наоборот. 

paf
Offline
Зарегистрирован: 25.01.2013

Таким образом:

paf
Offline
Зарегистрирован: 25.01.2013

А что это за циферень слева?! В окне ArduinoIDE?! Крайний левый столбец строк?

Старая библиотека удалена?

 

km77
Offline
Зарегистрирован: 10.12.2012

В какой версии все же надо проверить твой код? Скачал IDE 1.0.3,проверил в нем,библиотеки на DS1307 изначально там не было,добавил туда-там не компилится. В 1.0.1 не пробовал.

paf
Offline
Зарегистрирован: 25.01.2013

У меня 1.0.2 ... все работает как ... часы!   Ты не ответил - код в IDE скопировал вместе нумерацией строк?  Это не пройдет!

код вытаскивается без нумерации кнопочкой <> в правом верхнем углу окошка с кодом.

paf
Offline
Зарегистрирован: 25.01.2013

У меня минуты вместо  01; .... 09  кажут 1....9, без нуля.  Как бы исправить без "мороки про строки"? 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

paf пишет:

У меня минуты вместо  01; .... 09  кажут 1....9, без нуля.  Как бы исправить без "мороки про строки"? 

Форматироваием вывода примерно в таком духе:

if (minute < 10) {serial.print("0"); serial.print(minute);}

paf
Offline
Зарегистрирован: 25.01.2013

"А-аа!!! - Семён Семёныч...!"   Но это слишком просто...     Спасибо, Андрей.  Интересно, а что ж я собрался городить?! Интересно...

 

Dima85
Offline
Зарегистрирован: 07.01.2013

В свое время достаточно много времени убил на настройку RTC DS1307. Пробовал подключить на 4-5 аналоговые порта безуспешно. Как оказалось в Arduino Mega нужно подключить в разъемы comunication, в 20 и 21-ый разъемы с надписью SDA и SCL, после у меня все заработало. Может кому-то пригодится. 

AndyResh
Offline
Зарегистрирован: 08.04.2013

Dima85 пишет:

В свое время достаточно много времени убил на настройку RTC DS1307. Пробовал подключить на 4-5 аналоговые порта безуспешно. Как оказалось в Arduino Mega нужно подключить в разъемы comunication, в 20 и 21-ый разъемы с надписью SDA и SCL, после у меня все заработало. Может кому-то пригодится. 

Дима, ты просто СПАСИТЕЛЬ :)

Сам парился с неделю пытаясь понять почему не идут данные с реал-тайма. Все перепробывал: менял батарею (думал сдохла), укорачивал провода до часиков до ардуинки - невкакую!

А тут случайно наткнулся на твой коментарий, пришёл домой тупо переткнул проводки... и О ЧУДО! Все заработало.

Спасибо, ещё раз!

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Вопрос снят