Thursday, May 29, 2014

Theoretically speaking...(Update: Tested and working)

A friend asked me to make him a BT Fuel Manager for his twin Yamaha Setup. He has 2 tanks that feed each outboard, so he needed 2 sensors and a bit of coding to make this work with the Android apps. Since he isn't into learning Processing from scratch, he asked me to help him with the software part and show him how to do the hardware part.

Like the title says, this hasn't been tested, but should work. What it does is, it uses a second interrupt on Pin 3, where the second sensor is connected, and triggers exactly the same function to count pulses. Now this could have been done in two ways.

1. We could just attach an interrupt to pin 3 and call the same increment function called "incrementpulse".
2. We could use 2 seperate increment values and functions and add that at the end when sending data to the Apps

I have chosen the second way for a simple reason: You can use 2 diffrenet sensors, that have a diffrenet count per liter value. For instance 2000 pulses per liter on the first one and a 2500 pulses per liter on the second one.

Here is the code in theory:

UPDATE 1/6/2014: I have connected two flow sensors and tested the application. It is working and gets data from both sensors. We still haven't tested it on the boat but everything looks promising. The best part is that even if you plan to use one flow sensor, you can use this Sketch as it works also with one sensor connected!


//******************************************************
//     BT Fuel Manager Arduino sketch by MaleBuffy
//            for Double 2 Stroke Outboard
//         and BT Fuel Manager / BT Fuel Gauge
//                21/4/2014
//******************************************************
//
//     Pin 9 of Arduino to RX on the HC-05
//     Pin 11 of Arduino to TX on the HC-05
//     Pin 3v3 for +3.3V for the HC-05
//     Pin Gnd for Ground for the HC-05
//     Pin D4 for +5V for the Sensor 1
//     Pin D6 for GND for the Sensor 1
//     Pin D2 for Sensor 1 cable
//     Pin D3 for Sensor 2 cable   
//     Pin D4 for +5V for the Sensor 2
//     Pin D6 for GND for the Sensor 2
#include <JeeLib.h> // The Library used to put Arduino to sleep ISR(WDT_vect) { Sleepy::watchdogEvent(); } // Enable Watchdog for Sleeping purposes #include <SoftwareSerial.h>// import the Arduino serial library SoftwareSerial BTFuel(11, 9); // Define the Pins of the HC-05 Bluetooth device. RX, TX volatile float PulseSensor; // Measuring the pulse from the sensor 1 volatile float PulseSensor2;// Measuring the pulse from the sensor 2 float literspersecond; // Its the liters per second of sensor 1 float literspersecond2; // Its the liters per second of sensor 1 int hall = 2; // Sensor 1 Pin should be connected to Pin 2 of the Arduino int hall2 = 3; // Sensor 2 Pin should be connected to Pin 3 of the Arduino int pulses = 1818 ; // Define Sensor 1 Pulse per Liter for 2500 FCH-M-POM-LC 6 MM / 950 for FCH-midi-POM / 1818 for FS-3400AH int pulses2 = 1818 ; // Define Sensor 2 Pulse per Liter for 2500 FCH-M-POM-LC 6 MM / 950 for FCH-midi-POM / 2000 for FS-3400AH / void incementpulse () //This is the function that incements the pulse counter. PulseSensor 1 { PulseSensor++; // Equals PulseSensor = PulseSensor + 1 } void incementpulse2 () //This is the function that incements the pulse counter. PulseSensor 2 { PulseSensor2++; // Equals PulseSensor = PulseSensor + 1 } // Begin of Code. Setting pins up. void setup() { pinMode(hall, INPUT); // Init Pin 2 to receive data from the Sensor digitalWrite(hall, HIGH); // Using Internal Pull up resistor to pin 2 pinMode(hall2, INPUT); // Init Pin 3 to receive data from the Sensor digitalWrite(hall2, HIGH); // Using Internal Pull up resistor to pin 3 pinMode(4, OUTPUT); // Initializes digital pin 4 as an OUTPUT digitalWrite(4, HIGH); // 5V to pin 4 (Flow Sensor) pinMode(6, OUTPUT); // Initializes digital pin 6 as an OUTPUT digitalWrite(6, LOW); // GND to pin 6 (Flow Sensor) BTFuel.begin(9600); // Initiate serial connection to Bluetooth device attachInterrupt(0, incementpulse, RISING); // attaching the interupt attachInterrupt(1, incementpulse2, RISING); // attaching the interupt } // Loop measuring pulses from Sensor void loop () { PulseSensor = 0; // Resetting PulseSensor PulseSensor2 = 0; // Resetting PulseSensor 2 sei(); // Enabling interrupts delay (1000); // Delay 1 second (1000 milliseconds) cli(); // Disabling interrupts literspersecond = (PulseSensor/pulses); // Flowsensor used, makes X Pulses ever Liter. literspersecond2 = (PulseSensor2/pulses2); // Flowsensor used, makes X Pulses ever Liter. BTFuel.println(literspersecond+literspersecond2,4); // Sends liters per second to Bluetooth if (PulseSensor == 0 && PulseSensor2 == 0) { // If no input comes from the Sensor, put the Arduino to Sleep enterSleep(); } } // Function to put Arduino to sleep void enterSleep() { Sleepy::powerDown(); }

Saturday, May 24, 2014

Saving battery life...

A Fuel Flow Managing System is all about measuring Fuel economy. That's easy to understand. So it would only make sense if the Fuel Manager would need the least possible energy for doing its job. Thats what I did.

JeeLib is a Arduino (not only) Library that can put a Arduino (ATMEGA) into sleep, consuming the least amount of energy. You can install it buy downloading from GitHub here and putting the folder (rename it as JeeLib) into the Arduino "libraries" folder.

