/********************************************************** This is example code for using the Adafruit liquid flow meters. Tested and works great with the Adafruit plastic and brass meters ------> http://www.adafruit.com/products/828 ------> http://www.adafruit.com/products/833 Connect the red wire to +5V, the black wire to common ground and the yellow sensor wire to pin #2 Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! Written by Limor Fried/Ladyada for Adafruit Industries. BSD license, check license.txt for more information All text above must be included in any redistribution **********************************************************/ #include "LiquidCrystal.h" LiquidCrystal lcd(7, 8, 9, 10, 11, 12); // which pin to use for reading the sensor? can use any pin! #define FLOWSENSORPIN 2 // count how many pulses! volatile uint16_t pulses = 0; // track the state of the pulse pin volatile uint8_t lastflowpinstate; // you can try to keep time of how long it is between pulses volatile uint32_t lastflowratetimer = 0; // and use that to calculate a flow rate volatile float flowrate; // Interrupt is called once a millisecond, looks for any pulses from the sensor! SIGNAL(TIMER0_COMPA_vect) { uint8_t x = digitalRead(FLOWSENSORPIN); if (x == lastflowpinstate) { lastflowratetimer++; return; // nothing changed! } if (x == HIGH) { //low to high transition! pulses++; } lastflowpinstate = x; flowrate = 1000.0; flowrate /= lastflowratetimer; // in hertz lastflowratetimer = 0; } void useInterrupt(boolean v) { if (v) { // Timer0 is already used for millis() - we'll just interrupt somewhere // in the middle and call the "Compare A" function above OCR0A = 0xAF; TIMSK0 |= _BV(OCIE0A); } else { // do not call the interrupt function COMPA anymore TIMSK0 &= ~_BV(OCIE0A); } } void setup() { Serial.begin(9600); Serial.print("Flow sensor test!"); lcd.begin(16, 2); pinMode(FLOWSENSORPIN, INPUT); digitalWrite(FLOWSENSORPIN, HIGH); lastflowpinstate = digitalRead(FLOWSENSORPIN); useInterrupt(true); } void loop() // run over and over again { lcd.setCursor(0, 0); lcd.print("Pulses:"); lcd.print(pulses, DEC); lcd.print(" Hz:"); lcd.print(flowrate); //lcd.print(flowrate); Serial.print("Freq: "); Serial.println(flowrate); Serial.print("Pulses: "); Serial.println(pulses, DEC); // if a plastic sensor use the following calculation // Sensor Frequency (Hz) = 7.5 * Q (Liters/min) // Liters = Q * time elapsed (seconds) / 60 (seconds/minute) // Liters = (Frequency (Pulses/second) / 7.5) * time elapsed (seconds) / 60 // Liters = Pulses / (7.5 * 60) float liters = pulses; liters /= 7.5; liters /= 60.0; /* // if a brass sensor use the following calculation float liters = pulses; liters /= 8.1; liters -= 6; liters /= 60.0; */ Serial.print(liters); Serial.println(" Liters"); lcd.setCursor(0, 1); lcd.print(liters); lcd.print(" Liters "); delay(100); }