How to access more than one HALL sensor?

Using YF-G21's from Seeed Studios I have this code but can't figure out how to get it to read from more than one sensor:

// reading liquid flow rate using Seeeduino and Water Flow Sensor from Seeedstudio.com
// Code adapted by Charles Gantt from PC Fan RPM code written by Crenn @thebestcasescenario.com
// http:/themakersworkbench.com http://thebestcasescenario.com http://seeedstudio.com

/*
+5v red
ground black
yellow to resistor and +5v and pin 2
http://www.themakersworkbench.com/?q=node/399

*/

volatile int NbTopsFan; //measuring the rising edges of the signal
int Calc;                               
int hallsensor = 2;    //The pin location of the sensor

void rpm ()     //This is the function that the interupt calls 
{ 
  NbTopsFan++;  //This function measures the rising and falling edge of the hall effect sensors signal
} 
// The setup() method runs once, when the sketch starts
void setup() //
{ 
  pinMode(hallsensor, INPUT); //initializes digital pin 2 as an input
  Serial.begin(9600); //This is the setup function where the serial port is initialised,
  attachInterrupt(0, rpm, RISING); //and the interrupt is attached
} 
// the loop() method runs over and over again,
// as long as the Arduino has power
void loop ()    
{
  NbTopsFan = 0;	//Set NbTops to 0 ready for calculations
  sei();		//Enables interrupts
  delay (1000);	//Wait 1 second
  cli();		//Disable interrupts
  Calc = (NbTopsFan * 60 / 7.5); //(Pulse frequency x 60) / 7.5Q, = flow rate in L/hour 
  Serial.print (Calc, DEC); //Prints the number calculated above
  Serial.print (" L/hour\r\n"); //Prints "L/hour" and returns a  new line
}

I was also trying to get it to flash an LED to give me an indication as to the flow-rate (this also includes some of the code I was trying to use for 3 sensors):

// reading liquid flow rate using Seeeduino and Water Flow Sensor from Seeedstudio.com
// Code adapted by Charles Gantt from PC Fan RPM code written by Crenn @thebestcasescenario.com
// http:/themakersworkbench.com http://thebestcasescenario.com http://seeedstudio.com

/*
+5v red
ground black
yellow to resistor and +5v and pin 2
http://www.themakersworkbench.com/?q=node/399

*/

volatile int NbTopsFan; //measuring the rising edges of the signal
int Calc;                               
int hallsensor1 = 8;    //The pin location of the sensor
int hallsensor2 = 9;    //The pin location of the sensor
int hallsensor3 = 10;    //The pin location of the sensor

void rpm ()     //This is the function that the interupt calls 
{ 
  NbTopsFan++;  //This function measures the rising and falling edge of the hall effect sensors signal
} 



// The setup() method runs once, when the sketch starts
void setup() //
{ 
  pinMode(hallsensor1, INPUT); //initializes digital pin 2 as an input
  pinMode(hallsensor2, INPUT); //initializes digital pin 2 as an input
  pinMode(hallsensor3, INPUT); //initializes digital pin 2 as an input
  Serial.begin(9600); //This is the setup function where the serial port is initialised,
  attachInterrupt(0, rpm0, RISING); //and the interrupt is attached
  attachInterrupt(1, rpm1, RISING); //and the interrupt is attached
  attachInterrupt(2, rpm2, RISING); //and the interrupt is attached
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(4, OUTPUT);
} 
// the loop() method runs over and over again,
// as long as the Arduino has power
void loop ()    
{
  NbTopsFan = 0;	//Set NbTops to 0 ready for calculations
  sei();		//Enables interrupts
  delay (1000);
  cli();		//Disable interrupts
  Calc = (NbTopsFan * 60 / 7.5); //(Pulse frequency x 60) / 7.5Q, = flow rate in L/hour 
  Serial.print (Calc, DEC); //Prints the number calculated above
  Serial.print (" L/hour\r\n"); //Prints "L/hour" and returns a  new line
  blinkLED(4, abs(Calc/100));


  NbTopsFan = 0;	//Set NbTops to 0 ready for calculations
  sei();		//Enables interrupts
  delay (1000);
  cli();		//Disable interrupts
  Calc = (NbTopsFan * 60 / 7.5); //(Pulse frequency x 60) / 7.5Q, = flow rate in L/hour 
  Serial.print (Calc, DEC); //Prints the number calculated above
  Serial.print (" L/hour\r\n"); //Prints "L/hour" and returns a  new line
  blinkLED(5, abs(Calc/100));


}

void blinkLED(int ledNum, int blinkCount){
  for (int x = 0; x < blinkCount; x++) { 
    Serial.println(x);
  digitalWrite(ledNum,HIGH);
  delay (5000);
  digitalWrite(ledNum,LOW);
  delay (5000);
  }  
  
}

Where is the interrupt?

Doc

The Arduino UNO only has two external interrupts, on pins 2 and 3.

To use three interrupts you would need an Arduino MEGA which has external interrupts on pins 2, 3, 21, 20, 19, and 18.

Neither has interrupts on pins 8, 9, and 10.

You could use pin change interrupts.

  digitalWrite(ledNum,HIGH);
  delay (5000);
  digitalWrite(ledNum,LOW);
  delay (5000);

You also might want to get rid of the delay() calls, unless you want to do nothing else for 10 seconds.

Thanks all! :slight_smile: I have a few different arduinos, one's a mega so I'll try that.

interrupt 0 is pin 2 and 1 is pin 3 right?

That's right, on the Uno.

wrek:
interrupt 0 is pin 2 and 1 is pin 3 right?

Yes, and on the Mega: 2 is pin 21, 3 is pin 20, 4 is pin 19 and 5 is pin 18. The pins are listed in the documentation for attachInterrupt():

Here are some libraries that help with using 'pin change' interrupts:

http://arduino.cc/playground/Main/PinChangeInt
http://arduino.cc/playground/Main/PcInt

Here is some background information and examples: Arduino Playground - HomePage