首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在中断内调用库

在中断内调用库
EN

Stack Overflow用户
提问于 2014-10-12 21:36:46
回答 1查看 50关注 0票数 0

我在这里有这个代码,当按下按钮时,LED将闪烁3-10秒,然后保持15分钟。现在,我想要做的是,我如何调用tinyGPS.h来准确地在3-10秒的闪烁时间之后执行?我已经创建了一个函数,但我没有运气。

代码语言:javascript
运行
复制
#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;
  }
EN

回答 1

Stack Overflow用户

发布于 2014-10-13 03:31:16

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

不管怎样..。如果你想在开始15分钟等待之前执行一次函数,你可以把它放在指令delay(900000);之前。

但是,如果你想在这15分钟内做一些事情,你不能使用delay函数,因为它是一个阻塞函数。你不得不

  1. 等待较短的时间,然后执行某项操作或
  2. 使用millis()函数,如“无延迟眨眼”示例所示。

我建议您使用第二种解决方案,因为您有更精确的等待时间,而且这是实现这一目标的正确方法。

或者,更好的是,最好的解决方案不是拥有像您这样的代码,而是实现一个有限状态机,并将运行时间作为更改状态的参数。

如果你只想把所有的东西都放在盘子里,我可以给你写出解决方案1:代替delay(900000);

代码语言:javascript
运行
复制
int time_cnt;
for(time_cnt=0; time_cnt<900; time_cnt++)
{
    // Do something
    delay(1000);
}

这将每秒执行一次Do something部分;您可以根据需要延长或缩短时间...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26325697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档