该温室系统采用的是上位机与下位机联动的模式,本文章主要讲述的是上位机温室监控的读取温度模块。模块使用的是温度传感器(DS18B20)数据读取,传感器概述 传感器为单线接口,使用一个接口引脚即可通信 每个传感器都有唯一的序列号,因此可以多个DS18B20存在一条总线上,可以在不同的地方放置温 度传感器 可以使用数据线供电 测量范围从-55℃至+125℃ 应用范围包括恒温控制、工业系统、消费类产品、温度计或者任何热敏系统
1、温室监控的页面设计:
2、主要程序代码
上位机的读取温度控制代码
2.1、读取温度的button按键
private void btn_TEMP_Click(object sender, EventArgs e) //读取温度
{
label4.Text = (Convert.ToDouble(greenHouse.ReadTemperture()) / 10).ToString() + "℃";
}
2.2、温度读取的主要指令
FRAME_HEAD1 = 0xAA; //帧头1
FRAME_HEAD2 = 0x55; //帧头2
FRAME_END = 0x0D; //帧尾
FRAME_DIR_CMD = 0x01; //数据方向 上位机发送命令
DEVICE_TEMP = 0x03; //设备类型 温度传感器
2.3、读取的程序代码
public int ReadTemperture() //读取温度
{
byte[] data = new byte[7];
data[0] = FRAME_HEAD1;
data[1] = FRAME_HEAD2;
data[2] = FRAME_DIR_CMD;
data[3] = DEVICE_TEMP;
data[4] = 0;
data[5] = 0;
data[6] = FRAME_END;
if (RequestSendData != null)
{
RequestSendData(data);
}
if(sema.WaitOne(200) == true) //2、使用信号变量
{
return temperature; //等待200毫秒,如果接收到就返回
}
else
{
return 0xFFFF; //没有接收到就返回一个很大的值
}
}
2.4、读取数据的主要代码
public void ReceivedRawData(byte[] data) //遍历数组中的每一个元素
{
foreach(byte b1 in data)
{
switch(pharse_state)
{
case 0:
if (b1 == FRAME_HEAD1)
pharse_state = 1;
break;
case 1:
if (b1 == FRAME_HEAD2)
pharse_state = 2;
else
pharse_state = 0;
break;
case 2:
if (b1 == FRAME_DIR_REC)
{
pharse_state = 3;
data_object.Clear();
}
else
pharse_state = 0;
break;
case 3:
data_object.Add(b1);
if(data_object.Count >= FRAME_DIR_NUM)
pharse_state = 4;
break;
case 4:
if (b1 == FRAME_END)
PhrasaseValidData(data_object);
pharse_state = 0;
break;
}
}
}
2.5、解析读取到的有效数据
private void PhrasaseValidData(List<byte> data_list) //解析有效数据
{
switch (data_list[0])
{
case DEVICE_TEMP: //读取温度
temperature = data_list[1] * 256 + data_list[2];
try
{
sema.Release(); //检测是否接收到数据
}
catch
{
//捕捉异常但不处理
}
break;
}
}