极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 40293|回复: 25

【关于内部中断】求教如何在loop中控制LED亮5s后灭掉

[复制链接]
发表于 2015-4-14 16:36:26 | 显示全部楼层 |阅读模式
本帖最后由 奶妃 于 2015-4-16 10:07 编辑

我写了一个程序,通过4个超声波测距来控制7个LED的亮灭。在控制过程中,我需要使LED7先亮5s之后,灭掉(再也不会亮)。
在实际操作中,一开始我使用了delay,想简单地让led7一直保持LOW,直接delay15s,在此期间触发第三个超声波测距,让其控制led7灭;但是这样会导致超声波测距也受到delay的影响。

下面是我原先写好的程序的第二个部分:
const int T2 = 6;
const int E2 = 7;
float distance2;
int led2 = 8;
int led6 = 9;
int led7 = 10;
int b = 0;

void setup()
{
//超声波测距模块2
//初始化串口通信及连接SR04的引脚
        Serial.begin(9600);
        pinMode(T2, OUTPUT);
//设置输入状态
        pinMode(E2, INPUT);
        pinMode(led2,OUTPUT);
        pinMode(led6,OUTPUT);
        pinMode(led7,OUTPUT);
        digitalWrite(led2,LOW);
        digitalWrite(led6,LOW);
        digitalWrite(led7,LOW);
        
}

void loop()
{
//超声波测距模块2
//产生一个10us的高脉冲去触发TrigPin
        digitalWrite(T2, LOW);
        delayMicroseconds(2);
        digitalWrite(T2, HIGH);
        delayMicroseconds(10);
        digitalWrite(T2, LOW);
//检测脉冲宽度,并计算出距离
        distance2 = pulseIn(E2, HIGH) / 58.00;
        Serial.print("distance2=");
        Serial.print(distance2);
        Serial.println("cm");
        delay(500);
        
        
//第二部分程序控制LED1,LED2,LED6,LED7
        if((distance2 >=8)&&(distance2 <=15))
          b = 1;
         else
          b = 0;
         
        Serial.print("b=");
        Serial.println(b);

        
        if(b == 1){
          digitalWrite(led1,LOW);
          digitalWrite(led2,HIGH);
          digitalWrite(led6,HIGH);
        
          digitalWrite(led7,HIGH);
          delay(5000);
          digitalWrite(led7,LOW);
          delay(15000);     //在15s内触发第三个超声波传感器,利用3控制LED7灭
       }
}

以上程序无法实现我想要的简单效果,然后我这几天查了关于各种定时器的使用,但是编写出来的程序运行起来一团糟。并且由于我的程序都在loop里,会让中断一直不停。


想求教如何实现“如何在loop中控制LED亮5s后灭掉”
这个问题可能很小白但是拜托了求解答QUQ


回复

使用道具 举报

发表于 2015-4-14 19:02:23 | 显示全部楼层
先記下亮燈時間, 把狀態設定為亮燈.  
在 loop 內如果狀態是亮燈, 就檢查現在時間是否比記下的時間過了 5 秒, 是的話就關掉, 並更新狀態為關掉.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-14 20:06:57 | 显示全部楼层
Super169 发表于 2015-4-14 19:02
先記下亮燈時間, 把狀態設定為亮燈.  
在 loop 內如果狀態是亮燈, 就檢查現在時間是否比記下的時間過了 5  ...

这里不能用millis(),那是要使用pulseIn函数么?
我查了一下,大概是要这样使用pulseIn么?

const int T2 = 6;
const int E2 = 7;
float distance2;
int led1 = 4;
int led2 = 8;
int led6 = 9;
int led7 = 10;
int b = 0;
unsigned long duration;

void setup()
{
//超声波测距模块2
//初始化串口通信及连接SR04的引脚
        Serial.begin(9600);
        pinMode(T2, OUTPUT);
//设置输入状态
        pinMode(E2, INPUT);
        pinMode(led2,OUTPUT);
        pinMode(led6,OUTPUT);
        pinMode(led7,OUTPUT);
        digitalWrite(led2,LOW);
        digitalWrite(led6,LOW);
        digitalWrite(led7,LOW);
        
}

