DS1307 показывают странное время, которое стоит.

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

Вам сюда.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

maksim пишет:

Вам сюда.

гыыыыы... браво... бис....

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

даю наводку.. и жду что вернут пивом :)

Board I2C / TWI pins
Uno, Ethernet A4 (SDA), A5 (SCL)
Mega2560 20 (SDA), 21 (SCL)
Leonardo 2 (SDA), 3 (SCL)
Due 20 (SDA), 21 (SCL), SDA1SCL1

 

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

Ну если так, то тогда получается что Kvanto поленился почитать эту ветку с начала.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

maksim пишет:

Ну если так, то тогда получается что Kvanto поленился почитать эту ветку с начала.

да тут многие не читают ветки, их вполне устраивает что название темы совпадает с их проблемой :)

им так же лень брать родные библиотеки, и читать мануалы к ним :)

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

 Словоохотливые в обычных обстоятельствах демоны, в спешном порядке вызванные из Подземельных Измерений, напускали на себя застенчивый вид и уклонялись от расспросов. Волшебные зеркала потрескались. С гадальных карт таинственным образом исчез весь рисунок. Хрустальные шары совершенно затуманились. Даже чайные листья, презрительно отвергаемые волшебниками как легкомысленные и ненадежные, сбивались в кучку на дне чашки и отказывались сдвинуться с места. (С) Терри Пратчетт

Kvanto
Offline
Зарегистрирован: 26.04.2013

У меня же Leonardo. точно. значит неправильно соединил. подсоединил SCL и SDA к цифровым портам. Вот что в мониторе.

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

и что дальше? а взять библиотеку по ссылке выше в этой теме, вам религия не позволяет? :) 

пойду опять мучить демонов и чаинки, может выясню куда он все же и что присоединил и какой библиотекой теперь пытается чего то добиться :)

Kvanto
Offline
Зарегистрирован: 26.04.2013

Puhlyaviy пишет:

и что дальше? а взять библиотеку по ссылке выше в этой теме, вам религия не позволяет? :) 

пойду опять мучить демонов и чаинки, может выясню куда он все же и что присоединил и какой библиотекой теперь пытается чего то добиться :)

Библиотеку то я установил из этой ветки. Вот код, который залил. В ветке для IDE 1.0.3. выложена библиотека. У меня 1.5.2. может это влияет?



// Программа часов на DS1307 и LCD 16x2
// Подключаем все необходимые библиотеки и указываем пины подключения
#include <Wire.h>
#include <LiquidCrystal.h> // Подключение библиотеки для LCD с кириллицей
#include <DS1307.h> //Подключение библиотеки для DS1307
// Указываем пины подключения LCD 16х2 к Arduino
#define pinRS  4 // RS  к аналоговому пину 4
#define pinE   5 // E   к аналоговому пину 5
#define pinDB4  10 // DB4 к цифровому пину 10
#define pinDB5  11 // DB5 к цифровому пину 11
#define pinDB6  12 // DB6 к цифровому пину 12
#define pinDB7  13 // DB7 к цифровому пину 13
LiquidCrystal lcd(pinRS, pinE, pinDB4, pinDB5, pinDB6, pinDB7); //Подключаем дисплей
//******************************************************************************
void setup()
{
  lcd.begin(16, 2);
  Serial.begin(9600);
  //ustanovkaChasov(); //функция настройки часов, если в этом есть необходимость
}
//******************************************************************************
//Объявляем функцию установки даты и времени
void ustanovkaChasov()
  {
  RTC.stop();              // останавливаем ход часов
  RTC.set(DS1307_SEC,0);   // устанавливаем секунды
  RTC.set(DS1307_MIN,58);  // устанавливаем минуты
  RTC.set(DS1307_HR,16);   // устанавливаем часы
  RTC.set(DS1307_DOW,4);   // устанавливаем номер дня недели
  RTC.set(DS1307_DATE,31);  // устанавливаем число
  RTC.set(DS1307_MTH,1);   // устанавливаем месяц
  RTC.set(DS1307_YR,13);    // устанавливаем год
  RTC.start();             // запускаем ход часов
  }
//**************************************************************

void loop()
{
  // Вывод единиц в сегменте единиц дней
  if (RTC.get(DS1307_DATE,false)<=9)//если едициц дней меньше-равно 9, то выводим на 1 шаг правее
  { lcd.setCursor(0, 0);
    lcd.print(" ");
    lcd.setCursor(1, 0);
    lcd.print (RTC.get(DS1307_DATE,false));}
  else // иначе (т.е. если единиц дней больше 9, то выводим на 1 шаг левее
  { lcd.setCursor(0, 0);
    lcd.print (RTC.get(DS1307_DATE,false));}
    
  //Отображение текущего месяца
  lcd.setCursor(2, 0); //указываем место печати названия месяца
  switch (RTC.get(DS1307_MTH,false)) // в зависимости от значения месяца печатаем название
  {
    case 1:    lcd.print("-01-");    break;
    case 2:    lcd.print("-02-");    break;
    case 3:    lcd.print("-03-");    break;
    case 4:    lcd.print("-04-");    break;
    case 5:    lcd.print("-05-");    break;
    case 6:    lcd.print("-06-");    break;
    case 7:    lcd.print("-07-");    break;
    case 8:    lcd.print("-08-");    break;
    case 9:    lcd.print("-09-");    break;
    case 10:   lcd.print("-10-");    break;
    case 11:   lcd.print("-11-");    break;
    case 12:   lcd.print("-12-");    break;
  }
  
  //Отображение текущего года гггг
  lcd.setCursor(6, 0); // указываем место печати значения года
  lcd.print(RTC.get(DS1307_YR,false)); // печатаем год

  // Отображение текущего дня недели 
  lcd.setCursor(11,0); //указываем место печати дня недели
  switch (RTC.get(DS1307_DOW,false))// в зависимости от номера дня недели выводим на экран
  {
    case 1:    lcd.print("/MON/");    break;
    case 2:    lcd.print("/TUE/");    break;
    case 3:    lcd.print("/WED/");    break;
    case 4:    lcd.print("/THU/");    break;
    case 5:    lcd.print("/FRI/");    break;
    case 6:    lcd.print("/SAT/");    break;
    case 7:    lcd.print("/SUN/");    break;
  }
  
  // Отображение времени чч:мм:сс
  lcd.setCursor(3,1);
  lcd.print(RTC.get(DS1307_HR,true)); // печатаем час
  lcd.setCursor(5,1);
  lcd.print(":"); // печатаем разделитель
  lcd.setCursor(6,1);
  lcd.print(RTC.get(DS1307_MIN,false)); // печатаем минуты
  lcd.setCursor(8,1);
  lcd.print(":"); // печатаем разделитель
  lcd.setCursor(9,1);
  lcd.print(RTC.get(DS1307_SEC,false)); // печатаем секунды
 
  
  Serial.print(RTC.get(DS1307_HR,true)); //часы
  Serial.print(":");
  Serial.print(RTC.get(DS1307_MIN,false));//минуты
  Serial.print(":");
  Serial.print(RTC.get(DS1307_SEC,false));//секунды
  Serial.print("      ");                
  Serial.print(RTC.get(DS1307_DATE,false));//дата
  Serial.print("/");
  Serial.print(RTC.get(DS1307_MTH,false));//месяц
  Serial.print("/");
  Serial.print(RTC.get(DS1307_YR,false)); //год
  Serial.println();
  
  delay(100);
}

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

