Дребезг кнопки

step962
Offline
Зарегистрирован: 23.05.2011

olega88 пишет:

2. Измеряет время нажатия на кнопку (кнопка без фиксации)

Из описания функции pulseIn():

Цитата:

Например, если задано считывание HIGH функцией pulseIn(), функция ожидает пока на заданном порту не появиться HIGH. Когда HIGH получен, включается таймер, который будет остановлен когда на порту вход/выхода будет LOW. Функция pulseIn() возвращает длину сигнала в микросекундах.

Вы вызываете эту функцию с аргументом HIGH, когда у вас кнопка уже нажата, т.е. на линии присутствует состояние HIGH. Как вы думаете, что будет делать функция в этом случае?

А делать она будет следующее:

- ждать, пока закончится текущее состояние HIGH

- ждать пока наступит новое состояние HIGH

- наконец-то примется считать продолжительность импульса.

Для пущей убедительности привожу выдержку из кода функции:

[...]
// ждем:
	// wait for any previous pulse to end
	while ((*portInputRegister(port) & bit) == stateMask)
		if (numloops++ == maxloops)
			return 0;
	
// опять ждем:
	// wait for the pulse to start
	while ((*portInputRegister(port) & bit) != stateMask)
		if (numloops++ == maxloops)
			return 0;
// наконец-то считаем длительность:	
	// wait for the pulse to stop
[...]

Итог: в вашей ситуации вызов функции pulseIn() лишь блокирует исполнение программы до повторного нажатия клавиши (ну или до отработки на дребезге кнопки при ее отпускании). То есто абсолютно бесполезен или даже вреден.

olega88
Offline
Зарегистрирован: 03.04.2012

maksim пишет:

Что не помогло? 

после изменений стр 22 и 25 работает надёжно, но некорректно когда при сработавшем реле1, запускаешь реле2 (происходит сброс)

olega88
Offline
Зарегистрирован: 03.04.2012

step962 пишет:

olega88 пишет:

2. Измеряет время нажатия на кнопку (кнопка без фиксации)

Из описания функции pulseIn():

Цитата:

Например, если задано считывание HIGH функцией pulseIn(), функция ожидает пока на заданном порту не появиться HIGH. Когда HIGH получен, включается таймер, который будет остановлен когда на порту вход/выхода будет LOW. Функция pulseIn() возвращает длину сигнала в микросекундах.

Вы вызываете эту функцию с аргументом HIGH, когда у вас кнопка уже нажата, т.е. на линии присутствует состояние HIGH. Как вы думаете, что будет делать функция в этом случае?

А делать она будет следующее:

- ждать, пока закончится текущее состояние HIGH

- ждать пока наступит новое состояние HIGH

- наконец-то примется считать продолжительность импульса.

Для пущей убедительности привожу выдержку из кода функции:

[...]
// ждем:
	// wait for any previous pulse to end
	while ((*portInputRegister(port) & bit) == stateMask)
		if (numloops++ == maxloops)
			return 0;
	
// опять ждем:
	// wait for the pulse to start
	while ((*portInputRegister(port) & bit) != stateMask)
		if (numloops++ == maxloops)
			return 0;
// наконец-то считаем длительность:	
	// wait for the pulse to stop
[...]

Итог: в вашей ситуации вызов функции pulseIn() лишь блокирует исполнение программы до повторного нажатия клавиши (ну или до отработки на дребезге кнопки при ее отпускании). То есто абсолютно бесполезен или даже вреден.

Ну вот.. а казалось такая хорошая функция...

maksim
Offline
Зарегистрирован: 12.02.2012

olega88 пишет:

maksim пишет:

Что не помогло? 

после изменений стр 22 и 25 работает надёжно, но некорректно когда при сработавшем реле1, запускаешь реле2 (происходит сброс)

Коректно, так и было задумано, я так понял когда у вас был дребезг, в 22 строке у вас вообще задержки не было, если так, то оставьте ее 50 - этого должно хватить.

step962
Offline
Зарегистрирован: 23.05.2011

olega88 пишет:

Ну вот.. а казалось такая хорошая функция...

Функция вполне себе нормальная. Ею, как и любым инструментом, надо научиться пользоваться. И применять для тех задач, которые она умеет решать.

И будет "щясте".

olega88
Offline
Зарегистрирован: 03.04.2012

maksim пишет:

olega88 пишет:

maksim пишет:

Что не помогло? 

после изменений стр 22 и 25 работает надёжно, но некорректно когда при сработавшем реле1, запускаешь реле2 (происходит сброс)

Коректно, так и было задумано, я так понял когда у вас был дребезг, в 22 строке у вас вообще задержки не было, если так, то оставьте ее 50 - этого должно хватить.

