问题
In my project i need to read input data from water flow sensor. It works well when i wire water flow with pin 2 or 3 , but does not work work when i wire it to any other pins. It becomes a problem because i need to use GSM shield and you know pins 2,3 and 7 reserved for arduino and modem
the code:
#include <LiquidCrystal.h> // initialize the library with the numbers of the interface pins
LiquidCrystal lcd(5, 6, 9, 10, 11, 12);
volatile int TopsFan; //measuring the rising edges of the signal
int result;
int pin = 2; //The pin location of the sensor
void rpm () //This is the function that the interrupt calls
{
TopsFan++; //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(pin, INPUT); //initializes digital pin 2 as an input
Serial.begin(9600); //This is the setup function where the
serial port is initialized(USB port)
attachInterrupt(0, rpm, RISING); // the interrupt is attached
}
lcd.begin(16, 2); // set up the LCD's number of columns and rows
lcd.print("The water flow: "); // Print a message to the LCD.
// the loop() method runs over and over again,
// as long as the Arduino has power
void loop ()
{
TopsFan = 0; //Set TopsFan to 0 ready for calculations
sei(); //Enables interrupts
delay (1000); //Wait 1 second
cli(); //Disable interrupts
result = (TopsFan * 60 / 7.5); //(Pulse frequency x 60) /
7.5Q, = flow rate in L/min
lcd.setCursor(0, 1); //prepare the cursor on the screen
lcd.print(result, DEC); //Prints the number calculated above
lcd.print(" L/min\r\n"); //Prints "L/min" and returns a new
line
}
回答1:
Pls read https://www.arduino.cc/en/Reference/AttachInterrupt :
...
...
The first parameter to attachInterrupt is an interrupt number. Normally you should use digitalPinToInterrupt(pin) to translate the actual digital pin to the specific interrupt number. For example, if you connect to pin 3, use digitalPinToInterrupt(3) as the first parameter to attachInterrupt.
Board Digital Pins Usable For Interrupts
Uno, Nano, Mini, other 328-based 2, 3
...
...
It would seem you need to try a different approach, perhaps bypassing interrupts altogether. Something like the following:
#include <LiquidCrystal.h> // initialize the library with the numbers of the interface pins
int count_rpm(void) ;
LiquidCrystal lcd(5, 6, 9, 10, 11, 12);
int flow_pin = 5 ; //The pin location of the sensor (5 or whatever suits you)
// The setup() method runs once, when the sketch starts
void setup()
{
pinMode(flow_pin, INPUT); //initializes digital pin 2 as an input
Serial.begin(9600); //This is the setup function where the serial port is initialized(USB port)
lcd.begin(16, 2); // set up the LCD's number of columns and rows
lcd.print("The water flow: "); // Print a message to the LCD.
}
// the loop() method runs over and over again,
// as long as the Arduino has power
void loop ()
{
int result;
result = (count_rpm() * 60 / 7.5); //(Pulse frequency x 60) / 7.5Q, = flow rate in L/min
lcd.setCursor(0, 1); //prepare the cursor on the screen
lcd.print(result, DEC); //Prints the number calculated above
lcd.print(" L/min\r\n"); //Prints "L/min" and returns a new line
}
int count_rpm(void)
{
long start = millis() ;
int count = 0 ;
boolean current_state ;
boolean previous_state = digitalRead(flow_pin) ;
for( ; millis()-start <= 1000 ; )
{
current_state = digitalRead(flow_pin) ;
if (current_state && !previous_state)
count++ ;
previous_state = current_state ;
}
return count ;
}
来源:https://stackoverflow.com/questions/36382676/arduino-uno-r3-input-pins-with-gsm-shield