Включение нагрузки по заданному времени.
- Войдите на сайт для отправки комментариев
Ср, 07/05/2014 - 00:59
Здравствуйте всем. Помогите решить легкую для вас задачу. Необходим код для ардуино с такими требованиями:
Есть отрезок времени (например пять минут) необходимо включить нагрузку в определное время (например на 10-й секунде) потом отключить её (например на 15 секунде) и так далее.
Какая нагрузка?
10-я секунда от чего отсчитывается?
Интервал включения фиксированный, или задается через интерфейс?
Блокировки и проверки нужны?
Супер девайс! рекомендую
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 секунды оба канала то по щелчкам реле слышно что оно даже успевает переключаться!!!
Супер девайс! рекомендую
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
Спасибо но это не подходит ))
Нагрузка= пока эксперементирую на встроеном диоде на 13 выводе. А вообще будет нагрузка холодный неон, через симистор и оптопару.
10 секунда от момента включения ардуино, тоесть с момента подачи питания на ардуино.
Интервал включения, не совсем понял вопроса.
Блокировки проверки тоже не совсем понял о чем речь, но думаю ответ: Нет.
т.е. 0 --> 10 (вкл) --> 25 (выкл) --> 35(вкл) --> 50 (выкл) и т.д.?
эти интервалы будет нужда менять (кнопками, энкодером и пр.), или они константами прописаны в коде?
К примеру, не включать нагрузку, если питание подано, но сейчас светло; сообщать об обрыве в цепи питания хололдного неона и пр.
т.е. 0 --> 10 (вкл) --> 25 (выкл) --> 35(вкл) --> 50 (выкл) и т.д.?
эти интервалы будет нужда менять (кнопками, энкодером и пр.), или они константами прописаны в коде?
К примеру, не включать нагрузку, если питание подано, но сейчас светло; сообщать об обрыве в цепи питания хололдного неона и пр.
т.е. 0 --> 10 (вкл) --> 25 (выкл) --> 35(вкл) --> 50 (выкл) и т.д.?
Да именно так, не каких кнопок не чего не будет. Включается выключается только по написанному коду.
К примеру, не включать нагрузку, если питание подано, но сейчас светло; Нет такого не надо.
void loop ()
{
delay (10000);
digitalWrite (13,1);
delay (15000);
digitalWrite (13,0);
}
По простоте моего задания наверно видно что я делитант ))) Поэтому можно подробней? Как будет выглядеть полностью весь код? и можно прокоментировать строчки кода?
Ага.
Код полностью
void setup ()
{
pinMode (13, OUTPUT); //настроить пинг на выход
}
void loop ()
{
delay (10000); //10 тыс миллисекунд ничего не делать
digitalWrite (13, 1);//пподать 5 вольт на 13 пил
delay (15000); //15 сек отдыхаем
digitalWrite (13,0);//снять напряжение с пива
}
Немного не то.
digitalWrite (13, 1);
delay (15000);
Включает на 15 секунд. А надо чтоб выключало на 15-й секунде
необходимо включить нагрузку в определное время (например на 10-й секунде) потом отключить её (например на 15 секунде) и так далее.
Поменяй второй делей на 5 тыс.
Как надо на 15 секунде включается на 30 выключается и стоп машина?
Поменяй второй делей на 5 тыс.
Нет вычеслять время не вариант в моем случае. Так как включений выключений будет много, за пять минут может быть до 1000 включений выключений. Поэтому я замучаюсь писать такой код с вычеслениями времени.
надо написать именно в таком варианте:
такаета секунда - включается
такаета секунда - выключается
и так далее....
А у вас получается такой вариант:
через столько то секунд - включается
через столькото секунд после включения -выключается
и так далее....
Что значит на такой-то секунде включается? Откуда отсчет вести? С времени старта МК?
Пожалуйста:
void loop ()
{
If (millis ()==15000) digitalWrite (13,1);
If (millis () ==20000) digitalWrite (13,0);
// и.т.д
}
Что значит на такой-то секунде включается? Откуда отсчет вести? С времени старта МК?
Да, отчет времени с момента включения ардуино
Пожалуйста:
void loop ()
{
If (millis ()==15000) digitalWrite (13,1);
If (millis () ==20000) digitalWrite (13,0);
// и.т.д
}
Огромнейшее спасибо!!! То что надо. Работает.
Только при включении я так понимаю есть какаета задержка (на загрузку МК) ? Так как все включения выключения выполняются на 1,5-2 секунды позже. Как решить эту проблему? Есть какаета информация сколько секунд выполняется включение МК? Тоесть через сколько секунд после включения начинает выполнятся программа?
Рас уж вы мне помогли, может я как то отблагодарю? И задам ещё несколько подобных вопросов?
Только учти рано или поздно millis переполнится и начнет осчет с начала
Что значит переполнится?
Мк не может хранить числа до бесконечности.
таймер миллис имеет тип unsigned long досчитав до 2^32 -1 он начнет считать с 0
А вот это вы проигнорировали? )))
Рас уж вы мне помогли, может я как то отблагодарю? И задам ещё несколько подобных вопросов?
Автору надо: "включений выключений будет много, за пять минут может быть до 1000 включений выключений".
А код из поста #16 выполнится один раз. Следующий повтор будет через 47 суток.
А код из поста #16 выполнится один раз. Следующий повтор будет через 47 суток.
Так там коммент и т д. прописать тыщу условий. Задание не очень четко сформулировано.
Достаточно сказать спасибо )
Есть вопросы, задавайте, чем смогу помогу
Достаточно сказать спасибо )
Есть вопросы, задавайте, чем смогу помогу
Всё правильно, код должен выполнятся один рас, а 1000 включений выключений это имеется ввиду они будут прописаны в коде, а не повторятся.
Вопрос уже был ))
при включении МК я так понимаю есть какаета задержка? Так как все включения выключения выполняются на 1,5-2 секунды позже. Как решить эту проблему? Есть какаета информация сколько секунд выполняется включение МК? Тоесть через сколько секунд после включения начинает выполнятся программа?
Этого увы не знаю
И ещё вопросы:
1) Когда включаешь питание МК, диод моргает несколько рас. Почему это происходит и не будет ли моргать у меня подключеный неон ?
2) В спомощью какого кода можно сделать плавное затухание и включение диода (в дальнейшем неона подключеного через оптопару и симистр) ?
3) В спомощью какого кода сделать эфект страбоскопа?
заданию из первого поста соответствует код в посте #10. При этом одобренная последовательность"0 --> 10 (вкл) --> 25 (выкл) --> 35(вкл) --> 50 (выкл)" выполняется и кода минимум.
Для коррекции задержки при включении МК надо чуть уменьшить первую паузу и прописать это в setup:
01
#define OUTPUT_PIN 13 // пин для подключения нагрузки
02
03
void
setup
()
04
{
05
pinMode(OUTPUT_PIN, OUTPUT);
// инициализируем пин как выход
06
blink(8500,15000);
// первичное включение нагрузки, с учетом времени включения МК
07
}
08
09
10
void
loop
()
// цикличное включение нагрузки
11
{
12
blink(10000,15000);
// первое число - сколько мсек включена нагрузка
13
// второе число - пауза перед следующим включением
14
}
15
16
17
void
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
}
У меня такое чувство, что тут трое общаются в разных терминах, поэтому постоянно непонятки.
Может как то можно включать МК без запуска программы, а потом например замыканием каких то контактов запускать программу?
В рабочей версии замени номер пина на другой и все
Использовать ШИМ. Неон разве позволяет плавное включение?
Если просто - то уменьшить числа a и b до 100-400. Если нужно двойное/тройное моргание, то через циклы.
У меня такое чувство, что тут трое общаются в разных терминах, поэтому постоянно непонятки.
Это вы про что? От меня только я пишу. Просто пишем одновременно, поперепутались сообщения. Сам уже запутался..
У меня такое чувство, что тут трое общаются в разных терминах, поэтому постоянно непонятки.
Это вы про что? От меня только я пишу. Просто пишем одновременно, поперепутались сообщения. Сам уже запутался..
Всё я понял про что вы )))
Использовать ШИМ. Неон разве позволяет плавное включение?
Неон да позваляет.
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
07
void
setup
()
08
{
09
pinMode(OUTPUT_PIN, OUTPUT);
// инициализируем пин как выход
10
//blip(8500,1500); // первичное включение нагрузки, с учетом времени включения МК
11
}
12
13
14
void
loop
()
15
{
16
blip(10000,15000);
// просто включение нагрузки
17
// первое число - сколько мсек включена нагрузка
18
// второе число - пауза после выключения, мсек
19
}
20
21
22
////// Эффект включения на N мсек и выключения через K мсек
23
void
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
////// Эффект стробоскопа
33
void
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
////// Эффект плавного включения
44
void
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
////// Эффект плавного выключения
57
void
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
////// Случайный эффект
70
void
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:
1
void
loop
()
2
{
3
blip(10000,15000);
// просто включение нагрузки
4
// первое число - сколько мсек включена нагрузка
5
// второе число - пауза перед выключением
6
}
Если надо плавно включить и через 10 сек плавно выключить, а через 5 сек повторить, то пишем:
01
void
loop
()
02
{
03
fadeIn(16,10000);
// плавное увеличение яркости
04
// первое число - скорость нарастания яркости (2-100)
05
// второе число - пауза после полного включения, мсек
06
07
fadeOut(8,5000);
// плавное понижение яркости
08
// первое число - скорость гашения яркости (2-100)
09
// второе число - пауза после полного выключения, мсек
10
}
Если нужен стробоскоп из 5 вспышек, с паузой 3 сек между сериями вспышек, то пишем:
1
void
loop
()
2
{
3
strob(5,48,3000);
// стробоскоп
4
// первое число - количество вспышек
5
// второе число - длительность вспышки, мсек
6
// третье число - пауза после полной серии, мсек
7
}
Можно и комбинировать:
1
void
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
}
Если хочется произвольный эффект, то пишем:
1
void
loop
()
2
{
3
randomEffect();
4
}
2) В спомощью какого кода можно сделать плавное затухание и включение диода (в дальнейшем неона подключеного через оптопару и симистр) ?
3) В спомощью какого кода сделать эфект страбоскопа?
Ты уж определись, что конкретно надо ;)
Надо все эфекты. В какоето время просто включить / выключить, в какоето плавное включение / выключение, в какоето стробоскоп. Всё это в одной программе, просто в разное время.
За коды спасибо, буду разбираться.
К примеру, надо (как в первом задании) включить на 10 сек и выключить на 15 сек, затем бесконечно повторить. Тогда пиши в loop:
Такого задания не было, просто понял не правильно.
Задание такое: Необходимо включить нагрузку на определенной секунде. (отсчет времени с момента включения МК) Потом необходимо выключить нагрузку так же на определенной секунде и так далее... без повторений программы. Потом я дополнил задание: необходимо ещё добавить в тот же код, так же на определенной секунде, эфект затухания / включения и эфект стробоскопа.
Пример:
Включаем МК, пошол отсчет времени.
На 10-й секунде включить нагрузку.
На 15-й секунде выключить нагрузку.
На 20-й секунде сделать плавное включение.
На 25-й секунде выключить нагрузку.
На 30-й секунде включить нагрузку.
На 35-й секунде сделать плавное выключение
На 40-й секунде включить стробоскоп.
На 45-й секунде выключить стробоскоп.
После 45-й секунды ни чего не делаем, выключаем МК.
Вот так думаю понятней всем :) Советов много, спасибо, но всё как то в расброс, теперь разбираться в ваших советах и собирать по кусочкам. Незнаю получится ли :)
Весь код был выше (пример loop комбинированного), осталось правильно прописать последовательность эффектов и паузы. Дерзайте! :)
Там нет времени в которое должен включится определенный эфект.
Вот например сейчас у меня код такой:
01
void
setup
()
02
{
03
pinMode(13, OUTPUT);
04
}
05
06
void
loop
()
07
{
08
if
(millis ()==6900) digitalWrite (13,1);
09
if
(millis ()==13300) digitalWrite (13,0);
10
if
(millis ()==27500) digitalWrite (13,1);
11
if
(millis ()==41200) digitalWrite (13,0);
12
13
// и.т.д
14
15
}
Как мне туда добавить эфект вашего стробоскопа:
1
void
loop
()
2
{
3
strob(5,48,3000);
// стробоскоп
4
// первое число - количество вспышек
5
// второе число - длительность вспышки, мсек
6
// третье число - пауза после полной серии, мсек
7
}
Рассчитать. Длительность эффекта известна, осталось дополнить паузу до наступления времени следуюшего события.
(Это к посту 42).
digitalWrite... заменить на вызов функции эффекта.
if (millis ()==13300) strob(5,48,3000);
Не понял. Можете на примере показать?
Например вот так надо:
Написали ответ раньше чем я задал вопрос :) Спасибо, ща попробую
рагается:
error: 'strob' was not declared in this scope
Надо весь мой код из поста 38. А if вставлять в loop:
01
void
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
}
Ни чего не получается, пошел я спать :)