带有gsm屏蔽的arduino uno R3输入引脚 [英] arduino uno R3 input pins with gsm shield
问题描述
在我的项目中,我需要从水流传感器读取输入数据.当我用2或3针连接水流时,它工作良好,但当我将其连接到任何其他针上时,它不起作用.这成为一个问题,因为我需要使用GSM屏蔽,并且您知道为arduino和调制解调器保留的针脚2,3和7
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
代码:
#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
}
推荐答案
请阅读 https://www.arduino.cc/en/Reference/AttachInterrupt :
...
...
attachInterrupt的第一个参数是中断号.通常,您应该使用digitalPinToInterrupt(pin)将实际的数字引脚转换为特定的中断号.例如,如果连接到引脚3,则使用digitalPinToInterrupt(3)作为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 ;
}
这篇关于带有gsm屏蔽的arduino uno R3输入引脚的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!