Ну если так, то тогда получается что Kvanto поленился почитать эту ветку с начала.
да тут многие не читают ветки, их вполне устраивает что название темы совпадает с их проблемой :)
им так же лень брать родные библиотеки, и читать мануалы к ним :)
а об их железе и путях его соединения нам приходится догадыватся эмпирическими путями...
Словоохотливые в обычных обстоятельствах демоны, в спешном порядке вызванные из Подземельных Измерений, напускали на себя застенчивый вид и уклонялись от расспросов. Волшебные зеркала потрескались. С гадальных карт таинственным образом исчез весь рисунок. Хрустальные шары совершенно затуманились. Даже чайные листья, презрительно отвергаемые волшебниками как легкомысленные и ненадежные, сбивались в кучку на дне чашки и отказывались сдвинуться с места. (С) Терри Пратчетт
и что дальше? а взять библиотеку по ссылке выше в этой теме, вам религия не позволяет? :)
пойду опять мучить демонов и чаинки, может выясню куда он все же и что присоединил и какой библиотекой теперь пытается чего то добиться :)
Библиотеку то я установил из этой ветки. Вот код, который залил. В ветке для 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);
}
а давайте вы выкинете весь свой код и просто запустите пример из библиотеки.. и сразу будет видно работает или нет.. а то у вас толи двигатель на дорогу выпал, толи колесо спустило... но вы продолжаете к этой бардаку еще прикручивать новые запчасти :)
а давайте вы выкинете весь свой код и просто запустите пример из библиотеки.. и сразу будет видно работает или нет.. а то у вас толи двигатель на дорогу выпал, толи колесо спустило... но вы продолжаете к этой бардаку еще прикручивать новые запчасти :)
примерчик заработал. Добавил к ним 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);
}
примерчик заработал. Добавил к ним Loop и дисплей тоже заработал. Значит что-то было неправильное с установкой часов. Вот итоговый код. благодарю за помощь!
ну что вы, не нужно ни каких благодарностей... пива будет вполне достаточно :)
Kvanto , я взял твой рабочий пример. У меня время убегает вперед аж за реальные 2 минуты - на все 10 ((. На дисплее показываются секунды 1,2,3...59,19,29,39,49,59,10,11 и т.д. ,т.е. секунды идут не правильно. В чем может быть проблема???
#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);
}
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;
}
maksim, странно, но вот вчера твой код залил - все работало. Ночью завис arduino - и все код больше не идет (((. Я загрузил дргуие коды- все работает, а этот нет (((( В чем может быть причина??? Даже монитор порта молчит (((
Решил на этих выходных тоже поигратся с этим модулем.
На данный момент есть:
- Определение подключен ли и работает ли модуль
- Отправление времени в Serial
- Установка заранее определенного времени по команде из Serial
В планах:
- Вывод на LCD (только время. Даты и дни недели - в планах отсуствуют)
- Установка времени кнопками
- Выполнение каких-то функций в определенный момент (в 16:00 включить светик, в 17:00 - выключить).
Вообщем - ничего оригинального. 1001 часы на ардуине :) "Фишка", только в нудном и многословном (с очепятками) описании самого процесса создания часов :)
Тоже самое у меня с китайским модулем! Пробовал играться с резисторами, укоротил провода до минимума, убираю питание с платы ардуино к модулю - часы идут самостоятельно, только убираю питание со всей платы ардуино (USB шнур) - все часы потом не ходят!
А по ссылке leshak с библиотекой DS1307new.h все отлично часы ходят без питания и без изменений на плате модуля!
Две страницы текста, но так никто толком и не сказал, получается на МЕГЕ НЕЛЬЗЯ ПРИСОЕДЕНИТЬ эти часы к ЛЮБОМУ пину? ТОЛЬКО У 20 и 21 ?
Не знаю! Перепробовал все - часы идут только с библиотекой РТС на 20 21 пине. С библиотекой ДС1307 нихрена не работает при любых раскладах. Выход SQ вообще не удалось запустить на 1 Гц.
Это ж надо так извращаться что никаких стандартов нет! Называется е%$#ь люди и тратьте свое драгоценное время на то чтобы понять как подключить эти гребаные часы! Ну почему не сделать проще!
Я понимаю когда берешь голый контроллер, но с ардуино так мучится!!!!
Это все равно что купить новую машину и потом пол года настраивать режим работы двигателя чтобы она поехала!!!
А потом купить магнитолу и еще пол года изучать даташиты чтобы ее подключить!!!! Не просто к динамикам а ПО ОСОБОЙ ЛОГИКЕ которая была бы у разных магнитол разная!!! Еще вскрыть и перепаять схему (ПОПРАВИТЬ БИБЛИОТЕКУ) чтобы заработало!
Матерые программисты объясните пожалуйста что можно сделать чтобы выход SQ заработал при использовании RTClib библиотеки. Но есть еще одна проблема, если использовать прерываение и в нем считывать значения даты времени то программа зависает... функция now() не отрабатывается внутри прерывания, хотя внутри loop() работает корректно. Бред какойто!
Дам вам бесплатный совет, бросайте заниматься этим делом. С машиной пример неудачный - вы не купите новую машину, которая не едет и у которой нужно настраивать двигатель. Не хотите настраивать, тратить свое драгоценное время - купите готовое и не засерайте своим нытьем форум. Ардуина вам ничего не должна - она работает по все тем же законам физики и даташиту на контроллер - вот единый стандарт. А успешный исход зависит только от прямоты ваших рук и понимания того что вы делаете.
Удаляете свою либу из 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);
}
Скачал либу собрал все по этой схеме
когда подключаю батарейку в монитор выходит время вот так
Вот если кому пригодится тестовый скетч для библиотеки 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); // Ждем секунду
}
Пытаюсь написать функцию установки времени кнопками для 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();}
}
#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!
// только для установки часов при первом запуске или для корректировки часов
//В следующих строках можно установить дату и время, учтите, это делается один раз Что бы установить часы заново, надо будет выключить резервное питание DS1307 и снова включить, что бы сбросить все установки на заводские.
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\"");
Используя RTClib, датированную 1 июля 2014, наткнулся на интересный эффект: если автоматически устанавливать из скетча время с помощью функции rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); - то часы встают при переходе питания на батарейку. Если выставить часы по-старинке, то дальнейшее использование в скетче этой библиотеки (других функций RTClib) - не вызывает никаких глюков с часами.
Добрался до своего аналогичного модуля, перепробовал несколько библиотек и контактов .. заработал. Полежал неделю подключенный к ардуино и usb - батарейка потекла и работать перестал. :( Без LIR2032 тоже не работает. На батарейке 4,2 вольта, на vbat 2-2.3 в. Думаю с CR2032 попробовать.
Матерые программисты объясните пожалуйста что можно сделать чтобы выход SQ заработал при использовании RTClib библиотеки. Но есть еще одна проблема, если использовать прерываение и в нем считывать значения даты времени то программа зависает... функция now() не отрабатывается внутри прерывания, хотя внутри loop() работает корректно. Бред какойто!
Ну нинаю. Я использую библиотеку DS1307, там внутри есть пример с LCD 1620. Все работает, кроме того выход SQ работает в полный рост.
Подскажите плз - почему могут останавливаться часы при отключении 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. Прошейте с закомпелированными строками.
Вы дожны увидеть что часики продолжают считать, а не выдают первоначальные значения (сетапа).
У меня тоже при отключении питания Ардуины часы встают. При подаче питания - начинают идти с этого момента дальше.
Буду разбираться. Батарея стандартная, 3 вольта. CR2032. Хотя на упаковке написано 3,6.
На 3,6 шли с аккумом и доп.делителем напряжения на резерв. Проверьте напряжение вашей батареи и проследите путь с нее до DS1307. Если делитель есть, может тупо не хватать напруги.
Посмотрел схему - в самом деле после батареи стоит делитель. Также присутствует зарядная цепь. Следовательно надо ставить LIR2032 - аккумулятор с напряжением 3,6 вольта, а не простой элемент CR2032. Нужно было внимательнее читать описание. )) Спасибо за помощь.
Купил и поставил LIR2032, все работает, часы идут и без внешнего питания. Только оооочень плохой контакт у штатных гибких соединителей с разъемами платы контроллера. Я про SDA и SCL. То не запишется время, то на 1602 отображается какая-то ахинея. Пришлось во время заливки скетча с раскомментированной установкой реального времени жгут проводов прижать рукой...:-) Короче, с бубнами все получилось.
Посмотрел схему - в самом деле после батареи стоит делитель. Также присутствует зарядная цепь. Следовательно надо ставить LIR2032 - аккумулятор с напряжением 3,6 вольта, а не простой элемент CR2032. Нужно было внимательнее читать описание. )) Спасибо за помощь.
Я просто выкинул нижний резистор и зарядный диод, толку с этого все равно никакого и поставил обычный CR2032.
Прошу помочь разобраться.
Подключаю модуль с часами: 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 потребляет не микро а МАКСИ!
Проверил на своем модифицированном модуле (модификация - убран диод и резистор нижнего плеча зарядной цепи, D1 и R4, батарея CR2032), напряжение на 3 ноге - 2,78В. Поскольку толку от аккума на борту никакого (при постоянном заряде он умрет раньше, чем обычная батарея), рекомендую сделать аналогично.
На данный момент вариантов четыре:
1. Резистор нижнего плеча или входное сопротивление мелкосхемы меньше заявленного номинала (тогда эффект будет наблюдаться и при внешнем питании)
2. Аккумулятор мертв (модифицировать начал из за этого).
3. Сопротивление вашего тестера низкое.
4. Чип умер (если при подаче от USB работает - мало вероятно).
Если тестер не стрелочный, п.3 скорее всего исключаем, п.4 и 1 уже написал. Основное внимание обращаем на п.2 (возможно плохой контакт в колодке), т.к. при живой и нормально подключенной батарее вы не должны получить 4,2В на ноге №3. Из чего делаю вывод - батарея каким-то образом исключена из цепи. Замерьте напряжение на ней при отсутствии внешнего питания (один контакт у кварца, другой между мелкосхемами) и двигайтесь дальше, собака роется в том районе))).
Вам сюда.
Вам сюда.
гыыыыы... браво... бис....
ну то что он подсоединил не правильно то оно даже пьяным ёжикам понятно
даю наводку.. и жду что вернут пивом :)
Ну если так, то тогда получается что Kvanto поленился почитать эту ветку с начала.
Ну если так, то тогда получается что Kvanto поленился почитать эту ветку с начала.
да тут многие не читают ветки, их вполне устраивает что название темы совпадает с их проблемой :)
им так же лень брать родные библиотеки, и читать мануалы к ним :)
а об их железе и путях его соединения нам приходится догадыватся эмпирическими путями...
Словоохотливые в обычных обстоятельствах демоны, в спешном порядке вызванные из Подземельных Измерений, напускали на себя застенчивый вид и уклонялись от расспросов. Волшебные зеркала потрескались. С гадальных карт таинственным образом исчез весь рисунок. Хрустальные шары совершенно затуманились. Даже чайные листья, презрительно отвергаемые волшебниками как легкомысленные и ненадежные, сбивались в кучку на дне чашки и отказывались сдвинуться с места. (С) Терри Пратчетт
У меня же Leonardo. точно. значит неправильно соединил. подсоединил SCL и SDA к цифровым портам. Вот что в мониторе.
и что дальше? а взять библиотеку по ссылке выше в этой теме, вам религия не позволяет? :)
пойду опять мучить демонов и чаинки, может выясню куда он все же и что присоединил и какой библиотекой теперь пытается чего то добиться :)
и что дальше? а взять библиотеку по ссылке выше в этой теме, вам религия не позволяет? :)
пойду опять мучить демонов и чаинки, может выясню куда он все же и что присоединил и какой библиотекой теперь пытается чего то добиться :)
Библиотеку то я установил из этой ветки. Вот код, который залил. В ветке для IDE 1.0.3. выложена библиотека. У меня 1.5.2. может это влияет?
а давайте вы выкинете весь свой код и просто запустите пример из библиотеки.. и сразу будет видно работает или нет.. а то у вас толи двигатель на дорогу выпал, толи колесо спустило... но вы продолжаете к этой бардаку еще прикручивать новые запчасти :)
а давайте вы выкинете весь свой код и просто запустите пример из библиотеки.. и сразу будет видно работает или нет.. а то у вас толи двигатель на дорогу выпал, толи колесо спустило... но вы продолжаете к этой бардаку еще прикручивать новые запчасти :)
примерчик заработал. Добавил к ним Loop и дисплей тоже заработал. Значит что-то было неправильное с установкой часов. Вот итоговый код. благодарю за помощь!
примерчик заработал. Добавил к ним Loop и дисплей тоже заработал. Значит что-то было неправильное с установкой часов. Вот итоговый код. благодарю за помощь!
ну что вы, не нужно ни каких благодарностей... пива будет вполне достаточно :)
Kvanto , я взял твой рабочий пример. У меня время убегает вперед аж за реальные 2 минуты - на все 10 ((. На дисплее показываются секунды 1,2,3...59,19,29,39,49,59,10,11 и т.д. ,т.е. секунды идут не правильно. В чем может быть проблема???
maksim, спасибо за код. Только если ввести сегодняшние параметры (7 июля 2013, и время), то отображается как "70 2013 /SUN/" , а время все ок.
Подправил, еще раз перекопируйте.
maksim, большое тебе спасибо
maksim, что бы не создавать новую тему. Я использую модуль часов реального времени (сам паял) - схемы в интернете есть. Есть такой код - он позволяет отключить от arduino основное питание, а при подаче снова питания - время продолжает идти дальше. Не пробовал что-то такое делать??? Еще раз спасибо.
maksim, странно, но вот вчера твой код залил - все работало. Ночью завис arduino - и все код больше не идет (((. Я загрузил дргуие коды- все работает, а этот нет (((( В чем может быть причина??? Даже монитор порта молчит (((
вроде понял в чем причина
Решил на этих выходных тоже поигратся с этим модулем.
На данный момент есть:
- Определение подключен ли и работает ли модуль
- Отправление времени в Serial
- Установка заранее определенного времени по команде из Serial
В планах:
- Вывод на LCD (только время. Даты и дни недели - в планах отсуствуют)
- Установка времени кнопками
- Выполнение каких-то функций в определенный момент (в 16:00 включить светик, в 17:00 - выключить).
Вообщем - ничего оригинального. 1001 часы на ардуине :) "Фишка", только в нудном и многословном (с очепятками) описании самого процесса создания часов :)
Если это хоть кому-нибудь интерестно, то... Леший в мире Ардуины: Еще одни часы на Ардуине. Часть 1. Запускаем часы
Когда это примет хоть какой-то "юзабельный вид" - будет оформленно в виде отдельной темы в разделе "Проекты".
Тоже самое у меня с китайским модулем! Пробовал играться с резисторами, укоротил провода до минимума, убираю питание с платы ардуино к модулю - часы идут самостоятельно, только убираю питание со всей платы ардуино (USB шнур) - все часы потом не ходят!
А по ссылке leshak с библиотекой DS1307new.h все отлично часы ходят без питания и без изменений на плате модуля!
Две страницы текста, но так никто толком и не сказал, получается на МЕГЕ НЕЛЬЗЯ ПРИСОЕДЕНИТЬ эти часы к ЛЮБОМУ пину? ТОЛЬКО У 20 и 21 ?
Не знаю! Перепробовал все - часы идут только с библиотекой РТС на 20 21 пине. С библиотекой ДС1307 нихрена не работает при любых раскладах. Выход SQ вообще не удалось запустить на 1 Гц.
Это ж надо так извращаться что никаких стандартов нет! Называется е%$#ь люди и тратьте свое драгоценное время на то чтобы понять как подключить эти гребаные часы! Ну почему не сделать проще!
Я понимаю когда берешь голый контроллер, но с ардуино так мучится!!!!
Это все равно что купить новую машину и потом пол года настраивать режим работы двигателя чтобы она поехала!!!
А потом купить магнитолу и еще пол года изучать даташиты чтобы ее подключить!!!! Не просто к динамикам а ПО ОСОБОЙ ЛОГИКЕ которая была бы у разных магнитол разная!!! Еще вскрыть и перепаять схему (ПОПРАВИТЬ БИБЛИОТЕКУ) чтобы заработало!
Вот примерно так!
Матерые программисты объясните пожалуйста что можно сделать чтобы выход SQ заработал при использовании RTClib библиотеки. Но есть еще одна проблема, если использовать прерываение и в нем считывать значения даты времени то программа зависает... функция now() не отрабатывается внутри прерывания, хотя внутри loop() работает корректно. Бред какойто!
Дам вам бесплатный совет, бросайте заниматься этим делом. С машиной пример неудачный - вы не купите новую машину, которая не едет и у которой нужно настраивать двигатель. Не хотите настраивать, тратить свое драгоценное время - купите готовое и не засерайте своим нытьем форум. Ардуина вам ничего не должна - она работает по все тем же законам физики и даташиту на контроллер - вот единый стандарт. А успешный исход зависит только от прямоты ваших рук и понимания того что вы делаете.
объясните пожалуйста что можно сделать чтобы выход SQ заработал при использовании RTClib библиотеки.
Доработать библиотеку напильником, чтобы она правильно устанавливала 7-й регистр у 1307
Для памяти: попалась неплохая статейка Платка расширения "Tiny RTC I2C modules"
Удаляете свою либу из arduino-1.0.3\libraries или перемещаете ее куда нибудь, качаете вот эту либу и туда же в arduino-1.0.3\libraries распаковываете, перезапускаете IDE. Подключать исключительно к А4 и А5, не забываем про подтягивающие резисторы, если таковых нет не модуле.
вместе с либой есть такой пример
Скачал либу собрал все по этой схеме
когда подключаю батарейку в монитор выходит время вот так
На этой схеме неправильная распиновка
На этой схеме неправильная распиновка
http://datasheets.maximintegrated.com/en/ds/DS1307.pdf
На этой схеме неправильная распиновка
http://datasheets.maximintegrated.com/en/ds/DS1307.pdf
там выводы с 5 по 8 наоборот пронумерованы, вот так правильно:
там выводы с 5 по 8 наоборот пронумерованы, вот так правильно:
Скачал либу собрал все по этой схеме
когда подключаю батарейку в монитор выходит время вот так
площадка под кварцем есть? она подключена к земле?
Скачал либу собрал все по этой схеме
когда подключаю батарейку в монитор выходит время вот так
площадка под кварцем есть? она подключена к земле?
Спасибо помогло!
Вот если кому пригодится тестовый скетч для библиотеки ds1307new с коментами на русском, так же можно использовать вывод SQ меняя всего одну строчку:
Пытаюсь написать функцию установки времени кнопками для DS1307
Но выдает ошибку " lvalue required as increment operand" в строке 11, если я меняю ++ на число например 23 то все хорошо, ругается той же ошибкой на следующую строку...как можно приращивать значение на 1 в этом случае? Использую библиотеку из поста №9 этой темы.
если не работает
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
Используя RTClib, датированную 1 июля 2014, наткнулся на интересный эффект: если автоматически устанавливать из скетча время с помощью функции rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); - то часы встают при переходе питания на батарейку. Если выставить часы по-старинке, то дальнейшее использование в скетче этой библиотеки (других функций RTClib) - не вызывает никаких глюков с часами.
Добрался до своего аналогичного модуля, перепробовал несколько библиотек и контактов .. заработал. Полежал неделю подключенный к ардуино и usb - батарейка потекла и работать перестал. :( Без LIR2032 тоже не работает. На батарейке 4,2 вольта, на vbat 2-2.3 в. Думаю с CR2032 попробовать.
Пару часов пытался взбодрить модуль 1307., получил на дисплее те же цифры, что и топикстартер.
Взял себя в руки, прижал рукой тонкие контакты, воткнутые в "хлеб" и о чудо! получил реальное время на дисплее..))
Реальный неконтакт.
Так что, минимизируйте длины соединительных коннекторов.
Матерые программисты объясните пожалуйста что можно сделать чтобы выход SQ заработал при использовании RTClib библиотеки. Но есть еще одна проблема, если использовать прерываение и в нем считывать значения даты времени то программа зависает... функция now() не отрабатывается внутри прерывания, хотя внутри loop() работает корректно. Бред какойто!
Ну нинаю. Я использую библиотеку DS1307, там внутри есть пример с LCD 1620. Все работает, кроме того выход SQ работает в полный рост.
Код:
конец кода
Подскажите плз - почему могут останавливаться часы при отключении arduino от usb питания? По идее ведь должны продолжать идти от внутренней 3v батарейки
1. Часы не останавливаются они продолжают идти.
2. При снятии питания с дуни останавливается выполнение проги дуней.
3. Что делает дуня при подаче питания? - Запускае прошитую в нее прогу с самого начала. В том числе и функцию setup где дуня кидает в часики параметры времени и даты.
Попробуйте так:1. Прошить дуню с установленными в сетапе данными.
1а. Запустите сериал монитор.
2. Закомпелируйте строки с 16 по 24 поставив перед каждой //
3. Прошейте с закомпелированными строками.
Вы дожны увидеть что часики продолжают считать, а не выдают первоначальные значения (сетапа).
ЗЫ: 1а можно пропустить. Это для наглядности.
объясните пожалуйста ... функция now() не отрабатывается внутри прерывания, хотя внутри loop() работает корректно. Бред какойто!
Матерым себя не считаю, но ответить попробую, возможно матерые меня и поправят.
В библиотеке при считывании данных используется
delayMicroseconds(1);
Как я понимаю эта функция юзает прерывания от таймера 0.
Когда выполняется ваше прерывание остальные запрещаются.
Попробуйте закомпилировать эту строку в *.срр
В библиотеке DHS11 мне это помогло.
А лучше избегайте считывания в прерывании.
У меня тоже при отключении питания Ардуины часы встают. При подаче питания - начинают идти с этого момента дальше.
Буду разбираться. Батарея стандартная, 3 вольта. CR2032. Хотя на упаковке написано 3,6.
У меня тоже при отключении питания Ардуины часы встают. При подаче питания - начинают идти с этого момента дальше.
Буду разбираться. Батарея стандартная, 3 вольта. CR2032. Хотя на упаковке написано 3,6.
На 3,6 шли с аккумом и доп.делителем напряжения на резерв. Проверьте напряжение вашей батареи и проследите путь с нее до DS1307. Если делитель есть, может тупо не хватать напруги.
Посмотрел схему - в самом деле после батареи стоит делитель. Также присутствует зарядная цепь. Следовательно надо ставить LIR2032 - аккумулятор с напряжением 3,6 вольта, а не простой элемент CR2032. Нужно было внимательнее читать описание. )) Спасибо за помощь.
Купил и поставил LIR2032, все работает, часы идут и без внешнего питания. Только оооочень плохой контакт у штатных гибких соединителей с разъемами платы контроллера. Я про SDA и SCL. То не запишется время, то на 1602 отображается какая-то ахинея. Пришлось во время заливки скетча с раскомментированной установкой реального времени жгут проводов прижать рукой...:-) Короче, с бубнами все получилось.
Посмотрел схему - в самом деле после батареи стоит делитель. Также присутствует зарядная цепь. Следовательно надо ставить LIR2032 - аккумулятор с напряжением 3,6 вольта, а не простой элемент CR2032. Нужно было внимательнее читать описание. )) Спасибо за помощь.
Я просто выкинул нижний резистор и зарядный диод, толку с этого все равно никакого и поставил обычный CR2032.
http://s018.radikal.ru/i521/1504/a1/8aad4904009c.jpg
Проверил на своем модифицированном модуле (модификация - убран диод и резистор нижнего плеча зарядной цепи, D1 и R4, батарея CR2032), напряжение на 3 ноге - 2,78В. Поскольку толку от аккума на борту никакого (при постоянном заряде он умрет раньше, чем обычная батарея), рекомендую сделать аналогично.
На данный момент вариантов четыре:
1. Резистор нижнего плеча или входное сопротивление мелкосхемы меньше заявленного номинала (тогда эффект будет наблюдаться и при внешнем питании)
2. Аккумулятор мертв (модифицировать начал из за этого).
3. Сопротивление вашего тестера низкое.
4. Чип умер (если при подаче от USB работает - мало вероятно).
Если тестер не стрелочный, п.3 скорее всего исключаем, п.4 и 1 уже написал. Основное внимание обращаем на п.2 (возможно плохой контакт в колодке), т.к. при живой и нормально подключенной батарее вы не должны получить 4,2В на ноге №3. Из чего делаю вывод - батарея каким-то образом исключена из цепи. Замерьте напряжение на ней при отсутствии внешнего питания (один контакт у кварца, другой между мелкосхемами) и двигайтесь дальше, собака роется в том районе))).