Как заставить работать реле через millis()
- Войдите на сайт для отправки комментариев
Чт, 11/01/2018 - 14:45
Есть задача включать реле на 50 минут и выключать на 20 минут. Пока что пробую на светодиоде по примеру Блинка без delay(). Для удобства тестирования светится 1 минуту, полминуты отдыхает. Вначале диод включается через положенную 1 минуту, а дальше не гаснет. Никак не могу понять, как довести до ума, без вашей помощи не обойтись мне! Вот код:
unsigned long previousMillis1 = 0; // will store last time LED was updated unsigned long previousMillis2 = 0; const long interval_1 = 60000;//3000000; const long interval_2 = 30000;//900000; int led = 13; void setup() { pinMode(led, OUTPUT); } void loop() { unsigned long currentMillis = millis(); { if (currentMillis - previousMillis2 >= interval_1) { previousMillis2 = currentMillis; digitalWrite(led,LOW); } delay(1000); if (currentMillis - previousMillis1 >= interval_2) { previousMillis1 = currentMillis; digitalWrite(led, HIGH); } } }
строки 16, 22 и 28 лишние.
Внимательно прочитайте еще раз блинк_без_делай - разве там два Previousmillis ? и два условия? - нет, все делается в одном. - в этом ваша проблема
Гаснет. Но потом сразу включается. Потому что интервалы у вас кратные и события происходят одно за другим. А зажигается светодиод в два раза чаще, чем тушится.
Вот ваш же код:
Светодиод визуально горит? А если поменять интервалы местами?
Код подправил. 2 Previousmillis мне нужны, потому что диод должен быть в потушенном состоянии ~в два раза меньше, чем во включенном состоянии. А как это реализовать через один Previousmillis, ума не приложу.
Светодиод визуально горит? А если поменять интервалы местами?
Да, горит. Если поменять местами, то 3 секунды горит, на 3 с. гаснет.
Код подправил. 2 Previousmillis мне нужны, потому что диод должен быть в потушенном состоянии ~в два раза меньше, чем во включенном состоянии.
Для этого не нужно два Previousmillis. Нужно всего лишь при каждом переключении диода менять интервал следующего переключения, приравнивая его то interval1. то interval2.
А Previousmillis и условие проверки должно быть одно.
b707, спасибо большое, все получилось. Если есть замечания, как улучшить код, удалить возможные подводные камни, буду благодарен!
MaksVV, протестировал Ваш код. Все замечательно, кроме маленького нюанса, а именно - диод 50 минут не светится, 20 горит. А должно быть наоборот. Заменил единицу на 0 в 8-й строке Вашего кода, теперь вроде сначала горит. Буду тестировать дальше. Спасибо!
Может вы реле уже подключили? У реле обычно логика включения инвертирована. Т.е. если на пине лог. 0 то реле включено.
Да, решил сразу на Аттини13 с подключенным реле испробовать.
Я этого не знал. Это очень странно, и на первый взгляд нелогично. Для меня, новичка, к тому же неудобно. Но что поделаешь, раз так сделали.
После нескольких включений-выключений 20 и 50 минут меняются местами, то есть горит 20 и выключается на 50 минут.
может так
У меня на данный момент схожая ситуация, отличие только в том что я планирую управлять двумя реле 1-е вкл/выкл кулера, а 2-е для вкл/выкл прибора.
В идеале должно быть так чтобы с помощью первой тактовой кнопки вводилось время работы прибора (2-го реле), например 25 минут, с помощью 2ой запуск таймеров.
Включение кулера (реле 1), происходит сразу при подаче питания.
Через 3 минуты происходит запуск прибора (2е реле) и по истечии 25 минут, должно оключится.
Выключение кулера (1е реле) происходит через 20 минут после отключения прибора (2го реле).
Пока пробую на светодиодах без кнопок, время ввожу программно. Данный код работает до момента выключения 1го реле и никак не могу заставить его погаснуть в нужное время. нужное время.
Код я писал не сам (взял изи видеуроков). Пожалуйста помогите.
//culler
может так
Так работает, спасибо. Почему я не стал использовать delay(). Следующий код работает очень странно. На Аттини13 светится 1 минуту, гаснет на 20 сек. На Ардуино светится где-то 5 мин.:
Пропуйте
Как то от нечего делать набросал програмку выполняющую функцию часов, считает секунды, минуты, часы. Может чем поможет, покрайней мере ее можно переделать под ваши нужды.
vosara
Проверил ваш код на схеме возникла проблема в том что код работает иначе.
А именно при вкл питания включается первый диод (13ый пин) т.е. время 00:00
Потом включается второй светодиод (12ый пин), первый отключается, время 00:01
После 3-х секунд работы кода оба диода выключены.
далее на 28ой секунде происходит включение второго светодиода (12ый пин), первый выключен.
на 48 секунде включается первый светодиод.
Мой вариант кода предпологал постоянное включенное состояние первого светодиода. Второй должен включиться и выключится в процессе работы первого. А после истечения определенного времени выключается первый.
Возможно ли это из-за светодиода? Я использую 2 RGB
Попробую переписать ваш код
Большое спасибо за помощь!
Проверил в симуляторе, единственное что время уменьшил, ссылку на видео оставляю
https://drive.google.com/open?id=1w0vgJdgvNQo-IsD12zdsyBHwn3xzFtXJ
Ну и код с меньшими цыфрами
Получилось таки
Проверил в симуляторе, единственное что время уменьшил, ссылку на видео оставляю
https://drive.google.com/open?id=1w0vgJdgvNQo-IsD12zdsyBHwn3xzFtXJ
Хм в симуляторе и правда работает.!
Видимо дело в том что RGB светодиоды гаснут при подаче HIGH а включаются LOW, возможно поэтому у меня не работает.
Еще раз большое спасибо за помощь!