а давайте вы выкинете весь свой код и просто запустите пример из библиотеки.. и сразу будет видно работает или нет.. а то у вас толи двигатель на дорогу выпал, толи колесо спустило... но вы продолжаете к этой бардаку еще прикручивать новые запчасти :)

Kvanto
Offline
Зарегистрирован: 26.04.2013

Puhlyaviy пишет:

а давайте вы выкинете весь свой код и просто запустите пример из библиотеки.. и сразу будет видно работает или нет.. а то у вас толи двигатель на дорогу выпал, толи колесо спустило... но вы продолжаете к этой бардаку еще прикручивать новые запчасти :)

примерчик заработал. Добавил к ним Loop и дисплей тоже заработал. Значит что-то было неправильное с установкой часов. Вот итоговый код. благодарю за помощь!




// 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 <LiquidCrystal.h> 
#include <Wire.h>
#include <DS1307.h> // written by  mattt on the Arduino forum and modified by D. Sjunnesson
#define pinRS  4 // RS  к аналоговому пину 4
#define pinE   5 // E   к аналоговому пину 5
#define pinDB4  10 // DB4 к цифровому пину 10
#define pinDB5  11 // DB5 к цифровому пину 11
#define pinDB6  12 // DB6 к цифровому пину 12
#define pinDB7  13 // DB7 к цифровому пину 13
LiquidCrystal lcd(pinRS, pinE, pinDB4, pinDB5, pinDB6, pinDB7); //Подключаем дисплей
void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);
  
  RTC.stop();
  RTC.set(DS1307_SEC,1);        //set the seconds
  RTC.set(DS1307_MIN,23);     //set the minutes
  RTC.set(DS1307_HR,12);       //set the hours
  RTC.set(DS1307_DOW,4);       //set the day of the week
  RTC.set(DS1307_DATE,5);       //set the date
  RTC.set(DS1307_MTH,3);        //set the month
  RTC.set(DS1307_YR,9);         //set the year
  RTC.start();

}

void loop()
{
  // Вывод единиц в сегменте единиц дней
  if (RTC.get(DS1307_DATE,false)<=9)//если едициц дней меньше-равно 9, то выводим на 1 шаг правее
  { lcd.setCursor(0, 0);
    lcd.print(" ");
    lcd.setCursor(1, 0);
    lcd.print (RTC.get(DS1307_DATE,false));}
  else // иначе (т.е. если единиц дней больше 9, то выводим на 1 шаг левее
  { lcd.setCursor(0, 0);
    lcd.print (RTC.get(DS1307_DATE,false));}
    
  //Отображение текущего месяца
  lcd.setCursor(2, 0); //указываем место печати названия месяца
  switch (RTC.get(DS1307_MTH,false)) // в зависимости от значения месяца печатаем название
  {
    case 1:    lcd.print("-01-");    break;
    case 2:    lcd.print("-02-");    break;
    case 3:    lcd.print("-03-");    break;
    case 4:    lcd.print("-04-");    break;
    case 5:    lcd.print("-05-");    break;
    case 6:    lcd.print("-06-");    break;
    case 7:    lcd.print("-07-");    break;
    case 8:    lcd.print("-08-");    break;
    case 9:    lcd.print("-09-");    break;
    case 10:   lcd.print("-10-");    break;
    case 11:   lcd.print("-11-");    break;
    case 12:   lcd.print("-12-");    break;
  }
  
  //Отображение текущего года гггг
  lcd.setCursor(6, 0); // указываем место печати значения года
  lcd.print(RTC.get(DS1307_YR,false)); // печатаем год

  // Отображение текущего дня недели 
  lcd.setCursor(11,0); //указываем место печати дня недели
  switch (RTC.get(DS1307_DOW,false))// в зависимости от номера дня недели выводим на экран
  {
    case 1:    lcd.print("/MON/");    break;
    case 2:    lcd.print("/TUE/");    break;
    case 3:    lcd.print("/WED/");    break;
    case 4:    lcd.print("/THU/");    break;
    case 5:    lcd.print("/FRI/");    break;
    case 6:    lcd.print("/SAT/");    break;
    case 7:    lcd.print("/SUN/");    break;
  }
  
  // Отображение времени чч:мм:сс
  lcd.setCursor(3,1);
  lcd.print(RTC.get(DS1307_HR,true)); // печатаем час
  lcd.setCursor(5,1);
  lcd.print(":"); // печатаем разделитель
  lcd.setCursor(6,1);
  lcd.print(RTC.get(DS1307_MIN,false)); // печатаем минуты
  lcd.setCursor(8,1);
  lcd.print(":"); // печатаем разделитель
  lcd.setCursor(9,1);
  lcd.print(RTC.get(DS1307_SEC,false)); // печатаем секунды
 
  
  Serial.print(RTC.get(DS1307_HR,true)); //часы
  Serial.print(":");
  Serial.print(RTC.get(DS1307_MIN,false));//минуты
  Serial.print(":");
  Serial.print(RTC.get(DS1307_SEC,false));//секунды
  Serial.print("      ");                
  Serial.print(RTC.get(DS1307_DATE,false));//дата
  Serial.print("/");
  Serial.print(RTC.get(DS1307_MTH,false));//месяц
  Serial.print("/");
  Serial.print(RTC.get(DS1307_YR,false)); //год
  Serial.println();
  
  delay(1000);
}

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Kvanto пишет:

