Помогите пожалуйста с часами DS1302 и DS1307

artxam
Offline
Зарегистрирован: 20.01.2016

Здравствуйте нужна помощь с преобразованием кода для часов DS1307 на код для часов DS1302 , возможно ли  это ?

#include <Wire.h> //Подключаем библиотеку для использования I2C интерфейса с модулем RTC 
#include <RTClib.h> //Подключаем библиотеку для использования модуля часов реального времени RTC 

RTC_DS1307 RTC; //Создаем переменную класса - для использования RTC 

//----------Объявляем разные переменные------------ 
const int RelayChn1 = 6; //Используем цифровой ПОРТ 6 для ПЕРВОГО канала релейного модуля 
const int RelayChn2 = 7; //Используем цифровой ПОРТ 7 для ВТОРОГО канала релейного модуля 
//----------Настройки времени и продолжительности включения реле 

//----------ПЕРВЫЙ канал---------------------------- 
const long StartRelCn_1 = 25200; //Время срабатывания в ПЕРВОМ канале релейного модуля (в секундах от начала суток) 
//в данном случае 25200 - это 7 часов 00 минут = ( 60секунд *60 минут *7 = 25200) 
const long DurationCh_1 = 10; //ДЛИТЕЛЬНОСТЬ срабатывания реле в ПЕРВОМ канале (в секундах) 

//----------ВТОРОЙ канал---------------------------- 
const long StartRelCn_2 = 37800; //Время срабатывания во ВТОРОМ канале релейного модуля (в секундах от начала суток) 
//В данном случае 10 часов 30 минут = (60 секунд * 60 минут * 10 часов + 60сек*30мин = 37800) 
const long DurationCh_2 = 15; //ДЛИТЕЛЬНОСТЬ срабатывания реле во ВТОРОМ канале (в секундах) 

//----------Модуль инициализации setup() - выполняется один раз при инициализации платы при подаче напряжение (и аналогичных событиях) 
void setup(){ 

pinMode(RelayChn1,OUTPUT); //Инициализируем порт для ПЕРВОГО канала как ВЫХОД 
pinMode(RelayChn2,OUTPUT); //Инициализируем порт для ВТОРОГО канала как ВЫХОД 

digitalWrite(RelayChn1,HIGH); //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень 
digitalWrite(RelayChn2,HIGH); //Т.к. используемый релейный модуль с опторазвязкой - управляется инверсной логикой 



Wire.begin(); //Инициируем I2C интерфейс 
RTC.begin(); //Инициирум RTC модуль 

// RTC.adjust(DateTime(__DATE__, __TIME__)); //С этой строки необходимо убрать комментарии один раз в начале, 
//для того, чтобы загрузить в RTC дату и время на момент компиляции программы 
//Иногда необходимо заливать СКЕТЧ на плату со снятым комментарием - для поправки 
//времени в RTC, НО оставлять такой СКЕТЧ в работе НЕЛЬЗЯ !!!!!!!!!!!!! 

} // КОНЕЦ ИНИЦИАЛИЗАЦИИ 

