Хочу сделать расходомер. Его можно применять для учета топлива в лодке, машине, мотоцикле итд. Ну или в бытовых нуждах, для учета перегоняемой жидкости.
Планирую, чтоб счетчик умел показывать текущий расход, расход средний, и за сутки. В основе расходомер YF-S401,и дисплей ST7789. Я плохо шарю в коде, и пытаюсь скрестить два найденных скетча. Один - для расходомера, другой - для запуска секундомера по кнопке. Хочу сделать, чтоб при появление сигнала с расходомера запускался секундомер, при отсутсвии сигнал секундомер останавливался. Но у меня расходомер включается, показывает литры, а вот секундомер не подрубается. Видмо затык в том, что в оригинальном скетче там сигнал с analogRead, а мне нужен digaitalRead
Планирую, чтоб счетчик умел показывать текущий расход, расход средний, и за сутки. В основе расходомер 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 ");
}
}
}
Изменено: