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

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:

01#define OUTPUT_PIN 13              // пин для подключения нагрузки
02 
03void setup()
04{               
05  pinMode(OUTPUT_PIN, OUTPUT);     // инициализируем пин как выход
06  blink(8500,15000);               // первичное включение нагрузки, с учетом времени включения МК
07}
08 
09 
10void loop()                        // цикличное включение нагрузки
11{
12  blink(10000,15000);              // первое число - сколько мсек включена нагрузка
13                                   // второе число - пауза перед следующим включением
14}
15 
16 
17void blink(int a, int b)
18{
19  digitalWrite(OUTPUT_PIN, HIGH);  // включаем пин
20  delay(a);                        // ждем a мсек
21  digitalWrite(OUTPUT_PIN, LOW);   // выключаем пин
22  delay(b);                        // ждем b мсек
23}

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

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) В спомощью какого кода сделать эфект страбоскопа? 

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

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

01#define OUTPUT_PIN 3              // пин для подключения нагрузки
02// Если нужно плавное включение, то пин должен быть:
03// для Nano и Mini: 3,5,6,9-11
04// для Micro и Leonardo: 3,5,6,9-11,13
05// для Megaxxxx: 2-13,44-46
06 
07void setup()
08{               
09  pinMode(OUTPUT_PIN, OUTPUT);    // инициализируем пин как выход
10  //blip(8500,1500);              // первичное включение нагрузки, с учетом времени включения МК
11}
12 
13 
14void loop()
15{
16  blip(10000,15000);            // просто включение нагрузки
17  // первое число - сколько мсек включена нагрузка
18  // второе число - пауза после выключения, мсек
19}
20 
21 
22////// Эффект включения на N мсек и выключения через K мсек
23void blip(int n, int k)           
24{
25  digitalWrite(OUTPUT_PIN, HIGH);  // включаем нагрузку
26  delay(n);                        // ждем N мсек
27  digitalWrite(OUTPUT_PIN, LOW);   // выключаем нагрузку
28  delay(k);                        // ждем K мсек
29}
30 
31 
32////// Эффект стробоскопа
33void strob(int n, int s, int k)
34{
35  for(byte i = 0; i < n; i++)      // повторяем N раз
36  {
37    blip(s,s);                     // включаем на S мсек и гасим на S мсек
38  }
39  delay(k);                        // после полного гашения ждем K мсек
40}
41 
42 
43////// Эффект плавного включения
44void fadeIn(int s, int k)
45{
46  for(byte i = 0; i < 255; i++)    // плавно поднимаем яркость до максимума
47  {
48    analogWrite(OUTPUT_PIN, i);
49    delay(s);                      // ждем S мсек после каждого шага
50  }
51  digitalWrite(OUTPUT_PIN, HIGH);  // полностью включаем нагрузку
52  delay(k);                        // после достижения полной яркости ждем K мсек
53}
54 
55 
56////// Эффект плавного выключения
57void fadeOut(int s, int k)
58{
59  for(byte i = 255; i > 1; i--)    // плавно снижаем яркость до минимума
60  {
61    analogWrite(OUTPUT_PIN, i);
62    delay(s);                      // ждем S мсек после каждого шага
63  }
64  digitalWrite(OUTPUT_PIN, LOW);   // полностью выключаем нагрузку
65  delay(k);                        // после полного гашения ждем K мсек
66}
67 
68 
69////// Случайный эффект
70void randomEffect()
71{
72  switch (random(3))               // случайное число от 0 до 2
73  {
74  case 0:                          //выполняется, когда выпало 0
75    blip(10000,15000);
76    break;
77  case 1:                          //выполняется, когда выпало 1
78    {
79      fadeIn(16,10000);          
80      fadeOut(8,5000);
81    }
82    break;
83  case 2:                          //выполняется когда выпало 2
84    strob(5,48,3000);
85    break;
86  
87}

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

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

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

01void loop()
02{
03  fadeIn(16,10000);             // плавное увеличение яркости
04  // первое число - скорость нарастания яркости (2-100)
05  // второе число - пауза после полного включения, мсек
06 
07  fadeOut(8,5000);              // плавное понижение яркости
08  // первое число - скорость гашения яркости (2-100)
09  // второе число - пауза после полного выключения, мсек
10}

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

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

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

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

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

1void loop()
2{
3  randomEffect();
4}

 

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

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

01void setup()
02{
03  pinMode(13, OUTPUT);
04}
05 
06void loop ()
07{
08if (millis ()==6900) digitalWrite (13,1);
09if (millis ()==13300) digitalWrite (13,0);
10if (millis ()==27500) digitalWrite (13,1);
11if (millis ()==41200) digitalWrite (13,0);
12 
13// и.т.д
14 
15}

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

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

 

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:

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

 

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

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