# 基于Android的温室大棚温湿度查询系统 **Repository Path**: hilam8899/gbiot_app ## Basic Information - **Project Name**: 基于Android的温室大棚温湿度查询系统 - **Description**: 基于Android的温室大棚温湿度查询系统 - **Primary Language**: Android - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-02-20 - **Last Updated**: 2025-02-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README
随着物联网技术的不断发展,温室大棚种植业向着智慧化、物联化发展,智慧农业越来越成为我国农业发展的重要方向。目前我国农业生产依旧存在生产模式相对落后,科技水平应用性对较低的情况,且大部分温室监测系统需要在固定终端使用,缺乏灵活性、高效性、实时性。针对以上种种问题,设计开发了基于Android的温室大棚温湿度查询系统,使得生产人员能够实时了解到温室大棚作物生产环境,并及时做出相关调控,实现了物联化,智能化,自动化的智慧温室大棚。
本设计是一个较为完整物联网项目,包括硬件硬件方面和软件方面两个部分组成。不仅开发难度大,知识储备要求高,同时也要进行大量的测试以保证软硬件的数据交互。所以设计目标如下:
(1)硬件方面,传感器实时收集温室大棚温度、湿度数据并传输到Arduino电子平台,同步处理数据并将封装好的数据通过蓝牙模块发送到Android应用进行实时监控。
(2)软件方面,Android蓝牙模块实时接收数据,数据存入数据库,界面实时监控并且具有超限报警功能,温湿度上下限可由使用者设置。
(3)软硬件数据顺利实现交互,数据报文格式正确,保证数据可靠传输。
先来看一下整体的架构图:硬件部分由Arduino开源平台、DHT11温湿度传感器、HC05蓝牙串口模块组成。软件部分由Android应用做上位机接受数据。传感器将采集到的温湿度数据传输到Arduino,数据经过封装处理在通过蓝牙串口模块将数据发送到手机APP,从而将温湿度数据在APP实时显示出来。在APP上可以设置温湿度告警的阈值,超过阈值将提示“偏高”或者“偏低”,进行相应的报警功能。

此模块主要目的是利用Dht11传感器实时获取环境的温湿度数据,通过总线传输到Arduino主控平台。DHT11只有一根数据线,数据线与8位单片机相连接,将封装好的数据传输到Arduino电子平台。

图 3-2 DHT11温湿度传感器模块
Arduino Mega 2560是基于ATmega2560的主控开发板。本设计通过使用Arduino Mega 2560接收DHT11温湿度传感器所传采集的数字电平信号,将其数据处理封装,再利用USART串口输送到HC05蓝牙模块,将其传输到APP应用,该模块是硬件电路的核心。

图 3-3 ArduinoMega2560开发板
HC05蓝牙模块是市面上常见的蓝牙串口模块。内部封装了蓝牙2.0协议,开发不需要知道协议的具体内通体,只要将数据发送到蓝牙模块的缓存区,就可以进行蓝牙之间的数据通信。本设计应用HC05蓝牙模块,每间隔5秒向安卓APP发送蓝牙数据报文,传输温湿度数据。

图 3-4 蓝牙模块
蓝牙通信模块主要负责蓝牙链接的管理和蓝牙数据的可靠传输。蓝牙通信的三个基本步骤:搜索、配对、连接。首先用户点击搜索按钮转到蓝牙信号界面,如果设备没有开启蓝牙将提示请求开启,之后显示蓝牙热点列表,用户搜连接到HC05模块数据热点进行匹配,匹配成功之后将进行HC05蓝牙模块和APP的数据传输。

图 3-5 蓝牙配对流程图
温湿度数据查询模块就是程序的主页面和主线程,该模块利用Handler机制与蓝牙子线程相互通信,接受蓝牙获取的数据并实时更新UI界面,方面用户监测温湿度变化,该模块前台页面主要涉及到了界面布局设计和开源折线统计图的数据更新。

