Не работают часы реального времени DS1307

dedmusoroed
Offline
Зарегистрирован: 06.06.2018

Не удается установить время на RTC DS1307 модуле, использовал скетч iarduino RTC после заливки в ардуинку выдает время на мониторе порта "01-01-2001,  01:01:01, Sun".
​Плата Arduino pro Mini, 5v, подключал модуль по I2C так же пробовал и другие скетчи (около 3-4х самых популярных) но после них вообще никакого эффекта. Заливал скетч на поиск адреса устройств, не нашел не один адрес, даже при подключенных дисплеях на ssd1306, хотя дисплеи работают нормально, пробовал подключать землю через резистор, на некоторых формуах пишут об этом способе но какой наминал резистора не указывают, пробовал от 200Ом до 3КОм ничего не меняется. Так же есть теория что нужно поменять что то по адресу 0x68 или на ноль или единицу, мол это защита от смены времени, но так и не смог найти как обратится к этому адресу и как его поменять, помогите пожалуйста, взялся за большой проэкт не имея знаний, с чего бы на начал оборачивается крахом, с самого первого дня знакомства, в ардуину не хотели заливатся скетчи, что только не пробовал, даже не понял как оно прошло, то комп программатор не видел то ком порт отваливался. Помогите пожалуйста. ТТ

b707
Offline
Зарегистрирован: 26.05.2017

dedmusoroed пишет:

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

тут ничем помочь нельзя. Только знания прокачивать. Самосточтельно.

Bront
Offline
Зарегистрирован: 05.04.2016

Хоть бы фотографии своих подключений приложили в максимально подробном виде.

И лукавите, что ничего не нашли. Вот хотя бы здесь, в картиночках все.

http://www.glacialwanderer.com/hobbyrobotics/?p=12

dedmusoroed
Offline
Зарегистрирован: 06.06.2018

Залил этот скетч, все испрвил, иии... Ничего не произошло, все по старому, выпаял резистор д6 модуль https://ru.aliexpress.com/item/1PCS-New-Arrival-AT24C32-Real-Time-Clock-RTC-I2C-DS1307-Module-for-AVR-ARM-PIC-51/32715323331.html?spm=a2g0s.9042311.0.0.4bae33ed0NM1Y8 самый дешманский, с английским вообще беда, так что англоязычные форумы особо ничем не помогают. Подключение дефолтное собрал из говна и палок, https://ru.aliexpress.com/item/CJMCU-CP2102-MICRO-USB-to-UART-TTL-Module-6Pin-Serial-Converter-UART-STC-Replace-FT232-NEW/32801557756.html?spm=a2g0s.9042311.0.0.274233edRYikaJ это программатор, а там далее все как обычно, соединил питание землю SCL и SDA есть еще пин DS почему то он нигде не упоминается, вроде как для управления в реальном времени, думал что нарушаю технологию загрузки, но нет, все 1 в 1 как в видеоуроках. Дисплеи работают при таком подключении незнаю что может быть сомнительного в нем. https://ibb.co/h3k5V8
https://ibb.co/g8tQV8

Bront
Offline
Зарегистрирован: 05.04.2016

Скетч с сайта который был выше?

И все проводки прям как там соединили? И вывод смотрели в терминале?

dedmusoroed
Offline
Зарегистрирован: 06.06.2018

Терминал это монитор порта? Там все пусто было, вообще ноль реакции, потом снова залил дефолтный скетч время такое же осталось (0-0-0), с резистором напруга была около 1.6 в убрал его стало 2.8 идти, это же достаточно для памяти? Подключил все как на картинке. 

Гриша
Offline
Зарегистрирован: 27.04.2014

скетч (который не работает) в студию - как сделать правильно

dedmusoroed
Offline
Зарегистрирован: 06.06.2018
// Бибилиотека разработана для RTC модуля http://iarduino.ru/shop/Expansion-payments/chasy-realnogo-vremeni-rtc-tr...
// Данный пример устанавливает на модуле заданное время 


