Повторяющиеся включения, помощь
- Войдите на сайт для отправки комментариев
Пт, 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);}
Изменил:
Нууу, если хотите покрасивее написать, то
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
Я читал теорию на сайтах, но логику не понимаю, что означают эти цыфры для меня загадка))))
int
myInts[6];
int
myPins[] = {2, 4, 8, 3, 6};
int
mySensVals[6] = {2, 4, -8, 3, 2};
char
message[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
вот я туплю, а я то думал игра с адресацией
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;
в
все к 11 ноге. а смысл разбивать на 2-7 тогда какой?
в последних строках вы управляете несколькими реле, а по факту одним, так как все на 11 ногу завязаны
все к 11 ноге. а смысл разбивать на 2-7 тогда какой?
в последних строках вы управляете несколькими реле, а по факту одним, так как все на 11 ногу завязаны
Так я и говорю, что это некорректно и спрашиваю, как написать короткий код с масивом
кто это писал? масив объявлен из 10 переменных, под 10 выделяется память, какое нах.. произвольное значение? сколько раз не читай оно будет постоянным.
и тут:
Обратите внимания, что при создании массива типа char необходим дополнительный элемент массива для нулевого символа.
не для нулевого, а для последнего. последний символ будет конец строки = \n
Так я и говорю, что это некорректно и спрашиваю, как написать короткий код с масивом
зачем вам массив? оставьте только реле1
и в конце вашей программы включайте и выключайте его
так?:
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]={семь значений через запятую};
Или константы вставлять в значения через запятую?
В приведённом выше скетче конечное состояние реле будет определяться последним проходом цикла (i=6), первые шесть проходов не имеют смысла.
Лучше так :
Лучше так :
Ай, Спасибо большое. Я так и подозревал, что логика "просто масив" не отработает!
MacSim Спасибо!
Пойду расскладывать по скетчу...