Water Meter

Hi,

Need help getting a reading from a hersey meters 430 water meter

Any help greatly appreciated!

Doesn't look like it has a pulse output or so.

Possible solution: camera & OCR.

wvmarle:
Doesn't look like it has a pulse output or so.

But it does say this:

The nutating action of the disc is coupled magnetically to the register to indicate the volume of water that passes through the meter

I wonder if you could sense that somehow say with a Hall sensor?

(Learnt a new word today.... nutation)

That's just to not have an axle sticking out and leaking water.

Doesn't matter what it's for; the fact is it is there. It may be worth investigating, that's why I said "I wonder".

I was taught in first year undergrad engineering design class 45 years ago, that one of the ways to arrive at a solution, is to throw around any and all ideas.

Well, start taking apart your water meter I'd say. It's somewhere inside that (metal?) housing. See what you can do with it.

Normally a mechanical water meter is digitally read by placing a magnet on one of the rotors (the fastest rotating - usually the 0.0001 m3 one), and placing a reed switch or hall effect sensor on top of it. Then you count the pulses as they go. Of course you have to manually set the starting value.

Or you have to find a very fancy water meter that has digital recording built in, and offers a data interface.

Here is some additional information http://muellersystems.com/wp-content/uploads/2016/03/Translator11-09-2010.pdf

oraclerouter:
Here is some additional information http://muellersystems.com/wp-content/uploads/2016/03/Translator11-09-2010.pdf

You should have led with that :wink:

But anyhoo I see it says this:

Complies with AWWA Standard C707 for Encoder Remote Reading Systems
....
When an AMR/AMI device interrogates the register....