#include <iarduino_RTC.h>
//  iarduino_RTC time(RTC_DS1302, 1, 2, 3); // подключаем RTC модуль на базе чипа DS1302, указывая выводы Arduino подключённые к выводам модуля RST, CLK, DAT
iarduino_RTC time(RTC_DS1307);          // подключаем RTC модуль на базе чипа DS1307, используется аппаратная шина I2C
//iarduino_RTC time(RTC_DS3231);          // подключаем RTC модуль на базе чипа DS3231, используется аппаратная шина I2C

void setup() {
    delay(300);
    Serial.begin(9600);
    time.begin();
    time.settime(0,51,21,27,10,15,2);  // 0  сек, 51 мин, 21 час, 27, октября, 2015 года, вторник
}
void loop(){
    if(millis()%1000==0){ // если прошла 1 секунда
      Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время
      delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
    }
}

//    ОПИСАНИЯ ПАРАМЕТРОВ ФУНКЦИЙ:
//
//  Подключение библиотеки:
//  #include <iarduino_RTC.h>
//  iarduino_RTC time(название модуля [, вывод SS/RST [, вывод CLK [, вывод DAT]]]);
//      если модуль работает на шине I2C или SPI, то достаточно указать 1 параметр, например: iarduino_RTC time(RTC_DS3231);
//      если модуль работает на шине SPI, а аппаратный вывод SS занят, то номер назначенного вывода SS для модуля указывается вторым параметром, например: iarduino_RTC time(RTC_DS1305,22);
//      если модуль работает на трехпроводной шине, то указываются номера всех выводов, например: iarduino_RTC time(RTC_DS1302, 1, 2, 3); // RST, CLK, DAT
//  
//  Для работы с модулями, в библиотеке реализованы 5 функции:
//      инициировать модуль  begin();
//      указать время        settime(секунды [, минуты [, часы [, день [, месяц [, год [, день недели]]]]]]);
//      получить время       gettime("строка с параметрами");
//      мигать времем        blinktime(0-не_мигать / 1-мигают_сек / 2-мигают_мин / 3-мигают_час / 4-мигают_дни / 5-мигают_мес / 6-мигает_год / 7-мигают_дни_недели / 8-мигает_полдень)
//      разгрузить шину      period (минуты);
//  
//  Функция begin():
//      функция инициирует модуль: проверяет регистры модуля, запускает генератор модуля и т.д.
//  
//  Функция settime(секунды [, минуты [, часы [, день [, месяц [, год [, день недели]]]]]]):
//      записывает время в модуль
//      год указывается без учёта века, в формате 0-99
//      часы указываются в 24-часовом формате, от 0 до 23
//      день недели указывается в виде числа: 0-воскресенье, 1-понедельник, 2-вторник ..., 6-суббота
//      если предыдущий параметр надо оставить без изменений, то можно указать отрицательное или заведомо большее значение
//      пример: time.settime(-1, 10); установит 10 минут, а секунды, часы и дату, оставит без изменений
//      пример: time.settime(0, 5, 13); установит 13 часов, 5 минут, 0 секунд, а дату оставит без изменений
//      пример: time.settime(-1, -1, -1, 9, 2, 17); установит дату 09.02.2017 , а время и день недели оставит без изменений
//  
//  Функция gettime("строка с параметрами"):
//      функция получает и выводит строку заменяя описанные ниже символы на текущее время
//      пример: time.gettime("d-m-Y, H:i:s, D"); ответит строкой "01-10-2015, 14:00:05, Thu"
//      пример: time.gettime("s");               ответит строкой "05"
//      указанные символы идентичны символам для функции date() в PHP
//  s   секунды                       от      00    до       59  (два знака)
//  i   минуты                        от      00    до       59  (два знака)
//  h   часы в 12-часовом формате     от      01    до       12  (два знака)
//  H   часы в 24-часовом формате     от      00    до       23  (два знака)
//  d   день месяца                   от      01    до       31  (два знака)
//  w   день недели                   от       0    до        6  (один знак: 0-воскресенье, 6-суббота)
//  D   день недели наименование      от     Mon    до      Sun  (три знака: Mon Tue Wed Thu Fri Sat Sun)
//  m   месяц                         от      01    до       12  (два знака)
//  M   месяц наименование            от     Jan    до      Dec  (три знака: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
//  Y   год                           от    2000    до     2099  (четыре знака)
//  y   год                           от      00    до       99  (два знака)
//  a   полдень                               am   или       pm  (два знака, в нижнем регистре)
//  A   полдень                               AM   или       PM  (два знака, в верхнем регистре)
//  
//  если требуется получить время в виде цифр, то можно вызвать функцию gettime() без параметра, после чего получить время из переменных
//      пример:  time.gettime();
//               Serial.print(time.Hours);   Serial.print(":");  // Вывод часов
//               Serial.print(time.minutes); Serial.print(":");  // Вывод минут
//               Serial.print(time.seconds); Serial.println(""); // Вывод секунд
//      seconds  секунды     0-59
//      minutes  минуты      0-59
//      hours    часы        1-12
//      Hours    часы        0-23
//      midday   полдень     0-1 (0-am, 1-pm)
//      day      день месяца 1-31
//      weekday  день недели 0-6 (0-воскресенье, 6-суббота)
//      month    месяц       1-12
//      year     год         0-99
//  
//  Функция blinktime(параметр [, частота ]):
//      указывает функции gettime мигать одним из параметров времени (заменять параметр пробелами)
//      функция может быть полезна, для отображения на дисплее, устанавливаемого параметра времени
//      например при установке минут, они начинают мигать, и Вам понятно, что именно Вы устанавливаете
//      первым аргументом функции указывается параметр в виде числа от 0 до 8
//  0   не мигать
//  1   мигают сек
//  2   мигают мин
//  3   мигают час
//  4   мигают дни
//  5   мигают мес
//  6   мигает год
//  7   мигают дни недели
//  8   мигает полдень
//      второй аргумент функции является необязательным, он указвает частоту миганий в Гц, по умолчанию 1Гц
//      пример: time.blinktime(6);    // при выводе на дисплеё будет мигать год с частотой по умолчанию 1Гц
//      пример: time.blinktime(6, 2); // при выводе на дисплеё будет мигать год с частотой 2Гц
//  
//  Функция period(минуты):
//      устанавливает минимальный период обращения к модулю в минутах (от 0 до 255)
//      функция может быть полезна, если шина сильно нагружена, на ней имеются несколько устройств
//      пример: time.period(10); // теперь каждые 10 минут к модулю может быть отправлен только 1 запрос на получение времени
//      ответом на все остальные запросы будет результат последнего полученного от модуля времени + время прошедшее с этого запроса

 

