程序写得稍多一点以后Arduino板子反应很慢-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 14267|回复: 17

[未解决] 程序写得稍多一点以后Arduino板子反应很慢

[复制链接]
发表于 2014-9-6 23:07 | 显示全部楼层 |阅读模式
主要问题就是板子写的程序稍多一些后(控制一个舵机,一个超声波测距器,一个蜂鸣器后),板子的反应感觉明显慢了了很多,想请一下这个问题是应该是出在哪里呢?是因为一块板子承载能力有限需要用第二块板子分担一下还是因为程序写的有问题?


const int TrigPin = 2;
const int EchoPin = 3;
float distance;
void setup()
{
        Serial.begin(9600);
        pinMode(12,OUTPUT);
        pinMode(TrigPin, OUTPUT);
        pinMode(EchoPin, INPUT);
        Serial.println("Ultrasonic sensor:");
}
void loop()
{
   
        digitalWrite(TrigPin, LOW);
        delayMicroseconds(2);
        digitalWrite(TrigPin, HIGH);
        delayMicroseconds(10);
        digitalWrite(TrigPin, LOW);
        distance = pulseIn(EchoPin, HIGH) / 58.00;
                if(distance<20.00){
          digitalWrite(12,HIGH);
          delay(1000);
}
        else{
          digitalWrite(12,LOW);
}
        Serial.print(distance);
        Serial.print("cm");
        Serial.println();
        delay(100);
}

      具体程序如上,这个程序是我控制超声波测距模块和一个蜂鸣器,这个板子反应速度还是挺快的。


const int TrigPin = 2;
const int EchoPin = 3;
float distance;
#include <Servo.h>
Servo myservo;  
int pos = 0;   


void setup() {


        Serial.begin(9600);
        pinMode(12,OUTPUT);
        pinMode(TrigPin, OUTPUT);
        pinMode(EchoPin, INPUT);
    Serial.println("Ultrasonic sensor:");
     myservo.attach(9);  
}


void loop() {
  voice();
  duoji();


}


void voice()
{
      
        digitalWrite(TrigPin, LOW);
        delayMicroseconds(2);
        digitalWrite(TrigPin, HIGH);
        delayMicroseconds(10);
        digitalWrite(TrigPin, LOW);
        distance = pulseIn(EchoPin, HIGH) / 58.00;
                if(distance<20.00){
          digitalWrite(12,HIGH);
          delay(1000);
}
        else{
          digitalWrite(12,LOW);
}
        Serial.print(distance);
        Serial.print("cm");
        Serial.println();
        delay(100);


}


void duoji(){
      for(pos = 0; pos < 180; pos += 1)  
     {  
        myservo.write(pos);  
        delay(15);
      }
      for(pos = 180; pos>=1; pos-=1)
      {                              
        myservo.write(pos);
        delay(15);
      }
  }


  

如上,是再多加上了一个舵机后板子反应速就很慢了。这个问题不知道是自己这个程序写的有问题还是一块板子承载能力有限,烦指教。

发表于 2014-9-7 15:22 | 显示全部楼层
这么多delay()当然慢了。。这里delay()一点,那里delay()一点。。合起来就慢了。。

发表于 2014-9-7 10:38 | 显示全部楼层

回帖奖励 +1 金币

怎么叫慢呢?
发表于 2014-9-7 13:47 | 显示全部楼层
后面一个比前面一个多那么多延时,相对来说,肯定慢啊……
发表于 2014-9-9 10:13 | 显示全部楼层
跑在for循环里  用mills判断
 楼主| 发表于 2014-9-10 00:53 | 显示全部楼层

就是本来想法是超声波测距模块测得distance小于10就蜂鸣器报警,可是综合程序加上舵机以后检测到小于十厘米后会过比较长的一段时间后才报警
 楼主| 发表于 2014-9-10 00:57 | 显示全部楼层
hp198969 发表于 2014-9-7 13:47
后面一个比前面一个多那么多延时,相对来说,肯定慢啊……

求问下要怎么改啊
 楼主| 发表于 2014-9-10 00:58 | 显示全部楼层
pencilstart 发表于 2014-9-7 15:22
这么多delay()当然慢了。。这里delay()一点,那里delay()一点。。合起来就慢了。。

...

求告知怎么改啊,才接触还是不太会写
发表于 2014-9-10 09:40 | 显示全部楼层
本帖最后由 pencilstart 于 2014-9-10 13:10 编辑
天道 发表于 2014-9-10 00:58
求告知怎么改啊,才接触还是不太会写

上面有朋友不是说了么?
跑在for循环里  用mills判断

如果不好把全部的delay整合,你就在每个函数里这样
[mw_shl_code=c,true]static unsigned long lastt = millis();

void foo() {
unsigned long currentt;unsgiend long delayms = 1000;

currentt = millis();
if( currentts - lastt > delayms  ) {
    // do something you want
   lastt = currents;
}
}
[/mw_shl_code]

不过,你要为每个函数的delay定义一个专用的静态lastt了。并且,我看到你有的是几个分支不同的delay,所以你可能需要整合delay time,把它们都平铺成在一个for循环内,满足时间条件才需要执行的动作
 楼主| 发表于 2014-9-10 13:37 | 显示全部楼层
.oο麽麽茶㊣ 发表于 2014-9-9 10:13
跑在for循环里  用mills判断

求明示啊啊啊啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 07:31 , Processed in 0.181460 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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