Повторяющиеся включения, помощь

Zebraj
Offline
Зарегистрирован: 14.03.2015

Здравствуйте уважаемые.

Скетч работает, но не могу написать повторяющиеся включения для Протоки. 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);} 
Zebraj
Offline
Зарегистрирован: 14.03.2015

Изменил:

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);}

 

 

Araris
Offline
Зарегистрирован: 09.11.2012

Нууу, если хотите покрасивее написать, то

1. Сделайте из констант (строки 01-07) массив,

2. Вместо строк 15-21 - цикл, пробегающий по массиву, сравнивающий элементы массива с utime и выставляющий некий, например, boolean RelProtokaStatus,

3. Строка 23 тогда будет digitalWrite(RelProtoka, RelProtokaStatus).

Zebraj
Offline
Зарегистрирован: 14.03.2015

Именно это и хотелось бы, но знаний мне не хватит описать массив и п. 2 :)

MacSim
Offline
Зарегистрирован: 28.11.2012

Zebraj пишет:

Именно это и хотелось бы, но знаний мне не хватит описать массив и п. 2 :)

интересно: на такое 18*hr+1800 знанийхватает, а на масив нет.

 

что значат все эти звезды? :-)

 

MacSim
Offline
Зарегистрирован: 28.11.2012

и если у вас одно реле протока к 11 ноге подключено, то к чему эти все проверки на реле 2,3 и т.д

 

Araris
Offline
Зарегистрирован: 09.11.2012

Zebraj пишет:

Именно это и хотелось бы, но знаний мне не хватит описать массив и п. 2 :)

Знания здесь : http://arduino.ru/Reference/Array

Zebraj
Offline
Зарегистрирован: 14.03.2015

интересно: на такое 18*hr+1800 знанийхватает, а на масив нет.

что значат все эти звезды? :-)

В начале кода прописано:

#define mn 60UL

#define hr 3600UL 

18*hr  = 18 *36000 = 18 часов :)

 

"и если у вас одно реле протока к 11 ноге подключено, то к чему эти все проверки на реле 2,3 и т.д."

Тут не совсем понял, там на реле 8, 9, 10, 11 и 12. Протока, да, на 11 

 

Zebraj
Offline
Зарегистрирован: 14.03.2015

Araris пишет:

Знания здесь : http://arduino.ru/Reference/Array

Я читал теорию на сайтах, но логику не понимаю, что означают эти цыфры для меня загадка))))

 

int myInts[6];
int myPins[] = {2, 4, 8, 3, 6};
int mySensVals[6] = {2, 4, -8, 3, 2};
char message[6] = "hello";

 

MacSim
Offline
Зарегистрирован: 28.11.2012

Zebraj пишет:

интересно: на такое 18*hr+1800 знанийхватает, а на масив нет.

что значат все эти звезды? :-)

В начале кода прописано:

#define mn 60UL

#define hr 3600UL 

18*hr  = 18 *36000 = 18 часов :)

 

"и если у вас одно реле протока к 11 ноге подключено, то к чему эти все проверки на реле 2,3 и т.д."

Тут не совсем понял, там на реле 8, 9, 10, 11 и 12. Протока, да, на 11 

 

вот я туплю, а я то думал игра с адресацией

 

const int RelPROTOKA1 = 11;

007 const int RelPROTOKA2 = 11;
008 const int RelPROTOKA3 = 11;
009 const int RelPROTOKA4 = 11;
010 const int RelPROTOKA5 = 11;
011 const int RelPROTOKA6 = 11;
012

const int RelPROTOKA7 = 11;

в

 

MacSim
Offline
Зарегистрирован: 28.11.2012

все к 11 ноге. а смысл разбивать на 2-7 тогда какой?

в последних строках вы управляете несколькими реле, а по факту одним, так как все на 11 ногу завязаны

Zebraj
Offline
Зарегистрирован: 14.03.2015

MacSim пишет:

все к 11 ноге. а смысл разбивать на 2-7 тогда какой?

в последних строках вы управляете несколькими реле, а по факту одним, так как все на 11 ногу завязаны

Так я и говорю, что это некорректно и спрашиваю, как написать короткий код с масивом

MacSim
Offline
Зарегистрирован: 28.11.2012
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

MacSim
Offline
Зарегистрирован: 28.11.2012

Zebraj пишет:

Так я и говорю, что это некорректно и спрашиваю, как написать короткий код с масивом

зачем вам массив? оставьте только реле1

и в конце вашей программы включайте и выключайте его

Zebraj
Offline
Зарегистрирован: 14.03.2015

так?:

#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);}



     }

 

MacSim
Offline
Зарегистрирован: 28.11.2012

OnRelPROTOKA[7]={семь значений через запятую}

for (int i=0;i<=6;i++){

if ((utime >= OnRelPROTOKA[i]) && (utime < (OnRelPROTOKA[i]+DurationPROTOKA)){

digitalWrite(RelPROTOKA,LOW);

} else {digitalWrite(RelPROTOKA,HIGH);}

}

Araris
Offline
Зарегистрирован: 09.11.2012

Чтобы компилятор не ругался

OnRelPROTOKA[7]={семь значений через запятую}   ->   long OnRelPROTOKA[7]={семь значений через запятую};

Zebraj
Offline
Зарегистрирован: 14.03.2015
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);}

}

Или константы вставлять в значения через запятую?

Araris
Offline
Зарегистрирован: 09.11.2012

В приведённом выше скетче конечное состояние реле будет определяться последним проходом цикла (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.
}

 

Zebraj
Offline
Зарегистрирован: 14.03.2015

Araris пишет:

Лучше так :

Ай, Спасибо большое. Я так и подозревал, что логика "просто масив" не отработает!

MacSim Спасибо!

Пойду расскладывать по скетчу...