Bront
Offline
Зарегистрирован: 05.04.2016

dedmusoroed пишет:

Терминал это монитор порта? Там все пусто было, вообще ноль реакции, потом снова залил дефолтный скетч время такое же осталось (0-0-0), с резистором напруга была около 1.6 в убрал его стало 2.8 идти, это же достаточно для памяти? Подключил все как на картинке. 

Да, монитор порта. И с резистором что вы там придумали?

Есть возможность выложить отчетливое фото вашей конструкции?

dedmusoroed
Offline
Зарегистрирован: 06.06.2018

Конструкция работает, с ней работает дисплей 128на64 и 64на32 на ссд1306 у них распиновка одинаковая, я подпоял 4 провода к тем же выводам к которым подключал дисплей это gnd/5v/a4/a5 и поменял местами сцл и сда и все, так как у них распиновка разная у ртс с дисплеем. Все резисторы имеются в модуле часов, для этого же он и создавался? Для безгеморного подключения, мож он косяченый? Я даже не знаю как подробнее сфотать, конструкцию, поля половину медным кабелем на медной макетной плате следить за контактами куда они идут, глаза выпадут. А резистор я просто выпаял, https://www.youtube.com/watch?v=b8-4o6A7dZs вот видео инструкция, но не знаю как оно относится к делу, при подключении от сети память питается от нее, почему она не сохроняется?

Гриша
Offline
Зарегистрирован: 27.04.2014

вариант :

скачайте библиотеку с примерами

запустите пример ReadTest.ino

чего напишет в монитор порта?

почитать на русском

 