примерчик заработал. Добавил к ним Loop и дисплей тоже заработал. Значит что-то было неправильное с установкой часов. Вот итоговый код. благодарю за помощь!

ну что вы, не нужно ни каких благодарностей... пива будет вполне достаточно :)

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Kvanto , я взял твой рабочий пример. У меня время убегает вперед аж за реальные 2 минуты - на все 10 ((. На дисплее показываются секунды 1,2,3...59,19,29,39,49,59,10,11 и т.д. ,т.е. секунды идут не правильно. В чем может быть проблема??? 

maksim
Offline
Зарегистрирован: 12.02.2012
#include "Arduino.h"
#include <LiquidCrystal.h> 
#include <Wire.h>
#include <DS1307.h> // written by  mattt on the Arduino forum and modified by D. Sjunnesson
#define pinRS  4 // RS  к аналоговому пину 4
#define pinE   5 // E   к аналоговому пину 5
#define pinDB4  10 // DB4 к цифровому пину 10
#define pinDB5  11 // DB5 к цифровому пину 11
#define pinDB6  12 // DB6 к цифровому пину 12
#define pinDB7  13 // DB7 к цифровому пину 13
LiquidCrystal lcd(pinRS, pinE, pinDB4, pinDB5, pinDB6, pinDB7); //Подключаем дисплей
char week[7][4] = {"MON","TUE","WED","THU","FRI","SAT","SUN"};

void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);

  RTC.stop();
  RTC.set(DS1307_SEC,1);        //set the seconds
  RTC.set(DS1307_MIN,23);     //set the minutes
  RTC.set(DS1307_HR,12);       //set the hours
  RTC.set(DS1307_DOW,4);       //set the day of the week
  RTC.set(DS1307_DATE,5);       //set the date
  RTC.set(DS1307_MTH,3);        //set the month
  RTC.set(DS1307_YR,9);         //set the year
  RTC.start();

}

void loop()
{
  // Вывод единиц в сегменте единиц дней
  lcd.setCursor(0, 0);
  if(RTC.get(DS1307_DATE, false) < 10) lcd.print(' '); //если едициц дней меньше-равно 9, то выводим на 1 шаг правее 
  lcd.print(RTC.get(DS1307_DATE, false));
  lcd.print(' ');
  
  //Отображение текущего месяца
  if(RTC.get(DS1307_MTH, false) < 10) lcd.print('0');
  lcd.print(RTC.get(DS1307_MTH, false)); // в зависимости от значения месяца печатаем название
  lcd.print(' ');
  
  //Отображение текущего года гггг
  lcd.print(RTC.get(DS1307_YR, false)); // печатаем год

  // Отображение текущего дня недели 
  lcd.setCursor(11,0); //указываем место печати дня недели
  lcd.print('/');
  lcd.print(week[RTC.get(DS1307_DOW, false)-1]);// в зависимости от номера дня недели выводим на экран
  lcd.print('/');

  // Отображение времени чч:мм:сс
  lcd.setCursor(3, 1);
  if(RTC.get(DS1307_HR, true) < 10) lcd.print(' ');
  lcd.print(RTC.get(DS1307_HR, false)); // печатаем час
  lcd.print(":"); // печатаем разделитель
  if(RTC.get(DS1307_MIN, false) < 10) lcd.print('0');
  lcd.print(RTC.get(DS1307_MIN, false)); // печатаем минуты
  lcd.print(":"); // печатаем разделитель
  if(RTC.get(DS1307_SEC, false) < 10) lcd.print('0');
  lcd.print(RTC.get(DS1307_SEC, false)); // печатаем секунды


  Serial.print(RTC.get(DS1307_HR,true)); //часы
  Serial.print(":");
  Serial.print(RTC.get(DS1307_MIN,false));//минуты
  Serial.print(":");
  Serial.print(RTC.get(DS1307_SEC,false));//секунды
  Serial.print("      ");                
  Serial.print(RTC.get(DS1307_DATE,false));//дата
  Serial.print("/");
  Serial.print(RTC.get(DS1307_MTH,false));//месяц
  Serial.print("/");
  Serial.print(RTC.get(DS1307_YR,false)); //год
  Serial.println();

  delay(1000);
}

 

mkvmaks
Offline
Зарегистрирован: 07.07.2013

maksim, спасибо за код. Только если ввести сегодняшние параметры (7 июля 2013, и время), то  отображается как            "70          2013 /SUN/"  , а время  все ок. 

 

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

Подправил, еще раз перекопируйте.

mkvmaks
Offline
Зарегистрирован: 07.07.2013

maksim,  большое тебе спасибо

mkvmaks
Offline
Зарегистрирован: 07.07.2013

 maksim, что бы не создавать новую тему. Я использую модуль часов реального времени (сам паял) - схемы в интернете есть. Есть такой код - он позволяет отключить от arduino основное питание, а при подаче снова питания - время продолжает идти дальше.  Не пробовал что-то такое делать??? Еще раз спасибо. 

 

#include <Wire.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>
#include "DS1307.h"

 
//Массив, содержащий время компиляции
char compileTime[] = __TIME__;
 
//Номера пинов Arduino, к которым подключается индикатор
#define DISPLAY_CLK_PIN 12  
#define DISPLAY_DIO_PIN 13
 
//Для работы с микросхемой часов и индикатором мы используем библиотеки
DS1307 clock;
 
LiquidCrystal lcd(4, 5, 10, 11, 12, 13);//инициализация портов 
 
void setup()
{
 {
 lcd.begin(16, 2);//инициализация дисплея
  }


  //Запускаем часы реального времени
  clock.begin();
 
  //Получаем число из строки, зная номер первого символа
  byte hour = getInt(compileTime, 0);
  byte minute = getInt(compileTime, 3);
  byte second = getInt(compileTime, 6);
 
  //Импровизированный хэш времени
  //Содержит в себе количество секунд с начала дня
  unsigned int hash =  hour * 60 * 60 + minute  * 60 + second; 
 
  //Проверяем несовпадение нового хэша с хэшем в EEPROM
  if (EEPROMReadInt(0) != hash) {
 
    //Сохраняем новый хэш
    EEPROMWriteInt(0, hash);
 
    //Готовим для записи в RTC часы, минуты, секунды
    clock.fillByHMS(hour, minute, second);
 
    //Записываем эти данные во внутреннюю память часов.
    //С этого момента они начинают считать нужное для нас время
    clock.setTime();
  }
 
}
 
 
void loop()
{
  //Значения для отображения на каждом из 4 разрядов
  int8_t timeDisp[4];
 
  //Запрашиваем время с часов
  clock.getTime();
 
  //Получаем десятки часов с помощью целочисленного деления
  timeDisp[0] = clock.hour / 10;
 
  //Получаем единицы часов с помощью остатка от деления
  timeDisp[1] = clock.hour % 10;
 
  //Проделываем то же самое с минутами
  timeDisp[2] = clock.minute / 10;
  timeDisp[3] = clock.minute % 10;
 
  //... а затем выводим его на экран
   lcd.setCursor(0,0);
   lcd.print(timeDisp[0]);
   lcd.print(timeDisp[1]);
   lcd.print(timeDisp[2]);
   lcd.print(timeDisp[3]);
 

 
}
 
