Суточный таймер на 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; }
Привет. Мне кажется, так должно быть правильно:
Проверить сейчас не на чем...
Привет. Мне кажется, так должно быть правильно:
Огромное спасибо, все работает!
Подскажите пожалуйста еще, как вывести показания температуры с датчиков на окно СОМ порта?
Между строками 74 и 75 добавить
Между 184-185
198-199
Самый простой вариант, но так будет выводить с каждым повторением цикла.
Еще раз спасибо, Garou, все работает, поставил секундную задержку,мне эта функция нужна только временно, для отладки.