Bront
Offline
Зарегистрирован: 05.04.2016

А что значит поменял местами SCL и SDA?

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

dedmusoroed
Offline
Зарегистрирован: 06.06.2018

До монитора даже не доходит, пишет ...

java.io.IOException: jssc.SerialPortException: Port name - COM3; Method name - setEventsMask(); Exception type - Can't set mask.
 at processing.app.Serial.dispose(Serial.java:158)
 at processing.app.SerialMonitor.close(SerialMonitor.java:110)
 at processing.app.AbstractMonitor.suspend(AbstractMonitor.java:96)
 at processing.app.Editor$DefaultExportHandler.run(Editor.java:2127)
 at java.lang.Thread.run(Thread.java:745)
Caused by: jssc.SerialPortException: Port name - COM3; Method name - setEventsMask(); Exception type - Can't set mask.
 at jssc.SerialPort.setEventsMask(SerialPort.java:279)
 at jssc.SerialPort.removeEventListener(SerialPort.java:1064)
 at jssc.SerialPort.closePort(SerialPort.java:1090)
 at processing.app.Serial.dispose(Serial.java:155)
 ... 4 more
 

При загрузке в плату.

dedmusoroed
Offline
Зарегистрирован: 06.06.2018

Поменял местами проводки зеленый с белым. https://ibb.co/h2Lm3T

Bront
Offline
Зарегистрирован: 05.04.2016

для начала вам надо разобраться вообще с выводом в монитор порта.

отключить все от ардуинки и залить скетч из примеров, например ASCIITable

dedmusoroed
Offline
Зарегистрирован: 06.06.2018


Интересная ситуация, скетч заливается и работает без модуля часов, те же нули в монитор выдает ;D
​Попробовал несколько скетчей залить, а потом гет таймом проверил, выдает муть какуюто, то квадраты, причем не в столбец пишутся данные а в строчку D; 
 

/**
 * DS1307 Time and Alarm memory handling example using the extended DS1307 library for handling alarms in 
 * the internal free NVRAM of the DS1307
 * 
 * This example sketch shows how to use the extended DS1307 library. This library adds weekday alarms to the DS1307 
 * functionality. These alarms are stored in the DS1307 persistent RAM (NVRAM) so that it survives periods without 
 * power. For that it requires that the DS1307 is powered with an backup battery (e.g. CR2023 coin cell). This sketch 
 * shows:
 * - how to get the current time of the DS1307 chip and if not set yet it will set the time
 * - it shows various example how to set alarms
 * - in the loop part it shows how to check if there is an alarm that neds to go off.
 * - note: weekday alarms can only be set at 5 minute resulution, e.g. 8:10 is OK and 8:09 is not
 *
 * Circuit:
 * - see here for a nice istructable that shows how to connect the DS1307 to an Arduino
 *   http://www.instructables.com/id/Arduino-Real-Time-Clock-DS1307/
 *   
 * Athor:   Milé Buurmeijer
 * Version: 0.6
 * Date:    26/07/2012
 *
 * Version history:
 * 0.1 Initial version that contains alarm structure, alarm retreive functionality and alarm triggering
 * 0.2 Alarm set quick hack
 * 0.3 Setting of alarms debugged
 * 0.4 Removed alarmIsSetAddress * 
 * 0.5 first test of library usage
 * 0.6 alarm clear function corrected
 *
 * Based on test sketch from the "DS1307new" library by Peter Schmelzer and Oliver Kraus (version 1.21)
*/

#define DEBUG 1

#include <Wire.h>       // for some strange reasons, Wire.h must be included here
#include "DS1307new.h"  // extension to new DS1307 Arduino library that includes weekday alarms

