小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 10080|回复: 3

我尝试在小车上加入温度监控功能,但是出了问题,求助

[复制链接]
发表于 2017-5-14 13:36:40 | 显示全部楼层 |阅读模式
小车是DS版,无红外,有超声波。我在A2口接入了一枚LM35温度传感器,然后用论坛里给到的通过串口上传传感器信息的代码,进行数据上传。
具体程序是这样的:

void temperature_check()   //温度监控
  {
    int n = analogRead(A2);    //读取A2口的电压值
    float t = n * (5.0/1023.0*100);   //使用浮点数存储温度数据,温度数据由电压值换算得到
//此处后续加入十进制转十六进制代码
    unsigned char hexdata[8] = {0xFF,0x63,0x00,t,0xFF};
    Serial.write(hexdata, 8);
//    Serial.println(t);                   //串口输出温度数据
    delay(500);                           //等待0.5秒,控制刷新速度
  }

然后在loop函数中加入这段代码:

void loop()
  {  
    while(1)
    {
        Get_uartdata();
        UartTimeoutCheck();
        Cruising_Mod();
        temperature_check();      
      }  
    }


完整的代码文件见附件
现在的情况是,温度能成功显示在上位机,但是小车接收不到指令,包括四轮和舵机都不动。一定概率还会出现不仅接受不到指令,温度也传不上来,同时一侧的轮子会跟随Arduino上的LED一起,亮(转)一秒,灭(停)一秒,如此往复的情况……猜测跟Delayed()函数有关。但不知道ledpin是如何影响到M2一侧的车轮电机的。
如果在loop()中将temperature_check();    注释,即屏蔽这段代码,小车又能恢复正常。


wifi板使用的是5.0版的,根据http://www.wifi-robots.com/thread-2985-1-1.html这个帖子中的开通双向数据教程,打开/etc/inittab这个文件后,并没有ttyATH0::askfirst:/bin/ash --login这一行,有的是下面三行
::sysinit:/etc/init.d/rcS S boot
::shutdown:/etc/init.d/rcS K shutdown
::askconsole:/bin/ash --login

前两行没变,第三行不一样。不知道wifi板的双向数据有没有开通呢。

现在的问题是,如何改动,才能达到在保留原来所有功能的同时,加入温度实时监控的功能呢?

这个改造跟我的毕业设计有关,希望各位大大能给予支持,帮助解决!非常感谢!!

wifi_robot_temperature_check.zip (3.4 KB, 下载次数: 21)
回复

使用道具 举报

 楼主| 发表于 2017-5-14 14:36:26 | 显示全部楼层
或者说有没有类似的例程可以参考呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-15 10:53:27 | 显示全部楼层
在这里问也没人回……上淘宝找客服咨询,解决了
原因是loop函数里加入有延时的函数会扰乱原有的代码,因此建议我使用中断函数。
因此我参考http://blog.csdn.net/c80486/article/details/52622035这个帖子,使用定时中断,完美解决了问题
具体代码如下

#include <MsTimer2.h>              
先要导入MsTimer2.h这个库,源代码中已经导入了的

void temperature_check()   //温度监控
  {
    int n = analogRead(A5);    //读取A5口的电压值
    float t = n * (5.0/1023.0*100);   //使用浮点数存储温度数据,温度数据由电压值换算得到
    //此处后续加入十进制转十六进制代码
    unsigned char hexdata[8] = {0xFF,0x63,0x00,t,0xFF};
    Serial.write(hexdata, 8);
    Serial.println(t);                   //串口输出温度数据
}
此为中断服务程序,就是中断后执行的部分

void setup()
{
//这里是原有的部分,这里省略
    MsTimer2::set(2000, temperature_check); //设置中断,每2000ms进入一次中断服务程序 temperature_check()  
    MsTimer2::start(); //开始计时  
}
这是在setup函数中加入的计时中断函数

测试通过!
回复 支持 反对

使用道具 举报

发表于 2017-9-7 17:09:09 | 显示全部楼层
先学习了,不错!
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-11-26 07:09 , Processed in 1.093618 second(s), 23 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

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