磁动力电子网-雕刻机DIY论坛,单片机论坛,CNCDIY,DIYCNC

 找回密码
 加入磁动力

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 792|回复: 8

[应用实例] 【处女作】DIY行车落锁,串口OBDII通讯。

[复制链接]
发表于 2015-8-17 11:38:17 | 显示全部楼层 |阅读模式
本帖最后由 sexyhgf 于 2015-8-17 11:43 编辑

初学8天的作品 各种QQ群抱大腿 各种百度抄袭借鉴代码 各种头疼头晕 好歹胡蒙乱碰弄出个能凑合用的东西来 窃喜之余来显摆显摆
代码绝大部分是抄袭某大神的串口通讯教程 还有几部分细节磁力群各位大神提供了帮助C语言帮助和基础知识教学 再次表示感谢对俺这种小白不抛弃不放弃的崇高共产主义精神~

近日突发奇想 想给自己的车子加上行车落锁的功能 就是当车速到达20km/h时 自动锁车门(很多便宜些的车子都没这功能,实际是车厂耍流氓,在ecu里写两句逻辑是很简单的事情)
淘宝上有200块的行车落锁+4窗升降成品可买 但作为一个有理想有追求的DIYer 能自己做的东西 绝不买成品 于是以远超成品的价格买了几个小部件回来折腾....

目标需求:
从行车电脑(ecu)读取车速信息 车速达到20km以上后arduino 控制小型继电器吸合 锁车按钮引出飞线并联到小型继电器常开端子上 模拟按下锁车按钮

所用部件:
arduino + OBDII开发模块 + 光耦隔离继电器模块

制作匆忙 没仔细拍照 就这几张了:

驾驶位左手的按键板





引出锁车按钮的飞线





全家福 arduino + OBDII模块 + 继电器模块


装盒 收工~

代码如下: 写的不科学不严谨 还望各位前辈轻拍...
  1. int incomingByte = 0;          // 接收到的 data byte
  2. String inputString = "";         // 用来储存接收到的内容
  3. boolean newLineReceived = false; // 前一次数据结束标志

  4. unsigned char RPMhex[8] = {0x33,0xCC,0x01,0x29,0x29,0x0D,0x0A}; //请求时速
  5. //Serial.write(RPMhex, 8);

  6. int LED=13;         //通过led闪烁来判断是否发出了请求指令以及所处的程序位置
  7. int LockDoor=12;    //12脚用于触发继电器模块的光耦

  8. byte Locked=0;       //判断是否已经触发过继电器锁车门,锁了后就进入死循环不再动作。

  9. void setup()
  10. {
  11.   Serial.begin(115200); //设定通讯端口及速率
  12. pinMode(LED,OUTPUT);      //13脚测试灯
  13. pinMode(LockDoor,OUTPUT); //12脚触发光耦
  14. }


  15. void loop()
  16. {
  17.   if (Locked==1)
  18. {
  19. //===传说中的停止响应===
  20. digitalWrite(LED,HIGH); //长亮13脚的led,说明车门已锁。
  21.   while(Locked > 10){ } //进入死循环不再往下执行判断及动作,因为serialEvent()相当于中断,
  22.                         //所以串口有数据来的时候它还会去接收,不过因为死循环的关系,没机会去判断时速了。
  23. //======================
  24. }

  25. //********数据校验正确后的判断部分*************
  26. else if (newLineReceived)
  27.    {
  28. //     Serial.print(inputString);  // 这里只是简单的将它打出来了,你可以根据自己的要求来用你接收到的数据......
  29.    
  30. int KM=inputString[4]; //摘取单字节数字1f在第五位上 33 cc 02 a9 1f c8 0d 0a 时速km/h
  31. //    Serial.print(KM);
  32.             if(KM>0x14) //0x14=20KM,0x1f=31km,十六进制的.此处判断计算时速并作出相应动作。
  33.             {
  34. digitalWrite(LockDoor,HIGH);
  35. delay(2000);
  36. digitalWrite(LockDoor,LOW);
  37. Locked=1;
  38.   inputString = "";
  39.   Serial.flush();
  40.   newLineReceived = false;
  41.             }
  42.             else
  43.             {
  44.   inputString = "";
  45.   Serial.flush();
  46.   newLineReceived = false;
  47.              }
  48.             
  49. }

  50. //串口没有数据过来 就 闪烁4下 清空缓存 再次请求数据 并等待5秒
  51.     else
  52.     {
  53.       delay(1000);     
  54.       digitalWrite(LED,HIGH);
  55.       delay(500);
  56.       digitalWrite(LED,LOW);
  57.       delay(100);
  58.       digitalWrite(LED,HIGH);
  59.       delay(500);
  60.       digitalWrite(LED,LOW);
  61.       delay(100);
  62.       digitalWrite(LED,HIGH);
  63.       delay(500);
  64.       digitalWrite(LED,LOW);
  65.       delay(100);
  66.       digitalWrite(LED,HIGH);
  67.       delay(500);
  68.       digitalWrite(LED,LOW);

  69.     Serial.flush();
  70.     Serial.write(RPMhex, 7);
  71.     delay(5000);
  72.     }


  73.    
  74. }

  75. //serialEvent()是IDE1.0及以后版本新增的功能,相当于中断功能。

  76. void serialEvent()
  77. {
  78.   while (Serial.available())
  79.   {   
  80.     incomingByte = Serial.read();       //一个字节一个字节地读,下一句是读到的放入字符串数组中组成一个完成的数据包
  81.     inputString += (char) incomingByte;  // 全双工串口可以不用在下面加延时,半双工则要加的//
  82.     delay(2);

  83.      // 下面就是所谓的通讯协议了,如果接收到了换行符号,本例是定义了这次串口通讯数据接收结束//
  84.      // 其他的你还可以加一些规则,比如数据包起始位,规定一个数据包就是以FF为开头的,如果不是就不接收//
  85.      // 也可以加上数据校验位,同样在这里做一个校验判断,如果不符合,则将数据包丢掉,再通过一个标志位写个值,//
  86.      //在主程序里面让发送方重发(主程序里面都写一条IF就行了)//

  87.      if (incomingByte == '\n') //结束位为换行符\n也就是0A,则本次接收数据完成,到下面去校验数据。
  88.     {

  89.      byte CRC=(inputString[3]+inputString[4]);//校验位在[5],算法是[3]+[4]=[5].
  90.      byte crcc=(inputString[5]);

  91.      if(CRC==crcc) //校验位 正确缓闪3下,不正确快闪3下。
  92. {
  93.       delay(1000);
  94.       digitalWrite(LED,HIGH);
  95.       delay(200);
  96.       digitalWrite(LED,LOW);
  97.       delay(200);
  98.       digitalWrite(LED,HIGH);
  99.       delay(200);
  100.       digitalWrite(LED,LOW);
  101.       delay(200);
  102.       digitalWrite(LED,HIGH);
  103.       delay(200);
  104.       digitalWrite(LED,LOW);      
  105.         newLineReceived = true;
  106. }
  107. else
  108. {
  109.       delay(1000);
  110.       digitalWrite(LED,HIGH);
  111.       delay(50);
  112.       digitalWrite(LED,LOW);
  113.       delay(50);
  114.       digitalWrite(LED,HIGH);
  115.       delay(50);
  116.       digitalWrite(LED,LOW);
  117.       delay(50);
  118.       digitalWrite(LED,HIGH);
  119.       delay(50);
  120.       digitalWrite(LED,LOW);
  121.         inputString = "";
  122.         Serial.flush();
  123.         newLineReceived = false;
  124. }

  125.   
  126. //     newLineReceived = true;
  127.     }   
  128.   }
  129. }
