极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18842|回复: 11

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

[复制链接]
发表于 2015-4-13 08:54:54 | 显示全部楼层 |阅读模式
本帖最后由 Mr.sail 于 2015-4-13 09:09 编辑

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






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


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


  14. //电压程序定义

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



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




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





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



  32. void loop()
  33. {  

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




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



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


  53. //电池温度检测环节

  54. if(vol>60)
  55. {                                            //如果温度大于60℃ ,10号灯报警
  56. digitalWrite(10, HIGH);
  57. }
  58. if(vol<57)                                 //如果温度小于57℃ ,10号灯报警解除
  59. {
  60.   digitalWrite(10,LOW);
  61. }
  62. //电池电压检测环节
  63. if(val<12.4)                                   //如果电压小于12.4v ,11号灯报警
  64. {                                                     
  65. digitalWrite(13, HIGH);
  66. }
  67. if(val>12.6)                                   //如果电压大于12.6v ,11号灯报警解除
  68. {
  69.   digitalWrite(13,LOW);
  70. }

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

回复

使用道具 举报

 楼主| 发表于 2015-4-13 09:09:58 | 显示全部楼层
求各位大神来帮个忙
回复 支持 反对

使用道具 举报

发表于 2015-4-13 09:47:54 | 显示全部楼层
本帖最后由 i7456 于 2015-4-13 09:49 编辑
Mr.sail 发表于 2015-4-13 09:09
求各位大神来帮个忙


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的读取程序,也可能会造成延时,具体得看库的源程序
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-13 12:42:19 | 显示全部楼层
i7456 发表于 2015-4-13 09:47
pulseIn(pin, value, timeout)
Parameters
pin: the number of the pin on which you want to read t ...

嗯嗯,我看下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-13 13:04:44 | 显示全部楼层
i7456 发表于 2015-4-13 09:47
pulseIn(pin, value, timeout)
Parameters
pin: the number of the pin on which you want to read t ...

确实是这个问题,不过怎么解决比较好呢?
回复 支持 反对

使用道具 举报

发表于 2015-4-13 13:37:56 | 显示全部楼层
Mr.sail 发表于 2015-4-13 13:04
确实是这个问题,不过怎么解决比较好呢?

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

使用道具 举报

 楼主| 发表于 2015-4-13 15:39:07 | 显示全部楼层
i7456 发表于 2015-4-13 13:37
测转速的传感器,间隔多长时间会出现一个脉冲?
试试改用中断的方式

测速的话是,最长检测时间是0.5秒
测温用中断嘛
回复 支持 反对

使用道具 举报

发表于 2015-4-13 15:49:09 | 显示全部楼层
Mr.sail 发表于 2015-4-13 15:39
测速的话是,最长检测时间是0.5秒
测温用中断嘛

测速用中断
回复 支持 反对

使用道具 举报

发表于 2015-4-14 09:51:49 | 显示全部楼层
用中断,执行速度高
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-15 16:44:38 | 显示全部楼层
i7456 发表于 2015-4-13 15:49
测速用中断

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

这样呢?可以吗?
回复 支持 反对

使用道具 举报

发表于 2015-4-15 16:59:33 | 显示全部楼层
Mr.sail 发表于 2015-4-15 16:44
\void setup()
{
  Serial.begin(9600);

cs()是怎么实现测速的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-16 19:26:45 | 显示全部楼层
i7456 发表于 2015-4-15 16:59
cs()是怎么实现测速的?
  1. void cs()
  2. {
  3.   mcsj = pulseIn(3, LOW,350000);                            //读取引脚上的高电平脉冲,最大脉冲时间间隔为0.35秒,并且把结果赋值给mcsj变量
  4.   v = s*3600000 / mcsj;
  5.   Serial.print(v);                                         //通过串口输出速度V变量
  6.   Serial.println(" km/h ");                                //输出km/h后换行

  7. }
复制代码
测低低电平时间
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 09:07 , Processed in 0.041923 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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