Хочу сделать Расходомер

telect

✩✩✩✩✩✩✩
21 Фев 2020
3
0
Хочу сделать расходомер. Его можно применять для учета топлива в лодке, машине, мотоцикле итд. Ну или в бытовых нуждах, для учета перегоняемой жидкости.
Планирую, чтоб счетчик умел показывать текущий расход, расход средний, и за сутки. В основе расходомер YF-S401,и дисплей ST7789. Я плохо шарю в коде, и пытаюсь скрестить два найденных скетча. Один - для расходомера, другой - для запуска секундомера по кнопке. Хочу сделать, чтоб при появление сигнала с расходомера запускался секундомер, при отсутсвии сигнал секундомер останавливался. Но у меня расходомер включается, показывает литры, а вот секундомер не подрубается. Видмо затык в том, что в оригинальном скетче там сигнал с analogRead, а мне нужен digaitalRead

C++:
/***************************************************
  This is a library for the ST7789 IPS SPI display.

  Originally written by Limor Fried/Ladyada for
  Adafruit Industries.

  Modified by Ananev Ilia
****************************************************/

#include <Adafruit_GFX.h>    // Core graphics library by Adafruit
#include <Arduino_ST7789.h> // Hardware-specific library for ST7789 (with or without CS pin)
#include <SPI.h>
//#include "FontsRus/TimesNRCyr16.h"

#define TFT_DC    8
#define TFT_RST   9 //RES
#define TFT_CS    10 // only for displays with CS pin NIL
#define TFT_MOSI  11   // for hardware SPI data pin (all of available pins) SDA
#define TFT_SCLK  13   // for hardware SPI sclk pin (all of available pins)SCK
Arduino_ST7789 tft = Arduino_ST7789(TFT_DC, TFT_RST); //for display without CS pin


volatile int flow_frequency; // Measures flow sensor pulses
unsigned int l_hour; // Calculated litres/hour
unsigned char flowsensor = 2; // Sensor Input
unsigned long currentTime;
unsigned long cloopTime;
void flow () // Interrupt function
{
   flow_frequency++;
}


unsigned long start, finished, elapsed;
boolean r = false;
// Переменные для времени отладки кнопки
long lastButtonPressTime = 0; // последний раз, когда была нажата кнопка
long debounceDelay = 50; // время отладки; установите как можно меньше




void setup () {


  tft.init(80, 160);   // initialize a ST7789 chip, 240x240 pixels

  uint16_t time = millis();
  tft.fillScreen(BLACK);
tft.setTextColor(WHITE, BLACK);



pinMode(flowsensor, INPUT);
   digitalWrite(flowsensor, HIGH); // Optional Internal Pull-Up
 
   attachInterrupt(0, flow, RISING); // Setup Interrupt
   sei(); // Enable interrupts
   currentTime = millis();
   cloopTime = currentTime;





}

void loop()
{
  CheckFlow();
  CheckStartStop();
DisplayResult();

//tft.setFont(&TimesNRCyr16pt8b);

}
 



void CheckFlow()
{
tft.setCursor(5, 30);

  tft.setTextSize(2);
  tft.println("Fuel Meter");


currentTime = millis();
   // Every second, calculate and print litres/hour
  if(currentTime >= (cloopTime + 1000))
   {
     cloopTime = currentTime; // Updates cloopTime
      // Pulse frequency (Hz) = 7.5Q, Q is flow rate in L/min.
    l_hour = (flow_frequency * 60 / 5880); // (Pulse frequency x 60 min) / 7.5Q = flowrate in L/hour
     flow_frequency = 0; // Reset Counter
      tft.setCursor(5, 60);

  tft.setTextSize(2);

      tft.print(l_hour, DEC); // Print litres/hour
    tft.println(" L/h");

   }

   }



void CheckStartStop()
{

int x = digitalRead(2); // назначьте «x»  входуArduino (кнопки модуля)
if (x < 800 && x > 600 ) // если кнопка SELECT
{
if ((millis() - lastButtonPressTime) > debounceDelay)
{

if (r == false)
  {
tft.fillScreen(BLACK);
tft.setCursor(3, 90); // нужно
tft.setTextSize(2);
tft.print("Time Past");
start = millis(); // сохраняет время начала, чтобы вычислить прошедшее время
}
else if (r == true)
{
tft.setCursor(2, 120); // нужно
tft.print(" Final Time ");
}
r = !r;
    }
lastButtonPressTime = millis();
 
 
   }
}




void DisplayResult()
{
if (r == true)
{
finished = millis(); // сохраняет время остановки, чтобы вычислить прошедшее время.
// объявляем переменные
float h, m, s, ms;
unsigned long over;

// время
elapsed = finished - start;

h = int(elapsed / 3600000);
over = elapsed % 3600000;
m = int(over / 60000);
over = over % 60000;
s = int(over / 1000);
ms = over % 1000;
// показать результаты
tft.setCursor(0, 160);

tft.print(h, 0);
tft.print("h ");
tft.print(m, 0);
tft.print("m ");
tft.print(s, 0);
tft.print("s ");

if (h < 10)
  {
tft.print(ms, 0);
tft.print("ms ");

  }
    }

}
 
Изменено:

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,407
976
58
Марий-Эл
Его можно применять для учета топлива в лодке, машине, мотоцикле итд
А минимальное измерения протока 0.3л/мин не мало для измерения топлива?
А на машину с инжектором вообще не поставишь.
 
  • Лойс +1
Реакции: Старик Похабыч

telect

✩✩✩✩✩✩✩
21 Фев 2020
3
0
@Эдуард Анисимов, есть в продаже модели расчитанные на разные объемы. Если код заработает, то закажу другой. Хотя, по-моему они внутри одинаковы все, а точность регулируется программно.
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,407
976
58
Марий-Эл
@Эдуард Анисимов, есть в продаже модели расчитанные на разные объемы. Если код заработает, то закажу другой. Хотя, по-моему они внутри одинаковы все, а точность регулируется программно.
Здесь Вы немного не правы. У каждого счётчика есть минимальный расход при котором он крутится. Если скорости протока не хватает, какую крутую программу не напиши, работать всё равно не будет. Вам для грубого подсчёта нужен датчик с минимальным расходом 0.05 л/мин. Для более менее измерения 0.01 л/мин. Ну и сами прикиньте какой датчик нужен для точного измерения.