char getInt(const char* string, int startIndex) {
  return int(string[startIndex] - '0') * 10 + int(string[startIndex+1]) - '0';
}
 
//Запись двухбайтового числа в память
void EEPROMWriteInt(int address, int value)
{
  EEPROM.write(address, lowByte(value));
  EEPROM.write(address + 1, highByte(value));
}
 
//Чтение числа из памяти
unsigned int EEPROMReadInt(int address)
{
  byte lowByte = EEPROM.read(address);
  byte highByte = EEPROM.read(address + 1);
 
  return (highByte << 8) | lowByte;
}
 
mkvmaks
Offline
Зарегистрирован: 07.07.2013

maksim, странно,  но вот вчера твой код залил - все работало. Ночью завис arduino - и все код больше не идет (((. Я загрузил дргуие коды- все работает,  а этот нет (((( В чем может быть причина??? Даже монитор порта молчит (((  

mkvmaks
Offline
Зарегистрирован: 07.07.2013

вроде понял в чем причина

leshak
Offline
Зарегистрирован: 29.09.2011

Решил на этих выходных тоже поигратся с этим модулем.

На данный момент есть:

- Определение подключен ли и работает ли модуль
- Отправление времени в Serial
- Установка заранее определенного времени по команде из Serial

В планах:

- Вывод на LCD  (только время. Даты и дни недели - в планах отсуствуют)
- Установка времени кнопками
- Выполнение каких-то функций в определенный момент (в 16:00 включить светик, в 17:00 - выключить).

Вообщем - ничего оригинального. 1001 часы на ардуине :) "Фишка", только в нудном и многословном (с очепятками) описании самого процесса создания часов :)

Если это хоть кому-нибудь интерестно, то...  Леший в мире Ардуины: Еще одни часы на Ардуине. Часть 1. Запускаем часы

Когда это примет хоть какой-то "юзабельный вид" - будет оформленно в виде отдельной темы в разделе "Проекты".

 

v.v.
Offline
Зарегистрирован: 15.08.2013

Тоже самое у меня с китайским модулем! Пробовал играться с резисторами, укоротил провода до минимума,  убираю питание с платы ардуино к модулю - часы  идут самостоятельно, только убираю питание со всей платы ардуино (USB шнур) - все часы потом не ходят!

А по ссылке leshak с библиотекой DS1307new.h все отлично часы ходят без питания и без изменений на плате модуля!

 

 
Rednaxela
Offline
Зарегистрирован: 26.08.2013

Две страницы текста, но так никто толком и не сказал, получается на МЕГЕ НЕЛЬЗЯ ПРИСОЕДЕНИТЬ эти часы к ЛЮБОМУ пину? ТОЛЬКО У 20 и 21 ? 

Не знаю! Перепробовал все - часы идут только с библиотекой РТС на 20 21 пине. С библиотекой ДС1307 нихрена не работает при любых раскладах. Выход SQ вообще не удалось запустить на 1 Гц.

Это ж надо так извращаться что никаких стандартов нет!  Называется е%$#ь люди и тратьте свое драгоценное время на то чтобы понять как подключить эти гребаные часы! Ну почему не сделать проще!

Я понимаю когда берешь голый контроллер, но с ардуино так мучится!!!!

Rednaxela
Offline
Зарегистрирован: 26.08.2013

Это все равно что купить новую машину и потом пол года настраивать режим работы двигателя чтобы она поехала!!!

А потом купить магнитолу и еще пол года изучать даташиты чтобы ее подключить!!!! Не просто к динамикам а ПО ОСОБОЙ ЛОГИКЕ которая была бы у разных магнитол разная!!! Еще вскрыть и перепаять схему (ПОПРАВИТЬ БИБЛИОТЕКУ) чтобы заработало!

Вот примерно так!

Rednaxela
Offline
Зарегистрирован: 26.08.2013

Матерые программисты объясните пожалуйста что можно сделать чтобы выход SQ заработал при использовании RTClib библиотеки.   Но есть еще одна проблема, если использовать прерываение и в нем считывать значения даты времени то программа зависает... функция now() не отрабатывается внутри прерывания, хотя внутри loop() работает корректно. Бред какойто!

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

Дам вам бесплатный совет, бросайте заниматься этим делом. С машиной пример неудачный - вы не купите новую машину, которая не едет и у которой нужно настраивать двигатель. Не хотите настраивать, тратить свое драгоценное время - купите готовое и не засерайте своим нытьем форум. Ардуина вам ничего не должна - она работает по все тем же законам физики и даташиту на контроллер - вот единый стандарт.  А успешный исход зависит только от прямоты ваших рук и понимания того что вы делаете.

vdk
Offline
Зарегистрирован: 14.04.2013

Rednaxela пишет:

объясните пожалуйста что можно сделать чтобы выход SQ заработал при использовании RTClib библиотеки.  

Доработать библиотеку напильником, чтобы она правильно устанавливала 7-й регистр у 1307

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

Для памяти: попалась неплохая статейка   Платка расширения "Tiny RTC I2C modules"

kazakoff
Offline
Зарегистрирован: 07.06.2013

maksim пишет:

Удаляете свою либу из arduino-1.0.3\libraries или перемещаете ее куда нибудь, качаете вот эту либу и туда же в arduino-1.0.3\libraries распаковываетеперезапускаете IDE. Подключать исключительно к А4 и А5, не забываем про подтягивающие резисторы, если таковых нет не модуле.вместе с либой есть такой пример

// 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> // written by  mattt on the Arduino forum and modified by D. Sjunnesson

void setup()
{
  Serial.begin(9600);

  RTC.stop();
  RTC.set(DS1307_SEC,1);        //set the seconds
  RTC.set(DS1307_MIN,23);     //set the minutes
  RTC.set(DS1307_HR,12);       //set the hours
  RTC.set(DS1307_DOW,4);       //set the day of the week
  RTC.set(DS1307_DATE,5);       //set the date
  RTC.set(DS1307_MTH,3);        //set the month
  RTC.set(DS1307_YR,9);         //set the year
  RTC.start();

}

void loop()
{

  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_DATE,false));//read date
  Serial.print("/");
  Serial.print(RTC.get(DS1307_MTH,false));//read month
  Serial.print("/");
  Serial.print(RTC.get(DS1307_YR,false)); //read year
  Serial.println();

  delay(1000);

}

 

Скачал либу собрал все по этой схеме

 

 

когда подключаю батарейку в монитор выходит время вот так 

45:85:85
 
типо микруха отваливается.
 
а когда отключаю батарейку нормально.
 
в чем может быть дело? левая микруха?
4ERTIK
Offline
Зарегистрирован: 24.03.2013

На этой схеме неправильная распиновка

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

4ERTIK пишет:

На этой схеме неправильная распиновка

Так покажите "правильную"...

http://datasheets.maximintegrated.com/en/ds/DS1307.pdf

Dimus
Offline
Зарегистрирован: 25.11.2012

maksim пишет:

4ERTIK пишет:

На этой схеме неправильная распиновка

Так покажите "правильную"...

http://datasheets.maximintegrated.com/en/ds/DS1307.pdf

там выводы с 5 по 8 наоборот пронумерованы, вот так правильно:

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

Dimus пишет:

там выводы с 5 по 8 наоборот пронумерованы, вот так правильно:

И как по вашему эта нумерация может повлиять на работу? Расположение выводов одинаковое.

msng
Offline
Зарегистрирован: 07.06.2012

kazakoff пишет:

Скачал либу собрал все по этой схеме

 

 

когда подключаю батарейку в монитор выходит время вот так 

45:85:85
 
типо микруха отваливается.
 
а когда отключаю батарейку нормально.
 
в чем может быть дело? левая микруха?

 

площадка под кварцем есть? она подключена к земле?

kazakoff
Offline
Зарегистрирован: 07.06.2013

msng пишет:

kazakoff пишет:

Скачал либу собрал все по этой схеме

 

 

когда подключаю батарейку в монитор выходит время вот так 

45:85:85
 
типо микруха отваливается.
 
а когда отключаю батарейку нормально.
 
в чем может быть дело? левая микруха?

 

площадка под кварцем есть? она подключена к земле?

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

gatsby163
Offline
Зарегистрирован: 10.03.2014

Вот если кому пригодится тестовый скетч для библиотеки ds1307new с коментами на русском, так же можно использовать вывод SQ меняя всего одну строчку:

RTC.ctrl = 0x00;                      // 0x00=отключен SQW, 0x10=1Hz,
                                               // 0x11=4096Hz, 0x12=8192Hz, 0x13=32768Hz
// #############################################################################
// #
// # 
// # 
// #############################################################################
// *********************************************
// Подключаем Библиотеки
// *********************************************
#include <Wire.h>                       // Библиотека "Wire.h" должна быть обязательно подключена.
#include <DS1307new.h>

// *********************************************
// DEFINE
// *********************************************

// *********************************************
// Переменные
// *********************************************
uint16_t startAddr = 0x0000;            // Начальный адрес для хранения в NV-RAM
uint16_t lastAddr;                      // новый адрес для хранения в NV-RAM
uint16_t TimeIsSet = 0xaa55;            // По этой переменной проверяется то, что время не нужно устанавливать заново

// *********************************************
// Установки
// *********************************************
void setup()
{
   Serial.begin(9600);

/*
   ОБРАТИТЕ ВНИМАНИЕ: Мы сделали адрес сдвига для NV-RAM! 
                   NV-RAM адрес 0x08 ДОЛЖЕН обратиться к адресу 0x00 = 0 
                   Чтобы избежать перезаписи регистров часов в случае 
                   Ошибок в коде. Так что последний адрес 0x38 = 56!
*/
  RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));

/*
   В следующих строках можно установить дату и время, учтите, это делается один раз
   Что бы установить часы заново, надо будет выключить резервное питание DS1307 и 
   снова включить, что бы сбросить все установки на заводские.
*/

  RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
  if (TimeIsSet != 0xaa55)
  {
    RTC.stopClock();
        
    RTC.fillByYMD(2014,2,28);
    RTC.fillByHMS(16,18,0);
    
    RTC.setTime();
    TimeIsSet = 0xaa55;
    RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
    RTC.startClock();
  }
  else
  {
    RTC.getTime();
  }

/*
   Регистр управления для пина SQW, который может быть использован в качестве прерывания.
*/
  RTC.ctrl = 0x00;                      // 0x00=отключен SQW, 0x10=1Hz,
                                        // 0x11=4096Hz, 0x12=8192Hz, 0x13=32768Hz
  RTC.setCTRL();

  Serial.println("DS1307 Testsketch");
  Serial.println("Format is \"hh:mm:ss dd-mm-yyyy DDD\"");

  uint8_t MESZ;                         //Летнее время

  MESZ = RTC.isMEZSummerTime();
  Serial.print("MEZ=0, MESZ=1 : ");
  Serial.println(MESZ, DEC);    
  Serial.println();
}

// *********************************************
// Программа
// *********************************************
void loop()
{
  RTC.getTime();
  if (RTC.hour < 10)                    
  {
    Serial.print("0");
    Serial.print(RTC.hour, DEC);
  } 
  else
  {
    Serial.print(RTC.hour, DEC);    //вывод значения Часы
  }
  Serial.print(":");
  if (RTC.minute < 10)                  
  {
    Serial.print("0");
    Serial.print(RTC.minute, DEC);
  }
  else
  {
    Serial.print(RTC.minute, DEC); //вывод значения Минуты
  }
  Serial.print(":");
  if (RTC.second < 10)                 
  {
    Serial.print("0");
    Serial.print(RTC.second, DEC);
  }
  else
  {
    Serial.print(RTC.second, DEC); //вывод значения Секунды
  }
  Serial.print(" ");
  if (RTC.day < 10)                    
  {
    Serial.print("0");
    Serial.print(RTC.day, DEC);
  }
  else
  {
    Serial.print(RTC.day, DEC); //вывод значения День
  }
  Serial.print("-");
  if (RTC.month < 10)                  
  {
    Serial.print("0");
    Serial.print(RTC.month, DEC);
  }
  else
  {
    Serial.print(RTC.month, DEC); //вывод значения Месяц
  }
  Serial.print("-");
  Serial.print(RTC.year, DEC); //вывод значения Год       
  Serial.print(" ");
  switch (RTC.dow)                      // Вывод дня недели
  {
    case 1:
      Serial.print("MON");
      break;
    case 2:
      Serial.print("TUE");
      break;
    case 3:
      Serial.print("WED");
      break;
    case 4:
      Serial.print("THU");
      break;
    case 5:
      Serial.print("FRI");
      break;
    case 6:
      Serial.print("SAT");
      break;
    case 7:
      Serial.print("SUN");
      break;
  }
  Serial.print(" seconds since 1.1.2000:");
  Serial.print(RTC.time2000, DEC);          //выводит значение сколько секунд прошло с 1 января 2000г. Не знаю для чего кому может пригодится
  uint8_t MESZ = RTC.isMEZSummerTime();     
  Serial.print(" MEZ=0, MESZ=1 : ");
  Serial.print(MESZ, DEC);                 //выводит значение Летнее или Зимнее время
  
  Serial.print(" - Address in NV-RAM is: ");
  RTC.getRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t));
  Serial.print(lastAddr, HEX);
  lastAddr = lastAddr + 1;              // мы хотим использовать его в качестве счетчика адреса, например
  RTC.setRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t));
  RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
  if (TimeIsSet == 0xaa55)              // Проверка были установлены часы или нет
  {
    Serial.println(" - Clock was set!");
  }
  else
  {
    Serial.println(" - Clock was NOT set!");
  }    
  delay(1000);                          // Ждем секунду
}

 

 

