Управление яркостью стветодиодной лентой в зависимости от времени

Lazar_net
Offline
Зарегистрирован: 18.04.2016

Добрый день!

Прошу помощи знающих людей. Решил сделать дополнительное освещение в коридоре квартиры, которое бы включалось от датчика движения. При этом в дневное время ( например с 08-00 утра до 22-00) лента горела бы на полную яркость, а ночью (с 22-00 до 08-00) работало в половину яркости.

Задача:

Сделать освещение коридора светодиодной лентой, которая изменяла бы яркость в зависимости от времени - 100% яркость с 08-00 до 22-00, 50% яркость с 22-00 до 08-00.

Есть уже - одноцветная лента - 10 метров, есть блок питания к ней 12V 8.3А 100W (брался блок с запасом как по току, так и по мощности), датчик движения ( работающий от 220V), Arduino ( есть UNO, Nano, Mega, но предпочтительнее строить на Uno), l2c RTC на ds1307 AT24C32, 2 шт одноканальных реле ( зачем - думал сделать переключение ленты с одного реле на другое, на одном прямо запитана лента, на втором через резистор. Но вроде бы можно управлять яркостью самой ардуино) 

Требуется помощь в програмнной части. ну и частично в общей информации по подключению. 

На форуме в основном видел подключение RGB лент. Видел в продаже шилды для подключения лент, но ценник на них космический ( от 900 руб за кусочек пластика), хотелось бы попробывать сделать подручными средствами.

Спасибо!

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

какое потребление ленты?

Lazar_net
Offline
Зарегистрирован: 18.04.2016

Если по математическим расчетам - 96 ватт / 8 ампер исходя из даташита на светодиоды

keefa
Offline
Зарегистрирован: 19.06.2015

Lazar_net пишет:

Добрый день!

Прошу помощи знающих людей. Решил сделать дополнительное освещение в коридоре квартиры, которое бы включалось от датчика движения. При этом в дневное время ( например с 08-00 утра до 22-00) лента горела бы на полную яркость, а ночью (с 22-00 до 08-00) работало в половину яркости.

Задача:

Сделать освещение коридора светодиодной лентой, которая изменяла бы яркость в зависимости от времени - 100% яркость с 08-00 до 22-00, 50% яркость с 22-00 до 08-00.

Есть уже - одноцветная лента - 10 метров, есть блок питания к ней 12V 8.3А 100W (брался блок с запасом как по току, так и по мощности), датчик движения ( работающий от 220V), Arduino ( есть UNO, Nano, Mega, но предпочтительнее строить на Uno), l2c RTC на ds1307 AT24C32, 2 шт одноканальных реле ( зачем - думал сделать переключение ленты с одного реле на другое, на одном прямо запитана лента, на втором через резистор. Но вроде бы можно управлять яркостью самой ардуино) 

Требуется помощь в програмнной части. ну и частично в общей информации по подключению. 

На форуме в основном видел подключение RGB лент. Видел в продаже шилды для подключения лент, но ценник на них космический ( от 900 руб за кусочек пластика), хотелось бы попробывать сделать подручными средствами.

Спасибо!

 

Хочется конечно помочь, но чем...

Что уже сделано? что не получается?

Или нужно,

1. нарисовать схему.

2. написать программу.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Помощь - содействие кому-нибудь в чём-нибудь, участие в чём-нибудь, приносящее облегчение.

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

думаю что тут все понятно...

Lazar_net
Offline
Зарегистрирован: 18.04.2016

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

//----------ИМПОРТ БИБЛИОТЕК------------------------- 
#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 = 28800; //Время срабатывания в ПЕРВОМ канале релейного модуля (в секундах от начала суток)  
//в данном случае 28800 - это 8 часов 00 минут
const long DurationCh_1 = 50400; //ДЛИТЕЛЬНОСТЬ срабатывания реле в ПЕРВОМ канале (в секундах) 

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

//----------Модуль инициализации 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); //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается 
} 

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

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

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

Lazar_net пишет:

Добрый день!

Прошу помощи знающих людей. Решил сделать дополнительное освещение в коридоре квартиры, которое бы включалось от датчика движения. При этом в дневное время ( например с 08-00 утра до 22-00) лента горела бы на полную яркость, а ночью (с 22-00 до 08-00) работало в половину яркости.

Задача:

Сделать освещение коридора светодиодной лентой, которая изменяла бы яркость в зависимости от времени - 100% яркость с 08-00 до 22-00, 50% яркость с 22-00 до 08-00.

