van_wilder 发表于 2013-11-19 00:05:41

如何给void loop里面的循环语句给个终止时间?

大家好,我最近才学习arduino。发现是一个比较好玩的东西。现在脑袋里有一个想法,但是一直无法从语句里面来实现,希望各路大神帮我出出主意。

我的程序很简单int switch1=A0;

int PWM1=8;

int value1=0;

void setup()
{
pinMode(switch1, INPUT);

pinMode(PWM1, OUTPUT);

Serial.begin(9600);
}

void loop()
{
value1=analogRead(switch1);

if(value1==0)
{
    digitalWrite(PWM1, LOW);
}
    else
{
    digitalWrite(PWM1, HIGH);
    delay(1000);
    digitalWrite(PWM1, LOW);
    delay(1000);
}
}


这是一个很简单的控制LED灯亮暗的程序,在开关关闭后LED灯闪亮。
我现在想让灯只闪亮8秒中。即void loop循环语句的运行时间是8秒。


我试过在倒数第二个大括号外面加delay(8000),结果发现灯亮了一秒后暗9秒。
我也试过将循环语句除void loop之外的全部程序框起来加delay(8000),结果发现亮暗一次后停止8秒再次进行亮暗。


我想实现的结果是亮暗不停的闪烁直到8秒后停止。求各位大神帮忙想想办法!
谢谢

isilcala 发表于 2013-11-19 02:05:42

去看看millis();

szpapas 发表于 2013-11-19 07:28:29

建议去看看 《计算机程序设计艺术》(The Art of Computer Programming)

春泥蛋炒饭 发表于 2013-11-19 07:33:42

方法很简单,把你的程序放到setup()里,loop()里不加任何语句,setup()只执行一次。

van_wilder 发表于 2013-11-19 08:44:34

春泥蛋炒饭 发表于 2013-11-19 07:33 static/image/common/back.gif
方法很简单,把你的程序放到setup()里,loop()里不加任何语句,setup()只执行一次。

我的意思是loop()里面的循环持续8秒的时间,在这8秒里面loop()里面的语句一直循环。就是比方说灯亮1秒然后再暗1秒,这样亮暗4组后持续8秒后停止。改变灯亮暗的持续时间,比如delay(500),那么就是8秒里面灯亮暗8组。

林定祥 发表于 2013-11-19 09:19:12

循环中加入计数器,闪几下跳出来。

swatkxs 发表于 2013-11-19 10:25:03

用for语句放到setup里面,arduino没有程序中断

学慧放弃 发表于 2013-11-19 14:18:03

我也遇到同样的问题

simatic_net 发表于 2013-11-19 15:04:08

用for语句放到setup里面可以实现你要的结果,不过这之后整个系统就停了,这有什么用?应该给重新启动加个条件。

浩然轩 发表于 2013-11-19 18:15:52

你直接复制7次亮灭过程,不就可以实现你的想法了。如果,能用for循环来实现语句会更简单。:lol

Be1ieve 发表于 2013-11-19 19:08:22

setup()只會執行一次,結束之後就進loop()
如果你寫在setup(),跑完一次系統就卡在loop()裡
直接在loop()裡面跑8秒的話,在delay()時啥都不能做

用timer控制閃爍隨時要開關都行,不過對初學者可能難了點#include <SimpleTimer.h>
SimpleTimer timer;

#define switchPin A0
#define ledPin 3

int timerNumber = -1;

void flash(){
digitalWrite(ledPin, !digitalRead(ledPin));
}

void setup(){
Serial.begin(9600);
pinMode(switchPin, INPUT);
pinMode(ledPin, OUTPUT);
}

void loop(){
timer.run();
int switchValue = analogRead(switchPin);
if(switchValue > 100){
    if(timerNumber >= 0){
      timer.deleteTimer(timerNumber);
      timerNumber = -1;
    }
    analogWrite(ledPin, map(switchValue, 100, 1024, 10, 250));
}
else if(timerNumber < 0){
    digitalWrite(ledPin, false);
    timerNumber = timer.setTimer(500, flash, 8*2);
}

delay(10);
}

wu110han 发表于 2013-11-20 12:23:49

那就不要用loop了。直接写一个函数。设置定时器,写个while或者for,时间到了break函数。
页: [1]
查看完整版本: 如何给void loop里面的循环语句给个终止时间?