Определить работу ДВС
- Войдите на сайт для отправки комментариев
Пнд, 17/06/2013 - 21:18
Запутался в трёх соснах....
Задача при работающем двигателе контролируем датчики гидравлики, когда двигатель выключен контроль только аккумулятора.
Сделал такой скетч.
#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" не возвращается. Тоесть кнопку уже не трогаю, а на экране пятизначное число и причём уже изменяется само по себе...
Ну почему же само по себе. Вот вы его инкриментируете в замкнутом цикле в течении 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; }так же почитайте про дребезг кнопки
А что бы не изобретать трехпедальный велосипед воспользуйтесь поиском по сайту "тахометр", "счетчик импульсов" и т.д.
Спасибо за подсказку... про тахометр и счёткчик импульсов уже кажется выучил наизусть... :)
После чашки кофе сам заметил, что со скобками проблема...
#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); }Данный код работать не будет, что сделать я вам написал выше, перечитайте.
Данный код работать не будет, что сделать я вам написал выше, перечитайте.
Проверил - работают оба варианта
Скетч с вашим вариантом после компиляции короче на пару десятков байт (в моём случае размер критичен) поэтому ещё раз спасибо за помощь.
А, ну если работает ,тогда ладно. Как только у вас возникнет вопрос "а почему за 1 импульс плюсуется 25 ?" перечитайте сообщение #1.
А, ну если работает ,тогда ладно. Как только у вас возникнет вопрос "а почему за 1 импульс плюсуется 25 ?" перечитайте сообщение #1.
Это понятно, но в моём случае это не критично, мне важно только наличие импульсов.
Сегодня проводил полевые испытания...
Выяснилось, что если перед циклом стоит 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
смысл в том, чтобы датчики опрашивались только при заведеном двигателе.