Ron , thank you so much, I add oil pressure sensor, flowmeter to the system. I will share the results.
// initialize LCD lib with I2C serial communication protocol
#include <Wire.h> //I2C lib
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
// LCD lib
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
int pot_pin = A0;
int pump_pwm= 3;
int press_pin =A1;
int flowPin = 2; //This is the input pin on the Arduino
double flowRate; //This is the value we intend to calculate.
double totalFlowRate;
volatile int count; //This integer needs to be set as volatile to ensure it updates correctly during the interrupt process.
int pot_init= 0;
int pump_init= 0;
int percentValue =0;
void setup() {
lcd.begin(20,4); // A4 - A5 connection SDA - SCL
lcd.backlight();
pinMode(flowPin, INPUT); //Sets the pin as an input
attachInterrupt(0, Flow, RISING); //Configures interrupt 0 (pin 2 on the Arduino Nano) to run the function "Flow"
Serial.begin(9600);
}
void loop() {
pressure_cal();
pump_control();
flow_control();
}
void pressure_cal(void) {
float sensorVoltage = analogRead(press_pin); // sensor voltage A0
float psi = ((sensorVoltage-102)/204)*25; // Offset 0 PSI= 0.5V=102 unit, 50 PSI= 2.5, 100 PSI= 4.5V, 1 PSI= 0.04V , +-0.4PSI approax. sensitivity
// calibration
float bar = psi*(0.0689475729); // Conversion PSI to BAR
if(psi < 0)
psi = 0;
if(bar<0);
bar=0;
lcd.setCursor (0,2);
lcd.print (psi);
lcd.print (" PSI");
lcd.setCursor ( 0,3);
lcd.print(bar);
lcd.print( " BAR");
lcd.setCursor(0,1);
lcd.print(sensorVoltage);
Serial.println (sensorVoltage);
Serial.println(bar);
Serial.println (psi);
delay (100);
}
void pump_control(void)
{
// read the analog in value:
pot_init = analogRead(pot_pin);
// map it to the range of the analog out:
pump_init = map(pot_init, 0, 1023, 0, 255); // Duty cycle between %20 - %90: speed control , duty cycle between %0 - %20: turned off , duty cycle between %90 - %100: full speed
// map pump speed percent of full scale
percentValue = map (pump_init, 0, 255,0,100);
// change the analog out value:
analogWrite(pump_pwm, pump_init);
// print the results to the Serial Monitor:
Serial.print("\t Speed Input = ");
Serial.print(pot_init);
Serial.print("\t Speed Output = ");
Serial.print(pump_init);
Serial.print("\t Pump Speed Percentage = ");
Serial.println(percentValue);
lcd.setCursor(0,0);
lcd.print("Speed: ");
lcd.setCursor(8,0);
lcd.print("%");
lcd.setCursor(9,0);
lcd.print(percentValue);
// delay after the last reading:
delay(2);
}
void flow_control(void) {
count = 0; // Reset the counter so we start counting from 0 again
interrupts(); //Enables interrupts on the Arduino
delay (1000); //Wait 1 second
noInterrupts(); //Disable the interrupts on the Arduino
//Start the math
flowRate = (count * 2.36); //Take counted pulses in the last second and multiply by 2.25mL
flowRate = flowRate * 60; //Convert seconds to minutes, giving you mL / Minute
flowRate = flowRate / 1000; //Convert mL to Liters, giving you Liters / Minute
totalFlowRate += flowRate; // Add the liters passed in second to the cumulative total
Serial.println(flowRate); //Print the variable flowRate to Serial
lcd.setCursor(0,4);
lcd.print("F: ");
lcd.setCursor(3,4);
lcd.print(flowRate);
lcd.setCursor(8,4);
lcd.print("lt/m");
lcd.setCursor(13,4);
lcd.print("TF:");
lcd.setCursor(16,4);
lcd.print(totalFlowRate);
}
void Flow()
{
count++; //Every time this function is called, increment "count" by 1
}
// initialize LCD lib with I2C serial communication protocol
#include <Wire.h> //I2C lib
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
// LCD lib
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
int pot_pin = A0;
int pump_pwm= 3;
int press_pin =A1;
int flowPin = 2; //This is the input pin on the Arduino
double flowRate; //This is the value we intend to calculate.
double totalFlowRate;
volatile int count; //This integer needs to be set as volatile to ensure it updates correctly during the interrupt process.
int pot_init= 0;
int pump_init= 0;
int percentValue =0;
void setup() {
lcd.begin(20,4); // A4 - A5 connection SDA - SCL
lcd.backlight();
pinMode(flowPin, INPUT); //Sets the pin as an input
attachInterrupt(0, Flow, RISING); //Configures interrupt 0 (pin 2 on the Arduino Nano) to run the function "Flow"
Serial.begin(9600);
}
void loop() {
pressure_cal();
pump_control();
flow_control();
}
void pressure_cal(void) {
float sensorVoltage = analogRead(press_pin); // sensor voltage A0
float psi = ((sensorVoltage-102)/204)*25; // Offset 0 PSI= 0.5V=102 unit, 50 PSI= 2.5, 100 PSI= 4.5V, 1 PSI= 0.04V , +-0.4PSI approax. sensitivity
// calibration
float bar = psi*(0.0689475729); // Conversion PSI to BAR
if(psi < 0)
psi = 0;
if(bar<0);
bar=0;
lcd.setCursor (0,2);
lcd.print (psi);
lcd.print (" PSI");
lcd.setCursor ( 0,3);
lcd.print(bar);
lcd.print( " BAR");
lcd.setCursor(0,1);
lcd.print(sensorVoltage);
Serial.println (sensorVoltage);
Serial.println(bar);
Serial.println (psi);
delay (100);
}
void pump_control(void)
{
// read the analog in value:
pot_init = analogRead(pot_pin);
// map it to the range of the analog out:
pump_init = map(pot_init, 0, 1023, 0, 255); // Duty cycle between %20 - %90: speed control , duty cycle between %0 - %20: turned off , duty cycle between %90 - %100: full speed
// map pump speed percent of full scale
percentValue = map (pump_init, 0, 255,0,100);
// change the analog out value:
analogWrite(pump_pwm, pump_init);
// print the results to the Serial Monitor:
Serial.print("\t Speed Input = ");
Serial.print(pot_init);
Serial.print("\t Speed Output = ");
Serial.print(pump_init);
Serial.print("\t Pump Speed Percentage = ");
Serial.println(percentValue);
lcd.setCursor(0,0);
lcd.print("Speed: ");
lcd.setCursor(8,0);
lcd.print("%");
lcd.setCursor(9,0);
lcd.print(percentValue);
// delay after the last reading:
delay(2);
}
void flow_control(void) {
count = 0; // Reset the counter so we start counting from 0 again
interrupts(); //Enables interrupts on the Arduino
delay (1000); //Wait 1 second
noInterrupts(); //Disable the interrupts on the Arduino
//Start the math
flowRate = (count * 2.36); //Take counted pulses in the last second and multiply by 2.25mL
flowRate = flowRate * 60; //Convert seconds to minutes, giving you mL / Minute
flowRate = flowRate / 1000; //Convert mL to Liters, giving you Liters / Minute
totalFlowRate += flowRate; // Add the liters passed in second to the cumulative total
Serial.println(flowRate); //Print the variable flowRate to Serial
lcd.setCursor(0,4);
lcd.print("F: ");
lcd.setCursor(3,4);
lcd.print(flowRate);
lcd.setCursor(8,4);
lcd.print("lt/m");
lcd.setCursor(13,4);
lcd.print("TF:");
lcd.setCursor(16,4);
lcd.print(totalFlowRate);
}
void Flow()
{
count++; //Every time this function is called, increment "count" by 1
}
// initialize LCD lib with I2C serial communication protocol
#include <Wire.h> //I2C lib
int pot_pin = A0;
int pump_pwm= 3;
int press_pin =A1;
int flowPin = 2; //This is the input pin on the Arduino
double flowRate; //This is the value we intend to calculate.
double totalFlowRate;
volatile int count; //This integer needs to be set as volatile to ensure it updates correctly during the interrupt process.
int pot_init= 0;
int pump_init= 0;
int percentValue =0;
void setup() {
pinMode(flowPin, INPUT); //Sets the pin as an input
attachInterrupt(0, Flow, RISING); //Configures interrupt 0 (pin 2 on the Arduino Nano) to run the function "Flow"
Serial.begin(9600);
}
void loop() {
pressure_cal();
pump_control();
flow_control();
}
void pressure_cal(void) {
float sensorVoltage = analogRead(press_pin); // sensor voltage A0
float psi = ((sensorVoltage-102)/204)*25; // Offset 0 PSI= 0.5V=102 unit, 50 PSI= 2.5, 100 PSI= 4.5V, 1 PSI= 0.04V , +-0.4PSI approax. sensitivity
// calibration
float bar = psi*(0.0689475729); // Conversion PSI to BAR
if(psi < 0)
psi = 0;
if(bar<0);
bar=0;
Serial.println (sensorVoltage);
Serial.println(bar);
Serial.println (psi);
delay (100);
}
void pump_control(void)
{
// read the analog in value:
pot_init = analogRead(pot_pin);
// map it to the range of the analog out:
pump_init = map(pot_init, 0, 1023, 0, 255); // Duty cycle between %20 - %90: speed control , duty cycle between %0 - %20: turned off , duty cycle between %90 - %100: full speed
// map pump speed percent of full scale
percentValue = map (pump_init, 0, 255,0,100);
// change the analog out value:
analogWrite(pump_pwm, pump_init);
// print the results to the Serial Monitor:
Serial.print("\t Speed Input = ");
Serial.print(pot_init);
Serial.print("\t Speed Output = ");
Serial.print(pump_init);
Serial.print("\t Pump Speed Percentage = ");
Serial.println(percentValue);
// delay after the last reading:
delay(2);
}
void flow_control(void) {
count = 0; // Reset the counter so we start counting from 0 again
interrupts(); //Enables interrupts on the Arduino
delay (1000); //Wait 1 second
noInterrupts(); //Disable the interrupts on the Arduino
//Start the math
flowRate = (count * 2.36); //Take counted pulses in the last second and multiply by 2.25mL
flowRate = flowRate * 60; //Convert seconds to minutes, giving you mL / Minute
flowRate = flowRate / 1000; //Convert mL to Liters, giving you Liters / Minute
totalFlowRate += flowRate; // Add the liters passed in second to the cumulative total
Serial.println(flowRate); //Print the variable flowRate to Serial
}
void Flow()
{
count++; //Every time this function is called, increment "count" by 1
}
// initialize LCD lib with I2C serial communication protocol
#include <Wire.h> //I2C lib
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
// LCD lib
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
int pot_pin = A0;
int pump_pwm= 3;
int press_pin =A1;
int flowPin = 2; //This is the input pin on the Arduino
byte resetButtonA = 11;
double flowRate; //This is the value we intend to calculate.
volatile int count; //This integer needs to be set as volatile to ensure it updates correctly during the interrupt process.
int pot_init= 0;
int pump_init= 0;
int percentValue =0;
int totalFlowRate = 0;
void setup() {
lcd.begin(20,4); // A4 - A5 connection SDA - SCL
lcd.backlight();
pinMode(resetButtonA, INPUT);
digitalWrite(resetButtonA, HIGH);
pinMode(flowPin, INPUT); //Sets the pin as an input
attachInterrupt(0, Flow, RISING); //Configures interrupt 0 (pin 2 on the Arduino Nano) to run the function "Flow"
Serial.begin(9600);
}
void loop() {
pressure_cal();
pump_control();
flow_control();
}
void pressure_cal(void) {
float sensorVoltage = analogRead(press_pin); // sensor voltage A0
float psi = ((sensorVoltage-102)/204)*25; // Offset 0 PSI= 0.5V=102 unit, 50 PSI= 2.5, 100 PSI= 4.5V, 1 PSI= 0.04V , +-0.4PSI approax. sensitivity
// calibration
float bar = psi*(0.0689475729); // Conversion PSI to BAR
if(psi < 0)
psi = 0;
if(bar<0);
bar=0;
lcd.setCursor (0,1);
lcd.print (psi);
lcd.print (" PSI");
lcd.setCursor ( 0,2);
lcd.print(bar);
lcd.print( " BAR");
//lcd.setCursor(0,1);
//lcd.print(sensorVoltage);
Serial.println (sensorVoltage);
Serial.println(bar);
Serial.println (psi);
delay (100);
}
void pump_control(void)
{
// read the analog in value:
pot_init = analogRead(pot_pin);
// map it to the range of the analog out:
pump_init = map(pot_init, 0, 1023, 0, 255); // Duty cycle between %20 - %90: speed control , duty cycle between %0 - %20: turned off , duty cycle between %90 - %100: full speed
// map pump speed percent of full scale
percentValue = map (pump_init, 0, 255,0,100);
// change the analog out value:
analogWrite(pump_pwm, pump_init);
// print the results to the Serial Monitor:
Serial.print("\t Speed Input = ");
Serial.print(pot_init);
Serial.print("\t Speed Output = ");
Serial.print(pump_init);
Serial.print("\t Pump Speed Percentage = ");
Serial.println(percentValue);
lcd.setCursor(0,0);
lcd.print("Speed: ");
lcd.setCursor(8,0);
lcd.print("%");
lcd.setCursor(9,0);
lcd.print(percentValue);
// delay after the last reading:
delay(2);
}
void flow_control(void) {
count = 0; // Reset the counter so we start counting from 0 again
interrupts(); //Enables interrupts on the Arduino
delay (1000); //Wait 1 second
noInterrupts(); //Disable the interrupts on the Arduino
/* if(digitalRead(resetButtonA) == LOW)
{
totalFlowRate = 0;
lcd.setCursor(16, 3);
lcd.print("0");
}
else {
totalFlowRate += flowRate;
lcd.setCursor(16, 3);
lcd.print(totalFlowRate);
} */
//Start the math
flowRate = (count * 8.93); //Take counted pulses in the last second and multiply by 8.93mL
flowRate = flowRate * 60; //Convert seconds to minutes, giving you mL / Minute
flowRate = flowRate / 1000; //Convert mL to Liters, giving you Liters / Minute
totalFlowRate += flowRate; // Add the liters passed in second to the cumulative total
Serial.println(flowRate); //Print the variable flowRate to Serial
lcd.setCursor(0,3);
lcd.print("F: ");
lcd.setCursor(3,3);
lcd.print(flowRate);
lcd.setCursor(8,3);
lcd.print("lt/m");
lcd.setCursor(13,3);
lcd.print("T:");
lcd.setCursor(15,3);
lcd.print(totalFlowRate);
}
void Flow()
{
count++; //Every time this function is called, increment "count" by 1
}
#include <Wire.h> //I2C lib
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
// LCD lib
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
const int pot_pin = A0;
const int pump_pwm= 3;
int press_pin =A1;
//flowmeter parameters
int flowPin = 2; // input pin on arduino D2
double flowRate; // value intented to calculate
double flowR; // flow value in lt
double totalFlow; // total output of flow from system
byte sensorInterrupt = 0; // interrupt 0 on D2 pin Arduino Nano
volatile int count; ////integer needs to be set as volatile to ensure it updates correctly during the interrupt process.
int pot_init= 0;
int pump_init= 0;
int percentValue =0;
void setup() {
lcd.begin(20,4); // A4 - A5 connection SDA - SCL
lcd.backlight();
Serial.begin(9600);
pinMode( flowPin,INPUT); // Set D2 pin as an input
attachInterrupt(sensorInterrupt,Flow,RISING); // Configures interrupt 0 ( pin D2 on Arduino Nano ) to run function "Flow"
}
void flow_control(void) {
count = 0; // reset counter so it could start counting from 0
interrupts(); // enables interrupts on arduino nano
delay(1000); // wait 1000 msec
noInterrupts(); // disable interrupts on arduino nano
//calculation for flowmeter
flowR = (count*8.93); // 112 pulse/lt 423.84 pulse /gallon
flowRate= flowR*60; // convert seconds to minutes, new unit is ml/minutes
flowRate= flowRate/1000; // convert ml to liters, new unit is lt/minutes
totalFlow += flowR;
// Print the flow rate for this second in litres / minute
Serial.print("Flow rate: ");
Serial.print(int(flowRate)); // Print the integer part of the variable
Serial.print("L/min");
Serial.print("\t"); // Print tab space
// Print the cumulative total of litres flowed since starting
Serial.print("Output Liquid Quantity: ");
Serial.print(totalFlow/1000);
Serial.println("L");
}
void Flow(void)
{
count++; // every time this function is called, increment "count" by 1
}
void loop() {
pressure_cal();
pump_control();
flow_control();
}
void pressure_cal(void) {
float sensorVoltage = analogRead(press_pin); // sensor voltage A0
float psi = ((sensorVoltage-102)/204)*25; // Offset 0 PSI= 0.5V=102 unit, 50 PSI= 2.5, 100 PSI= 4.5V, 1 PSI= 0.04V
// calibration
float bar = psi*(0.0689475729); // Conversion PSI to BAR
lcd.setCursor (0,1);
lcd.print (psi);
lcd.print (" PSI");
lcd.setCursor ( 10,1);
lcd.print(bar);
lcd.print( " BAR");
//lcd.setCursor(17,1);
//lcd.print(sensorVoltage);
Serial.print("\t Sensor Value = ");
Serial.print(sensorVoltage);
Serial.print("\t Bar = ");
Serial.print(bar);
Serial.print("\t PSI = ");
Serial.println(psi);
delay (100);
}
void pump_control(void)
{
// read the analog in value:
pot_init = analogRead(pot_pin);
// map it to the range of the analog out:
pump_init = map(pot_init, 0, 1023, 50, 230); // duty cycle between %20 - %90: speed control , duty cycle between %0 - %20: turned off , duty cycle between %90 - %100: full speed
// map pump speed percent of full scale
percentValue = map (pump_init, 50, 230,0,100);
// change the analog out value:
analogWrite(pump_pwm, pump_init);
// print the results to the Serial Monitor:
Serial.print("\t Speed Input = ");
Serial.print(pot_init);
Serial.print("\t Speed Output = ");
Serial.print(pump_init);
Serial.print("\t Pump Speed Percentage = ");
Serial.println(percentValue);
lcd.setCursor(2,0);
lcd.print("Speed: ");
lcd.setCursor(8,0);
lcd.print("%");
lcd.setCursor(9,0);
lcd.print(percentValue);
lcd.print(" ");
// delay after the last reading:
delay(10);
}
by Duane Benson
by Jake Hertz
by Robert Keim
by Aaron Carman