使用Arduino进行温度、压力测量并自动控制的初步尝试

目录

    • 第一次尝试
    • 硬件连接图
    • 原理
    • 过程
    • 代码
    • 结果

第一次尝试

以前没有实际用Arduino做过项目,仅仅是做一些家庭娱乐的小物件儿,今天总算在工作上做了点有用的东西。原理、过程都很简单,仅仅是给自己做一个记录,方便日后学习、交流。
公司现在需要新加一台发动机实验耐久台架。之前都是在实验室,连上AVL或者Horiba的设备进行监控,但如果没有实验室条件,或者不想占用宝贵的台架资源(毕竟如果要是租用台架,一天就要好几万),那么我们发动机的运行状态就得不到外部监控了。(即使不进行外部监控,ECU仍然会时时测量发动机参数,但目前的开发阶段很多传感器未进行安装,使用的是替代值或者计算出的理论值)所以我就开始了自己搭建环境监控设备的尝试。

硬件连接图

使用Arduino进行温度、压力测量并自动控制的初步尝试_第1张图片
使用Arduino进行温度、压力测量并自动控制的初步尝试_第2张图片

原理

RTU-318E模块连接PT100热电阻,压力传感器,经过该模块处理后形成数据。要想获得温度、压力数据,必须要和这个模块进行通讯。查询手册得知该模块使用的是MODBUS协议,使用这个协议获得该模块发回的数据后,对监控的温度、压力进行判断,如果超限则切断发动机点火开关。

过程

如何连接传感器这部分就不说了,每个项目使用的传感器不同,供电、连线方式各有区别。

连接上传感器,采集器就正常运行了,但此时我并不能得到数据,必须要通讯。这个模块提供了两路连接方式:RS232和RS485。这两种连接方式都不能直接和arduino连接,必须要转接模块。鉴于我用RS232的设备较多,而且RS232转TTL的模块很便宜,(RS485转TTL的可能要几十块钱)所以我用RS232转TTL连接Arduino和采集器。
TX-RX对接,我其实一直都不是很仔细看,如果没反应就反过来接。因为有一些卖家,做模块的时候也会标反,我后来就懒得去看这两个接口正反了。
使用Arduino进行温度、压力测量并自动控制的初步尝试_第3张图片
一开始我还想要用MODBUSMASTER这个库来写,但不知道为何我的UNO板子一直没反应。后来发现可能是有些库有问题,查了很久未果,于是我从原理上来理解,发现不一定要加载MODBUS库,因为这个通讯协议仅仅是规定了通讯报文(在我理解看来就是通关密语)的格式,如果直接发送报文,也可以进行通讯的。
于是我直接打开串口调试助手,手动发送了一句报文,立马就获得了采集模块的回应。
使用Arduino进行温度、压力测量并自动控制的初步尝试_第4张图片

接下来的工作就简单多了,向串口写入报文,再获取数据。由于获取到的数据格式一致,我就直接查找字串中某个数据的位置来获得某一个通道的数据,写Arduino代码不多,本人也不是码农也不是电子工程师,仅仅是一个爱好者吧……所以写的很笨拙。
获得数据后进行判断,控制一个继电器通断。下面的代码判断了两路通道,但目前还没有学会如何将两位数字结合在一起判断,后面肯定会做的更精致一些。
先写到这里吧

代码

以下均使用Arduino的IDE1.8,7,未加载额外的库,因为实际上仅仅是向串口发送了一系列的数据,得到从站的回应数据而已。

unsigned char hexdata[8]={0x01,0x04,0x00,0x00,0x00,0x10,0xF1,0xC6};  
//Modbus 从设备手册中通信协议中规定的通信密码。
String data= "";//给定一个data的类型为String
int tem0601=0;
int tem0602=25;//修改此处的tem06两位数字可以设定温度限值=(tem0601*16+tem0602)/10
int pressure0101=0;
int pressure0102=0;//修改此处的pressure01可以设定压力限值
void setup() {
  pinMode(13,OUTPUT);
  pinMode(12,OUTPUT);
  Serial.begin(9600);
  while(Serial.read()>= 0){};
}
void loop() {
Serial.write(hexdata,8);  //发送通讯协议数组
delay(80);
while(Serial.available()>0)
  { data+=char(Serial.read());
    delay(15);
  }
Serial.print(data.charAt(13));
Serial.print(data.charAt(27));
if(int(data.charAt(13))>tem0601){ //第13位为通道6的前一位数字。常温该通道下为 00
  if(int(data.charAt(14)>tem0602)){//第14位为通道6的后一位数字。常温下约为F4-FC,此时温度为20-28度
    digitalWrite(13,HIGH);}
    else{digitalWrite(13,LOW);}
  }else{;}//Do Nothing}
delay(80);
if(int(data.charAt(26))>pressure0101){ //第27位为AI模拟量通道的前一位数字。常压是00
  if(int(data.charAt(27)>pressure0102)){//第28位为AI模拟量通道的后一位数字。常压是00
    digitalWrite(12,HIGH);}
    else{digitalWrite(12,LOW);}
  }else{;}//Do Nothing}
delay(80);
data= "";//将data存储值清空。进入下一个循环
  }
  

结果

可以实现温度超限、压力超限自动切换继电器。

你可能感兴趣的:(Arduino,学习笔记)