ds1307 +relay

Hayko
Offline
Зарегистрирован: 02.07.2017

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

изменил под себя, сделал на 3 relay и чтоб несколько раз включились но возникли проблемы, подскажите пожалуйста может что-то не так со скетчом

вот скетч

//----------ИМПОРТ БИБЛИОТЕК------------------------- 

#include <Wire.h> //Подключаем библиотеку для использования I2C интерфейса с модулем RTC 
#include <RTClib.h> //Подключаем библиотеку для использования модуля часов реального времени RTC 
 
RTC_DS1307 RTC; //Создаем переменную класса - для использования RTC 
 
//----------Объявляем разные переменные------------ 
const int RelayChn1 = 6; //Используем цифровой ПОРТ 6 для ПЕРВОГО канала релейного модуля свет
const int RelayChn2 = 7; //Используем цифровой ПОРТ 7 для ВТОРОГО канала релейного модуля Компрессор
const int RelayChn3 = 8; //Используем цифровой ПОРТ 8 для ВТОРОГО канала релейного модуля насос
 
//----------Настройки времени и продолжительности включения реле 
 
//----------ПЕРВЫЙ канал---------------------------- 
const long StartRelCn_1 = 19800; //Время срабатывания в ПЕРВОМ канале релейного модуля (в секундах от начала суток) 
                                //в данном случае 18000 - это 5 часов 00 минут = ( 60секунд *60 минут *5 = 18000) 
const long DurationCh_1 = 64800; //ДЛИТЕЛЬНОСТЬ срабатывания реле в ПЕРВОМ канале (в секундах) 
 
//----------ВТОРОЙ канал---------------------------- 
const long StartRelCn_2 = 3570;    //Время срабатывания во ВТОРОМ канале релейного модуля (в секундах от начала суток) 
                                 //В данном случае 10 часов 30 минут = (60 секунд * 60 минут * 10 часов + 60сек*30мин = 37800) 
const long DurationCh_2 = 125;      //ДЛИТЕЛЬНОСТЬ срабатывания реле во ВТОРОМ канале (в секундах) 
 
const long StartRelCn_3 = 14370;
const long DurationCh_3 = 125;
 
const long StartRelCn_4 = 25170;
const long DurationCh_4 = 125;
 
const long StartRelCn_5 = 35970;
const long DurationCh_5 = 125;
 
const long StartRelCn_6 = 46770;
const long DurationCh_6 = 125;
 
const long StartRelCn_7 = 57570;
const long DurationCh_7 = 125;
 
const long StartRelCn_8 = 68370;
const long DurationCh_8 = 125;
 
const long StartRelCn_9 = 79170;
const long DurationCh_9 = 125;
 
//------------третий канал---------------
 
const long StartRelCn_10 = 3600;    //Время срабатывания во ВТОРОМ канале релейного модуля (в секундах от начала суток) 
                                 //В данном случае 10 часов 30 минут = (60 секунд * 60 минут * 10 часов + 60сек*30мин = 37800) 
const long DurationCh_10 = 100;      //ДЛИТЕЛЬНОСТЬ срабатывания реле во ВТОРОМ канале (в секундах) 
 
const long StartRelCn_11 = 14400;
const long DurationCh_11 = 100;
 
const long StartRelCn_12 = 25200;
const long DurationCh_12 = 100;
 
const long StartRelCn_13 = 36000;
const long DurationCh_13 = 100;
 
const long StartRelCn_14 = 46800;
const long DurationCh_14 = 100;
 
const long StartRelCn_15 = 57600;
const long DurationCh_15 = 100;
 
const long StartRelCn_16 = 68400;
const long DurationCh_16 = 100;
 
const long StartRelCn_17 = 79200;
const long DurationCh_17 = 100;
 
//----------Модуль инициализации setup() - выполняется один раз при инициализации платы при подаче напряжение (и аналогичных событиях) 
 