Есть уже - одноцветная лента - 10 метров, есть блок питания к ней 12V 8.3А 100W (брался блок с запасом как по току, так и по мощности), датчик движения ( работающий от 220V), Arduino ( есть UNO, Nano, Mega, но предпочтительнее строить на Uno), l2c RTC на ds1307 AT24C32, 2 шт одноканальных реле ( зачем - думал сделать переключение ленты с одного реле на другое, на одном прямо запитана лента, на втором через резистор. Но вроде бы можно управлять яркостью самой ардуино) 

Требуется помощь в програмнной части. ну и частично в общей информации по подключению. 

На форуме в основном видел подключение RGB лент. Видел в продаже шилды для подключения лент, но ценник на них космический ( от 900 руб за кусочек пластика), хотелось бы попробывать сделать подручными средствами.

Спасибо!

 

Резистором у 95Вт да и транзистором яркость особо не покрутишь. :) Если необходимо именно ступенчатое изменение яркости в 2 раза, то самое простое это порезать ленту пополам, ночью включать оба куска последовательно, днём - параллельно. Это можно сделать релюшкой без заморочек.

Lazar_net
Offline
Зарегистрирован: 18.04.2016

Опытным путем выяснилось что подойдет резистор на 200 ОМ мощностью 2Вт. Как раз нужное освещение выдает и не греется.

Lazar_net
Offline
Зарегистрирован: 18.04.2016

Mr.Privet пишет:

Помощь - содействие кому-нибудь в чём-нибудь, участие в чём-нибудь, приносящее облегчение.

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

думаю что тут все понятно...

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

Оформить тему с самого начала по всем канонам и правилам Сообщества было проблематично в виду малого опыта нахождения в Сообществе.

Буду исправляться.

Замечание принял к сведению.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

реле имеет 3 контакта, один NC (normally closed) NO (normally opened) b COM (common). Из источника питание провод идет в COM, с NС на прямую к лампочкам, а с NO в лампочкам через резистор. Так при переключении реле будет меняться режим освещение. Ну или парралельное-последовотельное подключение, немного сложнее зато без резисторов.

по поводу программы я бы вытаскивал из RTC только часы и если часы от 10 до 22 то выкл реле, если нет то вкл реле.

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

Lazar_net пишет:

Опытным путем выяснилось что подойдет резистор на 200 ОМ мощностью 2Вт. Как раз нужное освещение выдает и не греется.

Так сколько лента то потребляет? 8А или сколько? 8^2*200=3.2кВт расеиваемой мощности. :)

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

1. Строка 46 наверное, не нужна - не трогал эту библиотеку и точно не знаю.

2. Если (текущее время в сутках больше назначенного времени включения) И (текущее время в сутках меньше назначенного времени выключения) включить полную яркость, иначе включить половину яркости. День приходится в середину суточного интервала - и тут заворота суток влияния нет.
Lazar_net
Offline
Зарегистрирован: 18.04.2016

faeton пишет:

Lazar_net пишет:

Опытным путем выяснилось что подойдет резистор на 200 ОМ мощностью 2Вт. Как раз нужное освещение выдает и не греется.

Так сколько лента то потребляет? 8А или сколько? 8^2*200=3.2кВт расеиваемой мощности. :)

По потребляемой мощности брал данные из datasheet на ленту (3528 CMD 120шт в метре. Всего метров 10)  поэтому и получились такие данные. А вот про резистор - проверял очень просто - включил его в цепь и посмотрел результат)) Результат устроил семейство, на том и сошлись. Но так как перетыкивать питание с прямого на резистор ручками двараза в день очень муторно, и решили прилепить Ардуинку что бы делала это за меня. 

Mr.Privet пишет:

реле имеет 3 контакта, один NC (normally closed) NO (normally opened) b COM (common). Из источника питание провод идет в COM, с NС на прямую к лампочкам, а с NO в лампочкам через резистор. Так при переключении реле будет меняться режим освещение. Ну или парралельное-последовотельное подключение, немного сложнее зато без резисторов.

по поводу программы я бы вытаскивал из RTC только часы и если часы от 10 до 22 то выкл реле, если нет то вкл реле.

Все гениальное действительно просто! Использование одного реле это просто супер. Но возникает вопрос - не станет ли чего с реле при его столь долгой работой под каждым из режимов? ( рассуждаю как потребитель).

И почему резисторы не лучшее решение? 

 

И еще вопрос - обязательно нужно все переводить в unixtime? или можно с RTC вытащить прямое значение часа, что бы в дальнейшем сравнить его со значением действия?

keefa
Offline
Зарегистрирован: 19.06.2015

Уже более конструктивно.