图 3-6 数据查询模块
该模块主要是进行温度和湿度的超限报警管理,用户点击菜单里面的超限报警管理转到超限报警管理页面。此页面可以设置四个阈值,包括温湿度上下限和湿度上下限。并且将设置的阈值存在app程序内部通过if语句判断是否进行温湿度超限报警。

图 3-7 数据查询模块流程图
本设计主要使用Android自身具备的轻型数据库SQLite。它小巧灵活,适合各种嵌入式环境。本设计数据类型关系单一,数据量较大。主要是存储温湿度数据和时间数据,每五秒钟就要插入一次数据,所以只设置一个表user_data表,主要的字段有id,time日期字段,clock时间字段,temperature温度字段和humidity湿度字段。
|
列 名 |
字段名称 |
类型(长度) |
是否为空 |
约束 |
|
id |
ID属性 |
int(10) |
否 |
主键 |
|
time |
日期属性 |
varchar(20) |
否 |
|
|
clock |
时间属性 |
varchar(20) |
否 |
|
|
temperature |
温度属性 |
int(10) |
否 |
|
|
humidity |
湿度属性 |
int(10) |
否 |
|
DHT11传感器是通用型数字温湿度传感器。传感器可以同时采集温度和湿度数据。DHT11温湿度传感器负责采集温室大棚环境中的温湿度数据,下面介绍设计详细工作流程。
DHT11采用单数据线通信方式,DATA 引脚为数据引脚,进行与Arduino之前的数据传输。DHT1一次传出40位数据,采用大端模式,首先传输出高8位再传输第八位。数据报文格式为:8位湿度值整数部分、8位湿度值小数部分、8位温度值整数部分、8位温度值小数部分和8位校验位。但本设计只获取整数位,不获取小数值。
根据下列给出的时序时间表和时序图,我们可以初步总结一下DHT11传感器的工作流程:
第一步:Arduino低电平保持18-30ms
第二步:Arduino高电平保持10-20us,主机释放总线
第三步:等待DHT11低电平响应,如果没有将继续等待
第四步:等待85us低电平等待时间,等待88us高电平等待时间
第五步:获取温度、湿度数据
第六步:Arduino输出高电平,一次数据接收周期完毕

图 4-1 时序图时间表

图 4-2 DHT11操作时序图
DHT11时序此相对复杂,在数字电路中中1代表高电平,0代表低电平。所以我们在嵌入式软件编码时,只需要控制引脚按照时序图中要求的时间进行置1或置0。本设计将DHT11的DATA引脚与Arduino的4号引脚相连接,通过上述时序进行对函数的编写,具体电路设计如下图所示。