void setup() {
  
  #ifdef DEBUG
    // init serial communication
    Serial.begin(9600);
    while(!Serial) {} // for Arduino Leonardo
  #endif
  
  // uncomment line below if you explicitly want to set the time
  //RTC.setRAM(timeIsSetAddress, (uint8_t *)&aspectIsNotSetToken, sizeof(uint8_t)); 

  // check if flagged that time was already set in RTC  
  if (RTC.isTimeSet()) {
    // OK RTCandA was properly set, so let get the time
    RTC.getTime();
  } else {
    // only do this once to set the RTC
    // this routine writes the token to the RTC NV-RAM memory for future reference
    RTC.setDateTimeRTC();
  }
  
  //examples how to set alarms [alarms are defined at at 5 minute resolution]
  RTC.clearAlarmNvramMemory(); // clears the DS1307 internal NVRAM to hold the alarms
  RTC.listNvramMemory(); // print out the NVRAM memory values
  // set alarm Mondays at 5:25, 
  // first parameter is day of the week (sunday = 0, monday = 1, ..., saturday = 6)
  // second parameter is the hour in 24h style
  // last parameter is the minutes in 5 minute resolution, i.e. 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55
  RTC.setAlarm( 1, 5, 25);   
  RTC.listNvramMemory();
  RTC.setAlarm( 2, 16, 35); // set alarm Tuesdays at 16:05
  RTC.listNvramMemory();
  RTC.setAlarm( 3, 12, 10); // aet alarm Wednesday at 12:10
  RTC.listNvramMemory();
  RTC.setAlarm( 4, 11, 15); // set alarm Thursdays at 11:25
  RTC.listNvramMemory();
  RTC.clearAlarm( 4);       // clear alarm on Thursday
  RTC.listNvramMemory();
  RTC.setAlarm ( 6, 20, 0); // set alarm Saturdays at 20:00
  RTC.listNvramMemory();

  #ifdef DEBUG
    Serial.println("DS1307 time and alarm memory module");
    Serial.println("Format is \"hh:mm:ss dd-mm-yyyy DDD\"");
  
    uint8_t CEST = RTC.isCETSummerTime();
    Serial.print("isCETSummerTime=");
    Serial.println(CEST, DEC);    
    Serial.println();
  #endif
}

/**  
 * main loop of the sketch
 */
void loop() {
  RTC.getTime(); // get current time from the DS1307 RTC chip
  RTC.printTime(); // print it to serial
  // check if alarms need to be triggered
  if (RTC.isAlarmTime()) {
    #ifdef DEBUG
      Serial.println("Alarm time has passed!");
    #endif
  }
  delay(10000); // wait 10 seconds
}

 

repon
Offline
Зарегистрирован: 23.08.2013

Тоже проблема с Uno + DS1307.

Конденсатор и резистор R4 выпаял, R6 замкнул.

на com порту ничего не выводится.

батарейка CR2032 свежая

 

#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

const char *monthName[12] = {
  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

tmElements_t tm;

void setup() {
  bool parse=false;
  bool config=false;

  // get the date and time the compiler was run
  if (getDate(__DATE__) && getTime(__TIME__)) {
    parse = true;
    // and configure the RTC with this info
    if (RTC.write(tm)) {
      config = true;
    }
  }

  Serial.begin(9600);
  while (!Serial) ; // wait for Arduino Serial Monitor
  delay(200);
  if (parse && config) {
    Serial.print("DS1307 configured Time=");
    Serial.print(__TIME__);
    Serial.print(", Date=");
    Serial.println(__DATE__);
  } else if (parse) {
    Serial.println("DS1307 Communication Error :-{");
    Serial.println("Please check your circuitry");
  } else {
    Serial.print("Could not parse info from the compiler, Time=\"");
    Serial.print(__TIME__);
    Serial.print("\", Date=\"");
    Serial.print(__DATE__);
    Serial.println("\"");
  }
}

void loop() {
}

bool getTime(const char *str)
{
  int Hour, Min, Sec;

  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
  tm.Hour = Hour;
  tm.Minute = Min;
  tm.Second = Sec;
  return true;
}

bool getDate(const char *str)
{
  char Month[12];
  int Day, Year;
  uint8_t monthIndex;

  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
  for (monthIndex = 0; monthIndex < 12; monthIndex++) {
    if (strcmp(Month, monthName[monthIndex]) == 0) break;
  }
  if (monthIndex >= 12) return false;
  tm.Day = Day;
  tm.Month = monthIndex + 1;
  tm.Year = CalendarYrToTm(Year);
  return true;
}