Reading a gas meter with an Arduino, Part 2

Standard

In Part 1 of Reading a Gas Meter with an Arduino, I outlined in brief what I wanted to achieve and how I thought I might go about it.

In this second article, I detail my experiences using the photo-reflector purchased from Maplin. Since I haven’t yet created any circuits more complicated than some basic traffic lights, this would be my first real experience using this type of sensor in a circuit. I had a feeling when starting that I’d be needing to use the pull-down resistor type set-up on one of the sensor pins, and it turns out I was right – special thanks to everyone on the Arduino Forums for assisting.

It turns out, with a little help from the Arduino forums, it was pretty easy (it always is when you know how!). Having first connected the sensor to a digital input, and reading the value from the digital pin in the loop() method, it quickly became clear that trying to count one pass of the reflective disc on the gas meter in this manner wouldn’t work. Adding delay statements wouldn’t work either – I might miss the disc moving past the sensor as the speed it rotates is variable (depending on the amount of gas being consumed). If you’re not sure why this won’t work, think of the Arduino and photo-reflector as a high-speed camera: taking many frames per second the second a reflection is detected. You might receive – for argument’s sake – 1,000 ‘frames’ while the gas meter disc is passing under the sensor, but how do you know – in code – which one to ‘act’ upon and which to ignore? Clearly, you can’t send a thousand ‘pulses’ to your data logger, because your data will all be wrong. This dilemma only came up because in my limited knowledge of the Arduino and the C++ implementation it uses meant that I was trying to stuff all this “detection logic” into the loop() statement.

Enter the Hardware Interrupt… the simplest answer to the problem

In my traditional .NET coding, I’d simply use an ‘event’ to achieve what I wanted, and then write some minimal state-checking code. On the Arduino, however, I have learned that the hardware interrupt is basically very similar (but a bit cooler, actually!). What’s even better is that I don’t even need to bother with any complex code to determine whether or not the sensor is still sensing the same revolution of the disc: when you initialise the interrupt, you state whether you want it to be triggered when a certain condition is met, i.e. any state change, from low to high, from high to low etc. This really nifty feature is exactly what I needed.

Refer to line 7 of the sketch sample below to see how easy it is to register the interrupt. In this example, I simply use the interrupt to turn on an LED whenever the photo-reflector is LOW, i.e. it is detecting a reflection. In later articles, I’ll be changing this to do some logging. The reason for this, is simply that this hardware interrupt is fired only ONCE – and not again until the state changes.

Finding out what’s going on under the hood

I use the Serial library to output ‘debug’ information to help me figure out what’s happening inside the Arduino. It’s not necessary for reading values from the photo-reflector, and at a later stage in this project I’ll probably remove the debug information as I’ll need to be sending the information that is read from the gas meter back to the PC somehow.

The Sketch


int ledPin = 13;                     // select the pin for the LED
volatile int state = LOW;            // remember the current state

void setup() {
  pinMode(ledPin, OUTPUT);            // declare the ledPin as an OUTPUT
  Serial.begin(9600);
  attachInterrupt(0, check, CHANGE);  // attach an interrupt (interrupt 0 = digital pin 2)
}

void loop() {
  digitalWrite(ledPin, state);
}

void check() {    // Checks for feedback from the phototransistor
  state = !state;
  Serial.print("State changed to: ");
  Serial.print(state);
  Serial.print(".\n");
}

Photograph

Schematic

I have attempted to re-create the above in schematic form, using Fritzing. As mentioned in earlier posts, Fritzing is a beta tool and it doesn’t currently have symbols for all the electrical components one might use. Having searched the web for a suitable circuit symbol for my photoreflector, I can’t find one. I suspect that because, although the photo-reflector is an ‘all-in-one’ design, it is actually just comprised of an LED and a photosensitive transistor:

Arduino schematic showing placement of maplin photo-reflector

Next Steps…

Now that I have figured out how to interpret a value from a photo-reflector within the Arduino, what I need to do is build a prototype sensor ‘bar’ that I can mount to the gas meter. The next post on this subject will probably be just that – how I made (or am making!) the sensor bar. One point I’ll be bearing in mind is that I’d like to site the Arduino remotely from the sensor arm, and I’d like to be able to collect data from other sensors attached to the same board. Thinking ‘out loud’ as I go really, but I promise to write a proper ‘How-To’ article when I’m on the other side of the learning curve!

Advertisements

Reading a gas meter with an Arduino, Part 1

Standard

Ok, since I received my Arduino, I have been playing around with some simple projects in an effort to understand more about the way the Arduino board works, and to gather some of the basic electronic skills necessary to work with it. So now, I want to turn my attention to something a little more in tune with my reasons for actually buying the Arduino in the first place: home automation.

After a trip to the gas meter cupboard, unfortunately my gas meter is not the type that outputs a digital ‘pulse’ at regular intervals: it’s an odometer type. However, usefully, I did discover that it has a little reflective disc between the digit ‘6’ and ‘7’, which could presumably be read with some kind of reflection sensor. I did some digging around to see who else on the web has built their own gas-meter readers, and found BWired.nl. This is an awesome site – certainly way beyond what most of us mere mortals could aspire to for our home automation setups! Anyway, on this page, the owner describes using a ‘CNY70 Reflective Optical Sensor with Transistor Output’. After some digging around, I found that Maplin has something which (I think) might be similar here – it’s called “Photoreflector SY-CR102” and it costs £0.79! This neat little device includes a photo-emitting diode and a phototransistor, which should do the trick.

I’ll go down to the store and pickup the Photoreflector later today, and have a go at playing with it over the coming days. Essentially what I need to do is figure out how the sensor responds whenever the reflective disk of the gas meter passes the sensor aperture. In theory then, at least, it’s then going to be a case of simply counting the ‘pulses’ from the sensor. Once I can do that, given that the dial will rotate once a known quantity of gas has been consumed, I should be able to create a very accurate sensor device that is synchronous with the gas meter itself.

Here’s how I imagine the project to unfold:

I’m quite excited about this – it’s such a steep learning curve though! 🙂

/Rich