I modified the sketch to take a measurement for one second and then go to sleep until the sensor picks up a pulse again. It would really make sense of course, when using a Barebone Arduino, that hasn't got the USB intercafe etc. that also consumes energy. 

Here is the updated code with the JeeLib part.

//******************************************************
//     BT Fuel Manager Arduino sketch by MaleBuffy
//            for Single 2 Stroke Outboard
//         and BT Fuel Manager / BT Fuel Gauge
//                24/5/2014
//******************************************************
//
//     Pin 9 of Arduino to RX on the HC-05
//     Pin 11 of Arduino to TX on the HC-05
//     Pin 3v3 for +3.3V for the HC-05
//     Pin Gnd for Ground for the HC-05
//     Pin D4 for +5V for the Sensor
//     Pin D6 for GND for the Sensor
//     Pin D2 for Sensor cable



#include <JeeLib.h> // The Library used to put Arduino to sleep
ISR(WDT_vect) { Sleepy::watchdogEvent(); }  // Enable Watchdog for Sleeping purposes
#include <SoftwareSerial.h> // import the Arduino serial library 
SoftwareSerial BTFuel(11, 9); // Define the Pins of the HC-05 Bluetooth device. RX, TX 
volatile float PulseSensor; // Measuring the pulse from the sensor
float literspersecond;  // Holds the Serial output to the BT Device. Its the liters per second
int hall = 2;    // Sensor Pin should be connected to Pin 2 of the Arduino
int pulses = 2000 ; // Define Sensor Pulse per Liter for 2500 FCH-M-POM-LC 6 MM / 950 for FCH-midi-POM / 2000 for FS-3400AH

void incementpulse ()     //This is the function that incements the pulse counter. PulseSensor
  PulseSensor++;  // Equals PulseSensor = PulseSensor + 1

// Begin of Code. Setting pins up.

void setup() 
  pinMode(hall, INPUT); // Init Pin 2 to receive data from the Sensor
  digitalWrite(hall, HIGH); // Using Internal Pull up resistor to pin 2
  pinMode(4, OUTPUT); // Initializes digital pin 4 as an OUTPUT 
  digitalWrite(4, HIGH); // 5V to pin 4 (Flow Sensor)
  pinMode(6, OUTPUT); // Initializes digital pin 6 as an OUTPUT 
  digitalWrite(6, LOW); // GND to pin 6 (Flow Sensor)
   
  BTFuel.begin(9600); // Initiate serial connection to Bluetooth device
  attachInterrupt(0, incementpulse, RISING); // attaching the interupt



// Loop measuring pulses from Sensor

void loop ()    
{

  PulseSensor = 0;   // Resetting PulseSensor 
  sei();      // Enabling interrupts
  delay (1000);   // Delay 1 second (1000 milliseconds)
  cli();      // Disabling interrupts

  literspersecond = (PulseSensor/pulses); // Flowsensor used, makes X Pulses ever Liter. 
  BTFuel.println(literspersecond,4); // Sends liters per second to Bluetooth 

  if (PulseSensor == 0) {         // If no input comes from the Sensor, put the Arduino to Sleep
   enterSleep();
  }
}

// Function to put Arduino to sleep
void enterSleep()
{
 Sleepy::powerDown();
}

Wednesday, May 14, 2014

Sensor crazy...

UPDATE: DO NOT BUY!!! Its a cheap copy that has only 180 Pulses per Liter! Useless! The original is in BLUE colour!

Well it seems like I am becoming a sensor addict. I have bought so many sensors, that I forgot all about the Microstream one. Although purchased a while ago, it hasen't arrived yet (From China of course).

It costs about EUR 17, which is less than the BIO-Tech ones and a bit more than the one from Futurlec. It has however, a good accuracy of 0.5% which when true, is awesome. Its probably more on the 2% side, but thats also super awesome.

Pulse rate 0.46mL/p






Friday, May 9, 2014

The sensors explained

Although I haven't tested the project on my boat yet (damn you Chinese waterproof case), I am going to tell you a little bit why I decided to test my project with the FS-3400AH aka FLOWFUEL30L0.

Thing is, I started with the FCH-M-POM-LC 6 MM fom BIO-TECH. This was used in another flowscan project, however for a smaller outboard (40 HP). The "problem" is that although the flow rates it can handle are suitable for engines like my Tohatsu M140A2, I am afraid that the 3mm nozzle is just too small. This has been confirmed with the person that used this flow sensor on the 40HP outboard. 



Since I was still coding for the Arduino and Android, I was searching for a better suitable flow sensor. I contacted BIO-Tech and they suggested I should use the FCH-midi-POM which has a 6mm nozzle. That would fit OK, but at the Price of about EUR 42, it wass too expensive for what I had in mind. I ordered one just in case, however.



So back to the drawing board, I managed to find another sensor that probably fits my needs. At first, the downside was the it supports flow rates from 1L/Hour to 60L/Hour. My engine burns 54L/Hour at WOT. I ordered it since I thought that I wanted to measure fuel flow at cruising speed and not WOT. The good part however is that, buy blowing into the sensor I managed to get readings for over 60L/Hour. Air is different from liquid for sure, but since this is the only 6mm nozzle sensor I have received, I will do the tests with this one. So my priorities are:



1. FS-3400AH
2. FCH-midi-POM
3. FCH-M-POM-LC 6 MM (probably not going to test it at all)

Saturday, May 3, 2014

Redesigning for testing phase

Since I am still in the testing phase of my BT Fuel Manager, I have decided that connecting it to the 12V battey of the Boat is not a good idea. Once I have everything finished, it would make sense.

So i have used a 9V battery connector and connected it to Vin and Gnd of the Arduino, in order to power it from the battery. OK, there is no on/off switch but that is no problem for now. It is temporary anyways.

Here is a picture of the connector.