Определить работу ДВС

renoshnik
Offline
Зарегистрирован: 11.04.2013

Запутался в трёх соснах....

Задача при работающем двигателе контролируем датчики гидравлики, когда двигатель выключен контроль только аккумулятора.

Сделал такой скетч. 





#include <LiquidCrystal.h>
LiquidCrystal lcd(8,9,10,11,12,13);
int rpm, z;

void setup() {
pinMode(17, INPUT);		// вход от катушки зажигания
digitalWrite(17, HIGH); 
	lcd.begin(16, 2);
}

void loop() {
rpm = 0;
unsigned long currentMillis = millis(); 
while(millis() - currentMillis < 1000){ 
if (digitalRead(17)==LOW) z = 1;
rpm = rpm+z;
}	
if (rpm > 1) on();		// двигатель включён проверяем давление гидравлики
if (rpm == 0) of();		// двигатель выключен контролируем только аккумулятор
delay(1000);
}	
void of() { 
lcd.setCursor(0, 0);
	lcd.print(" NO impulse  ");   
    lcd.setCursor(0, 1);
	lcd.print(rpm);     
}
void on() { 
lcd.setCursor(0, 0);
	lcd.print(" impulse   ");   
    lcd.setCursor(0, 1);
	lcd.print(rpm);     
}

катушку зажигания имитировал просто кнопкой на массу.

при включении программы сразу выдаёт "NO impulse", начинаю (вручную) коротить кнопку, выдаёт пятизначное число и потом в "NO impulse" не возвращается. Тоесть кнопку уже не трогаю, а на экране пятизначное число и причём уже изменяется само по себе...

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

Ну почему же само по себе. Вот вы его инкриментируете в замкнутом цикле в течении 1 секунды 100 милионов раз:

while(millis() - currentMillis < 1000){ 
if (digitalRead(17)==LOW) z = 1;
rpm = rpm+z;
}

а нужно только при изменении уровня сигнала

  boolean flag = LOW;
  while(millis() - currentMillis < 1000)
  { 
    if(digitalRead(17)==LOW && flag==LOW) 
    {
      rpm++;
      flag == HIGH;
    }
    if(digitalRead(17)==HIGH && flag==HIGH) flag = LOW;
  }

так же почитайте про дребезг кнопки

А что бы не изобретать трехпедальный велосипед воспользуйтесь поиском по сайту "тахометр", "счетчик импульсов" и т.д.

renoshnik
Offline
Зарегистрирован: 11.04.2013

Спасибо за подсказку... про тахометр и счёткчик импульсов уже кажется выучил наизусть... :)

После чашки кофе сам заметил, что со скобками проблема...



#include <LiquidCrystal.h>
LiquidCrystal lcd(8,9,10,11,12,13);
int rpm, z;

void setup() {
pinMode(17, INPUT);		// вход от катушки зажигания
digitalWrite(17, HIGH); 
	lcd.begin(16, 2);
}

void loop() {
rpm=0;
unsigned long currentMillis = millis(); 
while(millis() - currentMillis < 1000){ 
//delay(10);
if (digitalRead(17)==LOW) {z = 1;
rpm = rpm+z;}
}	
if (rpm > 1) on();		// двигатель включён проверяем давление гидравлики
if (rpm == 0) of();		// двигатель выключен датчики гидравлики не работают
delay(1000);
}	
void of() { 
lcd.setCursor(0, 0);
	lcd.print(" NO impulse  ");   
    lcd.setCursor(0, 1);
	lcd.print(rpm);     
}
void on() { 
lcd.setCursor(0, 0);
	lcd.print(" impulse   ");   
    lcd.setCursor(0, 1);
	lcd.print(rpm);     
}

 

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

Данный код работать не будет, что сделать я вам написал выше, перечитайте.

renoshnik
Offline
Зарегистрирован: 11.04.2013

maksim пишет:

Данный код работать не будет, что сделать я вам написал выше, перечитайте.

 

Проверил - работают оба варианта

Скетч с вашим вариантом после компиляции короче на пару десятков байт (в моём случае размер критичен) поэтому ещё раз спасибо за помощь.

 

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

А, ну если работает ,тогда ладно. Как только у вас возникнет вопрос "а почему за 1 импульс плюсуется 25 ?" перечитайте сообщение #1.

renoshnik
Offline
Зарегистрирован: 11.04.2013

maksim пишет:

А, ну если работает ,тогда ладно. Как только у вас возникнет вопрос "а почему за 1 импульс плюсуется 25 ?" перечитайте сообщение #1.

Это понятно, но в моём случае это не критично, мне важно только наличие импульсов. 

renoshnik
Offline
Зарегистрирован: 11.04.2013

Сегодня проводил полевые испытания...

Выяснилось, что если перед циклом стоит boolean flag = LOW; то при постоянном замыкании на массу (без импульсов) счётчик работает и выдаёт значения отличные от нуля.

Вот такой код считает импульсы только тогда когда они есть.





void loop() {
rpm = 0;
unsigned long currentMillis = millis(); 
/*
boolean flag = LOW;
	while(millis() - currentMillis < 1000) { 
		if(digitalRead(17)==LOW && flag==LOW) {
		rpm++;
		flag == HIGH;}
	if(digitalRead(17)==HIGH && flag==HIGH) flag = LOW;}
*/	

boolean flag = HIGH;
	while(millis() - currentMillis < 1000) { 
		if(digitalRead(17)==LOW && flag==LOW) {
		rpm++;
		flag == HIGH;}
	if(digitalRead(17)==HIGH && flag==HIGH) flag = LOW;}

if (rpm > 1) sensor();		// двигатель включён проверяем давление гидравлики
if (rpm <= 1) skrin();		// двигатель выключен контролируем только аккумулятор
}	

вот результат.

http://www.youtube.com/watch?v=4u-M-WvOohA

смысл в том, чтобы датчики опрашивались только при заведеном двигателе.