//-------------------------------------------------- 
void loop() // ПРОГРАММЫй безусловный ЦИКЛ 
{ 
DateTime myTime = RTC.now(); //Читаем данные времени из RTC при каждом выполнении цикла 

//----------Раздел обработки реле по времени ---- 
long utime = myTime.unixtime(); //сохраняем в переменную - время в формате UNIX 
utime %= 86400; //Сохраняем в этой же переменной остаток деления на кол-во секнд в сутках, 
//Это дает количество секунд с начала текущих суток 

//------------КАНАЛ 1------------------------------ 
if ((utime >= StartRelCn_1) && 
(utime < (StartRelCn_1+DurationCh_1))) 
//Если секунд с начала суток больше, чем задано для включения 
//Но, одновременно и меньше, чем задано для включения + длительность 
{ 
digitalWrite(RelayChn1,LOW); //Устанавливаем на ПЕРВОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает 
} 
else //во всех остальных случаях 
{ 
digitalWrite(RelayChn1,HIGH); //Устанавливаем на ПЕРВОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается 
} 

//------------КАНАЛ 2 - все аналогично ----------- 
if ((utime >= StartRelCn_2) && 
(utime < (StartRelCn_2+DurationCh_2))) 
{ 
digitalWrite(RelayChn2,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает 
} 
else 
{ 
digitalWrite(RelayChn2,HIGH); //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается 
} 

}//------------Конец ЦИКЛА----------------------------- 

 

artxam
Offline
Зарегистрирован: 20.01.2016

Помогите плиз

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Какого рода помощь нужна? Это секретно или напишете всё же?

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Нужно дописывать в библиотеку RTC код

в .h

// RTC based on the DS1302 chip connected via pins
class DS1302 {
public:
	DS1302 (uint8_t ce_pin, uint8_t sck_pin, uint8_t io_pin);
	uint8_t begin(void);
	void adjust(const DateTime& dt);
	uint8_t isrunning(void);
	DateTime now();
	uint8_t read(const uint8_t addr);
	void write(const uint8_t addr, const uint8_t val);
private:
	uint8_t _read();
	void _write(const uint8_t val);
protected:
	uint8_t ce, sck, io;
};

в .cpp

DS1302:: DS1302 (uint8_t ce_pin, uint8_t sck_pin, uint8_t io_pin) {
	ce = ce_pin;
	sck = sck_pin;
	io = io_pin;
}
uint8_t DS1302::begin(void) {
	pinMode(ce, OUTPUT);
	pinMode(sck, OUTPUT);
	pinMode(io, INPUT);
}
uint8_t DS1302::_read() {
	pinMode(io, INPUT);
	uint8_t value = 0;
	for (uint8_t i = 0; i < 8; ++i) {
		bit = digitalRead(io);
		value |= (bit << i);  // Bits are read LSB first.
		digitalWrite(sck, HIGH);
		digitalWrite(sck, LOW);
	}
	return value;
}

void DS1302::_write(const uint8_t val) {
	pinMode(io, OUTPUT);
	shiftOut(io, sck, LSBFIRST, val);
}
uint8_t DS1302::read(const uint8_t addr) {
	const uint8_t cmd = (0x81 | (addr << 1))
	_write(cmd);
	return _read();
}

void DS1302::write(const uint8_t addr, const uint8_t val) {
	const uint8_t cmd = (0x80 | (addr << 1))
	_write(cmd);
	_write(val);
}

uint8_t DS1302::isrunning(void) {
	uint8_t ss = read(0);
	return !(ss>>7);
}
DateTime DS1302::now() {
	_write(0xBF);
	uint8_t ss = bcd2bin(_read() & 0x7F);
	uint8_t mm = bcd2bin(_read());
	uint8_t hh = bcd2bin(_read());
	uint8_t d = bcd2bin(_read());
	uint8_t m = bcd2bin(_read());
	_read();
	uint16_t y = bcd2bin(_read()) + 2000;
	return DateTime (y, m, d, hh, mm, ss);
}
void DS1307::adjust(const DateTime& dt) {
	_write(0xBE);
	_write(bin2bcd(dt.second()));
	_write(bin2bcd(dt.minute()));
	_write(bin2bcd(dt.hour()));
	_write(bin2bcd(dt.day()));
	_write(bin2bcd(dt.month()));
	_write(bin2bcd(dt.dayOfWeek()));
	_write(bin2bcd(dt.year() - 2000));
	_write(0);
}

Естественно код не тестил даже на компилируемость - надеюсь рабочий, накидал по быстрому по даташиту.

Обновил свою библиотеку тут https://github.com/NeiroNx/RTCLib

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, тогда Вы направильную ветку форума выбрали. Если Вам нужен готовый код, то Вам вот сюда. Там за денюшку напишут.  Здесь не пишут готовых кодов. Здесь помогают тем, кто пишет сам.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Сам бы я никогда не купил DS1302 - ибо интегрируемость чипа слабая - интерфейс не i2c, не spi - не имеет аппаратной реализации. 

karl2233
Offline
Зарегистрирован: 05.07.2015

NeiroN, на Всегалактическом чемпионате по советам, этот занял бы первое место с большим отрывом =)

я вот тож, по незнанию прикупил 1302 и теперь маюсь с интеграцией в готовые скетчи(у самого чёт не получается часы с бдильником сделать).

а варинт с покупкой 1307 или других, не рассматривается в силу разных причин.

нашел тут библиотеку iarduino, теперь сижу, разбираюсь.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Ну код я выложил свой  - может всетки его заставим работать, раз у вас все равно есть этот DS1302.

Библиотека то клнечно хорошая, но там нет реализации "датавремя", unixtime и прочих плюшек. 

karl2233
Offline
Зарегистрирован: 05.07.2015

да мне надо просто часы на LED(без сдвиговых регистров) и будильник, так что дата мне не нужна.

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

за код спасибо, бум пытаться =)

kukuyok
Offline
Зарегистрирован: 22.07.2018

Привет! Наткнулся на вашу либу после iarduino_RTC и соблазнился на наличие необходимого мне метода unixtime(), но не смог завести сами часики (на iarduino_RTC отлично ходют). В каком состоянии поддержка этой железки? Она должна работать? Поскольку наименование пинов на платке и в вашей либе разное, поправьте, плз, если не так сопоставил мой-ваш:

RST-CE

CLK-SCK

DAT-IO

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Из общих соображений как-то RST - это обычно reset, а CE - выбор устройства. Если мы вместо выбора будем давать сигнал на перезагрузку, то вряд ли устройство будет работать.