Если уж решили полъзовать ленты на 12 В, то я бы пошел в сторону применения Полевого транзистора(мосфет), Схема не сложная. при этом, мощность(интенсивность свечения), можно регулировать от 0 - 100%. Так же можно реализовать плавное включение выключение. Если уж делать то делать! )) 

keefa
Offline
Зарегистрирован: 19.06.2015

У меня есть реализованный "проект" освещение рабочей поверхности на кухне. там нет часов реального времени, но их не трудно встроить. Есть датчик движения, есть мосфет, есть инфракрасный приемник( менял задержку на выключение освещения и мощность). Датчик движения применялся из набора для ардуино на 5В. Есть готовая рабочая схема: 

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

Lazar_net пишет:

faeton пишет:

Lazar_net пишет:

Опытным путем выяснилось что подойдет резистор на 200 ОМ мощностью 2Вт. Как раз нужное освещение выдает и не греется.

Так сколько лента то потребляет? 8А или сколько? 8^2*200=3.2кВт расеиваемой мощности. :)

По потребляемой мощности брал данные из datasheet на ленту (3528 CMD 120шт в метре. Всего метров 10)  поэтому и получились такие данные. А вот про резистор - проверял очень просто - включил его в цепь и посмотрел результат)) Результат устроил семейство, на том и сошлись. Но так как перетыкивать питание с прямого на резистор ручками двараза в день очень муторно, и решили прилепить Ардуинку что бы делала это за меня. 

Mr.Privet пишет:

реле имеет 3 контакта, один NC (normally closed) NO (normally opened) b COM (common). Из источника питание провод идет в COM, с NС на прямую к лампочкам, а с NO в лампочкам через резистор. Так при переключении реле будет меняться режим освещение. Ну или парралельное-последовотельное подключение, немного сложнее зато без резисторов.

по поводу программы я бы вытаскивал из RTC только часы и если часы от 10 до 22 то выкл реле, если нет то вкл реле.

Все гениальное действительно просто! Использование одного реле это просто супер. Но возникает вопрос - не станет ли чего с реле при его столь долгой работой под каждым из режимов? ( рассуждаю как потребитель).

И почему резисторы не лучшее решение? 

 

И еще вопрос - обязательно нужно все переводить в unixtime? или можно с RTC вытащить прямое значение часа, что бы в дальнейшем сравнить его со значением действия?

Теоритически долго включенное реле может получить намагниченность якоря и может нагреваться. Но есть твёрдотельные реле, да и любой полевичок потянет, если резистор 2Вт не греется. Вы разберитесь с током потребления. На счёт модуля RTC я не знаю. Юникс тайм - это количество секунд со дня моего рождения, а что даёт RTC микросхема по умолчанию я не рабирался.

Lazar_net
Offline
Зарегистрирован: 18.04.2016

Откоректировал скетч под работу с 1 реле, проверить работу смогу вечером.

//----------ИМПОРТ БИБЛИОТЕК------------------------- 
#include <Wire.h> //Подключаем библиотеку для использования I2C интерфейса с модулем RTC 
#include <RTClib.h> //Подключаем библиотеку для использования модуля часов реального времени RTC 

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

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

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

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

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

digitalWrite(RelayChn1,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); //Устанавливаем на ПЕРВОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается 
} 

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

keefa пишет:

Уже более конструктивно.

Если уж решили полъзовать ленты на 12 В, то я бы пошел в сторону применения Полевого транзистора(мосфет), Схема не сложная. при этом, мощность(интенсивность свечения), можно регулировать от 0 - 100%. Так же можно реализовать плавное включение выключение. Если уж делать то делать! )) 

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

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Lazar_net пишет:

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

не станет. оно для этого и создано ) реле "изнашивается" при переключениях, и то не сильно, а у Вас оно 2 раза в сутки. БП от диодов быстрее сгорит...

Lazar_net пишет:

И почему резисторы не лучшее решение? 

Лучшее решение - это то что вы можете реализовать при своих возможностях и средствах. У нас в теме уже 3 варианта: резистор, мосфет и парралельно-последовательное соединение. что из этого проще и лучше реализовать решать Вам. Вот лично я бы сделал с резистором и не парился. только в мощьности не прогадайте.

Lazar_net пишет:

И еще вопрос - обязательно нужно все переводить в unixtime? или можно с RTC вытащить прямое значение часа, что бы в дальнейшем сравнить его со значением действия?

Это зависит от библеотеки которую вы используете (RTClib.h) обычно вызывается RTC.hours

keefa
Offline
Зарегистрирован: 19.06.2015

Lazar_net пишет:

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

