Включение чего либо тактовой кнопкой на определенное время
- Войдите на сайт для отправки комментариев
Сб, 08/10/2016 - 22:10
В моем случае нужно по нажатии на кнопку включать поподогрев стеклоочистителей на время допустим 20 мин или выключать, если до этого он был включен и еще не успел выключиться сам. Будет ли правильно работать такой скетч?
#include <class_BUTTON.h> // вел Клапауция
#define RELAY 12 // выход на реле включения подогрева подогрева стеклоочистителей
#define LED 11 // выход на индикацию кнопки включения подогрева
BUTTON button (10); // вход кнопки включения подогрева
unsigned long time, timer=0;
bool timerenabled=false;
#define TIMEREXPIRED (time-timer)>1200000 // таймер на 20 мин
bool dvornik = 0; // состояние подогрева
void setup()
{
pinMode (LED, OUTPUT); digitalWrite(LED, LOW); // сначала индикация выключена
pinMode (RELAY, OUTPUT); digitalWrite(RELAY, HIGH); // сначала реле в положении выкл, сигнал инвертирован
}
void ON() // цикл запуска таймера включения подогрева
{
timer=time;
timerenabled=true;
dvornik = 1;
}
void loop() {
digitalWrite (LED, dvornik);
digitalWrite (RELAY, !dvornik);
button.read();
time = millis();
if (timerenabled)
{
if (TIMEREXPIRED) {timerenabled=false; dvornik = 0;}
}
else
{
if (button.click_down && !dvornik) ON();
if (button.click_down && dvornik) {dvornik = 0; timerenabled=false;}
}
}
Будет ли правильно работать такой скетч?
Нет. Не будет. Правильная работа скетча в принципе не реализуема, можно только достичь состояния, когда ошибки не будут существенно влиять на возможность использования по основному назначению.
ПС. А залить и проверить не? Аналитически никто не проверит правильность реализации, только можна явные ляпы найти.
я наивный надеялся на то, что опытные люди проверят мой скетч, и укажут на серьезные ошибки, если таковые есть, которые я исправлю до того как всё соберу (а то сегодня уже поздно ковырятся), чтобы был эффект: ОО чудо, всё заработало с первого раза!
я наивный надеялся на то, что опытные люди проверят мой скетч, и укажут на серьезные ошибки, если таковые есть, которые я исправлю до того как всё соберу (а то сегодня уже поздно ковырятся), чтобы был эффект: ОО чудо, всё заработало с первого раза!
прекрасно - теперь объясни, зачем ты столько всего нагородил?
#include <class_BUTTON.h> BUTTON button(10); // вход кнопки включения подогрева #define RELAY 12 // выход на реле включения подогрева подогрева стеклоочистителей #define LED 11 // выход на индикацию кнопки включения подогрева void setup() { pinMode (LED , OUTPUT); digitalWrite(LED , LOW ); // сначала индикация выключена pinMode (RELAY, OUTPUT); digitalWrite(RELAY, HIGH ); // сначала реле в положении выкл, сигнал инвертирован } void loop() { button.read(); if (button.click_down) {digitalWrite(RELAY, !digitalRead(RELAY)); digitalWrite(LED, !digitalRead(LED));} // вкл/выкл. if (button.timer ) {digitalWrite(RELAY, HIGH ); digitalWrite(LED, LOW );} // всё выключается. }В моем случае нужно по нажатии на кнопку включать поподогрев стеклоочистителей на время допустим 20 мин или выключать, если до этого он был включен и еще не успел выключиться сам.
На мой взгляд, логика управления несколько ущербная. По уму, надо не по времени делать, а с обратной связью:
1. Разместить температурные датчики на стекле в местах парковки стеклоочистителей.
2. Включать подогрев стеклоочистителей только при отрицательной температуре в местах парковки.
Соответственно:
1. При плюсовой температуре подогрев не нужен и он не включится
2. Когда сами стеклоочистители выключены, они быстро нагреют место парковки и подогрев будет работать незначительно.
3. При включении стеклоочистителей место их парковки будет охлаждаться тем сильнее, чем меньше времени стеклоочистители находятся в запаркованном состоянии, а значит и подогрев сможем регулировать, в зависимости от режима работы стеклоочистителей.
P.S. Термодатчики следует прикрыть от штатного обдува стекл, например, аллюминиевым скотчем. Чтобы мерять температуру стекла, а не воздуха из обдува )
P.P.S. В зависимости от конструкции, не исключаю, что потребуется еще датчик внешней температуры воздуха. На случай продуманного оборева лобового стекла, когда оно ниже нуля все равно не охлаждается.
согласен, но я стеклоочистители в подарок купил. Там можно было прикупить один из комплектов управления - с брелка, с кнопки через простое реле, и по датчикам температуры. Но все эти приколы не укладывались в мой бюджет (ну кроме обычного реле конечно). Поэтому , т.к. валяется без дела дуня, решил побыстрому (ДР уже скоро, могу не успеть) сделать через реле и кнопку, но с выключением по таймеру. Датчики температуры можно потом добавить, но поставлю их непосредственно в щётки. Там имхо лучше.
прекрасно - теперь объясни, зачем ты столько всего нагородил?
08staticconstbytebounce_ = 50;// длительность отслеживания дребезга.09staticconstbytedoubleclick_ = 200;// длительность отслеживания двойного клика.10staticconstunsignedlongtimer_ = 5000;// длительность отслеживания неактивности.11staticconstunsignedintretention_ = 2000;// длительность отслеживания нажатия и удержания.Правильно ли я понимаю, что в классе в строке 10 необходимо поставить нужное мне время 1 200 000 мсек вместо 5000?
PS недооценил возможности велосипеда
10staticconstunsignedlongtimer_ = 5000;// длительность отслеживания неактивности.Правильно ли я понимаю, что в классе в строке 10 необходимо поставить нужное мне время 1 200 000 мсек вместо 5000?
да. все константы можно изменять.
проверил скетч из сообщения #3- работает, спасибо за оптимизацию кода!
проверил скетч из сообщения #3- работает, спасибо за оптимизацию кода!
удалению кода, дублирующего функции и переменные класса
описалово класса здесь #255
Датчики температуры можно потом добавить, но поставлю их непосредственно в щётки. Там имхо лучше.
Безусловно лучше. Просто это конструктивно сложнее и не всегда возможно. Места для кабеля на поводках мало, чтобы тем же льдом этот кабель потом не оборвать.