Включение нагрузки по заданному времени.

shan907
Offline
Зарегистрирован: 07.05.2014

Здравствуйте всем. Помогите решить легкую для вас задачу. Необходим код для ардуино с такими требованиями:

Есть отрезок времени (например пять минут) необходимо включить нагрузку в определное время (например на 10-й секунде) потом отключить её (например на 15 секунде) и так далее.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Какая нагрузка?
10-я секунда от чего отсчитывается?
Интервал включения фиксированный, или задается через интерфейс?
Блокировки и проверки нужны?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Супер девайс! рекомендую

http://www.ebay.com/itm/New-0-1s-99h-Programmable-Digital-Timer-Double-Time-Delay-Relay-AC-110V-220V-/371006330388?pt=UK_BOI_Electrical_Test_Measurement_Equipment_ET&var=&hash=item5661b35614

От 0.1 секунды до 99 часов каждый из двух независимых каналов, переключаются по очереди.

Contact rating: AC 220V 5A DC 24V 7A(Resistive load)

Только есть нюанс -  после смены установок остаются старые пока не передёрнуть питание.

Из минусов- выше обычных автоматов, довольно сильно торчит из обычного щитка,  дверцу не даёт закрыть. На индикаторе идёт прямой отсчёт, удобнее был-бы обратный.

Из несомненных плюсов-  выведены входы Reset  Pause . 

Reset понятно сбрасывает, а Pause останавливает счёт. Можно сделать на них кое-какую логику.

А  если поставить по 0.1 секунды оба канала то по щелчкам реле слышно что оно даже успевает переключаться!!!

 

shan907
Offline
Зарегистрирован: 07.05.2014
shan907
Offline
Зарегистрирован: 07.05.2014

Tomasina пишет:
Какая нагрузка? 10-я секунда от чего отсчитывается? Интервал включения фиксированный, или задается через интерфейс? Блокировки и проверки нужны?

Нагрузка= пока эксперементирую на встроеном диоде на 13 выводе. А вообще будет нагрузка холодный неон, через симистор и оптопару.

10 секунда от момента включения ардуино, тоесть с момента подачи питания на ардуино.

Интервал включения, не совсем понял вопроса. 

Блокировки проверки тоже не совсем понял о чем речь, но думаю ответ: Нет. 

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

shan907 пишет:
Интервал включения, не совсем понял вопроса. 

т.е. 0 --> 10 (вкл) --> 25 (выкл) --> 35(вкл) --> 50 (выкл) и т.д.?
эти интервалы будет нужда менять (кнопками, энкодером и пр.), или они константами прописаны в коде?

shan907 пишет:
Блокировки проверки тоже не совсем понял о чем речь, но думаю ответ: Нет. 

К примеру, не включать нагрузку, если питание подано, но сейчас светло; сообщать об обрыве в цепи питания хололдного неона и пр.

shan907
Offline
Зарегистрирован: 07.05.2014

Tomasina пишет:

shan907 пишет:
Интервал включения, не совсем понял вопроса. 

т.е. 0 --> 10 (вкл) --> 25 (выкл) --> 35(вкл) --> 50 (выкл) и т.д.?
эти интервалы будет нужда менять (кнопками, энкодером и пр.), или они константами прописаны в коде?

shan907 пишет:
Блокировки проверки тоже не совсем понял о чем речь, но думаю ответ: Нет. 

К примеру, не включать нагрузку, если питание подано, но сейчас светло; сообщать об обрыве в цепи питания хололдного неона и пр.

т.е. 0 --> 10 (вкл) --> 25 (выкл) --> 35(вкл) --> 50 (выкл) и т.д.?

Да именно так, не каких кнопок не чего не будет. Включается выключается только по написанному коду.

К примеру, не включать нагрузку, если питание подано, но сейчас светло; Нет такого не надо.

Geronimo
Offline
Зарегистрирован: 06.05.2013

void loop ()
{
delay (10000);
digitalWrite (13,1);
delay (15000);
digitalWrite (13,0);
}

shan907
Offline
Зарегистрирован: 07.05.2014

Geronimo пишет:
void loop () { delay (10000); digitalWrite (13,1); delay (15000); digitalWrite (13,0); }

По простоте моего задания наверно видно что я делитант ))) Поэтому можно подробней? Как будет выглядеть полностью весь код? и можно прокоментировать строчки кода?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Ага.

Geronimo
Offline
Зарегистрирован: 06.05.2013

Код полностью

void setup ()

{

pinMode (13, OUTPUT); //настроить пинг на выход

}

 

 void loop ()

