极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 34876|回复: 11

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

[复制链接]
发表于 2013-11-19 00:05:41 | 显示全部楼层 |阅读模式
大家好,我最近才学习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秒后停止。求各位大神帮忙想想办法!
谢谢
回复

使用道具 举报

发表于 2013-11-19 02:05:42 | 显示全部楼层
去看看millis();
回复 支持 反对

使用道具 举报

发表于 2013-11-19 07:28:29 | 显示全部楼层
建议去看看 《计算机程序设计艺术》(The Art of Computer Programming)

回复 支持 反对

使用道具 举报

发表于 2013-11-19 07:33:42 | 显示全部楼层
方法很简单,把你的程序放到setup()里,loop()里不加任何语句,setup()只执行一次。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-19 08:44:34 | 显示全部楼层
春泥蛋炒饭 发表于 2013-11-19 07:33
方法很简单,把你的程序放到setup()里,loop()里不加任何语句,setup()只执行一次。

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

使用道具 举报

发表于 2013-11-19 09:19:12 | 显示全部楼层
循环中加入计数器,闪几下跳出来。
回复 支持 反对

使用道具 举报

发表于 2013-11-19 10:25:03 | 显示全部楼层
用for语句放到setup里面,arduino没有程序中断
回复 支持 反对

使用道具 举报

发表于 2013-11-19 14:18:03 | 显示全部楼层
我也遇到同样的问题
回复 支持 反对

使用道具 举报

发表于 2013-11-19 15:04:08 | 显示全部楼层
用for语句放到setup里面可以实现你要的结果,不过这之后整个系统就停了,这有什么用?应该给重新启动加个条件。
回复 支持 反对

使用道具 举报

发表于 2013-11-19 18:15:52 | 显示全部楼层
你直接复制7次亮灭过程,不就可以实现你的想法了。如果,能用for循环来实现语句会更简单。
回复 支持 反对

使用道具 举报

发表于 2013-11-19 19:08:22 | 显示全部楼层
setup()只會執行一次,結束之後就進loop()
如果你寫在setup(),跑完一次系統就卡在loop()裡
直接在loop()裡面跑8秒的話,在delay()時啥都不能做

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

  3. #define switchPin A0
  4. #define ledPin 3

  5. int timerNumber = -1;

  6. void flash(){
  7.   digitalWrite(ledPin, !digitalRead(ledPin));
  8. }

  9. void setup(){
  10.   Serial.begin(9600);
  11.   pinMode(switchPin, INPUT);
  12.   pinMode(ledPin, OUTPUT);
  13. }

  14. void loop(){
  15.   timer.run();
  16.   int switchValue = analogRead(switchPin);
  17.   if(switchValue > 100){
  18.     if(timerNumber >= 0){
  19.       timer.deleteTimer(timerNumber);
  20.       timerNumber = -1;
  21.     }
  22.     analogWrite(ledPin, map(switchValue, 100, 1024, 10, 250));
  23.   }
  24.   else if(timerNumber < 0){
  25.     digitalWrite(ledPin, false);
  26.     timerNumber = timer.setTimer(500, flash, 8*2);
  27.   }
  28.   
  29.   delay(10);
  30. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2013-11-20 12:23:49 | 显示全部楼层
那就不要用loop了。直接写一个函数。设置定时器,写个while或者for,时间到了break函数。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-11 05:09 , Processed in 0.044647 second(s), 29 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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