gatsby163
Offline
Зарегистрирован: 10.03.2014

Пытаюсь написать функцию установки времени кнопками для DS1307

Но выдает ошибку " lvalue required as increment operand" в строке 11, если я меняю ++ на число например 23 то все хорошо, ругается той же ошибкой на следующую строку...как можно приращивать значение на 1 в этом случае? Использую библиотеку из поста №9 этой темы.


void setupChas() 
{
int keyCode=0;
lcd.begin(16,2);
lcd.setCursor(0, 0);
lcd.print(" Setup Chas ");
lcd.setCursor(7, 1);
lcd.print(DS1307_HR);
do {
keyCode=ReadKey(KEYPAD_PIN);
if (keyCode==1){RTC.set(DS1307_HR++);delay(200);lcd.setCursor(7, 1);lcd.print(RTC.get(DS1307_HR,true));}
if (keyCode==2){RTC.set(DS1307_HR--);delay(200);lcd.setCursor(7, 1);lcd.print(DS1307_HR);}
} while (keyCode!=5 && keyCode!=4);

delay(200);
//if (keyCode==5) {EEPROM_write_byte(0, setTmp);}
if (keyCode==4) {setupMinute();}
}
m352005
Offline
Зарегистрирован: 14.04.2014
// TinyRTC for empty chip - DS18B20, PIN vcc = +5, gnd = gnd, SDA = Mega pin 20 (uno pin A4), SCL = Mega pin 21 (uno pin A5) 
 
