在中断内调用库

时间:2014-10-12 13:36:46

标签: function arduino interrupt

我这里有这个代码,当按下按钮时,LED将闪烁3-10秒,然后保持15分钟。现在,我想要做的是,如何在闪烁时间的3-10秒之后调用tinyGPS.h?我创造了一个功能,但我没有运气。

#include "TinyGPS/TinyGPS.h"

int buttonPin = 0;    
int ledPin = 1; 
int held = 5;
int ledState = LOW;         
int buttonState;             
int lastButtonState = LOW;   
long lastDebounceTime = 0;  
long debounceDelay = 50;   

void setup() 
{
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, ledState);
}

void loop() 
{
int reading = digitalRead(buttonPin);
    if (reading != lastButtonState) 
        {
            lastDebounceTime = millis();
        } 

    if ((millis() - lastDebounceTime) > debounceDelay) 
        {
            if (reading != buttonState) 
                {
                    buttonState = reading;
                    if (buttonState == HIGH) 
                        {
                            int cntr=10;
                            do
                            {
                                digitalWrite(ledPin, HIGH);   
                                delay(200);  
                                digitalWrite(ledPin, LOW);    
                                delay(200);                
                                cntr = cntr-1;
                            }       
                            while (cntr!=0);
                            digitalWrite(ledPin, HIGH);
                            delay(900000);
                            ledState = LOW;
                        }
                }
        }

  digitalWrite(ledPin, ledState);
  lastButtonState = reading;
  }

1 个答案:

答案 0 :(得分:0)

很抱歉,但是......你在标题中谈到的中断在哪里?

无论如何......如果你想在开始15分钟等待之前执行一个函数,你可以把它放在指令delay(900000);之前。

但是,如果您想在这15分钟内执行某些操作,则无法使用delay功能,因为它是阻止功能。你必须

  1. 等待更短的时间,然后执行某些操作或
  2. 使用millis()功能,如"无延迟闪烁"示例
  3. 我建议您使用第二种解决方案,因为您有更精确的等待时间,而且,这是正确的方法。

    或者,更好的是,最好的解决方案是没有像你这样的代码,而是实现一个有限状态机,将经过的时间作为改变状态的参数。

    如果你只是期待一切,我可以给你解决方案1:而不是delay(900000);

    int time_cnt;
    for(time_cnt=0; time_cnt<900; time_cnt++)
    {
        // Do something
        delay(1000);
    }
    

    每秒执行一次Do something部分;你可以根据自己的需要延长时间或缩短时间......