ds1307 +relay
- Войдите на сайт для отправки комментариев
Вс, 02/07/2017 - 21:18
добрый день, помогите пожалуйста..взял написанный скетч из интернета для включение и отключение двух 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:
1) Выложите нормально код.
2) Опишите конкретно, какие проблемы. Т.к. фраза "возникли проблемы" ни о чём не говорит.
1) в дневное время, а конкретно в час и в четыре часа когда отключается реле для компрессора с ним отключаются все работающие в это время relay.. обратно включается после перезагрузки arduino.
2) часы отстают примерно в 15 секунд в день
я не программист иначе что я тут делаю,
Да, кто ж Вас знает что Вы тут делаете и зачем, Вы - "непрограммист" полезли делать устройство на программируемом микроконтроллере.
а что тут такого, по этому и пишу Вам чтоб помогли, если сможете
Hayko,
начните с того, что удалите из скетча все лишнее. У Вас, как я понимаю, только три реле - RelayChn1. RelayChn2 и RelayChn3 , верно? Так зачем у вас скете прописаны задержки вплоть до реле номер 17? И условий срабатывания тоже не три, а минимум десяток. И комментарии стоило бы поправить до того, как просить кого-то посмотреть код - а то сейчас они скорее дезориентируют, чем помогают разобраться
верно реле только три ...но второй и третий реле должны включать и выключать по несколько раз в сутке (а конкретно в восемь)
верно реле только три ...но второй и третий реле должны включать и выключать по несколько раз в сутке (а конкретно в восемь)
О госпади... это ж надо было так накрутить в коде. Он хотя бы, компилируется? - мне кажется нет.
К чему у вас на строках 131, 139, 147 и тд - "висящие" else без операторов?
Фразу "по нескольку раз в сутки, а конкретно в восемь" - надо в кунсткамеру :)
ну да компилируется ..
а как должно быть?
а как должно быть?
Посмотрите, как у вас написано условие для первого канала (строки 108-119). Если время попадает в заданный интервал - включить реле, если нет - выключить. "Вот так должно быть.
А теперь сравните внимательно код для первого канала и код для всех остальных. Вы при копировании половину строк потеряли, вот оно и не работает.
а что необычного в фразе????????
а что необычного в фразе????????
Напоминает классику "между 36-ю и 37-ю годами я прожила 10 чудесных лет" (с) - как-то так
спасибо за подсказку, я исправил, щас заложу. о результатах попозже напишу...
добрый день, я исправил скетч как Вы сказали... теперь вообще ничего не работает
вот ''исправлении'' скетч
Что значит "не работает"? - подробнее?
И как должно работать.
заложил код ждал пока придет время срабатывания, он не включился, с моим старым кодом включается но дает сбои!!!
заложил код ждал пока придет время срабатывания, он не включился, с моим старым кодом включается но дает сбои!!!
заложил код ждал пока придет время срабатывания, он не включился, с моим старым кодом включается но дает сбои!!!
Вы какого-то чуда ждёте. Сами-то хоть что-то проверьте. Вот Вы получаете текущее время, переводите в секунды с начала суток - выведите эту цифру в монитор! Она меняется? Она такая, какую Вы ожидаете?
Для канала 1 у Вас единственный интервал времени, тут запутаться негде. Настройте его на ближайшее время и короткую длительность работы (не ждать же с полшестого утра до полдвенадцатого ночи). Загрузили код, запустили. Реле в том состоянии, как Вы ожидаете? Смотрите на цифру в мониторе порта и на Ваше реле. Если цифра попала в заданный период, а реле не сработало, то возможно у Вас что-то просто неаккуратно собрано (неконтакт какой) или неисправно - нужно проверять. Если сработало - отлично, ждём конца интервала, что с реле? Если с одним условием всё работает, то можно переходить к более сложным комбинациям.
Чтобы не захлебнуться в потоке цифр в мониторе порта, добавьте в цикл задержку в несколько секунд.
Вы какого-то чуда ждёте. Сами-то хоть что-то проверьте. Вот Вы получаете текущее время, переводите в секунды с начала суток - выведите эту цифру в монитор! Она меняется? Она такая, какую Вы ожидаете?
Для канала 1 у Вас единственный интервал времени, тут запутаться негде. Настройте его на ближайшее время и короткую длительность работы (не ждать же с полшестого утра до полдвенадцатого ночи). Загрузили код, запустили. Реле в том состоянии, как Вы ожидаете? Смотрите на цифру в мониторе порта и на Ваше реле. Если цифра попала в заданный период, а реле не сработало, то возможно у Вас что-то просто неаккуратно собрано (неконтакт какой) или неисправно - нужно проверять. Если сработало - отлично, ждём конца интервала, что с реле? Если с одним условием всё работает, то можно переходить к более сложным комбинациям.
Чтобы не захлебнуться в потоке цифр в мониторе порта, добавьте в цикл задержку в несколько секунд.
Полностью поддерживаю!
Hayko, явных ошибок в Вашем коде я не вижу. Значит. проблема где-то глубже. Наступает следующий этап - отладка :) Зачастую найти логические промахи в коде куда сложнее, чем просто ошибки программирование.
Прислушайтесь к словам kalapanga - добавьте вывод значений myTime и utime. установите время срабатывания реле1 так, чтобы не надо было ждать несколько часов - и посмотрите, работает ли хотя бы первый канал. Если да - переходите ко второму и тд
я все пробовал, все отлично работает , но всего 2-3 дня, после этого начинается.......
то утром свет не включается, то вместе отключением одного реле отключаются все работающие хотя свет должен был отключаться через скажем 5 часовa а реле для насоса после 5 секунд...
часы отстают примета 5 секунд в сутке
вчера загрузил заново, до сих пор все работает..
и еще такой эксперимента поставил собрал то же самое но вместо реле поставил светодиоды может дело в реле?
то есть в индуктивном токе?...где то я читал что он может повлиять если близко расположен....
я все пробовал, все отлично работает , но всего 2-3 дня, после этого начинается.......
то утром свет не включается, то вместе отключением одного реле отключаются все работающие хотя свет должен был отключаться через скажем 5 часовa а реле для насоса после 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 минут.
''// RTC.adjust(DateTime(__DATE__, __TIME__)); //С этой строки необходимо убрать комментарии один раз в начале,
//для того, чтобы загрузить в RTC дату и время на момент компиляции программы
//Иногда необходимо заливать СКЕТЧ на плату со снятым комментарием - для поправки
//времени в RTC, НО оставлять такой СКЕТЧ в работе НЕЛЬЗЯ !!!!!!!!!!!!! ''
подскажите пожалуйста... а что будет если загрузить СКЕТЧ со снятым комментарием и оставлять на долгое время???
При каждой перезагрузке МК, в часах будут устанлено время последней компиляции программы.
Иными словами, часы собьются после первой же перезагрузке.
''// RTC.adjust(DateTime(__DATE__, __TIME__)); //С этой строки необходимо убрать комментарии один раз в начале,
//для того, чтобы загрузить в RTC дату и время на момент компиляции программы
//Иногда необходимо заливать СКЕТЧ на плату со снятым комментарием - для поправки
//времени в RTC, НО оставлять такой СКЕТЧ в работе НЕЛЬЗЯ !!!!!!!!!!!!! ''
подскажите пожалуйста... а что будет если загрузить СКЕТЧ со снятым комментарием и оставлять на долгое время???
Макросы _DATE_ и _TIME_ подставляют вместо себя дату и время компиляции программы. Компиляцию вы делаете один раз, в момент загрузки скетча. После этого при каждом рестарте Ардуины время в часах будет возвращаться к этому значению.
Пример - чтоб было понятнее - если вы раскомментируете эту строку и зальете скетч в Ардуину сегодня - там будет выставлена дата 10 июля 17 года. И дальше, когда бы вы не запустили снова этот скетч - через неделю, через месяц... - часы всегда будут устанавливаться на 10 июля.
то есть ничего страшного не будет? я имею в виду что не arduino не часы НЕ ИСПОРТЯТСЯ
потому что у меня долгое время sketch был загружен со снятым комментарием
не испортятся. просто будут показывать неправильное время.
Философский вопрос: а "испорченные часы" и "часы, показывающие неправильное время" - это не одно и то же?
Понадобился код для управления солнечными панелями. Попал на эту ветку форума. Взял код с первой страницы от "Hayko". Код сразу хорошо работал и полностью устраивал. И вдруг он не сработал! Стал разбираться и обнаружил, что подвели часы. Добавил в код контроль. Сначала добавил монитор порта, а затем и вовсе, добавил монитор LCD 16x2, чтобы в любой момент можно было проследить за часами. Все теперь хорошо и надежно.