1 /* 2 * Author: Jon Trulson <jtrulson@ics.com> 3 * Copyright (c) 2015 Intel Corporation. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining 6 * a copy of this software and associated documentation files (the 7 * "Software"), to deal in the Software without restriction, including 8 * without limitation the rights to use, copy, modify, merge, publish, 9 * distribute, sublicense, and/or sell copies of the Software, and to 10 * permit persons to whom the Software is furnished to do so, subject to 11 * the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be 14 * included in all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 #pragma once 25 26 #include <string> 27 #include <stdint.h> 28 #include <sys/time.h> 29 #include <mraa/gpio.h> 30 31 namespace upm { 32 33 /** 34 * @brief Grove Water Flow Sensor library 35 * @defgroup grovewfs libupm-grovewfs 36 * @ingroup seeed gpio liquid eak 37 */ 38 39 /** 40 * @library grovewfs 41 * @sensor grovewfs 42 * @comname Grove Water Flow Sensor 43 * @type liquid 44 * @man seeed 45 * @web http://www.seeedstudio.com/wiki/index.php?title=G1/2_Water_Flow_sensor 46 * @con gpio 47 * @kit eak 48 49 * @brief API for the Grove Water Flow Sensor 50 * 51 * This sensor is used to measure water flow in liters per 52 * minute (LPM). It incorporates a Hall Effect sensor. The UPM module 53 * defines an interrupt routine to be triggered on each low pulse, 54 * keeping count. This device requires a 10K pull-up resistor for 55 * the signal line (yellow wire). There is a schematic diagram on 56 * the SeeedStudio site (3/2015): 57 * http://www.seeedstudio.com/wiki/index.php?title=G1/2_Water_Flow_sensor 58 * 59 * However, be careful when wiring this up - the schematic appears to 60 * have a bug in it: the lower left connection of the signal line 61 * (yellow) to Vcc (red) should not be there. The sensor can work 62 * with this connection, but probably not for very long. 63 * 64 * @image html grovewfs.jpg 65 * @snippet grovewfs.cxx Interesting 66 */ 67 class GroveWFS { 68 public: 69 /** 70 * Grove Water Flow sensor constructor 71 * 72 * @param pin Digital pin to use 73 */ 74 GroveWFS(int pin); 75 /** 76 * GroveWFS destructor 77 */ 78 ~GroveWFS(); 79 /** 80 * Returns the number of milliseconds elapsed since initClock() 81 * was last called. 82 * 83 * @return Elapsed milliseconds 84 */ 85 uint32_t getMillis(); 86 87 /** 88 * Resets the clock 89 * 90 */ 91 void initClock(); 92 93 /** 94 * Resets the flow counter to 0. The flow counter should be 95 * stopped via stopFlowCounter() prior to calling this function. 96 * 97 */ clearFlowCounter()98 void clearFlowCounter() { m_flowCounter = 0; }; 99 100 /** 101 * Starts the flow counter 102 * 103 */ 104 void startFlowCounter(); 105 106 /** 107 * Stops the flow counter 108 * 109 */ 110 void stopFlowCounter(); 111 112 /** 113 * Gets the flow counter 114 * 115 * @return Flow counter 116 */ flowCounter()117 uint32_t flowCounter() { return m_flowCounter; }; 118 119 /** 120 * Computes the flow rate in liters per minute (LPM) 121 * 122 * @return Computed flow rate 123 */ 124 float flowRate(); 125 126 private: 127 /** 128 * Flow interrupt service routine (ISR) 129 * 130 */ 131 static void flowISR(void *ctx); 132 133 volatile uint32_t m_flowCounter; 134 struct timeval m_startTime; 135 mraa_gpio_context m_gpio; 136 bool m_isrInstalled; 137 }; 138 } 139 140 141