#include <Wire.h>                       // Библиотека "Wire.h" должна быть обязательно подключена.
#include <DS1307new.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20, 20, 4);  // set the LCD address to 0x20 for a 20 chars and 4 line display
 
uint16_t startAddr = 0x0000;            // Начальный адрес для хранения в NV-RAM
uint16_t lastAddr;                      // новый адрес для хранения в NV-RAM
uint16_t TimeIsSet = 0xaa55;            // По этой переменной проверяется то, что время не нужно устанавливать заново
 
void setup()
{
  Serial.begin(9600);
  Wire.begin();
  lcd.init();    
  lcd.begin(20, 4);
  lcd.backlight();
//   ОБРАТИТЕ ВНИМАНИЕ: Мы сделали адрес сдвига для NV-RAM! NV-RAM адрес 0x08 ДОЛЖЕН обратиться к адресу 0x00 = 0 Чтобы избежать перезаписи регистров часов в случае ошибок в коде. Так что последний адрес 0x38 = 56!
  RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));
  RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
 
/*
// только для установки часов при первом запуске или для корректировки часов
//В следующих строках можно установить дату и время, учтите, это делается один раз Что бы установить часы заново, надо будет выключить резервное питание DS1307 и снова включить, что бы сбросить все установки на заводские.
  RTC.stopClock();
  RTC.fillByYMD(2014,4,13);
  RTC.fillByHMS(23,23,0);
  RTC.setTime();
  RTC.startClock();
  TimeIsSet = 0xaa55; 
//*/ 
    
  if (TimeIsSet != 0xaa55){
    RTC.stopClock();
    RTC.fillByYMD(2014,4,13);
    RTC.fillByHMS(22,55,0);
    RTC.setTime();
    TimeIsSet = 0xaa55;
    RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
    RTC.startClock();
  } else{
    RTC.getTime();
  }
 
  RTC.ctrl = 0x10;                      // 0x00=отключен SQW, 0x10=1Hz, 0x11=4096Hz, 0x12=8192Hz, 0x13=32768Hz Регистр управления для пина SQW, который может быть использован в качестве прерывания.
  RTC.setCTRL();
  Serial.println("Format is \"hh:mm:ss dd-mm-yyyy DDD\"");
 
  uint8_t MESZ;                         //Летнее время
 
  MESZ = RTC.isMEZSummerTime();
  Serial.print("MEZ=0, MESZ=1 : ");
  Serial.println(MESZ, DEC);   
  Serial.println();
}
 