{

delay (10000); //10 тыс миллисекунд ничего не делать

digitalWrite (13, 1);//пподать 5 вольт на 13 пил

 delay (15000); //15 сек отдыхаем

digitalWrite (13,0);//снять напряжение с пива

}

shan907
Offline
Зарегистрирован: 07.05.2014

Немного не то.

digitalWrite (13, 1);

 delay (15000);

Включает на 15 секунд. А надо чтоб выключало на 15-й секунде

 

shan907
Offline
Зарегистрирован: 07.05.2014

shan907 пишет:

необходимо включить нагрузку в определное время (например на 10-й секунде) потом отключить её (например на 15 секунде) и так далее.

Geronimo
Offline
Зарегистрирован: 06.05.2013

Поменяй второй делей на 5 тыс.

Как надо на 15 секунде включается на 30 выключается и стоп машина?

shan907
Offline
Зарегистрирован: 07.05.2014

Geronimo пишет:

Поменяй второй делей на 5 тыс.

Нет вычеслять время не вариант в моем случае. Так как включений выключений будет много, за пять минут может быть до 1000 включений выключений. Поэтому я замучаюсь писать такой код с вычеслениями времени.

надо написать именно в таком варианте:

такаета секунда - включается

такаета секунда - выключается

и так далее.... 

А у вас получается такой вариант:

через столько то секунд - включается

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

и так далее....

Geronimo
Offline
Зарегистрирован: 06.05.2013

Что значит на такой-то секунде включается? Откуда отсчет вести? С времени старта МК? 

 

Geronimo
Offline
Зарегистрирован: 06.05.2013

Пожалуйста:

void loop () 

{

If (millis ()==15000) digitalWrite (13,1);

If (millis () ==20000) digitalWrite (13,0);

// и.т.д

}

shan907
Offline
Зарегистрирован: 07.05.2014

Geronimo пишет:

Что значит на такой-то секунде включается? Откуда отсчет вести? С времени старта МК? 

 

Да, отчет времени с момента включения ардуино

shan907
Offline
Зарегистрирован: 07.05.2014

Geronimo пишет:

Пожалуйста:

void loop () 

{

If (millis ()==15000) digitalWrite (13,1);

If (millis () ==20000) digitalWrite (13,0);

// и.т.д

}

Огромнейшее спасибо!!! То что надо. Работает.

Только при включении я так понимаю есть какаета задержка (на загрузку МК) ? Так как все включения выключения выполняются на 1,5-2 секунды позже. Как решить эту проблему? Есть какаета информация сколько секунд выполняется включение МК? Тоесть через сколько секунд после включения начинает выполнятся программа?

shan907
Offline
Зарегистрирован: 07.05.2014

Рас уж вы мне помогли, может я как то отблагодарю? И задам ещё несколько подобных вопросов?

Geronimo
Offline
Зарегистрирован: 06.05.2013

Только учти рано или поздно millis переполнится и начнет осчет с начала

shan907
Offline
Зарегистрирован: 07.05.2014

Что значит переполнится?

Geronimo
Offline
Зарегистрирован: 06.05.2013

Мк не может хранить числа до бесконечности. 

таймер миллис имеет тип unsigned long досчитав до 2^32 -1 он начнет считать с 0

shan907
Offline
Зарегистрирован: 07.05.2014

А вот это вы проигнорировали? )))

Рас уж вы мне помогли, может я как то отблагодарю? И задам ещё несколько подобных вопросов?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Автору надо: "включений выключений будет много, за пять минут может быть до 1000 включений выключений".
А код из поста #16 выполнится один раз. Следующий повтор будет через 47 суток.

Geronimo
Offline
Зарегистрирован: 06.05.2013

Tomasina пишет:
Автору надо: "включений выключений будет много, за пять минут может быть до 1000 включений выключений".
А код из поста #16 выполнится один раз. Следующий повтор будет через 47 суток.

Так там коммент и т д. прописать тыщу условий. Задание не очень четко сформулировано.

Geronimo
Offline
Зарегистрирован: 06.05.2013

Достаточно сказать спасибо )
Есть вопросы, задавайте, чем смогу помогу

Geronimo
Offline
Зарегистрирован: 06.05.2013

Достаточно сказать спасибо )
Есть вопросы, задавайте, чем смогу помогу

shan907
Offline
Зарегистрирован: 07.05.2014

