|
本帖最后由 123bac 于 2015-1-10 21:40 编辑
本系统选用STC125A60S2,系统主要由单片机控制、水池水位控制、VB上位机组成。对土壤的湿度,环境的温度、湿度、光照进行检测进行检测,土壤湿度经过12位模数转换芯片(TLC2543)处理,最多支持11路的输入。光照检测采用数字光照传感器。在LCD12864上显示。测得的数据通过单片机的串行口发送给上位机显示实时数据曲线,改变,数据存储。VB上位机监测系统,可以实时监控的变化情况,设置相应变量的报警值,通过上位机可以进行手动浇水。本系统下位机用户可以设置浇水量光照土壤湿度的下限值。设置的值可以存储在EEPROM中具有掉电保护。可通过手机用蓝牙进行手动浇水,电源可以通过太阳能电池板对蓄电池充电节约能源。
硬件调试无错以后才能进行软件部分的编写调试。整个系统软件是灵魂,软件的调试分两部分下位机和VB上位机。一、首先通过编写各传感器单独运行的小程序包括实时时钟DS1302测试、Arduino Moisture Sensor 土壤湿度传感器测试、BH1750光照采集测试、DHT11温湿度采集测试。二、VB上位机的调试,首先通过串口调试助检查串口接收的数据是否与下位机上12864上显示的值。串口接收的数据正常以后打开VB上位机配置串口号,波特率。通过联机测试实时数据、波形图是否能够准确绘制,数据能否保存,报表是否能输出,按键是否能够控制下位机的电磁阀。三、蓝牙通信的调试。
VB上位机程序节选
*********************************************************************/
Dim z_start As Boolean '开始标志位
Dim ovt As Integer
Dim in_data(7) As Byte
Dim t_z_start As Boolean
Dim z_start_turang As Boolean '土壤湿度起始位
Dim turang_ovt As Integer
Dim turang_in_data(7) As Byte '土壤数据接收数组
Dim t_ovt As Integer
Dim t_in_data(7) As Byte
Dim wenduzhi(20) As Single '图片1
Dim wenduzhi_k As Integer
Dim time_count As Integer
Dim line_k As Integer
Dim time_count1 As Integer '图片2
Dim wenduzhi_k1 As Integer
Dim line_k1 As Integer
Dim wenduzhi1(20) As Single
'Dim time_count3 As Integer '图片3
'Dim wenduzhi_k3 As Integer
'Dim line_k3 As Integer
'Dim wenduzhi3(20) As Single
Private Sub Combo1_Click()
On Error GoTo BLAK
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
MSComm1.CommPort = Combo1.ListIndex + 1
MSComm1.PortOpen = True
Else
MSComm1.CommPort = Combo1.ListIndex + 1
MSComm1.PortOpen = True
End If
Exit Sub
BLAK:
MsgBox "串口不存在或者被占用!", vbOKOnly, "提示信息"
End Sub
Private Sub Combo2_Change()
MSComm1.Settings = Combo2.Text & "n,8,1"
End Sub
Private Sub Command1_Click()
Dim key_liang(0) As Byte
key_liang(0) = &H3 '开
MSComm1.Output = key_liang
MSComm1.Output = key_liang
MSComm1.Output = key_liang
MSComm1.Output = key_liang
MSComm1.Output = key_liang
End Sub
Private Sub Command2_Click()
Dim key_mie(0) As Byte
key_mie(0) = &H4 '关
MSComm1.Output = key_mie
MSComm1.Output = key_mie
MSComm1.Output = key_mie
MSComm1.Output = key_mie
MSComm1.Output = key_mie
End Sub
Private Sub Command3_Click()
Timer1.Enabled = False '停止记录
End Sub
Private Sub Command4_Click()
Timer1.Enabled = True '开始记录
End Sub
Private Sub Command5_Click()
监视控制界面.Hide
Form2.Show
End Sub
Private Sub Command6_Click()
监视控制界面.Hide
Form2.Hide
Form3.Show
End Sub
Private Sub Form_Load()
Combo1.ListIndex = 0
Combo2.ListIndex = 0
MSComm1.InputMode = comInputModeBinary
监视控制界面.Hide
Form2.Hide
Form3.Show
End Sub
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive ' 收到 RThreshold # ofchars.
xv: Dim hk As Variant
hk = MSComm1.Input
'第0通道数据接受与处理******************************************** 温度
If hk(0) = &HFA Then '通道0的开始标志位
z_start = True
ovt = 0
End If
If hk(0) = &HFB Then '通道0的结束标志位
z_start = False
Text1.Text = in_data(1) & in_data(2)
End If
If z_start = True Then
in_data(ovt) = hk(0)
ovt = ovt + 1
End If
'第1通道数据接受与处理*****************************************湿度
If hk(0) = &HFC Then '通道0的开始标志位
t_z_start = True
t_ovt = 0
End If
If hk(0) = &HFD Then '通道0的结束标志位
t_z_start = False
Text2.Text = t_in_data(1) & t_in_data(2)
End If
If t_z_start = True Then
t_in_data(t_ovt) = hk(0)
t_ovt = t_ovt + 1
End If
'第2通道数据接受与处理*****************************************土壤
If hk(0) = &HF0 Then '通道0的开始标志位
z_start_turang = True
turang_ovt = 0
End If
If hk(0) = &HF1 Then '通道0的结束标志位
z_start_turang = False
Text7.Text = turang_in_data(1) & turang_in_data(2) & turang_in_data(3) '百,十 , 个
End If
If z_start_turang = True Then
turang_in_data(turang_ovt) = hk(0)
turang_ovt = turang_ovt + 1
End If
If MSComm1.InBufferCount <> 0 Then
GoTo xv
End If
End Select
'判断是否报警 温度 text3上限值 text4下限值 text5上限值 text6下限值
If (Val(Text1.Text) > Val(Text3.Text)) Or (Val(Text1.Text) < Val(Text4.Text)) Or (Val(Text2.Text) > Val(Text5.Text)) Or (Val(Text2.Text) < Val(Text6.Text)) Then
Shape1.BackColor = &HFF& '红色 背景色
Else
Shape1.BackColor = &H8000&
End If
If (Val(Text1.Text) < Val(Text3.Text)) And (Val(Text1.Text) > Val(Text4.Text)) And (Val(Text2.Text) < Val(Text5.Text)) And (Val(Text2.Text) > Val(Text6.Text)) Then
Shape1.BackColor = &HC00000 '蓝色
End If
End Sub
Private Sub Picture3_Click()
End Sub
Private Sub Timer1_Timer()
Adodc1.Recordset.AddNew '添加新的
'将文本框中用户输入的各个字段值添加到数据库相应的字段中
Adodc1.Recordset.Fields("室温") = Val(Text1.Text)
Adodc1.Recordset.Fields("土壤湿度") = Val(Text2.Text)
'Adodc1.Recordset.Fields("湿度") = Val(Text7.Text)
Adodc1.Recordset.Fields("时间") = Now
Adodc1.Recordset.Update '更新数据
'第一张图片
Picture1.Picture = LoadPicture("") '每次都清空
For wenduzhi_k = 0 To 18 '循环
wenduzhi(wenduzhi_k) = wenduzhi(wenduzhi_k + 1) '后的数值赋给前一个
Next wenduzhi_k
wenduzhi(18) = Val(Text1.Text) * 30 '将实时温度值赋给第十八个 *
'开始画线
For line_k = 0 To 18 'picture1.scalewidth画面的 宽度 Picture1.ScaleHeight4/5作为标签 wenduzhi(line_k)改变坐标的起始位置原来是左上角的改为左下角 中间的Y: Picture1.ScaleHeight / 5 * 4 - wenduzhi(line_k + 1
Picture1.Line ((time_count) * Picture1.ScaleWidth / 18, Picture1.ScaleHeight / 5 * 4 - wenduzhi(line_k))-((time_count + 1) * Picture1.ScaleWidth / 18, Picture1.ScaleHeight / 5 * 4 - wenduzhi(line_k + 1)), vbWhite
time_count = time_count + 1
If (time_count * Picture1.ScaleWidth / 18 > Picture1.ScaleWidth) Then '要改变坐标的起始位置
time_count = 0 '超出画面的范围
End If
Next line_k
'第二张图片
Picture2.Picture = LoadPicture("")
For wenduzhi_k1 = 0 To 18
wenduzhi1(wenduzhi_k1) = wenduzhi1(wenduzhi_k1 + 1)
Next wenduzhi_k1
wenduzhi1(18) = Val(Text2.Text) * 20
'开始划线
For line_k1 = 0 To 18
Picture2.Line ((time_count1) * Picture2.ScaleWidth / 18, Picture2.ScaleHeight / 5 * 4 - wenduzhi1(line_k1))-((time_count1 + 1) * Picture2.ScaleWidth / 18, Picture2.ScaleHeight / 5 * 4 - wenduzhi1(line_k1 + 1)), vbWhite
time_count1 = time_count1 + 1
If (time_count1 * Picture2.ScaleWidth / 18 > Picture2.ScaleWidth) Then
time_count1 = 0
End If
End Sub
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|