// *********************************************
// Программа
// *********************************************
void loop()
{
  lcd.setCursor(0, 0);
  RTC.getTime();
  if (RTC.hour < 10){
    Serial.print("0"); lcd.print("0");
    Serial.print(RTC.hour, DEC); lcd.print(RTC.hour, DEC);
  } else {
    Serial.print(RTC.hour, DEC); lcd.print(RTC.hour, DEC);   //вывод значения Часы
  }
  Serial.print(":"); lcd.print(":");
  
  if (RTC.minute < 10){
    Serial.print("0"); lcd.print("0");
    Serial.print(RTC.minute, DEC); lcd.print(RTC.minute, DEC);
  } else{
    Serial.print(RTC.minute, DEC); lcd.print(RTC.minute, DEC);//вывод значения Минуты
  }
  Serial.print(":"); lcd.print(":");
  
  if (RTC.second < 10) {
    Serial.print("0"); lcd.print("0");
    Serial.print(RTC.second, DEC); lcd.print(RTC.second, DEC);
  } else{
    Serial.print(RTC.second, DEC); lcd.print(RTC.second, DEC);//вывод значения Секунды
  }
  Serial.print(" "); lcd.print(" ");
  
  if (RTC.day < 10) {
    Serial.print("0"); lcd.print("0");
    Serial.print(RTC.day, DEC); lcd.print(RTC.day, DEC);
  } else{
    Serial.print(RTC.day, DEC); lcd.print(RTC.day, DEC); //вывод значения День
  }
  Serial.print("-"); lcd.print("-");
  
  if (RTC.month < 10) {
    Serial.print("0"); lcd.print("0");
    Serial.print(RTC.month, DEC); lcd.print(RTC.month, DEC);
  } else{
    Serial.print(RTC.month, DEC); lcd.print(RTC.month, DEC); //вывод значения Месяц
  }
  Serial.print("-"); lcd.print("-");
  
  Serial.print(RTC.year-2000, DEC); lcd.print(RTC.year-2000, DEC); //вывод значения Год      
  Serial.print(" "); lcd.print(" ");
//  Serial.print(RTC.dow);
  switch (RTC.dow)                      // Вывод дня недели
  {
    case 1:
      Serial.print("MO"); lcd.print("MO");
      break;
    case 2:
      Serial.print("TU"); lcd.print("TU");
      break;
    case 3:
      Serial.print("WE"); lcd.print("WE");
      break;
    case 4:
      Serial.print("TH"); lcd.print("TH");
      break;
    case 5:
      Serial.print("FR"); lcd.print("FR");
      break;
    case 6:
      Serial.print("SA"); lcd.print("SA");
      break;
    case 0:
      Serial.print("SU"); lcd.print("SU");
      break;
  }
//  Serial.print(RTC.time2000, DEC);          //выводит значение сколько секунд прошло с 1 января 2000г. Не знаю для чего кому может пригодится
  uint8_t MESZ = RTC.isMEZSummerTime();    
  Serial.print(" MEZ=0, MESZ=1 : ");
  Serial.print(MESZ, DEC);                 //выводит значение Летнее или Зимнее время
   
//  Serial.print(" - Address in NV-RAM is: ");
  RTC.getRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t));
//  Serial.print(lastAddr, HEX);
  lastAddr = lastAddr + 1;              // мы хотим использовать его в качестве счетчика адреса, например
  RTC.setRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t));
  RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
 
  Serial.println();
  delay(1000);                          // Ждем секунду
}
 
m352005
Offline
Зарегистрирован: 14.04.2014

если не работает

1. проверить распиновку ds1307 - выше описано как

2. соответствие sda, scl портов портам arduino (uno отличается от mega)

3. положение резистора на lcd мониторе

4. наличие команды  lcd.backlight();

5. батарейку если сбрасывает часы

6. припайку корпуса кварца к контакту земля

7. пошлите в serial порт любой символ через монитор порта

8. размещение библиотек DS1307new.h и DS1307new.cpp в папке Arduino\libraries\DS1307new

9. для подключения lcd используется плата i2c-lcd http://www.ebay.com/bhp/i2c-lcd

10. для платы TinyRTC лучше припаять не штатную гребенку а 2.54 long female header, искать на ebay

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

Используя RTClib, датированную 1 июля 2014, наткнулся на интересный эффект: если автоматически устанавливать из скетча время с помощью функции rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); - то часы встают при переходе питания на батарейку. Если выставить часы по-старинке, то дальнейшее использование в скетче этой библиотеки (других функций RTClib) - не вызывает никаких глюков с часами.

Dimus
Offline
Зарегистрирован: 25.11.2012

Добрался до своего аналогичного модуля, перепробовал несколько библиотек и контактов .. заработал. Полежал неделю подключенный к ардуино и usb - батарейка потекла и работать перестал. :( Без LIR2032 тоже не работает. На батарейке 4,2 вольта, на vbat 2-2.3 в. Думаю с CR2032 попробовать.

BarberXP
Offline
Зарегистрирован: 30.11.2014

Пару часов пытался взбодрить модуль 1307., получил на дисплее те же цифры, что и топикстартер.

Взял себя в руки, прижал рукой тонкие контакты, воткнутые в "хлеб" и о чудо! получил реальное время на дисплее..))

Реальный неконтакт.

Так что, минимизируйте длины соединительных коннекторов.

BarberXP
Offline
Зарегистрирован: 30.11.2014

Rednaxela пишет:

Матерые программисты объясните пожалуйста что можно сделать чтобы выход SQ заработал при использовании RTClib библиотеки.   Но есть еще одна проблема, если использовать прерываение и в нем считывать значения даты времени то программа зависает... функция now() не отрабатывается внутри прерывания, хотя внутри loop() работает корректно. Бред какойто!

Ну нинаю. Я использую библиотеку DS1307, там внутри есть пример с LCD 1620. Все работает, кроме того выход SQ работает в полный рост.

Код:

#include <DS1307.h>
 