Geronimo пишет:
Tomasina пишет:
Автору надо: "включений выключений будет много, за пять минут может быть до 1000 включений выключений". А код из поста #16 выполнится один раз. Следующий повтор будет через 47 суток.
Так там коммент и т д. прописать тыщу условий. Задание не очень четко сформулировано.

Всё правильно, код должен выполнятся один рас, а 1000 включений выключений это имеется ввиду они будут прописаны в коде, а не повторятся.

shan907
Offline
Зарегистрирован: 07.05.2014

Geronimo пишет:
Достаточно сказать спасибо ) Есть вопросы, задавайте, чем смогу помогу

Вопрос уже был ))

при включении МК я так понимаю есть какаета задержка? Так как все включения выключения выполняются на 1,5-2 секунды позже. Как решить эту проблему? Есть какаета информация сколько секунд выполняется включение МК? Тоесть через сколько секунд после включения начинает выполнятся программа?

Geronimo
Offline
Зарегистрирован: 06.05.2013

Этого увы не знаю

shan907
Offline
Зарегистрирован: 07.05.2014

И ещё вопросы:

1) Когда включаешь питание МК, диод моргает несколько рас. Почему это происходит и не будет ли моргать у меня подключеный неон ?

2) В спомощью какого кода можно сделать плавное затухание и включение диода (в дальнейшем неона подключеного через оптопару и симистр) ?

3) В спомощью какого кода сделать эфект страбоскопа? 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

заданию из первого поста соответствует код в посте #10. При этом одобренная последовательность"0 --> 10 (вкл) --> 25 (выкл) --> 35(вкл) --> 50 (выкл)" выполняется и кода минимум.

Для коррекции задержки при включении МК надо чуть уменьшить первую паузу и прописать это в setup:

#define OUTPUT_PIN 13              // пин для подключения нагрузки

void setup() 
{                
  pinMode(OUTPUT_PIN, OUTPUT);     // инициализируем пин как выход
  blink(8500,15000);               // первичное включение нагрузки, с учетом времени включения МК
}


void loop()                        // цикличное включение нагрузки
{
  blink(10000,15000);              // первое число - сколько мсек включена нагрузка
                                   // второе число - пауза перед следующим включением
}


void blink(int a, int b) 
{
  digitalWrite(OUTPUT_PIN, HIGH);  // включаем пин
  delay(a);                        // ждем a мсек
  digitalWrite(OUTPUT_PIN, LOW);   // выключаем пин
  delay(b);                        // ждем b мсек
}

У меня такое чувство, что тут трое общаются в разных терминах, поэтому постоянно непонятки.

shan907
Offline
Зарегистрирован: 07.05.2014

Geronimo пишет:
Этого увы не знаю

Может как то можно включать МК без запуска программы, а потом например замыканием каких то контактов запускать программу?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

shan907 пишет:
1) Когда включаешь питание МК, диод моргает несколько рас. Почему это происходит и не будет ли моргать у меня подключеный неон ?

В рабочей версии замени номер пина на другой и все

Цитата:
2) В спомощью какого кода можно сделать плавное затухание и включение диода (в дальнейшем неона подключеного через оптопару и симистр) ?

Использовать ШИМ. Неон разве позволяет плавное включение?

Цитата:
3) В спомощью какого кода сделать эфект страбоскопа? 

Если просто - то уменьшить числа a и b до 100-400. Если нужно двойное/тройное моргание, то через циклы.

 

shan907
Offline
Зарегистрирован: 07.05.2014

Tomasina пишет:

У меня такое чувство, что тут трое общаются в разных терминах, поэтому постоянно непонятки.

Это вы про что? От меня только я пишу. Просто пишем одновременно, поперепутались сообщения. Сам уже запутался..

shan907
Offline
Зарегистрирован: 07.05.2014

shan907 пишет:

Tomasina пишет:

У меня такое чувство, что тут трое общаются в разных терминах, поэтому постоянно непонятки.

Это вы про что? От меня только я пишу. Просто пишем одновременно, поперепутались сообщения. Сам уже запутался..

Всё я понял про что вы )))

shan907
Offline
Зарегистрирован: 07.05.2014

Tomasina пишет:

Цитата:
2) В спомощью какого кода можно сделать плавное затухание и включение диода (в дальнейшем неона подключеного через оптопару и симистр) ?

Использовать ШИМ. Неон разве позволяет плавное включение?

Неон да позваляет.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

shan907 пишет:

2) В спомощью какого кода можно сделать плавное затухание и включение диода (в дальнейшем неона подключеного через оптопару и симистр) ?

3) В спомощью какого кода сделать эфект страбоскопа? 

Ты уж определись, что конкретно надо ;)