图 4-3 DHT11传感器电路图
DHT11采集温湿度数据关键代码如下:
int dht11::read(int pin)
{// BUFFER TO RECEIVE
uint8_t bits[5];
uint8_t cnt = 7;
uint8_t idx = 0;
// EMPTY BUFFER
for (int i=0; i< 5; i++) bits[i] = 0;
// REQUEST SAMPLE
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
delay(18);
digitalWrite(pin, HIGH);
delayMicroseconds(40);
pinMode(pin, INPUT);
// ACKNOWLEDGE or TIMEOUT
unsigned int loopCnt = 10000;
while(digitalRead(pin) == LOW)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;
loopCnt = 10000;
蓝牙串口模块将获得的温湿度数据转成蓝牙数据报文,并且进行蓝牙与蓝牙之间的信息通讯。对于APP它接收到的是蓝牙数据,开发APP时只需要编写蓝牙相关的代码,Android封装了蓝牙相关的API,所以开发起来简单。蓝牙串口模块的引脚图如下图所示,在这个设计中用到了四个引脚,VCC、GND接5V电源和地,蓝牙模块的TXD接单片机的RXD,RXD接TXD。

图 4-3 HC05蓝牙通信模块电路图
蓝牙通讯模块核心代码如下:
//获得DHT11传感器温湿度数据
int tem=(float)DHT11.temperature; //将温度值赋值给tem
int hum=(float)DHT11.humidity; //将湿度值赋给hum
//应用蓝牙发送湿度字节数据
Serial2.write(lowByte(hum)); //send the low byte
Serial2.write(highByte(hum)); //send the high byte
//应用蓝牙发送温度字节数据
Serial2.write(lowByte(tem)); //send the low byte
Serial2.write(highByte(tem)); //send the high byte
蓝牙技术是利用无线技术进行设备与设备之间无线通信的一种标准。Android封装了对蓝牙设备的操作,提供对不同蓝牙设备的数据交互支持。设计采用蓝牙技术进行硬件和app的数据传输。Android提供了蓝牙相关接口来进行以下操作:
在开启蓝牙之前首先要在AndroidManifest.xml中添加三种蓝牙权限,分别是:
(2)BLUETOOTH_ADMIN:允许蓝牙搜索热点,允许配对链接。
(3)ACCESS_COARSE_LOCATION:允许广播接收器接收广播
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
之后还要检测设备蓝牙设备是否开启,如果设备没有开启提示用户及时开启蓝牙设备。通过在主程序中建立蓝牙适配器BluetoothAdapter来进行蓝牙通信的创建和管理。利用getDefaultAdapter()方法返回一个蓝牙实例。

图 5-1 菜单页面开启蓝牙
设备搜索主要目的是返回附近蓝牙热点列表,通过列表选择将要与本机配对的热点。热点一般分为两种,一种是已经配对过得设备,将会在本机留下之前的配对信。,我们通过一个Bean文件进行存储,通过getBondedDevices()方法获取设备信息。第二种是尚未配对过得设备,该模块采用蓝牙广播机制,只要发现附近尚未配对的热点通过广播形式通知蓝牙后台。

图 5-2 蓝牙搜索列表
在建立连接时需要一个UUID,UUID是用来标识不同设备的ID。连接的第一步是调用BluetoothDevice的createRfcommSocketToServiceRecord方法获取蓝牙Socket.第二步是调用BluetoothSocket的connect()方法发起连接。其中connect()为阻塞方法,因此该连接过程子线程中执行。
String macAddr = "20:15:05:25:02:43";
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(macAddr);
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
mSocket = device.createRfcommSocketToServiceRecord(uuid);
new Thread(){
@Override
public void run() {
温湿度查询模块的界面实际就是程序主界面和主线程。页面布局主要是采用上下结构。上半部分是数值实时显示区域,下半部分引用第三方图表MPAndroidChart。MPAndroidChart 是一个Android非常强大的图标库,包括线形图,柱状图,饼图,雷达图,散列图,等等只要你见过的图都有。这里我们主要采用折线统计图进行数据统计。

图 5-3 温湿度查询模块主界面
设计采用线性布局和相对布局相结合的布局策略,根布局为线性布局,方便进行整体规划。上半部分数据显示区域则采用相对布局策略,因为文字控件和显示控件密集,利用相对布局方便控件规划。
本设计主要采用多线程技术,即前台UI更新界面为主线程,蓝牙后台数据首发为子线程,这样就要求主线程和子线程要进行相互通信。Android提供了 Handler机制来帮助我们进行线程间的通信。下图是Handler机制的示意图。

图 5-4 Handler消息机制示意图
详细代码如下:
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case BluetoothUtil.READ_DATA:
String data = (String) msg.obj;
//将字符转换成16进制的字符串共5个字节 xx xx xx xx xx
String hexData = str2HexStr(data);
//湿度整数部分,第一个字节
String humidityTemp = hexData.substring(0, 2);
//温度整数部分,第三个字节
String temperatureTemp = hexData.substring(4, 6);
//将16进制转换成10进制
int humidity = Character.digit(humidityTemp.charAt(0), 16) * 16
+ Character.digit(humidityTemp.charAt(1), 16);
int temperature = Character.digit(temperatureTemp.charAt(0), 16) * 16
+ Character.digit(temperatureTemp.charAt(1), 16);
mTemperatureTv.setText(temperature + "℃");
mHumidityTv.setText(humidity + "%");
}
}
本设计为超限报警模块单独编写了一个前台页面用来进行超限报警相关数据的设置。在菜单中点击超限报警页面将会跳转到此页面。该模块功能明确,页面布局也相对简洁。以相对布局为根布局,包含4个文本控件用来显示提示文本,4个可编辑文本控件用来输入温湿度上下限相关数据,并且按照垂直排序依次向下。该页面还包含保存和取消两个按钮。保存按钮将会存储四个可编辑文本控件中所填写的温湿度上下限数据,并通过intent将数据送往后台处理,取消将会返回主界面。下图是具体页面展示。

图 5-5 温湿度超限报警设置页面
Intent对象是安卓系统提供的进行页面跳转和数据传递的一种方法。它可以方便的从一个activity跳转的其他activity。Intent就像是不同活动间的快递员,可以传递不同的数据。本模块利用了安卓所提供的Intent机制。先通过findViewById()方法获取到前台页面中温度上限,温度下限,湿度上限,湿度下限四个温度值,然后再通过Intent对象所提供的putExtra()方法将数据依次放入Intent中并且跳转到主界面后台进行温湿度上下限的监控,利用if语句来判断是否超限,如果超限将会出触发相应的报警方法。
以下是详细代码:
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.scan:
//开始扫描设备
startDiscoveryDevice();
return true;
case R.id.alert_settings:
Intent intent = new Intent(MainActivity.this, AlertSettingActivity.class);
intent.putExtra(Constants.TEMP_HIGH_SETTING, mTempHigh);
intent.putExtra(Constants.TEMP_LOW_SETTING,mTempLow); intent.putExtra(Constants.HUMIDITY_HIGH_SETTING, mHumidityHigh);
intent.putExtra(Constants.HUMIDITY_LOW_SETTING, mHumidityLow);
startActivityForResult(intent, ACTIVITY_REQUEST_CODE);
break;
case R.id.disconnect:
if (mSocket != null) {
try {
mSocket.close();
mTemperatureTv.setText("__℃");
mHumidityTv.setText("__%");
} catch (IOException e) {
e.printStackTrace();
}
}
}
本设计采用SQLite数据库进行数据的存储。SQLite是一款嵌入式数据库,它内嵌与Android系统当中。Android内部提供了SQLiteOpenHelper类,通过继承此类可以很方便的进行数据库的初始化和更新。第一步建立一个MyDBHelper类来继承SQLiteOpenHelper,在该类中通过oncreat()方法来创建数据库和数据表。然后撰写插入和查询方法,在蓝牙子线程收到数据并且将数据实时更新到前台页面的同事进行插入操作。在菜单中单独编写一个新页面HistoryActivity用来查询之前所收到的相关温湿度数据。
此模块主要验证DHT11传感器在开机时能否正常供电和正常工作,在长时间工作下采集数据的准确性和设备可靠性。我们每5秒钟采集一次数据,将数据报文和设备运行的情况详细记录下来,结果如下表所示。数据采集正常,传感器数据采集测试通过。

图 6-1 DHT11传感器数据采集测试
此模块主要验证HC05蓝牙模块在开机时能否正常供电和正常工作,在匹配设备时能否正常成功匹配主从机,在长时间工作下传输数据的准确性和设备可靠性。我们每5秒钟发送一次蓝牙数据报文,通过相关专业蓝牙串口软件实时接受数据,将数数据文和设备运行状况详细记录下来,结果如下所示。数据接受稳定,蓝牙稳定性测试通过。

图 6-2 蓝牙数据传输测试
此模块主要验证app端蓝牙模块能否正常接受蓝牙热点并显示在蓝牙列表界面,能否正常进行蓝牙的配对和断开,能否正常的接受数据并且从前台界面实时更新。APP每5秒钟接受一次蓝牙数据报文,通过对主界面温湿度数据变化进行砖茶,将数数据文和设备运行状况详细记录下来,结果如下所示。数据接受稳定,数据传输更新工作正常。

https://gitee.com/gbwork_cn/gbiot_app.git