【关于内部中断】求教如何在loop中控制LED亮5s后灭掉
本帖最后由 奶妃 于 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
先記下亮燈時間, 把狀態設定為亮燈.
在 loop 內如果狀態是亮燈, 就檢查現在時間是否比記下的時間過了 5 秒, 是的話就關掉, 並更新狀態為關掉.
Super169 发表于 2015-4-14 19:02 static/image/common/back.gif
先記下亮燈時間, 把狀態設定為亮燈.
在 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);
}
} Super169 发表于 2015-4-14 19:02 static/image/common/back.gif
先記下亮燈時間, 把狀態設定為亮燈.
在 loop 內如果狀態是亮燈, 就檢查現在時間是否比記下的時間過了 5...
还是说要用什么语句来记录这个5s呢?QUQ实在是晕头转向了,拜托您给个大概的解释。 用 unsigned long 去記錄時間, t = millis();
檢查是否已過了 5s, (millis() - t) > 5000;
建议考虑使用scoop系统。 Super169 发表于 2015-4-14 20:39 static/image/common/back.gif
用 unsigned long 去記錄時間, t = millis();
檢查是否已過了 5s, (millis() - t) > 5000;
经过您的指导之后觉得这个方法真的好易懂!很兴奋地去试验了一下之后发现QUQ
如图上,我设定了 t71 = millis(); t72 = millis() - t71;
程序运行时串口监视器显示t71与t72几乎同步,从未达成灯灭条件是咋回事儿?
Super169 发表于 2015-4-14 20:39 static/image/common/back.gif
用 unsigned long 去記錄時間, t = millis();
檢查是否已過了 5s, (millis() - t) > 5000;
是不是millis(),一直是代表的系统运行时间,所以并不能这样使用? 本帖最后由 ofourme 于 2015-4-15 00:54 编辑
试试这样写吧。 if(b == 1){ t_start=millis(): digitalWrite(led7,HIGH); } if(millis()-t_start>5000) { digitalWrite(led7,LOW); }
手机打字麻烦,剩下的楼主自己完善。 ofourme 发表于 2015-4-15 00:52 static/image/common/back.gif
试试这样写吧。 if(b == 1){ t_start=millis(): digitalWrite(led7,HIGH); } if(millis()-t_start>5000) {...
你好~~代码根据你说的实验了一下,依旧行不通。灯一直亮着,输出一直同步QUQ
本帖最后由 Super169 于 2015-4-15 09:18 编辑
奶妃 发表于 2015-4-15 08:43 static/image/common/back.gif
你好~~代码根据你说的实验了一下,依旧行不通。灯一直亮着,输出一直同步QUQ
你有認真看我的回覆嗎?
http://www.geek-workshop.com/forum.php?mod=redirect&goto=findpost&ptid=14648&pid=91286
及
http://www.geek-workshop.com/forum.php?mod=redirect&goto=findpost&ptid=14648&pid=91294 本帖最后由 i7456 于 2015-4-15 22:45 编辑
奶妃 发表于 2015-4-14 21:30 static/image/common/back.gif
经过您的指导之后觉得这个方法真的好易懂!很兴奋地去试验了一下之后发现QUQ
如图上,我设定了 t71 = ...
t71的值不需要每次都更新,定义一个全局变量flag控制t71的更新;
int flag = 0;
if(b == 1){
digitalWrite(led1,LOW);
digitalWrite(led2,HIGH);
digitalWrite(led6,HIGH);
digitalWrite(led7,HIGH);
if(flag == 0){
t71 = millis();
flag = 1;
}
t72 = millis() - t71;
if(t72>=5000){
digitalWrite(led7,LOW);
flag = 0;
}
}
i7456 发表于 2015-4-15 10:09 static/image/common/back.gif
t71的值不需要每次都更新,定义一个全局变量flag控制t71的更新;
int flag = 0;
0 0我将程序原原本本照着~输进去了,然后出现了t71全部输出0的结果。
是不是因为一开始int flag = 0,然后下面判断时候就判断为程序最初呢?我有点迷糊
Super169 发表于 2015-4-15 09:17 static/image/common/back.gif
你有認真看我的回覆嗎?
http://www.geek-workshop.com/forum.php?mod=redirect&goto=findpost&ptid= ...
看了呀都.....也可能是我理解问题...实在是不好意思的! 奶妃 发表于 2015-4-15 22:13 static/image/common/back.gif
0 0我将程序原原本本照着~输进去了,然后出现了t71全部输出0的结果。
是不是因为一开始int flag = 0,然 ...
if(flag == 0)
sorry,应该是这样
页:
[1]
2