хм.. без изменений

olega88
Offline
Зарегистрирован: 03.04.2012

step962 пишет:

olega88 пишет:

Ну вот.. а казалось такая хорошая функция...

Функция вполне себе нормальная. Ею, как и любым инструментом, надо научиться пользоваться. И применять для тех задач, которые она умеет решать.

И будет "щясте".

тяжело в учении, легко в бою :) а учится ещё дооолго...

maksim
Offline
Зарегистрирован: 12.02.2012

Что именно без изменений?

olega88
Offline
Зарегистрирован: 03.04.2012

maksim пишет:

Что именно без изменений?

при сработавшем реле1, включая реле2 происходит сброс

maksim
Offline
Зарегистрирован: 12.02.2012

Так я же написал, что так и задумано, а задержку в 22стр. оставить 50 для того, чтобы не было дребезга.

maksim
Offline
Зарегистрирован: 12.02.2012

Я так понимаю вы хотите, что бы при сработавшем реле1 долгим нажатием включалось реле2 не изменяя состояния реле1.

olega88
Offline
Зарегистрирован: 03.04.2012

maksim пишет:

Я так понимаю вы хотите, что бы при сработавшем реле1 долгим нажатием включалось реле2 не изменяя состояния реле1.

точно! но это не критично, я смотрю так даже логичнее

olega88
Offline
Зарегистрирован: 03.04.2012

чёрт... по задумке цепь реле2 должна обрыватся внешним сигналом (запуск двигателя -- сигнал от генератора -- стартер отключается). Но если сигнал пропадёт(при движении оборвётся ремень генератора), реле2 опять сработает!!!! Попробую устранить недоделку, подавая внешний сигнал на цировой пин4, например..

maksim
Offline
Зарегистрирован: 12.02.2012

Нет можно сделать так, чтобы внешний сигнал только отключал реле2 

olega88
Offline
Зарегистрирован: 03.04.2012

maksim пишет:

Нет можно сделать так, чтобы внешний сигнал только отключал реле2 

это я и имею ввиду, цикл реле2 не должен повторятся если оно уже отработало своё

maksim
Offline
Зарегистрирован: 12.02.2012

Вот вы сейчас не понятно, что делаете.... изобретаете кривой велосипед, а если у вас пассажир на кнопку нажмет когда вас нет, а машина на скорости?

Хотите старт-кнопку с "интеллектуальным" заводом двигателя, то вот алгоритм: 

Нажимаем только на кнопку:

1.Первое нажатие кнопки engine start - включается режим АСС(работает, например, только магнитола и прикуриватель). Можно вообще убрать АСС.  

2.Второе нажатие - дополнительно включается зажигание (если нет АСС, то это будет первое нажатие).  

3.Третие нажатие - OFF, выключает АСС(если есть) и зажигание.  

Удерживая педаль тормоза, нажимаем кнопку engine start:

1.Короткое нажатие на кнопку включает зажигание и стартер, до тех пор пока двигатель не заведется или не пройдет 5 секунд, при выполнении одного из условий выключается стартер и включается АСС(если есть), зажигание естественно остается включенным. 

2.Следующее нажатие (можно сделать длинное нажатие) - OFF, выключает АСС(если есть) и зажигание, двигатель глохнет.

При этом уберается блокировка руля, ставится блок обхода штатного иммобилайзера(если он есть) и кнопка работает, только либо когда машина снята с сигналки или когда используется дополнительный иммо. 

olega88
Offline
Зарегистрирован: 03.04.2012

maksim пишет:

Вот вы сейчас не понятно, что делаете.... изобретаете кривой велосипед, а если у вас пассажир на кнопку нажмет когда вас нет, а машина на скорости?

Хотите старт-кнопку с "интеллектуальным" заводом двигателя, то вот алгоритм: 

Нажимаем только на кнопку:

1.Первое нажатие кнопки engine start - включается режим АСС(работает, например, только магнитола и прикуриватель). Можно вообще убрать АСС.  

2.Второе нажатие - дополнительно включается зажигание (если нет АСС, то это будет первое нажатие).  

3.Третие нажатие - OFF, выключает АСС(если есть) и зажигание.  

Удерживая педаль тормоза, нажимаем кнопку engine start:

1.Короткое нажатие на кнопку включает зажигание и стартер, до тех пор пока двигатель не заведется или не пройдет 5 секунд, при выполнении одного из условий выключается стартер и включается АСС(если есть), зажигание естественно остается включенным. 

2.Следующее нажатие (можно сделать длинное нажатие) - OFF, выключает АСС(если есть) и зажигание, двигатель глохнет.

При этом уберается блокировка руля, ставится блок обхода штатного иммобилайзера(если он есть) и кнопка работает, только либо когда машина снята с сигналки или когда используется дополнительный иммо. 