Попробуйте, работать с транзистором не сложнее чем с реле. Включение реле digitalWrite(pin, HIGH);

для транзистора analogWrite(pin, уровень от 0 - 255 зависит от требуемой интенсивности свечения); 

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

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

if (RTC.hours>=10&&RTC.hours<=22)digitalWrite(RelayChn1,HIGH);
else digitalWrite(RelayChn1,LOW);

и будет Вам счастье

Если режимы перепутуются поменяйте HIGH и LOW местами.

Иногда проще переписать скетч чем перепоять схему...

Lazar_net
Offline
Зарегистрирован: 18.04.2016

Mr.Privet пишет:

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

if (RTC.hours>=10&&RTC.hours<=22)digitalWrite(RelayChn1,HIGH);
else digitalWrite(RelayChn1,LOW);

и будет Вам счастье

Если режимы перепутуются поменяйте HIGH и LOW местами.

Иногда проще переписать скетч чем перепоять схему...

Время на RTC уже выставлено. Соотвествнно должно будет заработать. Спасибо, после теста обязательно отпишусь.

keefa пишет:

Lazar_net пишет:

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

Попробуйте, работать с транзистором не сложнее чем с реле. Включение реле digitalWrite(pin, HIGH);

для транзистора analogWrite(pin, уровень от 0 - 255 зависит от требуемой интенсивности свечения); 

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

Lazar_net
Offline
Зарегистрирован: 18.04.2016

Mr.Privet пишет:

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

if (RTC.hours>=10&&RTC.hours<=22)digitalWrite(RelayChn1,HIGH);
else digitalWrite(RelayChn1,LOW);

и будет Вам счастье

Если режимы перепутуются поменяйте HIGH и LOW местами.

Иногда проще переписать скетч чем перепоять схему...

Попробывал заменить строки проверки времени на Ваши, компиляция выдала ошибку 

_______1_____:37: error: 'class RTC_DS1307' has no member named 'hours'

 if (RTC.hours>=10&&RTC.hours<=22)digitalWrite(RelayChn1,HIGH);

                        ^

exit status 1
'class RTC_DS1307' has no member named 'hours'

Ниже привел библиотеку, которая используются для работы с RTC

/ Code by JeeLabs http://news.jeelabs.org/code/
// Released to the public domain! Enjoy!

#ifndef _RTCLIB_H_
#define _RTCLIB_H_

#include <Arduino.h>
class TimeSpan;


#define PCF8523_ADDRESS       0x68
#define PCF8523_CLKOUTCONTROL 0x0F
#define PCF8523_CONTROL_3     0x02

#define DS1307_ADDRESS  0x68
#define DS1307_CONTROL  0x07
#define DS1307_NVRAM    0x08

#define DS3231_ADDRESS  0x68
#define DS3231_CONTROL  0x0E
#define DS3231_STATUSREG 0x0F

#define SECONDS_PER_DAY 86400L

#define SECONDS_FROM_1970_TO_2000 946684800



// Simple general-purpose date/time class (no TZ / DST / leap second handling!)
class DateTime {
public:
    DateTime (uint32_t t =0);
    DateTime (uint16_t year, uint8_t month, uint8_t day,
                uint8_t hour =0, uint8_t min =0, uint8_t sec =0);
    DateTime (const DateTime& copy);
    DateTime (const char* date, const char* time);
    DateTime (const __FlashStringHelper* date, const __FlashStringHelper* time);
    uint16_t year() const       { return 2000 + yOff; }
    uint8_t month() const       { return m; }
    uint8_t day() const         { return d; }
    uint8_t hour() const        { return hh; }
    uint8_t minute() const      { return mm; }
    uint8_t second() const      { return ss; }
    uint8_t dayOfTheWeek() const;

    // 32-bit times as seconds since 1/1/2000
    long secondstime() const;   
    // 32-bit times as seconds since 1/1/1970
    uint32_t unixtime(void) const;

    DateTime operator+(const TimeSpan& span);
    DateTime operator-(const TimeSpan& span);
    TimeSpan operator-(const DateTime& right);

protected:
    uint8_t yOff, m, d, hh, mm, ss;
};

// Timespan which can represent changes in time with seconds accuracy.
class TimeSpan {
public:
    TimeSpan (int32_t seconds = 0);
    TimeSpan (int16_t days, int8_t hours, int8_t minutes, int8_t seconds);
    TimeSpan (const TimeSpan& copy);
    int16_t days() const         { return _seconds / 86400L; }
    int8_t  hours() const        { return _seconds / 3600 % 24; }
    int8_t  minutes() const      { return _seconds / 60 % 60; }
    int8_t  seconds() const      { return _seconds % 60; }
    int32_t totalseconds() const { return _seconds; }

