新人请教 用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);
}}
求各位大神来帮个忙 本帖最后由 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的读取程序,也可能会造成延时,具体得看库的源程序 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 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 static/image/common/back.gif
确实是这个问题,不过怎么解决比较好呢?
测转速的传感器,间隔多长时间会出现一个脉冲?
试试改用中断的方式 i7456 发表于 2015-4-13 13:37 static/image/common/back.gif
测转速的传感器,间隔多长时间会出现一个脉冲?
试试改用中断的方式
测速的话是,最长检测时间是0.5秒
测温用中断嘛 Mr.sail 发表于 2015-4-13 15:39 static/image/common/back.gif
测速的话是,最长检测时间是0.5秒
测温用中断嘛
测速用中断 用中断,执行速度高 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,中断发生时调用测速,低电平发生中断)
}
这样呢?可以吗? Mr.sail 发表于 2015-4-15 16:44 static/image/common/back.gif
\void setup()
{
Serial.begin(9600);
cs()是怎么实现测速的? 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]