Повторяющиеся включения, помощь
- Войдите на сайт для отправки комментариев
Пт, 12/02/2016 - 10:01
Здравствуйте уважаемые.
Скетч работает, но не могу написать повторяющиеся включения для Протоки. Arduino UNO включает реле с Воздуха, СО2, Свет линия1, Свет линия 2. А Протока должна включаться, в данном случае 7 раз по расписанию. Догадываюсь, что как я написал - так нельзя, но как написать не знаю:
const int RelRed = 8; //Используем цифровой ПОРТ -> на реле 4/12 включает БП ПК
const int RelVozd = 9; //Используем цифровой ПОРТ -> на реле 5/220
const int RelCO2 = 10; //Используем цифровой ПОРТ -> на реле 6/220
const int RelLed1 = 12; //Используем цифровой ПОРТ -> на реле 2/3 Биг Реле
const int RelLed2 = 13; //Используем цифровой ПОРТ -> на реле 3/3 Биг Реле
const int RelPROTOKA1 = 11;
const int RelPROTOKA2 = 11;
const int RelPROTOKA3 = 11;
const int RelPROTOKA4 = 11;
const int RelPROTOKA5 = 11;
const int RelPROTOKA6 = 11;
const int RelPROTOKA7 = 11;
const long OnRelRed = 01*hr; //Время срабатывания реле Синий, вместо Красного. Обраное подключение проводов
const long OffRelRed = 07*hr; //Время выключения реле
const long OnRelVozd = 18*hr; //Время срабатывания реле. Обраное подключение проводов
const long OffRelVozd = 20*hr; //Время выключения реле
const long OnRelCO2 = 18*hr; //Время срабатывания реле
const long OffRelCO2 = 20*hr; //Время выключения рел
const long OnRelLed1 = 13*hr; //Время срабатывания реле
const long OffRelLed1 = 22*hr; //Время выключения реле
const long OnRelLed2 = 14*hr; //Время срабатывания реле
const long OffRelLed2 = 21*hr; //Время выключения реле
const long OnRelPROTOKA1 = 18*hr+1800;
const long OffRelPROTOKA1 = 18*hr+1980;
const long OnRelPROTOKA2 = 19*hr;
const long OffRelPROTOKA2 = 19*hr+180;
const long OnRelPROTOKA3 = 19*hr+1800;
const long OffRelPROTOKA3 = 19*hr+1980;
const long OnRelPROTOKA4 = 20*hr;
const long OffRelPROTOKA4 = 20*hr+180;
const long OnRelPROTOKA5 = 20*hr+1800;
const long OffRelPROTOKA5 = 20*hr+1980;
const long OnRelPROTOKA6 = 21*hr;
const long OffRelPROTOKA6 = 21*hr+180;
const long OnRelPROTOKA7 = 21*hr+1800;
const long OffRelPROTOKA7 = 21*hr+1980;
//----------Модуль инициализации setup() - выполняется один раз при инициализации платы при подаче напряжение
void setup(){
pinMode (RelRed, OUTPUT);//Инициализируем порт канала как ВЫХОД
digitalWrite(RelRed,HIGH); //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень
pinMode (RelVozd, OUTPUT);//Инициализируем порт канала как ВЫХОД
digitalWrite(RelVozd,HIGH); //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень
pinMode (RelCO2, OUTPUT);//Инициализируем порт канала как ВЫХОД
digitalWrite(RelCO2,HIGH); //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень
pinMode (RelPROTOKA1, OUTPUT);//Инициализируем порт канала как ВЫХОД
digitalWrite(RelPROTOKA1,HIGH); //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень
pinMode (RelLed1,OUTPUT); //Инициализируем порт канала как ВЫХОД
digitalWrite(RelLed1,HIGH); //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень
pinMode (RelLed2,OUTPUT); //Инициализируем порт канала как ВЫХОД
digitalWrite(RelLed2,HIGH); //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень
Wire.begin(); //Инициируем I2C интерфейс
RTC.begin(); //Инициирум RTC модуль
//RTC.adjust(DateTime(__DATE__, __TIME__)); //С этой строки необходимо убрать комментарии один раз в начале установки часов,
//Иногда необходимо заливать СКЕТЧ на плату со снятым комментарием - для поправки времени в RTC, НО оставлять такой СКЕТЧ в работе НЕЛЬЗЯ !!!!!!!!!!!!!
} // КОНЕЦ ИНИЦИАЛИЗАЦИИ
//--------------------------------------------------
void loop() // ПРОГРАММЫй повторяющийся ЦИКЛ
{
DateTime myTime = RTC.now(); //Читаем данные времени из RTC при каждом выполнении цикла
//----------Раздел обработки реле по времени ----
long utime = myTime.unixtime(); //сохраняем в переменную - время в формате UNIX
utime %= 86400;
//------------Реле-----------
if ((utime >= OnRelRed) && (utime <= (OffRelRed)))
{ digitalWrite(RelRed,LOW);} else { digitalWrite(RelRed,HIGH);}
//------------Реле-----------
if ((utime >= OnRelVozd) && (utime < (OffRelVozd)))
{ digitalWrite(RelVozd,LOW); } else { digitalWrite(RelVozd,HIGH);}
//------------Реле-----------
if ((utime >= OnRelCO2) && (utime <= (OffRelCO2)))
{ digitalWrite(RelCO2,LOW);} else { digitalWrite(RelCO2,HIGH);}
//------------Реле----------
if ((utime >= OnRelLed1) && (utime <= (OffRelLed1))) //Если секунд с начала суток больше, чем задано для включения, и одновременно меньше, чем задано для включения
{ digitalWrite(RelLed1,LOW); //Устанавливаем на входе релейного модуля НИЗКИЙ уровень - реле включается
} else{digitalWrite(RelLed1,HIGH);}
//------------Реле-----------
if ((utime >= OnRelLed2) && (utime <= (OffRelLed2)))
{ digitalWrite(RelLed2,LOW);} else { digitalWrite(RelLed2,HIGH);}
//------------Реле ПРОТОКИ-----------
if ((utime >= OnRelPROTOKA1) && (utime < (OffRelPROTOKA1)))
{ digitalWrite(RelPROTOKA1,LOW); } else { digitalWrite(RelPROTOKA1,HIGH);}
if ((utime >= OnRelPROTOKA2) && (utime < (OffRelPROTOKA2)))
{ digitalWrite(RelPROTOKA2,LOW); } else { digitalWrite(RelPROTOKA2,HIGH);}
if ((utime >= OnRelPROTOKA3) && (utime < (OffRelPROTOKA3)))
{ digitalWrite(RelPROTOKA3,LOW); } else { digitalWrite(RelPROTOKA3,HIGH);}
if ((utime >= OnRelPROTOKA4) && (utime < (OffRelPROTOKA4)))
{ digitalWrite(RelPROTOKA4,LOW); } else { digitalWrite(RelPROTOKA4,HIGH);}
if ((utime >= OnRelPROTOKA5) && (utime < (OffRelPROTOKA5)))
{ digitalWrite(RelPROTOKA5,LOW); } else { digitalWrite(RelPROTOKA5,HIGH);}
if ((utime >= OnRelPROTOKA6) && (utime < (OffRelPROTOKA6)))
{ digitalWrite(RelPROTOKA6,LOW); } else { digitalWrite(RelPROTOKA6,HIGH);}
if ((utime >= OnRelPROTOKA7) && (utime < (OffRelPROTOKA7)))
{ digitalWrite(RelPROTOKA7,LOW); } else { digitalWrite(RelPROTOKA7,HIGH);}
Изменил:
const long OnRelPROTOKA1 = 18*hr+1800; const long OnRelPROTOKA2 = 19*hr; const long OnRelPROTOKA3 = 19*hr+1800; const long OnRelPROTOKA4 = 20*hr; const long OnRelPROTOKA5 = 20*hr+1800; const long OnRelPROTOKA6 = 21*hr; const long OnRelPROTOKA7 = 21*hr+1800; const long DurationPROTOKA = 240; //---------------------------------------------/// //------------Реле ПРОТОКИ----------- if ((utime >= OnRelPROTOKA1) && (utime < (OnRelPROTOKA1+DurationPROTOKA)) or (utime >= OnRelPROTOKA2) && (utime < (OnRelPROTOKA2+DurationPROTOKA)) or (utime >= OnRelPROTOKA3) && (utime < (OnRelPROTOKA3+DurationPROTOKA)) or (utime >= OnRelPROTOKA4) && (utime < (OnRelPROTOKA4+DurationPROTOKA)) or (utime >= OnRelPROTOKA5) && (utime < (OnRelPROTOKA5+DurationPROTOKA)) or (utime >= OnRelPROTOKA6) && (utime < (OnRelPROTOKA6+DurationPROTOKA)) or (utime >= OnRelPROTOKA7) && (utime < (OnRelPROTOKA7+DurationPROTOKA))) { digitalWrite(RelPROTOKA,LOW);} else {digitalWrite(RelPROTOKA,HIGH);}Нууу, если хотите покрасивее написать, то
1. Сделайте из констант (строки 01-07) массив,
2. Вместо строк 15-21 - цикл, пробегающий по массиву, сравнивающий элементы массива с utime и выставляющий некий, например, boolean RelProtokaStatus,
3. Строка 23 тогда будет digitalWrite(RelProtoka, RelProtokaStatus).
Именно это и хотелось бы, но знаний мне не хватит описать массив и п. 2 :)
Именно это и хотелось бы, но знаний мне не хватит описать массив и п. 2 :)
интересно: на такое
18*hr+1800знанийхватает, а на масив нет.что значат все эти звезды? :-)
и если у вас одно реле протока к 11 ноге подключено, то к чему эти все проверки на реле 2,3 и т.д
Именно это и хотелось бы, но знаний мне не хватит описать массив и п. 2 :)
Знания здесь : http://arduino.ru/Reference/Array
интересно: на такое
18*hr+1800знанийхватает, а на масив нет.что значат все эти звезды? :-)
В начале кода прописано:
#define mn 60UL
#define hr 3600UL
18*hr = 18 *36000 = 18 часов :)
"и если у вас одно реле протока к 11 ноге подключено, то к чему эти все проверки на реле 2,3 и т.д."
Тут не совсем понял, там на реле 8, 9, 10, 11 и 12. Протока, да, на 11
Знания здесь : http://arduino.ru/Reference/Array
Я читал теорию на сайтах, но логику не понимаю, что означают эти цыфры для меня загадка))))
intmyInts[6];intmyPins[] = {2, 4, 8, 3, 6};intmySensVals[6] = {2, 4, -8, 3, 2};charmessage[6] ="hello";интересно: на такое
18*hr+1800знанийхватает, а на масив нет.что значат все эти звезды? :-)
В начале кода прописано:
#define mn 60UL
#define hr 3600UL
18*hr = 18 *36000 = 18 часов :)
"и если у вас одно реле протока к 11 ноге подключено, то к чему эти все проверки на реле 2,3 и т.д."
Тут не совсем понял, там на реле 8, 9, 10, 11 и 12. Протока, да, на 11
вот я туплю, а я то думал игра с адресацией
constintRelPROTOKA1 = 11;007constintRelPROTOKA2 = 11;008constintRelPROTOKA3 = 11;009constintRelPROTOKA4 = 11;010constintRelPROTOKA5 = 11;011constintRelPROTOKA6 = 11;012constintRelPROTOKA7 = 11;ввсе к 11 ноге. а смысл разбивать на 2-7 тогда какой?
в последних строках вы управляете несколькими реле, а по факту одним, так как все на 11 ногу завязаны
все к 11 ноге. а смысл разбивать на 2-7 тогда какой?
в последних строках вы управляете несколькими реле, а по факту одним, так как все на 11 ногу завязаны
Так я и говорю, что это некорректно и спрашиваю, как написать короткий код с масивом
int myArray[10]={9,3,2,4,3,2,7,8,9,11}; // myArray[0] первый элемент, содержит 9 // myArray[9] последний элемент, содержит 11 // myArray[10] это неверно возможно возвращение произвольного значения из области памяти не относящийся к массивукто это писал? масив объявлен из 10 переменных, под 10 выделяется память, какое нах.. произвольное значение? сколько раз не читай оно будет постоянным.
и тут:
Обратите внимания, что при создании массива типа char необходим дополнительный элемент массива для нулевого символа.
не для нулевого, а для последнего. последний символ будет конец строки = \n
Так я и говорю, что это некорректно и спрашиваю, как написать короткий код с масивом
зачем вам массив? оставьте только реле1
и в конце вашей программы включайте и выключайте его
так?:
#define mn 60UL #define hr 3600UL const int RelPROTOKA = 11; const long OnRelPROTOKA1 = 18*hr+1800; const long OnRelPROTOKA2 = 19*hr; const long OnRelPROTOKA3 = 19*hr+1800; const long OnRelPROTOKA4 = 20*hr; const long OnRelPROTOKA5 = 20*hr+1800; const long OnRelPROTOKA6 = 21*hr; const long OnRelPROTOKA7 = 21*hr+1800; const long DurationPROTOKA = 240; void setup(){ pinMode (RelPROTOKA, OUTPUT); digitalWrite(RelPROTOKA,HIGH); Wire.begin(); RTC.begin(); } void loop() { DateTime myTime = RTC.now(); long utime = myTime.unixtime(); //сохраняем в переменную - время в формате UNIX utime %= 86400; if ((utime >= OnRelPROTOKA1) && (utime < (OnRelPROTOKA1+DurationPROTOKA)) or (utime >= OnRelPROTOKA2) && (utime < (OnRelPROTOKA2+DurationPROTOKA)) or (utime >= OnRelPROTOKA3) && (utime < (OnRelPROTOKA3+DurationPROTOKA)) or (utime >= OnRelPROTOKA4) && (utime < (OnRelPROTOKA4+DurationPROTOKA)) or (utime >= OnRelPROTOKA5) && (utime < (OnRelPROTOKA5+DurationPROTOKA)) or (utime >= OnRelPROTOKA6) && (utime < (OnRelPROTOKA6+DurationPROTOKA)) or (utime >= OnRelPROTOKA7) && (utime < (OnRelPROTOKA7+DurationPROTOKA))) { digitalWrite(RelPROTOKA,LOW);} else {digitalWrite(RelPROTOKA,HIGH);} }OnRelPROTOKA[7]={семь значений через запятую}for (int i=0;i<=6;i++){if((utime >= OnRelPROTOKA[i]) && (utime < (OnRelPROTOKA[i]+DurationPROTOKA)){digitalWrite(RelPROTOKA,LOW);}else{digitalWrite(RelPROTOKA,HIGH);}}Чтобы компилятор не ругался
OnRelPROTOKA[7]={семь значений через запятую} -> long OnRelPROTOKA[7]={семь значений через запятую};
long OnRelPROTOKA[7]={18*hr+1800, 19*hr, .......} for (int i=0;i<=6;i++){ if ((utime >= OnRelPROTOKA[i]) && (utime < (OnRelPROTOKA[i]+DurationPROTOKA)){ digitalWrite(RelPROTOKA,LOW); } else {digitalWrite(RelPROTOKA,HIGH);} }Или константы вставлять в значения через запятую?
В приведённом выше скетче конечное состояние реле будет определяться последним проходом цикла (i=6), первые шесть проходов не имеют смысла.
Лучше так :
long OnRelPROTOKA[7]={18*hr+1800,19*hr,19*hr+1800,20*hr,20*hr+1800,21*hr,21*hr+1800}; void loop() { boolean RelProtokaStatus = false; for (int i=0;i<=6;i++){ if ((utime >= OnRelPROTOKA[i]) && (utime < (OnRelPROTOKA[i]+DurationPROTOKA)) && (!RelProtokaStatus)){ // условия проверяются только если ранее в цикле не было "успешной" проверки. RelProtokaStatus = true;} } digitalWrite(RelPROTOKA,!RelProtokaStatus); // именно !RelProtokaStatus, включенному реле соответствует LOW. }Лучше так :
Ай, Спасибо большое. Я так и подозревал, что логика "просто масив" не отработает!
MacSim Спасибо!
Пойду расскладывать по скетчу...