Включение нагрузки по заданному времени.
- Войдите на сайт для отправки комментариев
Ср, 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:
#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 мсек }У меня такое чувство, что тут трое общаются в разных терминах, поэтому постоянно непонятки.
Может как то можно включать МК без запуска программы, а потом например замыканием каких то контактов запускать программу?
В рабочей версии замени номер пина на другой и все
Использовать ШИМ. Неон разве позволяет плавное включение?
Если просто - то уменьшить числа a и b до 100-400. Если нужно двойное/тройное моргание, то через циклы.
У меня такое чувство, что тут трое общаются в разных терминах, поэтому постоянно непонятки.
Это вы про что? От меня только я пишу. Просто пишем одновременно, поперепутались сообщения. Сам уже запутался..
У меня такое чувство, что тут трое общаются в разных терминах, поэтому постоянно непонятки.
Это вы про что? От меня только я пишу. Просто пишем одновременно, поперепутались сообщения. Сам уже запутался..
Всё я понял про что вы )))
Использовать ШИМ. Неон разве позволяет плавное включение?
Неон да позваляет.
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(); }2) В спомощью какого кода можно сделать плавное затухание и включение диода (в дальнейшем неона подключеного через оптопару и симистр) ?
3) В спомощью какого кода сделать эфект страбоскопа?
Ты уж определись, что конкретно надо ;)
Надо все эфекты. В какоето время просто включить / выключить, в какоето плавное включение / выключение, в какоето стробоскоп. Всё это в одной программе, просто в разное время.
За коды спасибо, буду разбираться.
К примеру, надо (как в первом задании) включить на 10 сек и выключить на 15 сек, затем бесконечно повторить. Тогда пиши в loop:
Такого задания не было, просто понял не правильно.
Задание такое: Необходимо включить нагрузку на определенной секунде. (отсчет времени с момента включения МК) Потом необходимо выключить нагрузку так же на определенной секунде и так далее... без повторений программы. Потом я дополнил задание: необходимо ещё добавить в тот же код, так же на определенной секунде, эфект затухания / включения и эфект стробоскопа.
Пример:
Включаем МК, пошол отсчет времени.
На 10-й секунде включить нагрузку.
На 15-й секунде выключить нагрузку.
На 20-й секунде сделать плавное включение.
На 25-й секунде выключить нагрузку.
На 30-й секунде включить нагрузку.
На 35-й секунде сделать плавное выключение
На 40-й секунде включить стробоскоп.
На 45-й секунде выключить стробоскоп.
После 45-й секунды ни чего не делаем, выключаем МК.
Вот так думаю понятней всем :) Советов много, спасибо, но всё как то в расброс, теперь разбираться в ваших советах и собирать по кусочкам. Незнаю получится ли :)
Весь код был выше (пример loop комбинированного), осталось правильно прописать последовательность эффектов и паузы. Дерзайте! :)
Там нет времени в которое должен включится определенный эфект.
Вот например сейчас у меня код такой:
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); // стробоскоп // первое число - количество вспышек // второе число - длительность вспышки, мсек // третье число - пауза после полной серии, мсек }Рассчитать. Длительность эффекта известна, осталось дополнить паузу до наступления времени следуюшего события.
(Это к посту 42).
digitalWrite... заменить на вызов функции эффекта.
if (millis ()==13300) strob(5,48,3000);
Не понял. Можете на примере показать?
Например вот так надо:
Написали ответ раньше чем я задал вопрос :) Спасибо, ща попробую
рагается:
error: 'strob' was not declared in this scope
Надо весь мой код из поста 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 вспышек }Ни чего не получается, пошел я спать :)