Включение чего либо тактовой кнопкой на определенное время

MaksVV
Offline
Зарегистрирован: 06.08.2015

В моем случае нужно по нажатии на кнопку включать поподогрев стеклоочистителей на время допустим 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;} 
  }
} 


 

Logik
Offline
Зарегистрирован: 05.08.2014

MaksVV пишет:

Будет ли правильно работать такой скетч?  

Нет. Не будет. Правильная работа скетча в принципе не реализуема, можно только достичь состояния, когда ошибки не будут существенно влиять на возможность использования по основному назначению.

ПС. А залить и проверить не? Аналитически никто не проверит правильность реализации, только можна явные ляпы найти.

MaksVV
Offline
Зарегистрирован: 06.08.2015

я наивный надеялся на то, что опытные люди проверят мой скетч, и укажут на серьезные ошибки, если таковые есть, которые я исправлю до того как всё соберу (а то сегодня уже поздно ковырятся), чтобы был эффект:  ОО чудо,  всё заработало с первого раза! 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

MaksVV пишет:

я наивный надеялся на то, что опытные люди проверят мой скетч, и укажут на серьезные ошибки, если таковые есть, которые я исправлю до того как всё соберу (а то сегодня уже поздно ковырятся), чтобы был эффект:  ОО чудо,  всё заработало с первого раза! 

прекрасно - теперь объясни, зачем ты столько всего нагородил?


#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              );} // всё выключается.
}

 

ptr
Offline
Зарегистрирован: 28.05.2016

MaksVV пишет:

В моем случае нужно по нажатии на кнопку включать поподогрев стеклоочистителей на время допустим 20 мин или выключать, если до этого он был включен и еще не успел выключиться сам.

На мой взгляд, логика управления несколько ущербная. По уму, надо не по времени делать, а с обратной связью:
1. Разместить температурные датчики на стекле в местах парковки стеклоочистителей.
2. Включать подогрев стеклоочистителей только при отрицательной температуре в местах парковки.

Соответственно:
1. При плюсовой температуре подогрев не нужен и он не включится
2. Когда сами стеклоочистители выключены, они быстро нагреют место парковки и подогрев будет работать незначительно.
3. При включении стеклоочистителей место их парковки будет охлаждаться тем сильнее, чем меньше времени стеклоочистители находятся в запаркованном состоянии, а значит и подогрев сможем регулировать, в зависимости от режима работы стеклоочистителей.

P.S. Термодатчики следует прикрыть от штатного обдува стекл, например, аллюминиевым скотчем. Чтобы мерять температуру стекла, а не воздуха из обдува )

P.P.S. В зависимости от конструкции, не исключаю, что потребуется еще датчик внешней температуры воздуха. На случай продуманного оборева лобового стекла, когда оно ниже нуля все равно не охлаждается.

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

согласен, но я стеклоочистители в подарок купил. Там можно было прикупить один из комплектов управления - с брелка, с кнопки через простое реле, и по датчикам температуры. Но все эти приколы не укладывались в мой бюджет (ну кроме обычного реле конечно). Поэтому , т.к. валяется без дела дуня,  решил побыстрому (ДР уже скоро, могу не успеть) сделать через реле и кнопку, но с выключением по таймеру.  Датчики температуры можно потом добавить, но поставлю их непосредственно в щётки. Там имхо лучше. 

Клапауций 232 пишет:

 

прекрасно - теперь объясни, зачем ты столько всего нагородил?



 

08 static const byte bounce_              =   50; // длительность отслеживания дребезга.
09 static const byte doubleclick_         =  200; // длительность отслеживания двойного клика.
10 static const unsigned long timer_      = 5000; // длительность отслеживания неактивности.
11 static const unsigned int retention_   = 2000; // длительность отслеживания нажатия и удержания.
 

Правильно ли я понимаю, что в классе в строке 10 необходимо поставить нужное мне время 1 200 000 мсек вместо 5000?  

PS недооценил возможности велосипеда

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

MaksVV пишет:

10 static const unsigned long timer_      = 5000; // длительность отслеживания неактивности.
 

Правильно ли я понимаю, что в классе в строке 10 необходимо поставить нужное мне время 1 200 000 мсек вместо 5000?  

да. все константы можно изменять.

MaksVV
Offline
Зарегистрирован: 06.08.2015

проверил скетч из сообщения #3- работает, спасибо за оптимизацию кода! 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

MaksVV пишет:

проверил скетч из сообщения #3- работает, спасибо за оптимизацию кода! 

удалению кода, дублирующего функции и переменные класса

описалово класса здесь #255

ptr
Offline
Зарегистрирован: 28.05.2016

MaksVV пишет:

 Датчики температуры можно потом добавить, но поставлю их непосредственно в щётки. Там имхо лучше. 

Безусловно лучше. Просто это конструктивно сложнее и не всегда возможно. Места для кабеля на поводках мало, чтобы тем же льдом этот кабель потом не оборвать.