Вот "конструктор":

#define OUTPUT_PIN 3              // пин для подключения нагрузки
// Если нужно плавное включение, то пин должен быть:
// для Nano и Mini: 3,5,6,9-11
// для Micro и Leonardo: 3,5,6,9-11,13
// для Megaxxxx: 2-13,44-46

void setup() 
{                
  pinMode(OUTPUT_PIN, OUTPUT);    // инициализируем пин как выход
  //blip(8500,1500);              // первичное включение нагрузки, с учетом времени включения МК
}


void loop()
{
  blip(10000,15000);            // просто включение нагрузки
  // первое число - сколько мсек включена нагрузка
  // второе число - пауза после выключения, мсек
}


////// Эффект включения на N мсек и выключения через K мсек
void blip(int n, int k)            
{
  digitalWrite(OUTPUT_PIN, HIGH);  // включаем нагрузку
  delay(n);                        // ждем N мсек
  digitalWrite(OUTPUT_PIN, LOW);   // выключаем нагрузку
  delay(k);                        // ждем K мсек
}


////// Эффект стробоскопа
void strob(int n, int s, int k)
{
  for(byte i = 0; i < n; i++)      // повторяем N раз
  {
    blip(s,s);                     // включаем на S мсек и гасим на S мсек
  }
  delay(k);                        // после полного гашения ждем K мсек
}


////// Эффект плавного включения
void fadeIn(int s, int k)
{
  for(byte i = 0; i < 255; i++)    // плавно поднимаем яркость до максимума
  {
    analogWrite(OUTPUT_PIN, i); 
    delay(s);                      // ждем S мсек после каждого шага
  }
  digitalWrite(OUTPUT_PIN, HIGH);  // полностью включаем нагрузку
  delay(k);                        // после достижения полной яркости ждем K мсек
}


////// Эффект плавного выключения
void fadeOut(int s, int k)
{
  for(byte i = 255; i > 1; i--)    // плавно снижаем яркость до минимума
  {
    analogWrite(OUTPUT_PIN, i); 
    delay(s);                      // ждем S мсек после каждого шага
  }
  digitalWrite(OUTPUT_PIN, LOW);   // полностью выключаем нагрузку
  delay(k);                        // после полного гашения ждем K мсек
}


////// Случайный эффект
void randomEffect()
{
  switch (random(3))               // случайное число от 0 до 2 
  {
  case 0:                          //выполняется, когда выпало 0
    blip(10000,15000);
    break;
  case 1:                          //выполняется, когда выпало 1
    {
      fadeIn(16,10000);           
      fadeOut(8,5000);
    }
    break;
  case 2:                          //выполняется когда выпало 2
    strob(5,48,3000);
    break;
  }  
}

К примеру, надо (как в первом задании)  включить на 10 сек и выключить на 15 сек, затем бесконечно повторить. Тогда пиши в loop:

void loop()
{
  blip(10000,15000);            // просто включение нагрузки
  // первое число - сколько мсек включена нагрузка
  // второе число - пауза перед выключением
}

Если надо плавно включить и через 10 сек плавно выключить, а через 5 сек повторить, то пишем:

void loop()
{
  fadeIn(16,10000);             // плавное увеличение яркости
  // первое число - скорость нарастания яркости (2-100)
  // второе число - пауза после полного включения, мсек

  fadeOut(8,5000);              // плавное понижение яркости
  // первое число - скорость гашения яркости (2-100)
  // второе число - пауза после полного выключения, мсек
}

Если нужен стробоскоп из 5 вспышек, с паузой 3 сек между сериями вспышек, то пишем:

void loop()
{
  strob(5,48,3000);               // стробоскоп
  // первое число - количество вспышек
  // второе число - длительность вспышки, мсек
  // третье число - пауза после полной серии, мсек
}

Можно и комбинировать:

void loop()
{
  fadeIn(16,0);             // плавное увеличение яркости
  strob(3,512,0);           // мигаем неспешно 3 раза
  blip(5000,0);             // горим 5 сек
  strob(5,48,0);            // мигаем быстро 5 раз
  fadeOut(8,5000);          // плавное понижение яркости и пауза 5 сек
}

Если хочется произвольный эффект, то пишем:

void loop()
{
  randomEffect();
}

 

shan907
Offline
Зарегистрирован: 07.05.2014

Tomasina пишет:

shan907 пишет:

2) В спомощью какого кода можно сделать плавное затухание и включение диода (в дальнейшем неона подключеного через оптопару и симистр) ?