void loop()
{
//超声波测距模块2
//产生一个10us的高脉冲去触发TrigPin
        digitalWrite(T2, LOW);
        delayMicroseconds(2);
        digitalWrite(T2, HIGH);
        delayMicroseconds(10);
        digitalWrite(T2, LOW);
//检测脉冲宽度,并计算出距离
        distance2 = pulseIn(E2, HIGH) / 58.00;
        Serial.print("distance2=");
        Serial.print(distance2);
        Serial.println("cm");
        delay(500);
        
        
//第二部分程序控制LED1,LED2,LED6,LED7
        if((distance2 >=8)&&(distance2 <=15))
          b = 1;
         else
          b = 0;
         
        Serial.print("b=");
        Serial.println(b);

        
        if(b == 1){
          digitalWrite(led1,LOW);
          digitalWrite(led2,HIGH);
          digitalWrite(led6,HIGH);
         
          digitalWrite(led7,HIGH);
         
          if(pulseIn(led7,HIGH,5000));
          digitalWrite(led7,LOW);


         
       }
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-14 20:12:32 | 显示全部楼层
Super169 发表于 2015-4-14 19:02
先記下亮燈時間, 把狀態設定為亮燈.  
在 loop 內如果狀態是亮燈, 就檢查現在時間是否比記下的時間過了 5  ...

还是说要用什么语句来记录这个5s呢?QUQ实在是晕头转向了,拜托您给个大概的解释。
回复 支持 反对

使用道具 举报

发表于 2015-4-14 20:39:37 | 显示全部楼层
用 unsigned long 去記錄時間, t = millis();
檢查是否已過了 5s,   (millis() - t) > 5000;
回复 支持 反对

使用道具 举报

发表于 2015-4-14 21:15:53 | 显示全部楼层
建议考虑使用scoop系统。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-14 21:30:47 | 显示全部楼层
Super169 发表于 2015-4-14 20:39
用 unsigned long 去記錄時間, t = millis();
檢查是否已過了 5s,   (millis() - t) > 5000;

经过您的指导之后觉得这个方法真的好易懂!很兴奋地去试验了一下之后发现QUQ
如图上,我设定了    t71 = millis();        t72 = millis() - t71;
程序运行时串口监视器显示t71与t72几乎同步,从未达成灯灭条件是咋回事儿?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-14 22:02:09 | 显示全部楼层
Super169 发表于 2015-4-14 20:39
用 unsigned long 去記錄時間, t = millis();
檢查是否已過了 5s,   (millis() - t) > 5000;

是不是millis(),一直是代表的系统运行时间,所以并不能这样使用?
回复 支持 反对

使用道具 举报

发表于 2015-4-15 00:52:29 来自手机 | 显示全部楼层
本帖最后由 ofourme 于 2015-4-15 00:54 编辑

试试这样写吧。 if(b == 1){ t_start=millis(): digitalWrite(led7,HIGH); } if(millis()-t_start>5000) { digitalWrite(led7,LOW); }
手机打字麻烦,剩下的楼主自己完善。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-15 08:43:44 | 显示全部楼层
ofourme 发表于 2015-4-15 00:52
试试这样写吧。 if(b == 1){ t_start=millis(): digitalWrite(led7,HIGH); } if(millis()-t_start>5000) {  ...

你好~~代码根据你说的实验了一下,依旧行不通。灯一直亮着,输出一直同步QUQ

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2015-4-15 09:17:19 | 显示全部楼层
本帖最后由 Super169 于 2015-4-15 09:18 编辑
奶妃 发表于 2015-4-15 08:43
你好~~代码根据你说的实验了一下,依旧行不通。灯一直亮着,输出一直同步QUQ


你有認真看我的回覆嗎?

http://www.geek-workshop.com/for ... 14648&pid=91286



http://www.geek-workshop.com/for ... 14648&pid=91294
回复 支持 反对

使用道具 举报

发表于 2015-4-15 10:09:53 | 显示全部楼层
本帖最后由 i7456 于 2015-4-15 22:45 编辑
奶妃 发表于 2015-4-14 21:30
经过您的指导之后觉得这个方法真的好易懂!很兴奋地去试验了一下之后发现QUQ
如图上,我设定了    t71 = ...


t71的值不需要每次都更新,定义一个全局变量flag控制t71的更新;
  1. int flag = 0;
复制代码

  1. if(b == 1){
  2.   digitalWrite(led1,LOW);
  3.   digitalWrite(led2,HIGH);
  4.   digitalWrite(led6,HIGH);
  5.         
  6.   digitalWrite(led7,HIGH);
  7.   if(flag == 0){
  8.     t71 = millis();
  9.     flag = 1;
  10.   }

  11.   t72 = millis() - t71;
  12.   if(t72>=5000){
  13.     digitalWrite(led7,LOW);
  14.     flag = 0;
  15.   }   
  16. }
复制代码


回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-15 22:13:31 | 显示全部楼层
i7456 发表于 2015-4-15 10:09
t71的值不需要每次都更新,定义一个全局变量flag控制t71的更新;
int flag = 0;[/code]

0 0我将程序原原本本照着~输进去了,然后出现了t71全部输出0的结果。
是不是因为一开始int flag = 0,然后下面判断时候就判断为程序最初呢?我有点迷糊

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-15 22:16:38 | 显示全部楼层
Super169 发表于 2015-4-15 09:17
你有認真看我的回覆嗎?

http://www.geek-workshop.com/forum.php?mod=redirect&goto=findpost&ptid= ...

看了呀都.....也可能是我理解问题...实在是不好意思的!
回复 支持 反对

使用道具 举报

发表于 2015-4-15 22:44:57 | 显示全部楼层
奶妃 发表于 2015-4-15 22:13
0 0我将程序原原本本照着~输进去了,然后出现了t71全部输出0的结果。
是不是因为一开始int flag = 0,然 ...

if(flag == 0)
sorry,应该是这样
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-7 23:33 , Processed in 0.055253 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表