Примерно так я и представляю это себе. Без АСС, вместо тормоза - педаль сцепления. Стартер откл. либо по генератору, либо 5 сек макс. Плюс выдержка времени перед вкл. стартера для нагрева свечей накала( в зависимости от температуры двигателя).  

 

maksim
Offline
Зарегистрирован: 12.02.2012
#define buttonPin 2
#define generatorPin 4 // через делитель к генератору
#define relePin1 13
#define relePin2 12
#define x 1000 // время удержания кнопки
#define xstarter 3000 // максимальное время работы стартера

unsigned long duration, millisold = 0;
boolean stateButton, relestate1, relestate2 = 0;

void setup() {
  pinMode(relePin1, OUTPUT);
  pinMode(relePin2, OUTPUT);
}

void loop(){
  if(digitalRead(buttonPin) && !stateButton){
    relestate1 = !relestate1;
    stateButton = 1;
    delay(150);
    duration = millis();
  }
  if(!digitalRead(buttonPin)){
    delay(50);
    stateButton = 0;
  }
  if(!digitalRead(generatorPin) && stateButton && millis()-duration > x){
    digitalWrite(relePin2, HIGH);
    relestate2 = 1;
    millisold = millis();
  }
  if(relestate1){
    digitalWrite(relePin1, HIGH); 
  }
  else{
    digitalWrite(relePin1, LOW);
    digitalWrite(relePin2, LOW);
    relestate2 = 0;
  }
  if(digitalRead(generatorPin) || relestate2 && millis()-millisold > xstarter){
    digitalWrite(relePin2, LOW);
    relestate2 = 0;
  }
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Хотя нет, не так, лампочка гены тухнет, когда двигатель заводится, тогда вот:

#define buttonPin 2
#define generatorPin 4 // через делитель к генератору
#define relePin1 13
#define relePin2 12
#define x 1000 // время удержания кнопки
#define xstarter 3000 // максимальное время работы стартера

unsigned long duration, millisold = 0;
boolean stateButton, relestate1, relestate2 = 0;

void setup() {
  pinMode(relePin1, OUTPUT);
  pinMode(relePin2, OUTPUT);
}

void loop(){
  if(digitalRead(buttonPin) && !stateButton){
    relestate1 = !relestate1;
    stateButton = 1;
    delay(150);
    duration = millis();
  }
  if(!digitalRead(buttonPin)){
    delay(50);
    stateButton = 0;
  }
  if(digitalRead(generatorPin) && stateButton && millis()-duration > x){
    digitalWrite(relePin2, HIGH);
    relestate2 = 1;
    millisold = millis();
  }
  if(relestate1){
    digitalWrite(relePin1, HIGH); 
  }
  else{
    digitalWrite(relePin1, LOW);
    digitalWrite(relePin2, LOW);
    relestate2 = 0;
  }
  if(!digitalRead(generatorPin) || relestate2 && millis()-millisold > xstarter){
    digitalWrite(relePin2, LOW);
    relestate2 = 0;
  }
}

 

olega88
Offline
Зарегистрирован: 03.04.2012

Максим, вы Гений!! Работает!!! Реле 2 выкл. либо по выдержке времени, либо при +5 вольт пин4!!!

olega88
Offline
Зарегистрирован: 03.04.2012

Хотя нет, не так, лампочка гены тухнет, когда двигатель заводится, тогда вот:

-----

тут ваще... при желании можно удерживая кнопку крутить до посинения( 2 в 1, или автоматически, или в режиме ключа)

maksim
Offline
Зарегистрирован: 12.02.2012

olega88 пишет:

Хотя нет, не так, лампочка гены тухнет, когда двигатель заводится, тогда вот:

-----

тут ваще... при желании можно удерживая кнопку крутить до посинения( 2 в 1, или автоматически, или в режиме ключа)

В смысле?

olega88
Offline
Зарегистрирован: 03.04.2012

maksim пишет:

olega88 пишет:

Хотя нет, не так, лампочка гены тухнет, когда двигатель заводится, тогда вот:

-----

тут ваще... при желании можно удерживая кнопку крутить до посинения( 2 в 1, или автоматически, или в режиме ключа)

В смысле?

В хорошем,  теперь поллучается 3 варианта развития событий:

1. держишь кнопку время х -- вкл. стартер, лампа гены тухнет, стартер откл.

2. держишь кнопку время х -- вкл. стартер, если лампа гены не тухнет через время xstarter, стартер откл.

3. держишь кнопку ссколь угодно долго, если лампа генератора не тухнет, стартер будет крутить пока лампа не потухнет, или не отпустишь кнопку( как будто ключами заводишь!)