3) В спомощью какого кода сделать эфект страбоскопа? 

Ты уж определись, что конкретно надо ;)

Надо все эфекты. В какоето время просто включить / выключить, в какоето плавное включение / выключение, в какоето стробоскоп. Всё это в одной программе, просто в разное время.

За коды спасибо, буду разбираться.

shan907
Offline
Зарегистрирован: 07.05.2014

Tomasina пишет:

К примеру, надо (как в первом задании)  включить на 10 сек и выключить на 15 сек, затем бесконечно повторить. Тогда пиши в loop:

Такого задания не было, просто понял не правильно.

Задание такое: Необходимо включить нагрузку на определенной секунде. (отсчет времени с момента включения МК) Потом необходимо выключить нагрузку так же на определенной секунде и так далее... без повторений программы. Потом я дополнил задание: необходимо ещё добавить в тот же код, так же на определенной секунде, эфект затухания / включения и эфект стробоскопа.

Пример:

Включаем МК, пошол отсчет времени.

На 10-й секунде включить нагрузку.

На 15-й секунде выключить нагрузку.

На 20-й секунде сделать плавное включение.

На 25-й секунде выключить нагрузку.

На 30-й секунде включить нагрузку.

На 35-й секунде сделать плавное выключение

На 40-й секунде включить стробоскоп.

На 45-й секунде выключить стробоскоп.

После 45-й секунды ни чего не делаем, выключаем МК.

Вот так думаю понятней всем :)  Советов много, спасибо, но всё как то в расброс, теперь разбираться в ваших советах и собирать по кусочкам. Незнаю получится ли :)

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Весь код был выше (пример loop комбинированного), осталось правильно прописать последовательность эффектов и паузы. Дерзайте! :)

shan907
Offline
Зарегистрирован: 07.05.2014

Там нет времени в которое должен включится определенный эфект.

shan907
Offline
Зарегистрирован: 07.05.2014

Вот например сейчас у меня код такой:


void setup()
{
  pinMode(13, OUTPUT);
}

void loop ()
{
if (millis ()==6900) digitalWrite (13,1);
if (millis ()==13300) digitalWrite (13,0);
if (millis ()==27500) digitalWrite (13,1);
if (millis ()==41200) digitalWrite (13,0);

// и.т.д

}

Как мне туда добавить эфект вашего стробоскопа:

void loop()
{
  strob(5,48,3000);               // стробоскоп
  // первое число - количество вспышек
  // второе число - длительность вспышки, мсек
  // третье число - пауза после полной серии, мсек
}

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Рассчитать. Длительность эффекта известна, осталось дополнить паузу до наступления времени следуюшего события.
(Это к посту 42).

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

digitalWrite... заменить на вызов функции эффекта.
if (millis ()==13300) strob(5,48,3000);

shan907
Offline
Зарегистрирован: 07.05.2014

Не понял. Можете на примере показать?

Например вот так надо:

if (millis ()==6900) digitalWrite (13,1);
if (millis ()==13300) digitalWrite (13,0);
     А тут на 15000 милисекунде включить стробоскоб
if (millis ()==27500) digitalWrite (13,1);
if (millis ()==41200) digitalWrite (13,0);
shan907
Offline
Зарегистрирован: 07.05.2014

Tomasina пишет:
digitalWrite... заменить на вызов функции эффекта. if (millis ()==13300) strob(5,48,3000);

Написали ответ раньше чем я задал вопрос :) Спасибо, ща попробую

shan907
Offline
Зарегистрирован: 07.05.2014

рагается:

error: 'strob' was not declared in this scope

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Надо весь мой код из поста 38. А if вставлять в loop:

void loop()
{
  if (millis() > 8900) blip(15000,0); // на 10-й секунде включить нагрузку на 15 сек
  if (millis() > 20000) fadeIn(16,0);  // на 20-й секунде плавное включение
  if (millis() > 25000) digitalWrite(OUTPUT_PIN, LOW);  // выключаем нагрузку (т.к. после fadeIn она остается включенной)
  if (millis() > 30000) blip(15000,0); // на 30-й секунде включить нагрузку на 15 сек
  if (millis() > 35000) fadeIn(16,0);  // на 35-й секунде плавное включение
  if (millis() > 45000) digitalWrite(OUTPUT_PIN, LOW);  // выключаем нагрузку
  if (millis() > 40000) strob(5,48,0);  // на 40-й секунде стробоскоп из 5 вспышек
}

 

shan907
Offline
Зарегистрирован: 07.05.2014

Ни чего не получается, пошел я спать :)