    TimeSpan operator+(const TimeSpan& right);
    TimeSpan operator-(const TimeSpan& right);

protected:
    int32_t _seconds;
};

// RTC based on the DS1307 chip connected via I2C and the Wire library
enum Ds1307SqwPinMode { OFF = 0x00, ON = 0x80, SquareWave1HZ = 0x10, SquareWave4kHz = 0x11, SquareWave8kHz = 0x12, SquareWave32kHz = 0x13 };

class RTC_DS1307 {
public:
    boolean begin(void);
    static void adjust(const DateTime& dt);
    uint8_t isrunning(void);
    static DateTime now();
    static Ds1307SqwPinMode readSqwPinMode();
    static void writeSqwPinMode(Ds1307SqwPinMode mode);
    uint8_t readnvram(uint8_t address);
    void readnvram(uint8_t* buf, uint8_t size, uint8_t address);
    void writenvram(uint8_t address, uint8_t data);
    void writenvram(uint8_t address, uint8_t* buf, uint8_t size);
};

// RTC based on the DS3231 chip connected via I2C and the Wire library
enum Ds3231SqwPinMode { DS3231_OFF = 0x01, DS3231_SquareWave1Hz = 0x00, DS3231_SquareWave1kHz = 0x08, DS3231_SquareWave4kHz = 0x10, DS3231_SquareWave8kHz = 0x18 };

class RTC_DS3231 {
public:
    boolean begin(void);
    static void adjust(const DateTime& dt);
    bool lostPower(void);
    static DateTime now();
    static Ds3231SqwPinMode readSqwPinMode();
    static void writeSqwPinMode(Ds3231SqwPinMode mode);
};


// RTC based on the PCF8523 chip connected via I2C and the Wire library
enum Pcf8523SqwPinMode { PCF8523_OFF = 7, PCF8523_SquareWave1HZ = 6, PCF8523_SquareWave32HZ = 5, PCF8523_SquareWave1kHz = 4, PCF8523_SquareWave4kHz = 3, PCF8523_SquareWave8kHz = 2, PCF8523_SquareWave16kHz = 1, PCF8523_SquareWave32kHz = 0 };

class RTC_PCF8523 {
public:
    boolean begin(void);
    void adjust(const DateTime& dt);
    boolean initialized(void);
    static DateTime now();

    Pcf8523SqwPinMode readSqwPinMode();
    void writeSqwPinMode(Pcf8523SqwPinMode mode);
};

// RTC using the internal millis() clock, has to be initialized before use
// NOTE: this clock won't be correct once the millis() timer rolls over (>49d?)
class RTC_Millis {
public:
    static void begin(const DateTime& dt) { adjust(dt); }
    static void adjust(const DateTime& dt);
    static DateTime now();

protected:
    static long offset;
};

#endif // _RTCLIB_H_

 

keefa
Offline
Зарегистрирован: 19.06.2015

Lazar_net пишет:

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

Для Вашего применения любой недорогой, n-канальный с током от 10А сток-исток, и напряжением не менее 20В. Да, и желательно что бы был слогическим уровнем управления. Самый распространенный IRFZ44N

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Lazar_net пишет:

 

Попробывал заменить строки проверки времени на Ваши, компиляция выдала ошибку 

_______1_____:37: error: 'class RTC_DS1307' has no member named 'hours'

тогда пробуем так

if (RTC.hour()>=10&&RTC.hour()<=22)digitalWrite(RelayChn1,HIGH);
else digitalWrite(RelayChn1,LOW);

 

Lazar_net
Offline
Зарегистрирован: 18.04.2016

Mr.Privet пишет:

Lazar_net пишет:

 

Попробывал заменить строки проверки времени на Ваши, компиляция выдала ошибку 

_______1_____:37: error: 'class RTC_DS1307' has no member named 'hours'

тогда пробуем так

if (RTC.hour()>=10&&RTC.hour()<=22)digitalWrite(RelayChn1,HIGH);
else digitalWrite(RelayChn1,LOW);

 

Это было первое что я попробовал, так же пробывал "hh" 

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

Lazar_net
Offline
Зарегистрирован: 18.04.2016

Замерил ток потребления ленты - 1.53А

Залил скетч из 16 поста - проверил на малых отрезках с привязкой ко времени - все работает. отправил в бой проверим несколько суток.

Спасибо за помощь. Особенно за мысль про 1 реле.

В дальнейшем буду развивать идею на транзисторах))