Расходомер топлива для карбюраторного двигателя на arduino nano и GPS модуле NEO-6M

Добрый день! Обзавелся очень хорошим датчиком расхода топлива швейцарской фирмы Aquametro VZO 4 OEM. Данный датчик имеет обычный герконовый импульсный выход и дает один импульс на каждые 0,005 литра. Максимальный расход для данного датчика 40 л/ч, длительный 25 л/ч, минимальный 0,5 л/ч. Импульсная частота при Qmax - 2,222 Гц, а при Qmin - 0,027 Гц.
Хочется сделать расходомер топлива на свою машину, чтобы считал мгновенный расход (л/100км), и с накоплением с возможностью обнуления кнопкой. Есть в наличии платка arduino nano, GPS модуль NEO-6M и ЖК дисплей 16х2. Собрал схему под скетч ниже, но с программированием ардуино пока на “вы” а с радиоэлектроникой на “ты”… Помогите, пожалуйста, модернизировать скетч ниже …

/*
YF‐ S201 Water Flow Sensor
Water Flow Sensor output processed to read in litres/hour
Adaptation Courtesy: hobbytronics.co.uk
*/
volatile int flow_frequency; // с помощью этой переменной мы будем подсчитывать импульсы от датчика расходы воды
// Calculated litres/hour
 float vol = 0.0,l_minute;
unsigned char flowsensor = 2; // Sensor Input
unsigned long currentTime;
unsigned long cloopTime;
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 9);
void flow () // функция обработки прерывания
{
   flow_frequency++;
}
void setup()
{
   pinMode(flowsensor, INPUT);
   digitalWrite(flowsensor, HIGH); // Optional Internal Pull-Up
   Serial.begin(9600);
   lcd.begin(16, 2);
   attachInterrupt(digitalPinToInterrupt(flowsensor), flow, RISING); // Setup Interrupt
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("Water Flow Meter");
   lcd.setCursor(0,1);
   lcd.print("Circuit Digest");
   currentTime = millis();
   cloopTime = currentTime;
}
void loop ()
{
   currentTime = millis();
   // каждую секунду рассчитываем и выводим на экран ЖК дисплея скорость потока воды в литрах в минуту
   if(currentTime >= (cloopTime + 1000))
   {
    cloopTime = currentTime; // Updates cloopTime
    if(flow_frequency != 0){
      // Pulse frequency (Hz) = 7.5Q, Q is flow rate in L/min.
      l_minute = (flow_frequency / 7.5); // (Pulse frequency x 60 min) / 7.5Q = flowrate in L/hour
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Rate: ");
      lcd.print(l_minute);
      lcd.print(" L/M");
      l_minute = l_minute/60;
      lcd.setCursor(0,1);
      vol = vol +l_minute;
      lcd.print("Vol:");
      lcd.print(vol);
      lcd.print(" L");
      flow_frequency = 0; // сбрасываем счетчик
      Serial.print(l_minute, DEC); // Print litres/hour
      Serial.println(" L/Sec");
    }
    else {
      Serial.println(" flow rate = 0 ");
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Rate: ");
      lcd.print( flow_frequency );
      lcd.print(" L/M");
      lcd.setCursor(0,1);
      lcd.print("Vol:");
      lcd.print(vol);
      lcd.print(" L");
    }
   }
}

Чтобы что?

1 лайк

Чтобы расход был как у танка! )))

Чтобы считался мгновенный расход (л/100км), и с накоплением, с возможностью обнуления кнопкой… Вроде все ясно изложено… :slight_smile:

Красиво.

а он не считается?

так вы начинайте - а мы поможем, если возникнут проблемы.
Иначе это не “помощь”, это называется делать за вас.

Датчики то разные, видимо не работает. ))

По стоимости - так в 100 раз (!) разница ))

В информации, что я нашел в интернете, другие цифры - 80 л/ч.
У вас какая-то документация есть на него? Выкладывайте.

ТС вы где живете ? У датчика по температуре от -10 до 60 …

Так я же и пишу, что с программированием ардуино на “вы”… вот прямо совсем на “вы”! Оно то считает… Я изменил импульсную частоту с 7,5 на 2,222, надеюсь верно… Но хотелось бы еще сюда прикрутить GPS, чтобы считать мгновенный расход… У меня то тросик на спидометр…

Откуда 2.222 ? Из описания (взятого в интернете):

Количество импульсов на литр: 200

На этом форуме три пути всего:

  1. Учиться и стать с ардуино на “ты” (бесплатно, но долго)
  2. Заказать код в платном разделе (быстро, но не бесплатно)
  3. Найти другой форум (как повезет).

Такой уж тут форум. Зато честно. ))

Если оно и считает, то криво и неточно. Я так понял, что вы этот код в инете нашли? - его какой-то чайник писал.
Вот смотрите - между первым использованием flow_frequency и ее обнулением в ЛУПе проходит аж полтора десятка строчек с очень медленными операциями вывода на экран. А все это время прерывание продолжает считать импульсы, которые вы потом теряете, когда обнуляете счечик.

Было бы правильнее завести для прерывания отдельную переменную, которую только копировать в лупе в локальную переменную, с которой и производить расчеты

документация на датчик https://promavtokip.by/attachments/article/10/tech-opisanie.pdf

P.S. Я и не писал, что скетч мой… да он найден на просторах интернета… надо же от чего-то отталкиваться… откуда мне было знать, что он “кривой”… но очень хотелось бы его “выровнять” с вашей помощью… не пинайте сильно, я только в это все вникать начинаю, а так мое призвание радиоэлектроника… :slight_smile:

Стр. 9

Рабочее напряжение: 230 В, 50/60 Гц

Это точно подходит для автомобилей?

Для чего это вам - понятно. А для чего это нам в сотый раз перелопачивать?

По поводу прерывания… так у этого датчика при номинальном расходе (25л/ч), частота будет всего 1,38 Гц…

Не смотрите вы на эти 220V! Это же обычный геркон! Ну, да, запас прочности (изоляции) этого геркона позволяет ему коммутировать напряжение 220V. Но нас то вполне устроит и 5 вольт. :slight_smile:

при такой частоте вряд ли стоит считать число срабатываний в секунду - ничего хорошего не выйдет. В те секунды, когда прилетел импульс - Вы всегда будете получать одну и ту же цифру - 18л/час. А во все остальные периоды расходомер будет показывать ноль.
Лучше измерять длительность периода между импульсами. То есть этот код вообще не подходит, его надо сильно переписывать.
И вообще, датчик явно слишком медленный для измерения “мгновенного” расхода. Результаты будут запаздывать секунды на две… “мгновенным” тут и не пахнет.