void setup(){ 
 
pinMode(RelayChn1,OUTPUT); //Инициализируем порт для ПЕРВОГО канала как ВЫХОД 
pinMode(RelayChn2,OUTPUT); //Инициализируем порт для ВТОРОГО канала как ВЫХОД 
pinMode(RelayChn3,OUTPUT); //Инициализируем порт для ВТОРОГО канала как ВЫХОД
 
digitalWrite(RelayChn1,LOW); //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень 
digitalWrite(RelayChn2,HIGH); //Т.к. используемый релейный модуль с опторазвязкой - управляется инверсной логикой 
digitalWrite(RelayChn3,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,HIGH); //Устанавливаем на ПЕРВОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает 
else //во всех остальных случаях 
digitalWrite(RelayChn1,LOW); //Устанавливаем на ПЕРВОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается 
 
 
 
//------------КАНАЛ 2 - все аналогично ----------- 
 
 
if ((utime >= StartRelCn_2) && 
(utime < (StartRelCn_2+DurationCh_2)))  
digitalWrite(RelayChn2,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает 
else 
 
 
if ((utime >= StartRelCn_3) && 
(utime < (StartRelCn_3+DurationCh_3)))
digitalWrite(RelayChn2,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает 
else
 
 
if ((utime >= StartRelCn_4) && 
(utime < (StartRelCn_4+DurationCh_4)))
digitalWrite(RelayChn2,LOW);
}
else
 
if ((utime >= StartRelCn_5) && 
(utime < (StartRelCn_5+DurationCh_5))) 
 
digitalWrite(RelayChn2,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает 
else 
 
if ((utime >= StartRelCn_6) && 
(utime < (StartRelCn_6+DurationCh_6))) 
 
digitalWrite(RelayChn2,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает 
else 
if ((utime >= StartRelCn_7) && 
(utime < (StartRelCn_7+DurationCh_7)))
 {
digitalWrite(RelayChn2,LOW);
 }
 
 else 
if ((utime >= StartRelCn_8) && 
(utime < (StartRelCn_8+DurationCh_8)))
 {
digitalWrite(RelayChn2,LOW);
 }
 
 else 
if ((utime >= StartRelCn_9) && 
(utime < (StartRelCn_9+DurationCh_9)))
 {
digitalWrite(RelayChn2,LOW);
 }
 
 
else
{  
digitalWrite(RelayChn2,HIGH); //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается 
 
//------------КАНАЛ 3 - все аналогично ----------- 
 
 
if ((utime >= StartRelCn_10) && 
(utime < (StartRelCn_10+DurationCh_10)))  
digitalWrite(RelayChn3,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает 
else 
 
 
if ((utime >= StartRelCn_11) && 
(utime < (StartRelCn_11+DurationCh_11)))
digitalWrite(RelayChn3,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает 
else
 
 
if ((utime >= StartRelCn_12) && 
(utime < (StartRelCn_12+DurationCh_12)))
digitalWrite(RelayChn3,LOW);
}
else
 
if ((utime >= StartRelCn_13) && 
(utime < (StartRelCn_13+DurationCh_13))) 
 
digitalWrite(RelayChn3,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает 
else 
 
if ((utime >= StartRelCn_14) && 
(utime < (StartRelCn_14+DurationCh_14))) 
 
digitalWrite(RelayChn3,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает 
else 
if ((utime >= StartRelCn_15) && 
(utime < (StartRelCn_15+DurationCh_15)))
 {
digitalWrite(RelayChn3,LOW);
 }
 
 else 
if ((utime >= StartRelCn_16) && 
(utime < (StartRelCn_16+DurationCh_16)))
 {
digitalWrite(RelayChn3,LOW);
 }
 
 else 
if ((utime >= StartRelCn_17) && 
(utime < (StartRelCn_17+DurationCh_17)))
 {
digitalWrite(RelayChn3,LOW);
 }
else
{  
digitalWrite(RelayChn3,HIGH); //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается 
 
//Если секунд с начала суток больше, чем задано для включения 
//Но, одновременно и меньше, чем задано для включения + длительность 
 
 
 
 
}//------------Конец ЦИКЛА-----------------------------
b707
Offline
Зарегистрирован: 26.05.2017

Во-первых, выложите скетч по правилам форума (см прикрепленную тему выше)

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

Hayko
Offline
Зарегистрирован: 02.07.2017

я не программист иначе что я тут делаю,

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Сделайте то, о чём написал b707:

1) Выложите нормально код.

2) Опишите конкретно, какие проблемы. Т.к. фраза "возникли проблемы" ни о чём не говорит.

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

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

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

//----------Настройки времени и продолжительности включения реле 

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

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

const long StartRelCn_3 = 14370;
const long DurationCh_3 = 125;

const long StartRelCn_4 = 25170;
const long DurationCh_4 = 125;

const long StartRelCn_5 = 35970;
const long DurationCh_5 = 125;

const long StartRelCn_6 = 46770;
const long DurationCh_6 = 125;

const long StartRelCn_7 = 57570;
const long DurationCh_7 = 125;

const long StartRelCn_8 = 68370;
const long DurationCh_8 = 125;

const long StartRelCn_9 = 79170;
const long DurationCh_9 = 125;

//------------третий канал---------------

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

const long StartRelCn_11 = 14400;
const long DurationCh_11 = 100;

const long StartRelCn_12 = 25200;
const long DurationCh_12 = 100;

const long StartRelCn_13 = 36000;
const long DurationCh_13 = 100;

const long StartRelCn_14 = 46800;
const long DurationCh_14 = 100;

const long StartRelCn_15 = 57600;
const long DurationCh_15 = 100;

const long StartRelCn_16 = 68400;
const long DurationCh_16 = 100;

const long StartRelCn_17 = 79200;
const long DurationCh_17 = 100;

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

void setup(){ 

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

digitalWrite(RelayChn1,LOW); //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень 
digitalWrite(RelayChn2,HIGH); //Т.к. используемый релейный модуль с опторазвязкой - управляется инверсной логикой 
digitalWrite(RelayChn3,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,HIGH); //Устанавливаем на ПЕРВОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает 
} 
else //во всех остальных случаях 
{ 
digitalWrite(RelayChn1,LOW); //Устанавливаем на ПЕРВОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается 
} 



//------------КАНАЛ 2 - все аналогично ----------- 


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


if ((utime >= StartRelCn_3) && 
(utime < (StartRelCn_3+DurationCh_3)))
{ 
digitalWrite(RelayChn2,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает 
} 
else


if ((utime >= StartRelCn_4) && 
(utime < (StartRelCn_4+DurationCh_4)))
{ 
digitalWrite(RelayChn2,LOW);
}
else

if ((utime >= StartRelCn_5) && 
(utime < (StartRelCn_5+DurationCh_5))) 
 
{ 
digitalWrite(RelayChn2,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает 
} 
else 

if ((utime >= StartRelCn_6) && 
(utime < (StartRelCn_6+DurationCh_6))) 
 
{ 
digitalWrite(RelayChn2,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает 
} 
else 
if ((utime >= StartRelCn_7) && 
(utime < (StartRelCn_7+DurationCh_7)))
 {
digitalWrite(RelayChn2,LOW);
 }

 else 
if ((utime >= StartRelCn_8) && 
(utime < (StartRelCn_8+DurationCh_8)))
 {
digitalWrite(RelayChn2,LOW);
 }

 else 
if ((utime >= StartRelCn_9) && 
(utime < (StartRelCn_9+DurationCh_9)))
 {
digitalWrite(RelayChn2,LOW);
 }

 
else
{  
digitalWrite(RelayChn2,HIGH); //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается 
} 

//------------КАНАЛ 3 - все аналогично ----------- 


if ((utime >= StartRelCn_10) && 
(utime < (StartRelCn_10+DurationCh_10)))  
{ 
digitalWrite(RelayChn3,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает 
} 
else 


if ((utime >= StartRelCn_11) && 
(utime < (StartRelCn_11+DurationCh_11)))
{ 
digitalWrite(RelayChn3,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает 
} 
else


if ((utime >= StartRelCn_12) && 
(utime < (StartRelCn_12+DurationCh_12)))
{ 
digitalWrite(RelayChn3,LOW);
}
else

if ((utime >= StartRelCn_13) && 
(utime < (StartRelCn_13+DurationCh_13))) 
 
{ 
digitalWrite(RelayChn3,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает 
} 
else 

if ((utime >= StartRelCn_14) && 
(utime < (StartRelCn_14+DurationCh_14))) 
 
{ 
digitalWrite(RelayChn3,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает 
} 
else 
if ((utime >= StartRelCn_15) && 
(utime < (StartRelCn_15+DurationCh_15)))
 {
digitalWrite(RelayChn3,LOW);
 }

 else 
if ((utime >= StartRelCn_16) && 
(utime < (StartRelCn_16+DurationCh_16)))
 {
digitalWrite(RelayChn3,LOW);
 }

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

//Если секунд с начала суток больше, чем задано для включения 
//Но, одновременно и меньше, чем задано для включения + длительность 
 



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

 

Hayko
Offline
Зарегистрирован: 02.07.2017

1) в дневное время, а конкретно в час и в четыре часа когда отключается реле для компрессора с ним отключаются все работающие в это время relay.. обратно включается после перезагрузки arduino.

2) часы отстают примерно в 15 секунд в день

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

Hayko пишет:

я не программист иначе что я тут делаю,

Да, кто ж Вас знает что Вы тут делаете и зачем, Вы - "непрограммист" полезли делать устройство на программируемом микроконтроллере.

Hayko
Offline
Зарегистрирован: 02.07.2017

а что тут такого, по этому и пишу Вам чтоб помогли, если сможете

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

Hayko,

начните с того, что удалите из скетча все лишнее. У Вас, как я понимаю, только три реле - RelayChn1. RelayChn2 и RelayChn3 , верно? Так зачем у вас скете прописаны задержки вплоть до реле номер 17? И условий срабатывания тоже не три, а минимум десяток. И комментарии стоило бы поправить до того, как просить кого-то посмотреть код - а то сейчас они скорее дезориентируют, чем помогают разобраться

Hayko
Offline
Зарегистрирован: 02.07.2017

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

 

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

Hayko пишет:

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

О госпади... это ж надо было так накрутить в коде.  Он хотя бы, компилируется? - мне кажется нет.

К чему у вас на строках 131, 139, 147 и тд - "висящие" else без операторов?

Фразу "по нескольку раз в сутки, а конкретно в восемь" - надо в кунсткамеру :)

Hayko
Offline
Зарегистрирован: 02.07.2017

ну да компилируется ..

а как должно быть?

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

Hayko пишет:

а как должно быть?

Посмотрите, как у вас написано условие для первого канала (строки 108-119). Если время попадает в заданный интервал - включить реле, если нет - выключить. "Вот так должно быть.

А теперь сравните внимательно код для первого канала и код для всех остальных. Вы при копировании половину строк потеряли, вот оно и не работает.

Hayko
Offline
Зарегистрирован: 02.07.2017

а что необычного в фразе????????

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

Hayko пишет:

а что необычного в фразе????????

Напоминает классику "между 36-ю и 37-ю годами я прожила 10 чудесных лет" (с) - как-то так

Hayko
Offline
Зарегистрирован: 02.07.2017

спасибо за подсказку, я исправил, щас заложу. о результатах попозже напишу...

Hayko
Offline
Зарегистрирован: 02.07.2017

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

вот ''исправлении'' скетч



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

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

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

//----------Настройки времени и продолжительности включения реле 

//----------ПЕРВЫЙ канал---------------------------- 
const long StartRelCn_1 = 19800; 
const long DurationCh_1 = 64800; 

//----------ВТОРОЙ канал---------------------------- 
const long StartRelCn_2 = 3570;   
const long DurationCh_2 = 125;     

const long StartRelCn_3 = 14370;
const long DurationCh_3 = 125;

const long StartRelCn_4 = 25170;
const long DurationCh_4 = 125;

const long StartRelCn_5 = 35970;
const long DurationCh_5 = 125;

const long StartRelCn_6 = 46770;
const long DurationCh_6 = 125;

const long StartRelCn_7 = 57570;
const long DurationCh_7 = 125;

const long StartRelCn_8 = 68370;
const long DurationCh_8 = 125;

const long StartRelCn_9 = 79170;
const long DurationCh_9 = 125;

//------------третий канал---------------

const long StartRelCn_10 = 3600;     
const long DurationCh_10 = 100;      

const long StartRelCn_11 = 14400;
const long DurationCh_11 = 100;

const long StartRelCn_12 = 25200;
const long DurationCh_12 = 100;

const long StartRelCn_13 = 36000;
const long DurationCh_13 = 100;

const long StartRelCn_14 = 46800;
const long DurationCh_14 = 100;

const long StartRelCn_15 = 57600;
const long DurationCh_15 = 100;

const long StartRelCn_16 = 68400;
const long DurationCh_16 = 100;

const long StartRelCn_17 = 79200;
const long DurationCh_17 = 100;

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

void setup(){ 

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

digitalWrite(RelayChn1,LOW); //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень 
digitalWrite(RelayChn2,HIGH); //Т.к. используемый релейный модуль с опторазвязкой - управляется инверсной логикой 
digitalWrite(RelayChn3,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,HIGH); 
} 
else 
{ 
digitalWrite(RelayChn1,LOW); 
} 



//------------КАНАЛ 2 - все аналогично ----------- 


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

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

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

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

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

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

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

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

//------------КАНАЛ 3 - все аналогично ----------- 


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


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


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

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

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

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

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

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

//Если секунд с начала суток больше, чем задано для включения 
//Но, одновременно и меньше, чем задано для включения + длительность 
 



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

 

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

Что значит "не работает"? - подробнее?

И как должно работать.

Hayko
Offline
Зарегистрирован: 02.07.2017

заложил код ждал пока придет время срабатывания, он не включился, с моим старым кодом включается но дает сбои!!!

fogary
Offline
Зарегистрирован: 05.03.2016

Hayko пишет:

заложил код ждал пока придет время срабатывания, он не включился, с моим старым кодом включается но дает сбои!!!

Возможно из-за того, что изначально у Вас была одна проверка "if-else if-else" для каждого реле и состояние реле менялось один раз, а стало несколько проверок "if-else" и каждое из них меняет состояние реле.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Hayko пишет:

заложил код ждал пока придет время срабатывания, он не включился, с моим старым кодом включается но дает сбои!!!

Вы какого-то чуда ждёте. Сами-то хоть что-то проверьте. Вот Вы получаете текущее время, переводите в секунды с начала суток - выведите эту цифру в монитор! Она меняется? Она такая, какую Вы ожидаете?

Для канала 1 у Вас единственный интервал времени, тут запутаться негде. Настройте его на ближайшее время и короткую длительность работы (не ждать же с полшестого утра до полдвенадцатого ночи). Загрузили код, запустили. Реле в том состоянии, как Вы ожидаете? Смотрите на цифру в мониторе порта и на Ваше реле. Если цифра попала в заданный период, а реле не сработало, то возможно у Вас что-то просто неаккуратно собрано (неконтакт какой) или неисправно - нужно проверять. Если сработало - отлично, ждём конца интервала, что с реле? Если с одним условием всё работает, то можно переходить к более сложным комбинациям.

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

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

kalapanga пишет:

Вы какого-то чуда ждёте. Сами-то хоть что-то проверьте. Вот Вы получаете текущее время, переводите в секунды с начала суток - выведите эту цифру в монитор! Она меняется? Она такая, какую Вы ожидаете?

Для канала 1 у Вас единственный интервал времени, тут запутаться негде. Настройте его на ближайшее время и короткую длительность работы (не ждать же с полшестого утра до полдвенадцатого ночи). Загрузили код, запустили. Реле в том состоянии, как Вы ожидаете? Смотрите на цифру в мониторе порта и на Ваше реле. Если цифра попала в заданный период, а реле не сработало, то возможно у Вас что-то просто неаккуратно собрано (неконтакт какой) или неисправно - нужно проверять. Если сработало - отлично, ждём конца интервала, что с реле? Если с одним условием всё работает, то можно переходить к более сложным комбинациям.

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

Полностью поддерживаю!

Hayko, явных ошибок в Вашем коде я не вижу. Значит. проблема где-то глубже. Наступает следующий этап - отладка :) Зачастую найти логические промахи в коде куда сложнее, чем просто ошибки программирование.

Прислушайтесь к словам kalapanga - добавьте вывод значений myTime и utime. установите время срабатывания реле1 так, чтобы не надо было ждать несколько часов - и посмотрите, работает ли хотя бы первый канал. Если да - переходите ко второму и тд

Hayko
Offline
Зарегистрирован: 02.07.2017

я все пробовал, все отлично работает , но всего 2-3 дня, после этого начинается.......

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

 часы отстают примета 5 секунд в сутке

вчера загрузил заново, до сих пор все работает..

и еще такой эксперимента поставил собрал то же самое но вместо реле поставил светодиоды может дело в реле?

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

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

Hayko пишет:

я все пробовал, все отлично работает , но всего 2-3 дня, после этого начинается.......

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

 часы отстают примета 5 секунд в сутке

вчера загрузил заново, до сих пор все работает..

и еще такой эксперимента поставил собрал то же самое но вместо реле поставил светодиоды может дело в реле?

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

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

А может быть все-таки скетч. В вашем коде есть несколько "скользких" моментов.

1. Как уже сказал kalapanga - не нужно запрашивать время с RTC в каждом цикле. Это слишком часто, модуль RTC может не успеть ответить и вся программа перестанет работать. В ардуино есть свои часы (функция millis) и RTC нужен только для того, чтобы подстраивать по нему реальное время. Делать это можно довольно редко - скажем пару раз в сутки

Кроме этого - обязательно надо делать проверку правильности времени, получаемого от RTC. Если вместо времени пришел ноль или время вдруг скачком изменилось на большую величину - это значение надо отбрасывать и считывать RTC снова.

2. Второе - вы не вполне верно отсчитываете интервалы включения реле. Смотрите - у вас и время включения и выключения закодированы конкретным временем. Например, если реле44 должно быть включено в 11.15 на 5 минут - вы жестко кодируете время выключения как 11.20. Почему мне кажется, что это неверно? - вот представьте, что у вас программа делала что-то сложное и опоздала включить реле в 11.15 - включила в 11.17. Но раз выключение у вас задано жестко в 11.20, то в итоге реле вместо 5 минут будет работать только 3. Если интервал короткий - например 5 секунд - то при таком подходе реле может вообще не включаться.

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

 

Hayko
Offline
Зарегистрирован: 02.07.2017

''// RTC.adjust(DateTime(__DATE__, __TIME__)); //С этой строки необходимо убрать комментарии один раз в начале, 

//для того, чтобы загрузить в RTC дату и время на момент компиляции программы 

//Иногда необходимо заливать СКЕТЧ на плату со снятым комментарием - для поправки 

//времени в RTC, НО оставлять такой СКЕТЧ в работе НЕЛЬЗЯ !!!!!!!!!!!!! ''

подскажите пожалуйста... а что будет если загрузить СКЕТЧ со снятым комментарием и оставлять на долгое время???

fogary
Offline
Зарегистрирован: 05.03.2016

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

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

Hayko пишет:

''// RTC.adjust(DateTime(__DATE__, __TIME__)); //С этой строки необходимо убрать комментарии один раз в начале, 

//для того, чтобы загрузить в RTC дату и время на момент компиляции программы 

//Иногда необходимо заливать СКЕТЧ на плату со снятым комментарием - для поправки 

//времени в RTC, НО оставлять такой СКЕТЧ в работе НЕЛЬЗЯ !!!!!!!!!!!!! ''

подскажите пожалуйста... а что будет если загрузить СКЕТЧ со снятым комментарием и оставлять на долгое время???

Макросы _DATE_ и _TIME_ подставляют вместо себя дату и время компиляции программы. Компиляцию вы делаете один раз, в момент загрузки скетча. После этого при каждом рестарте Ардуины время в часах будет возвращаться к этому значению.

 Пример - чтоб было понятнее - если вы раскомментируете эту строку и зальете скетч в Ардуину сегодня - там будет выставлена дата 10 июля 17 года. И дальше, когда бы вы не запустили снова этот скетч - через неделю, через месяц... - часы всегда будут устанавливаться на 10 июля.

Hayko
Offline
Зарегистрирован: 02.07.2017

то есть ничего страшного не будет? я имею в виду что не arduino не часы НЕ ИСПОРТЯТСЯ

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

 

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

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

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

Философский вопрос: а "испорченные часы" и "часы, показывающие неправильное время" - это не одно и то же?

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

Понадобился код для управления солнечными панелями. Попал на эту ветку форума. Взял код с первой страницы от "Hayko". Код сразу хорошо работал и полностью устраивал. И вдруг он не сработал! Стал разбираться и обнаружил, что подвели часы. Добавил в код контроль. Сначала добавил монитор порта, а затем и вовсе, добавил монитор LCD 16x2, чтобы в любой момент можно было проследить за часами. Все теперь хорошо и надежно.