带有 gsm 屏蔽的 arduino uno R3 输入引脚 [英] arduino uno R3 input pins with gsm shield

查看:37
本文介绍了带有 gsm 屏蔽的 arduino uno R3 输入引脚的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的项目中,我需要从水流传感器读取输入数据.当我用引脚 2 或 3 连接水流时,它运行良好,但当我将它连接到任何其他引脚时不起作用.这成为一个问题,因为我需要使用 GSM 屏蔽,并且您知道针脚 2,3 和 7 保留给 arduino 和调制解调器

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