You would need to find out what that standard and the interrogation comprises, then look into coding an Arduino to send the necessary questions, assuming there is compatibility with voltages and communications. (That it's ASCII at least sounds promising.)

How about a pulse based water meter similar to this one https://www.daecontrols.com/home/submeters/water-meters/water-meters-pulse

This one only has two wires how would I wire it? Would I need a resistor? Any help greatly appropriated

Your opening post made it seem you already had the other meter.

oraclerouter:
This one only has two wires how would I wire it? Would I need a resistor? Any help greatly appropriated

Well it’s just a switch:

The pulse emitter device consists of a plastic housing with Reed
Switch and 1.5 m cable with 2 cores in red and black

So one wire to Arduino ground , the other to a digital pin with INPUT_PULLUP. Every time the switch closes it will make the pin go low: count those.

Somewhere in the datasheet it should tell you how much water flows per pulse.

Yes, I do have the hersey meters 430 water meter but I was hoping it would be much easier to read the data from it.

So I started looking for something more straight forward to use and it seems like the pulse meters are the way to go.

The magnetic coupling in such meters is well screened - so you can’t affect the reading with a big external magnet . So detecting that won’t work .

The might be able to buy an add on pulse output from the supplier of the meter. You can use an opto reflective sensor off any test dial - which this meter has ( or sometimes the meters have a reflective digit on the index for this purpose).

hammy:
The magnetic coupling in such meters is well screened - so you can’t affect the reading with a big external magnet . So detecting that won’t work .

That's a good point, but hey, you never know until you know. Might be worth a try; the OP does after all already own one of those meters, it's not a purchasing decision. Wave a Hall sensor around and see what happens....

hammy:
The might be able to buy an add on pulse output from the supplier of the meter.

OP did provide a link (#6) to the maker's add on, but seems it requires an "interrogation protocol" to ask it for data, which data is then sent back in ascii. So that might be doable, but would require getting hold of the standard so as to get an Arduino to ask the right question/s. (Assuming electrical communications in the first place.)

elvon_blunden:
That's a good point, but hey, you never know until you know.

That will be really well shielded, no use to try. It's just a basic part of tamper-proofing the meter. It'd also require to completely take apart the meter to even get to that point.

elvon_blunden:
So one wire to Arduino ground , the other to a digital pin with INPUT_PULLUP. Every time the switch closes it will make the pin go low: count those.

By the way, if it's pulsing too fast to grab those with digitalRead()s, you would need to use an interrupt.

elvon_blunden:
By the way, if it's pulsing too fast to grab those with digitalRead()s, you would need to use an interrupt.

The water meter I have with the same system produces one pulse per rotation - about 50% duty cycle. You get one pulse per 1-100 seconds.

I'm using an interrupt but for a very different reason: to let the Arduino sleep in between. No reason to keep it awake sucking up battery power.

I monitor a couple of water wells on my land using 3/4" pulse output meters from EKM Metering which has a two wire interface. These meters give a pulse for every 0.1 cu. ft. I send the data via RF and save it to an SD card at the well. You can use the circuit described in the Button Push Count tutorial. One wire tied to your switch to ground via a 10k resistor and the other to 5 volts.

FWIW this is the code I came up with. It works for what I need.

/*
  RF based flow meter transmitter for well monitoring for
  a two meter connection with SD card data storage.

  A.J. Lindfors 2019
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <SD.h>
//pins
const byte inMeterOne = 4;
const byte inMeterTwo = 5;

//variables for meter calculation and various controls
int stateMeterOne, stateMeterTwo, oldMeterOne, oldMeterTwo;
unsigned long currentCountMillis, previousCountMillis;
unsigned long currentTransMillis, previousTransMillis;
unsigned long intervalTrans = 1000;
unsigned long intervalCount = 200;
unsigned long volumeOne,  volumeTwo;
unsigned long dataArray[2];

//pins and variables for controlling SPI items
const int sdSelect = 8; //sd card
RF24 radio(9, 10); // CE, CSN
const byte address[6] = "00001";

void setup() {
  Serial.begin(9600);
  pinMode(inMeterOne, INPUT);
  pinMode(inMeterTwo, INPUT);
}

void loop() {
  currentCountMillis = millis();
  currentTransMillis = millis();
  //edge detection function and data manipulation
  stateMeterOne = digitalRead(inMeterOne);
  stateMeterTwo = digitalRead(inMeterTwo);
  if (stateMeterOne != oldMeterOne) {
    if (stateMeterOne == HIGH) {
      volumeOne = volumeOne + 0.748;
      dataArray[0] = volumeOne;
    }
    oldMeterOne = stateMeterOne;
  }
  if (stateMeterTwo != oldMeterTwo) {
    if (stateMeterTwo == HIGH) {
      volumeTwo = volumeTwo + 0.748;
      dataArray[1] = volumeTwo;
    }
    oldMeterTwo = stateMeterTwo;
  }
  /* for RF testing purposes only
    if (currentCountMillis - previousCountMillis >= intervalCount) {
    previousCountMillis = currentCountMillis;
    volumeOne = volumeOne + 0.748;
    volumeTwo = volumeTwo + 0.748;
    }
  */
  //elapsed time based writing and transmitting
  if (currentTransMillis - previousTransMillis >= intervalTrans) {
    previousTransMillis = currentTransMillis;
    Serial.println("Sending and Writing");
    transmitData();
    writeData();
  }
  //to dump the data on request (see punch list)
  downloadData();
}
void transmitData() {
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_HIGH);
  radio.setDataRate( RF24_250KBPS );
  radio.stopListening();
  radio.write(dataArray, sizeof(dataArray));
}
void writeData() {
  // make a string for assembling the data to log:
  String dataString = "";

  // read the data array and assemble the string in csv:
  for (int i = 0; i < 2; i++) {
    unsigned long value = dataArray[i];
    dataString += String(value);
    if (i < 1) {
      dataString += ",";
    }
  }
  SD.begin(sdSelect);
  File dataFile = SD.open("flowlog.txt", FILE_WRITE);
  dataFile.println(dataString);
  dataFile.close();
  Serial.println(dataString);
}
void downloadData() {

}