// Init the DS1307
  DS1307 rtc(20, 21);
  void setup();
{
  rtc.halt(true);   // остановить часы
  rtc.setSQWRate(SQW_RATE_1);     // выход SQ = 1 Hz
  rtc.enableSQW(true);
  rtc.halt(false);   // запустить часы

конец кода

MacSim
Offline
Зарегистрирован: 28.11.2012

LDmitry пишет:

Подскажите плз - почему могут останавливаться часы при отключении arduino от usb питания? По идее ведь должны продолжать идти от внутренней 3v батарейки 

1. Часы не останавливаются они продолжают идти.

2. При снятии питания с дуни останавливается выполнение проги дуней.

3. Что делает дуня при подаче питания? - Запускае прошитую в нее прогу с самого начала. В том числе и функцию setup где дуня кидает в часики параметры времени и даты.

void setup()
13	{
14	  Serial.begin(9600);
15	 
16	  RTC.stop();
17	  RTC.set(DS1307_SEC,1);        //set the seconds
18	  RTC.set(DS1307_MIN,23);     //set the minutes
19	  RTC.set(DS1307_HR,12);       //set the hours
20	  RTC.set(DS1307_DOW,4);       //set the day of the week
21	  RTC.set(DS1307_DATE,5);       //set the date
22	  RTC.set(DS1307_MTH,3);        //set the month
23	  RTC.set(DS1307_YR,9);         //set the year
24	  RTC.start();
25	 
26	}

Попробуйте так:1. Прошить дуню с установленными в сетапе данными.

                            1а. Запустите сериал монитор.

                            2. Закомпелируйте строки с 16 по 24 поставив перед каждой //

                            3. Прошейте с закомпелированными строками.

 Вы дожны увидеть что часики продолжают считать, а не выдают первоначальные значения (сетапа).

ЗЫ: 1а можно пропустить. Это для наглядности.

MacSim
Offline
Зарегистрирован: 28.11.2012

 

Rednaxela пишет:

 объясните пожалуйста ... функция now() не отрабатывается внутри прерывания, хотя внутри loop() работает корректно. Бред какойто!

Матерым себя не считаю, но ответить попробую, возможно матерые меня и поправят.

В библиотеке при считывании данных используется

delayMicroseconds(1);

Как я понимаю эта функция юзает прерывания от таймера 0.

Когда выполняется ваше прерывание остальные запрещаются.

Попробуйте закомпилировать эту строку в *.срр

В библиотеке DHS11 мне это помогло.

А лучше избегайте считывания в прерывании.

BarberXP
Offline
Зарегистрирован: 30.11.2014

У меня тоже при отключении питания Ардуины часы встают. При подаче питания - начинают идти с этого момента дальше.

Буду разбираться. Батарея стандартная, 3 вольта. CR2032. Хотя на упаковке написано 3,6.

bwn
Offline
Зарегистрирован: 25.08.2014

BarberXP пишет:

У меня тоже при отключении питания Ардуины часы встают. При подаче питания - начинают идти с этого момента дальше.

Буду разбираться. Батарея стандартная, 3 вольта. CR2032. Хотя на упаковке написано 3,6.

На 3,6 шли с аккумом и доп.делителем напряжения на резерв. Проверьте напряжение вашей батареи и проследите путь с нее до DS1307. Если делитель есть, может тупо не хватать напруги.

BarberXP
Offline
Зарегистрирован: 30.11.2014

Посмотрел схему - в самом деле после батареи стоит делитель. Также присутствует зарядная цепь. Следовательно надо ставить LIR2032 - аккумулятор с напряжением 3,6 вольта, а не простой элемент CR2032. Нужно было внимательнее читать описание. )) Спасибо за помощь.

 

BarberXP
Offline
Зарегистрирован: 30.11.2014

Купил и поставил LIR2032, все работает, часы идут и без внешнего питания. Только оооочень плохой контакт у штатных гибких соединителей с разъемами платы контроллера. Я про SDA и SCL. То не запишется время, то на 1602 отображается какая-то ахинея. Пришлось во время заливки скетча с раскомментированной установкой реального времени жгут проводов прижать рукой...:-) Короче, с бубнами все получилось.

 

bwn
Offline
Зарегистрирован: 25.08.2014

BarberXP пишет:

Посмотрел схему - в самом деле после батареи стоит делитель. Также присутствует зарядная цепь. Следовательно надо ставить LIR2032 - аккумулятор с напряжением 3,6 вольта, а не простой элемент CR2032. Нужно было внимательнее читать описание. )) Спасибо за помощь.

 

Я просто выкинул нижний резистор и зарядный диод, толку с этого все равно никакого и поставил обычный CR2032.

FlyTortoise
Offline
Зарегистрирован: 13.03.2015

http://s018.radikal.ru/i521/1504/a1/8aad4904009c.jpg

Прошу помочь разобраться.
Подключаю модуль с часами: http://arduino.shopium.ua/products/arduino-ds1307-rtc-module/ к Ардуино Мини (питание модуля от Ардуино).
Все работает пока Ардуина подключена к USB.
Как только от USB отключаю модуль перестает считать.
Замерил напряжения самой батареи (вынул из модуля) = 3,5 V
На 3 ноге DS1307 при отклученном от USB напряжение = 0,68V но ПОЧЕМУ?

 

НЕПОНЯТНО почему при отключении внешнего питания 4,28V на 3 ноге превращаются в 0,68V ?

Если батарея 3,5 V то по расчетной формуле делителя напряжения на резисторах Uвых = Uвх х (R2 / (R1 + R2)) где Uвх = 3,5V; R2 = 1,5 MOm; R1 = 470 MOm; т.е. Uвых = 2,6V а на деле 0,68V
Типа без внешнего питания DS1307 подсаживает по 3 ноге. Другого ничего не приходит на ум но там же МИКРО ПОТРЕБЛЕНИЕ как по даташиту!.
Хотя при наличии внешнего питания на 3 ноге 4,28V
Бред. Типа батарея не вытягивает по току, а DS1307 потребляет не микро а МАКСИ!

 

Просьба помочь разобраться

Заранее СПС.

 

 

bwn
Offline
Зарегистрирован: 25.08.2014

Проверил на своем модифицированном модуле (модификация - убран диод и резистор нижнего плеча зарядной цепи, D1 и R4, батарея CR2032), напряжение на 3 ноге - 2,78В. Поскольку толку от аккума на борту никакого (при постоянном заряде он умрет раньше, чем обычная батарея), рекомендую сделать аналогично.
На данный момент вариантов четыре:
1. Резистор нижнего плеча или входное сопротивление мелкосхемы меньше заявленного номинала (тогда эффект будет наблюдаться и при внешнем питании)
2. Аккумулятор мертв (модифицировать начал из за этого).

3. Сопротивление вашего тестера низкое.
4. Чип умер (если при подаче от USB работает - мало вероятно).

Если тестер не стрелочный, п.3 скорее всего исключаем, п.4 и 1 уже написал. Основное внимание обращаем на п.2 (возможно плохой контакт в колодке), т.к. при живой и нормально подключенной батарее вы не должны получить 4,2В на ноге №3. Из чего делаю вывод - батарея каким-то образом исключена из цепи. Замерьте напряжение на ней при отсутствии внешнего питания (один контакт у кварца, другой между мелкосхемами) и двигайтесь дальше, собака роется в том районе))).