复制代码

目前已装在车上 工作情绪稳定 开心~~ 再就是程序方面自己觉得写得不够科学 如果大神们有空 还望帮忙优化一下 谢谢
回复

使用道具 举报

发表于 2015-8-17 11:48:33 | 显示全部楼层
我看图来的,不错,赞一个,授精
回复 支持 反对

使用道具 举报

发表于 2015-8-17 13:38:27 | 显示全部楼层
咋看是“處女”帖。這也太處了吧,程序都這么長。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-17 16:16:29 | 显示全部楼层
惭愧 拿着点灯注释凑字数来着。。。{:soso_e113:}
回复 支持 反对

使用道具 举报

发表于 2015-8-17 17:37:41 | 显示全部楼层
候总,我能定制一套吗?{:soso_e113:}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-26 17:26:02 | 显示全部楼层
大头文 发表于 2015-8-17 17:37
候总,我能定制一套吗?

又来笑话俺~
以你的水准10分钟就写完了 俺可是写了78天呢...泪奔ing。。。
回复 支持 反对

使用道具 举报

发表于 2015-8-28 10:30:12 | 显示全部楼层
sexyhgf 发表于 2015-8-26 17:26
又来笑话俺~
以你的水准10分钟就写完了 俺可是写了78天呢...泪奔ing。。。

10分钟就写完说的是耗子温总。{:soso_e113:}我10天也写不出来{:soso_e101:}
回复 支持 反对

使用道具 举报

发表于 2015-11-25 22:35:30 来自手机频道 | 显示全部楼层
营养贴啊,赶紧收藏了。
来自: 微社区
回复 支持 反对

使用道具 举报

发表于 2016-1-1 01:44:19 | 显示全部楼层
厉害   8天就是高手了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入磁动力

本版积分规则

QQ|小黑屋|手机版|Archiver|www.cdle.net 磁动力电子网 2001-2017 ( 粤ICP备10098153号

粤公网安备 44040402000001号

GMT+8, 2019-1-21 09:38

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.