Mr.sail 发表于 2015-4-13 08:54:54

新人请教 用arduino运行程序,程序并不大,但是运行延时明显,是怎么回事

本帖最后由 Mr.sail 于 2015-4-13 09:09 编辑

用arduino执行电压、温度和转速检测,通过串口调试和观察指示灯变化,发现在运行判断指令(if)的时候会出现很明显的 延时现象,比如应该电压低于12.4v时 指示灯亮,现在情况是,指示灯会延时一到两秒钟才会被点亮。请问各位大神,这是什么原因啊?
还有温度检测部分,我用的是 DS18B20,通过串口通信,有的时候会显示真值和-127循环跳动,也没找到原因。求大神赐教






//一机程序(测速,电压检测,温度检测,蓝牙串口通讯,液晶屏显示)
//设定连接模拟电压引脚A1
//定义温度2端口
//温度报警10
//电池报警11
//霍尔元件引脚为3                                             


//温度程序定义
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2    //定义单总线连接的端口
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float vol;//温度输出值


//电压程序定义

float val ;//电压输出标志(小数)



//测速定义
unsigned long mcsj;//定义引脚高电平时间, 无符号长整数型变量
unsigned long v;//定义无符号变量v,用来表示速度
#define s 0.022//定义常数s,用来表示轮子周长(m)




//联机程序
int LJ = 4;//LIAN JI





void setup()
{
Serial.begin(9600);
sensors.begin();    //启动测温线路
pinMode(4, OUTPUT);      //连机信号
pinMode(10,OUTPUT);         //温度出错灯
pinMode(11,OUTPUT);         //电池出错灯
Serial.begin(9600);//串口波特率为9600
pinMode(3, INPUT); //设置引脚为输入模式
}



void loop()
{

//电压程序
val = analogRead(A1);                                        // 读取电压模拟值(0到1023之间)
val = map(val, 0, 1023, 0, 22440);                        // 利用“map”函数缩放该值,val(mv)
val = val/1000;
//输出电压到串口
Serial.print(val);
Serial.println(" V ");   




//测速程序
mcsj = pulseIn(3, LOW,1500000);                            //读取引脚上的高电平脉冲,最大脉冲时间间隔为1.5秒,并且把结果赋值给mcsj变量
v = s*3600000 / mcsj;
Serial.print(v);                                       //通过串口输出速度V变量
Serial.println(" km/h ");                              //输出km/h后换行




//温度程序
sensors.requestTemperatures();    //发送温度测量请求命令
Serial.print(sensors.getTempCByIndex(0));    //获取0号传感器温度数据并发送
Serial.println("℃");
delay(10);   //一秒刷新一次



//电池温度检测环节

if(vol>60)
{                                          //如果温度大于60℃ ,10号灯报警
digitalWrite(10, HIGH);
}
if(vol<57)                                 //如果温度小于57℃ ,10号灯报警解除
{
digitalWrite(10,LOW);
}
//电池电压检测环节
if(val<12.4)                                 //如果电压小于12.4v ,11号灯报警
{                                                   
digitalWrite(13, HIGH);
}
if(val>12.6)                                 //如果电压大于12.6v ,11号灯报警解除
{
digitalWrite(13,LOW);
}

if (vol<=57 && val>12.6)                                       //如果温度小于50且电压大于12.4v , 给电调启动信号,否则关闭电调信号,报警
{                                 
digitalWrite(LJ,HIGH);                                                //调动电调指令,与二机器通讯
}
if (vol>60 ||val<12.4)   
{
digitalWrite(LJ,LOW);
}}

Mr.sail 发表于 2015-4-13 09:09:58

求各位大神来帮个忙

i7456 发表于 2015-4-13 09:47:54

本帖最后由 i7456 于 2015-4-13 09:49 编辑

Mr.sail 发表于 2015-4-13 09:09 static/image/common/back.gif
求各位大神来帮个忙

pulseIn(pin, value, timeout)
Parameters
pin: the number of the pin on which you want to read the pulse. (int)
value: type of pulse to read: either HIGH or LOW. (int)
timeout (optional): the number of microseconds to wait for the pulse to start; default is one second (unsigned long)
可能是pulseIn造成的延时。

DS18B20的读取程序,也可能会造成延时,具体得看库的源程序

Mr.sail 发表于 2015-4-13 12:42:19

i7456 发表于 2015-4-13 09:47 static/image/common/back.gif
pulseIn(pin, value, timeout)
Parameters
pin: the number of the pin on which you want to read t ...

嗯嗯,我看下

Mr.sail 发表于 2015-4-13 13:04:44

i7456 发表于 2015-4-13 09:47 static/image/common/back.gif
pulseIn(pin, value, timeout)
Parameters
pin: the number of the pin on which you want to read t ...

确实是这个问题,不过怎么解决比较好呢?

i7456 发表于 2015-4-13 13:37:56

Mr.sail 发表于 2015-4-13 13:04 static/image/common/back.gif
确实是这个问题,不过怎么解决比较好呢?

测转速的传感器,间隔多长时间会出现一个脉冲?
试试改用中断的方式

Mr.sail 发表于 2015-4-13 15:39:07

i7456 发表于 2015-4-13 13:37 static/image/common/back.gif
测转速的传感器,间隔多长时间会出现一个脉冲?
试试改用中断的方式

测速的话是,最长检测时间是0.5秒
测温用中断嘛

i7456 发表于 2015-4-13 15:49:09

Mr.sail 发表于 2015-4-13 15:39 static/image/common/back.gif
测速的话是,最长检测时间是0.5秒
测温用中断嘛

测速用中断

suoma 发表于 2015-4-14 09:51:49

用中断,执行速度高

Mr.sail 发表于 2015-4-15 16:44:38

i7456 发表于 2015-4-13 15:49 static/image/common/back.gif
测速用中断

\void setup()
{
Serial.begin(9600);
sensors.begin();            //启动测温线路
pinMode(4, OUTPUT);         //连机信号
pinMode(10,OUTPUT);         //温度出错灯
pinMode(11,OUTPUT);          //电池出错灯
Serial.begin(9600);         //串口波特率为9600
pinMode(3, INPUT);          //设置引脚为输入模式
attachInterrupt(3, cs, FALLING)      //速度开中断(中断引脚数3,中断发生时调用测速,低电平发生中断)
}

这样呢?可以吗?

i7456 发表于 2015-4-15 16:59:33

Mr.sail 发表于 2015-4-15 16:44 static/image/common/back.gif
\void setup()
{
Serial.begin(9600);


cs()是怎么实现测速的?

Mr.sail 发表于 2015-4-16 19:26:45

i7456 发表于 2015-4-15 16:59 static/image/common/back.gif
cs()是怎么实现测速的?

void cs()
{
mcsj = pulseIn(3, LOW,350000);                            //读取引脚上的高电平脉冲,最大脉冲时间间隔为0.35秒,并且把结果赋值给mcsj变量
v = s*3600000 / mcsj;
Serial.print(v);                                       //通过串口输出速度V变量
Serial.println(" km/h ");                              //输出km/h后换行

}
测低低电平时间
页: [1]
查看完整版本: 新人请教 用arduino运行程序,程序并不大,但是运行延时明显,是怎么回事