Суточный таймер на 8 каналов,помогите.
- Войдите на сайт для отправки комментариев
Вс, 22/11/2015 - 00:11
Уважаемые програмисты, помогите пожалуйста доделать чужой скетч под мои нужды. Автор в теме не появляется, а обратиться мне больше не к кому. Мне нужно чтобы таймер первого канала срабатывал три раза в сутки на включение\выключение. Два срабатывания в скетче уже реализовано, как сделать третье? Обратите внимание на строки скетча 38,39 и 109-111. Это я пытался переделать самостоятельно, но ничего не получилось, скетч компилируется, но реле по времени таймера не срабатывает, подправьте пожалуйста скетч, буду очень признателен, спасибо.
/*Готовая версия контроллера я рад)
* Роман Четин
*/
//Загрузка библиотек
#include <OneWire.h>
#include <Wire.h>
#include <RTClib.h>
int TSensorPin1 = 2;
int TSensorPin2 = 3;
OneWire ds1(TSensorPin1);
OneWire ds2(TSensorPin2);
RTC_DS1307 RTC;
//Подключение выходов
const int RelayChn1 = 5; //Используем цифровой ПОРТ 5 для ПЕРВОГО канала релейного модуля
const int RelayChn2 = 6; //Используем цифровой ПОРТ 6 для ВТОРОГО канала релейного модуля
const int RelayChn3 = 7; //Используем цифровой ПОРТ 7 для ТРЕТЬЕГО канала релейного модуля
const int RelayChn4 = 8; //Используем цифровой ПОРТ 8 для ЧЕТВЕРТОГО канала релейного модуля
const int RelayChn5 = 9; //Используем цифровой ПОРТ 9 для ПЯТОГО канала релейного модуля
const int RelayChn6 = 10; //Используем цифровой ПОРТ 10 для ШЕСТОГО канала релейного модуля
const int RelayChn7 = 11; //Используем цифровой ПОРТ 11 для СЕДЬМОГО канала релейного модуля
const int RelayChn8 = 12; //Используем цифровой ПОРТ 12 для ВОСЬМОГО канала релейного модуля
#define sc 1UL
#define mn 60UL
#define hr 3600UL
//----------Настройки времени и продолжительности включения реле
//----------Первый канал LED 5ШТ.*10ВТ. Реле №3 ------------
const long StartRelCn_1 = 8*hr+00*mn+00*sc; //Время срабатывания на ПЕРВОМ канале релейного модуля
const long DurationCh_1 = 2*hr+00*mn+00*sc; //ДЛИТЕЛЬНОСТЬ срабатывания реле на ПЕРВОМ канале
//----------Первый канал LED 5ШТ.*10ВТ Реле №3 -------------
const long StartRelCn_1L = 12*hr+00*mn+00*sc;
const long DurationCh_1L = 2*hr+00*mn+00*sc;
//----------Первый канал----------------------------
//const long StartRelCn_1G = 17*hr+00*mn;
//const long DurationCh_1G = 5*hr+00*mn;
//----------Второй канал LED 7ШТ.*10ВТ. Реле №4 ------------
const long StartRelCn_2 = 10*hr+00*mn+00*sc;
const long DurationCh_2 = 7*hr+00*mn+00*sc;
//----------Третий канал LED (24 BLUE+10 RED)*3ВТ. Реле №5 ----
const long StartRelCn_3 = 7*hr+30*mn+00*sc;
const long DurationCh_3 = 15*hr+00*mn+00*sc;
//----------Четвертый канал CO2 Реле №2 --------------
const long StartRelCn_4 = 9*hr+00*mn+00*sc;
const long DurationCh_4 = 12*hr+00*mn+00*sc;
//----------Пятый канал Удобрения Реле №1 ------------
const long StartRelCn_5 = 10*hr;
const long DurationCh_5 = 30*sc;
//----------Шестой канал Кормушка ---------------------
const long StartRelCn_6 = 9*hr;
const long DurationCh_6 = 0*hr;
//----------Терморегуляторы
//----------Седьмой КАНАЛ----------------------------
float t1 = 24.5; //Уставка температуры для СЕДЬМОГО канала релейного модуля 1 аквариум
float tGistrsis1 = 0.7; //Уставка гистерезиса - т.е отклонения от темп-ры уставки т.е. в данном случае 0,7 = плюс минус 0,35 градуса
//----------Восьмой КАНАЛ----------------------------
float t2 = 24.5; //Уставка температуры для ВОСЬМОГО канала релейного модуля 2 аквариум
float tGistrsis2 = 0.7;
//*********************************************************
void setup () {
Wire.begin();
RTC.begin();
// RTC.adjust(DateTime(__DATE__, __TIME__)); // строка только для первой компиляции!!!
DateTime myTime = RTC.now();
//Первоначальные установки выходов
pinMode(RelayChn1,OUTPUT); //Инициализируем порт для 1 канала как ВЫХОД
pinMode(RelayChn2,OUTPUT); //Инициализируем порт для 2 канала как ВЫХОД
pinMode(RelayChn3,OUTPUT); //Инициализируем порт для 3 канала как ВЫХОД
pinMode(RelayChn4,OUTPUT); //Инициализируем порт для 4 канала как ВЫХОД
pinMode(RelayChn5,OUTPUT); //Инициализируем порт для 5 канала как ВЫХОД
pinMode(RelayChn6,OUTPUT); //Инициализируем порт для 6 канала как ВЫХОД
pinMode(RelayChn7,OUTPUT); //Инициализируем порт для 7 канала как ВЫХОД
pinMode(RelayChn8,OUTPUT); //Инициализируем порт для 8 канала как ВЫХОД
digitalWrite(RelayChn1,LOW); //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень
digitalWrite(RelayChn2,LOW); //Т.к. используемый релейный модуль с опторазвязкой - управляется инверсной логикой
digitalWrite(RelayChn3,LOW);
digitalWrite(RelayChn4,LOW);
digitalWrite(RelayChn5,LOW);
digitalWrite(RelayChn6,HIGH);
digitalWrite(RelayChn7,LOW);
digitalWrite(RelayChn8,LOW);
}
//***************************************************
void loop () {
DateTime myTime = RTC.now();
uint32_t utime = myTime.unixtime();
utime %=86400;
//----------------------------релейная настройка начало------------------
//------------КАНАЛ 1------------------------------
if ((utime >= StartRelCn_1) &&
(utime < (StartRelCn_1+DurationCh_1)) or (utime >= StartRelCn_1L) &&
(utime < (StartRelCn_1L+DurationCh_1L)))
//if ((utime >= StartRelCn_1) &&
// (utime < (StartRelCn_1+DurationCh_1)) or (utime >= StartRelCn_1G) &&
// (utime < (StartRelCn_1G+DurationCh_1G)))
{
digitalWrite(RelayChn1,LOW); //Устанавливаем на входе релейного модуля НИЗКИЙ уровень - реле срабатывает
}
else
{
digitalWrite(RelayChn1,HIGH); //Устанавливаем на входе релейного модуля ВЫСОКИЙ уровень - реле выключается
}
//------------КАНАЛ 2 ------------------------------
if ((utime >= StartRelCn_2) &&
(utime < (StartRelCn_2+DurationCh_2)))
{
digitalWrite(RelayChn2,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
}
else
{
digitalWrite(RelayChn2,HIGH); //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
}
//------------КАНАЛ 3------------------------------
if ((utime >= StartRelCn_3) &&
(utime < (StartRelCn_3+DurationCh_3)))
{
digitalWrite(RelayChn3,LOW); //Устанавливаем на ТРЕТЬЕМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
}
else
{
digitalWrite(RelayChn3,HIGH); //Устанавливаем на ТРЕТЬЕМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
}
//------------КАНАЛ 4------------------------------
if ((utime >= StartRelCn_4) &&
(utime < (StartRelCn_4+DurationCh_4)))
{
digitalWrite(RelayChn4,LOW); //Устанавливаем на ЧЕТВЕРТОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
}
else
{
digitalWrite(RelayChn4,HIGH); //Устанавливаем на ЧЕТВЕРТОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
}
//------------КАНАЛ 5------------------------------
if ((utime >= StartRelCn_5) &&
(utime < (StartRelCn_5+DurationCh_5)))
{
digitalWrite(RelayChn5,LOW); //Устанавливаем на ПЯТОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
}
else
{
digitalWrite(RelayChn5,HIGH); //Устанавливаем на ПЯТОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
}
//------------КАНАЛ 6------------------------------
if ((utime >= StartRelCn_6) &&
(utime < (StartRelCn_6+DurationCh_6)))
{
digitalWrite(RelayChn6,HIGH); //Устанавливаем на ШЕСТОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
}
else
{
digitalWrite(RelayChn6,LOW); //Устанавливаем на ШЕСТОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
}
//------------КАНАЛ 7 Контроль температуры -------
float temp1 = getTemp1(); //Читаем температуру с датчика
if (temp1 < t1-tGistrsis1/2)
{
digitalWrite(RelayChn7,LOW); //Устанавливаем на 7 входе релейного модуля НИЗКИЙ уровень - реле срабатывает
}
else if (temp1 > t1+tGistrsis1/2)
{
digitalWrite(RelayChn7,HIGH); //Устанавливаем на 7 входе релейного модуля ВЫСОКИЙ уровень - реле выключается
}
//------------КАНАЛ 8 Контроль температуры -----------
float temp2 = getTemp2(); //Читаем температуру с датчика
//------------КАНАЛ 3 Контроль температуры -------
if (temp1 < t1-tGistrsis2/2)
{
digitalWrite(RelayChn8,LOW); //Устанавливаем на 8 входе релейного модуля НИЗКИЙ уровень - реле срабатывает
}
else if (temp2 > t2+tGistrsis2/2)
{
digitalWrite(RelayChn8,HIGH); //Устанавливаем на 8 входе релейного модуля ВЫСОКИЙ уровень - реле выключается
}
}
//*****************************************************
//Функции чтения с датчиков температуры
float getTemp1(){
byte data[12];
byte addr[8];
if ( !ds1.search(addr)) {
//no more sensors on chain, reset search
ds1.reset_search();
return -1001;
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
return -1002;
}
if ( addr[0] != 0x10 && addr[0] != 0x28) {
return -1003;
}
ds1.reset();
ds1.select(addr);
ds1.write(0x44,1);
byte present = ds1.reset();
ds1.select(addr);
ds1.write(0xBE);
for (int i = 0; i < 9; i++) {
data[i] = ds1.read();
}
ds1.reset_search();
byte MSB = data[1];
byte LSB = data[0];
float TRead = ((MSB<<8) | LSB);
float Temperature = TRead / 16;
return Temperature;
}
float getTemp2(){
byte data[12];
byte addr[8];
if ( !ds2.search(addr)) {
//no more sensors on chain, reset search
ds2.reset_search();
return -1001;
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
return -1002;
}
if ( addr[0] != 0x10 && addr[0] != 0x28) {
return -1003;
}
ds2.reset();
ds2.select(addr);
ds2.write(0x44,1);
byte present = ds2.reset();
ds2.select(addr);
ds2.write(0xBE);
for (int i = 0; i < 9; i++) {
data[i] = ds2.read();
}
ds2.reset_search();
byte MSB = data[1];
byte LSB = data[0];
float TRead = ((MSB<<8) | LSB);
float Temperature = TRead / 16;
return Temperature;
}
Привет. Мне кажется, так должно быть правильно:
const long StartRelCn_1L = 12*hr+00*mn+00*sc; const long DurationCh_1L = 2*hr+00*mn+00*sc; const long StartRelCn_1G = 17*hr+00*mn+00*sc; const long DurationCh_1G = 5*hr+00*mn+00*sc; if ((utime >= StartRelCn_1) && (utime < (StartRelCn_1+DurationCh_1)) or (utime >= StartRelCn_1L) && (utime < (StartRelCn_1L+DurationCh_1L)) or (utime >= StartRelCn_1G) && (utime < (StartRelCn_1G+DurationCh_1G))) { digitalWrite(RelayChn1,LOW); } else { digitalWrite(RelayChn1,HIGH); }Проверить сейчас не на чем...
Привет. Мне кажется, так должно быть правильно:
Огромное спасибо, все работает!
Подскажите пожалуйста еще, как вывести показания температуры с датчиков на окно СОМ порта?
Между строками 74 и 75 добавить
Между 184-185
Serial.print("Температура датчика 1: "); Serial.print(temp1); Serial.println(" °C");198-199
Serial.print("Температура датчика 2: "); Serial.print(temp2); Serial.println(" °C");Самый простой вариант, но так будет выводить с каждым повторением цикла.
Еще раз спасибо, Garou, все работает, поставил секундную задержку,мне эта функция нужна только временно, для отладки.