关闭视频

基于 Android +机智云的室内植物墙智能控制系统

发表于:2021年08月25日 15:46更新于:2024年05月04日 21:55

本文是由开发者设计的一个基于 Android+机智云的室内植物墙智能控制系统,打造室内小型化的可智能监控植物墙,完成在线监测温湿度、二氧化碳浓度、甲醛浓度、光照强度,并可控制水泵进行灌溉等。

基于Arduino 平台设计一个多传感器的硬件系统,并利用WiFi 芯片与机智云平台连接,通过云平台与 Android 手机移动端进行交互,从而实现在手机上查看当前数据并控制系统的功能。

 

 

系统总体方案设计

 

室内植物墙智能控制系统的设计目的是为想要在室内养护较多花草植物却又没有充足的时间与精力的人群提供一个符合需求的解决方案。

为此室内植物墙智能控制系统功能实现有:

① 实时获取当前温湿度、甲醛浓度、光照强度、二氧化碳浓度等数据,以便清楚得知室内空气环境变化,更加科学的养护植物;

② 将实时获取到的数据展现在移动端,提高养护植物的乐趣,调动人群的积极性;

③ 能够由移动端远程控制水泵浇水等动作,将养护植物的难度进一步降低,提高植物存活能力。

 

系统总体结构可以分为植物墙设计、硬件电路设计、软件服务设计三个部分,具体设计如图所示:

 

 

智能控制系统硬件及电路设计

 

1、室内植物墙设计

结合市面植物墙产品设计的优缺点,确定本系统所使用的植物墙方案,墙架主体包括循环灌水式水箱、可移动式铁架、自由摆放植物木架三个部分,其组合实物图如下所示。

 

2、硬件选择及电路设计

◆ 中央处理器:

整个硬件部分以 Arduino Uno R3板为核心,搭配各种传感器及相应配套电路。

◆ 温湿度传感器:

本系统采用DHT11传感器,其供电电压与 Arduino板的输出电压相对应。

◆ 甲醛浓度检测传感器:

选择检测方法为电化学法的DS-HCHO数字式传感器。

DS-HCHO 引脚说明:

◆ 光照强度传感器:

选用TSL2561 传感器,实现自行编程设置光照阈值,当实际光强超过阈值时能够产生中断信号。

◆ 二氧化碳浓度传感器:

采用MG811的检测传感器,可探测的浓度范围为 0 到 10000ppm,具有温度补偿功能,能够实现全温度范围下检测二氧化碳浓度。

◆ 水泵开关电路设计:

选用电磁式的继电器,输入电流只需要 5V 直流电流,可以对 220V、10A 交流的电路进行控制,与 Arduino 板搭配使用很合适,其接线示意图如图所示。

◆ WiFi电路设计:

本系统采用乐鑫的 ESP8266 芯片作为 WiFi 通信芯片。

ESP8266 引脚说明:

 

 

 

系统软件程序设计

 

1、温湿度检测程序

引用了DHT11库文件后的驱动程序编写如下:

//引用 DHT11 的库文件
#include <DHT11.h> 
//创建实例化对象
DHT11 DHT;
//定义 2 号引脚为温湿度测量的引脚
#define DHTPIN 2
//设置波特率为 9600
void setup(){
Serial.begin(9600);
}
//循环函数
void loop(){
//将读取到的值赋给 ck
int ck = DHT.read(DHTPIN);
//若无问题就打印 OK
 if (ck == DHTLIB_OK){
Serial.println(“OK”);
}
//出现校验和错误
else if(ck == DHTLIB_ERROR_CHECKSUM){
Serial.println(“CHECKSUM ERROR”);
}
//出现超时错误
else if(ck == DHTLIB_ERROR_TIMEOUT){
Serial.println(“TIMEOUT ERROR”);
}
//出现未知错误
 else{
 Serial.println(“UKNOWN ERROR”)
}//打印温度及湿度值
Serial.println(“Temperature: ” + DHT.temperature);
Serial.println(“Humidity(%):” + DHT.humidity);
//延时 1000 毫秒开始下一次循环
delay(1000);
}

 

2、甲醛浓度检测程序

分析清楚传感器通信格式后,可编写代码如下:

//引用软串口库文件
#include <SoftwareSerial.h>
//将 5,6 号口分别设为接收和发送串口
SoftwareSerial mySerial(5, 6);
//将需要发送给传感器的七个数放在数组中
unsigned char hdata[7] = {0x42,0x4d,0x01,0x00,0x00,0x00,0x90}; 
void setup(){
//设置软串口的波特率为 9600
 mySerial.begin(9600);
//设置硬串口的波特率为 9600
 Serial.begin(9600);
//传感器预热 10 秒
 delay(10000);
}
void loop(){ 
//将数组中的命令串通过软串口发给传感器
 mySerial.write(hdata,7); 
 while (mySerial.available()){
//若传感器中有数据返回则执行下面的函数
 SerialData(mySerial.read()); 
 }
//每次测量间隔 1 秒
 delay(1000);
}
//函数的具体实现
char SerialData(unsigned char ucData){
//创建一个数组存储每次获得的数据
 static unsigned char ucRxBuffer[100];
 //计数归零
 static unsigned char ucRxCnt = 0;
//数据当量
 long ht=0;
//返回的数据
 long ha=0;
//实际数据
 float ho=0;
//将返回的数据按序存入数组中
 ucRxBuffer[ucRxCnt++]=ucData;
//校验起始符,若不符合直接返回
 if (ucRxBuffer[0]!=0x42&&ucRxBuffer[1]!=0x4D){
 ucRxCnt=0;
 return ucRxCnt;
}
 if (ucRxCnt<11){
return ucRxCnt;
}
 else{
//第六个数为数据当量
 ht=(float)ucRxBuffer[5];
//测量数据为第七八位,转换公式如下
 ha=(float)ucRxBuffer[6]*256+(float)ucRxBuffer[7];
//数据当量为 3 ,则实际值为测量值除 100
 if(ht==3) {
 ho=ha*0.01;
}
//数据当量为 2 ,则实际值为测量值除 10
 if(ht==2){
 ho=ha*0.1;
}
//数据当量为 1 ,则实际值即为测量值
 if(ht==1){
 ho=ha;
}
//将实际值通过硬串口输出
 Serial.print("hcho :");
 Serial.println(hcho);
 ucRxCnt=0;
 return ucRxCnt;
} 
}

 

3、光照强度检测程序

TSL2561传感器能够将光强直接转换为数字信号输出,其具体传输流程如下所示:

其部分程序代码如下:

//引用相关文件库
#include <SFE_TSL2561.h>
#include <Wire.h>
// 实例化对象
SFE_TSL2561 tsl;
// 设置全局变量
boolean g; // 增益值,0 代表无增益,1 代表 16 倍增益
unsigned int ms; // 混合时间
void setup()
{
 // 初始化串口
 Serial.begin(9600);
 tsl.begin();
 g = 0;
 // 如果 t = 0, 混合时间为 13.7ms
 // 如果 t = 1, 混合时间为 101ms
 // 如果 t = 2, 混合时间为 402ms
 unsigned char t = 2;
 // 传感器上电,开始测量
 tsl.setPowerUp();
}
void loop()
{
 //延时
 delay(ms);
 //d0 表示通道 0 采集到的数据,d1 表示通道 1 采集到的数据
 unsigned int d0, d1;
 if (tsl.getData(d0,d1))
 {
 Serial.print("d0: ");
 Serial.print(d0);
 Serial.print("d1: ");
 Serial.print(d1);
 double lux; // 光强值
 boolean yes; // 判断传感器是否正常
 yes = tsl.getLux(gain,ms,d0,d1,lux);
 //输出光强值
 Serial.print(" lux: ");
 Serial.print(lux);
 //输出传感器正常与否,yes 表示正常,no 表示不正常
 if (yes) 
Serial.println(" (yes)");
else 
Serial.println(" (no)");
 }}

 

4、二氧化碳浓度检测程序

基于二氧化碳传感器相关变量的对应关系,可以设计二氧化碳浓度检测程序,部分代码如下:

//定义引脚为 7 号 #define MG_PIN (7);
//采样间隔为 100 毫秒
#define SAMPLE_INTERVAL (100);
//采样次数为 10 次 #define SAMPLE_TIMES (10);
void setup() {
 //初始化串口
Serial.begin(9600);
}
void loop() {
float volts;
int p;
//通过函数得到电压值
volts = MGGet(MG_PIN);
//将电压值换算为浓度
p = pow(10,(0.61-volts)/0.075);
//输出
 Serial.print(“CO2: ”);
 Serial.print(p);
Serial.print(“ppm ”);
Serial.print(“\n”);
delay(200);
}
//函数
float MGGet(int a) {
int i;
 float v = 0;
//每次间隔 100 毫秒采样一次,共采样 10 次并求平均,将毫伏换算为伏特
 for (i=0;i<SAMPLE_TIMES;i++) {
 v += analogRead(a);
 delay(SAMPLE_INTERVAL);
 }
 v = (v/SAMPLE_TIMES) /1000 ;
 return v;}

 

5、水泵开关设置程序

水泵开关需要明确高电平导通,低电平断开即可,部分代码如下所示:

//选择引脚为 8 号
const int pin = 8;
void setup() {
 //设置引脚模式为输出
pinMode(pin,OUTPUT);
}
void loop(){
 //高电平,继电器导通
digitalWrite(pin,HIGH);
//持续 100 秒
 delay(100000);
 //低电平,继电器断开
digitalWrite(pin,LOW);
 //持续 100 秒
 delay(100000);
}

 

6、WiFi连接程序

Wi-Fi 模块作为连接客户端与 Arduino 平台的中间模块,在程序上选择刷入机智云的固件,这样的好处在于能使用机智云的云平台服务,具体内容会在后续介绍。

 

 

系统服务端及移动端设计

 

本系统的软件部分可为服务端与移动端,系统服务端采用机智云物联网云平台,移 动端基于机智云的 Android SDK 进行深度二次开发设计。

 

1、服务端设计

◆ 机智云物联网云平台介绍

机智云提供一站式的物联网服务平台,包含硬件开发及云服务,并且面向个人及企业开发者,开发者通过物联网云平台,可以实现从硬件开发到应用开发及云端开发的功能,其云平台的架构如下所示。

◆ 设备接入设计

机智云提供多种硬件设备接入方案,例如购买官方开源套件就可自动实现接入云端,也可通过将 GAgent 固件烧录进 WiFi模组中,从而实现与机智云平台的连接。

GAgent 固件可以看作是一款运行在通信模块中的软件,提供模块与上层应用(包括移动客户端及云端等)的双向通信,无需关注通信的具体协议及细节,也不需要进行专门的 TCP传输设计。

考虑到本系统以 Arduino 板为核心,以 ESP8266 为通信模块,完美契合机智云给出的解决方案中烧录固件的形式,因此本系统采用烧录固件的方案。

具体接入步骤如下:

►在机智云官方网站上找到所需的固件资源,选择与通讯模块相匹配的 GAgent 固件及烧录软件进行下载,选即择第二个GAgent for ESP8266 进行下载,如图 所示。

►下载烧写软件工具

►将 WiFi 模块与 USB 转 TTL 模块相连接,进入烧录模式,需要注意的是,在进入烧录模式后,USB 转 TTL 模块提供的电压已无法满足 WiFi 模块的供电需求,此时需要有外部电源对 WiFi 模块提供 3.3V 的电压,两个模块具体的接线如图所示。

►具体而言就是两个模块的 TX 与 RX 交叉连接,外部电源正极与 Wi-Fi 模块的 VCC 及 EN相连,外部电源的负极与 Wi-Fi 模块的 IO0、IO2、GND 及转串模块的 GND 相连,在RST 于 GND 之间连接一个开关。

►在硬件电路连接好,需要用到的软件及固件都下载好后,打开烧录软件,依据说明选择相应的选项,点击 START 键后按下复位开关即可开始进行烧录,最后烧录成功后如图所示。

►创建产品:接下来在机智云平台创建一个产品,命名为“智能植物墙”,技术方案选择 WiFi方案,数据传输方式为定长,完成创建后如图所示。

►下一步是设置数据点,所谓数据点即是希望系统采集或者控制的数据,读写类型分为只读与可写两类,数据类型分为数值与布尔值等,本系统设置了六个数据点,如表所示。

►在机智云平台上创建数据,完成后如图所示。

►设置好数据点后进入 MCU 开发环节,选择独立 MCU 方案,硬件平台选择Arduino UNO R3,如图所示。

►填写产品密钥,产品密钥在产品基本信息一栏,是作为 APP 开发和服务器对接时需要使用的参数,如图所示。

►输入密码后即可显示完整密钥,然后复制粘贴即可。完成后点击生成代码包,稍等片刻即完成,如图所示。

 

2、移动端设计

关于移动APP的设计,可以采用基于机智云开源框架二次开发设计智能控制系统APP。

从实际需求出发,移动端应该具有以下几个功能:

① 用户注册及登录:智能植物墙系统作为一个物联网项目,对每个用户而言,基于信息保密原则需要有自己的账号,账号与设备一一对应,因此用户注册及登录功能必不可少;

② 设备绑定与解除绑定:用户在登录移动端后首先需要做的就是与自己的设备进行绑定,以便进行下一步的操作,在绑定了设备后还需要能够解绑;

③ 数据采集及设置:与设备绑定后需要能够实现实时显示采集到的数据,并且能够控制硬件设备。

移动端完整的工作流程如下:

点击移动端,展示欢迎界面,调用登录接口让用户通过注册或者直接登录的方法登录移动端,设备提前接入网络,调用设备绑定接口在移动端配置设备并与之绑定,绑定设备完成后,展示设备列表,点击具体绑定的设备,实时查看当前数据,并能与设备进行交互。

 

移动APP端的登录及注册界面效果:

最终完整配置流程界面:

在完成设备的绑定后该设备就会出现在移动端中,需要对云端返回的设备采集到的数据进行可视化处理,设计展示界面及开关控制功能。

最终的参数查询及控制界面:

其部分程序代码如下:

 

// 数据点"水泵开关"对应的标识名
protected static final String KEY_SWITCH = "Switch";
// 数据点"室内温度"对应的标识名
protected static final String KEY_TEMPERATURE = "Temperature";
// 数据点"室内湿度"对应的标识名
protected static final String KEY_HUMIDITY = "Humidity";
// 数据点"甲醛浓度"对应的标识名
protected static final String KEY_HCHO = "HCHO";
// 数据点"二氧化碳浓度"对应的标识名
protected static final String KEY_CO2 = "CO2";
// 数据点"光照强度"对应的标识名
protected static final String KEY_LIGHT = "Light";
// 数据点"水泵开关"对应的存储数据
protected static boolean data_Switch;
// 数据点"室内温度"对应的存储数据
protected static int data_Temperature;
// 数据点"室内湿度"对应的存储数据
protected static int data_Humidity;
// 数据点"甲醛浓度"对应的存储数据
protected static double data_HCHO;
// 数据点"二氧化碳浓度"对应的存储数据
protected static int data_CO2;
// 数据点"光照强度"对应的存储数据
protected static int data_Light;
protected void getDataFromReceiveDataMap
(ConcurrentHashMap<String, Object> dataMap) {
if (dataMap.get("data") != null) {
ConcurrentHashMap<String, Object> map 
= (ConcurrentHashMap<String, Object>) dataMap.get("data");
for (String dataKey : map.keySet()) {
if (dataKey.equals(KEY_SWITCH)) {
data_Switch = (Boolean) map.get(dataKey);
}
if (dataKey.equals(KEY_TEMPERATURE)) {
data_Temperature = (Integer) map.get(dataKey);
}
if (dataKey.equals(KEY_HUMIDITY)) {
data_Humidity = (Integer) map.get(dataKey);
}
if (dataKey.equals(KEY_HCHO)) {
if (map.get(dataKey) instanceof Integer) {
data_HCHO = (Integer) map.get(dataKey);
} 
else {
data_HCHO = (Double) map.get(dataKey);
}
}
if (dataKey.equals(KEY_CO2)) {
data_CO2 = (Integer) map.get(dataKey);
}
if (dataKey.equals(KEY_LIGHT)) {
data_Light = (Integer) map.get(dataKey);
}
}
} 
}

 

 

系统设计总结

 

基于Android +机智云平台的室内植物墙智能控制系统由植物墙、硬件电路及移动控制端等组成,通过市场调研确定植物墙的设计方案,以 Arduino 作为硬件平台并辅以各类传感器,组成环境信息探测采集系统。

以ESP8266 为 Wi-Fi 芯片并刷入机智云固件,作为桥梁将硬件系统与机智云平台相连接。以 Android 平台作为移动端的选择,以机智云开源框架为基础设计移动端,以实现对硬件系统的远程控制。在实时监测室内环境数据的同时远程控制水泵灌溉开关,降低了绿植养护的难度,提高了绿植养护的乐趣。

 

设计完善的植物墙养护植物图:

由于继电器端口的原因,水泵无法直接与之相连,因此用一个改装过的插座来代替,通过继电器控制插座的通断电从而控制插在插座上的水泵,以此起到开关的作用。

完整的硬件电路连接图:

将项目代码编译打包运行,通过 Android Studio 的调试功能将生成的完整移动端安装到手机上并打开,如图所示从左到右依次为移动端下载安装完成图、移动端打开后欢迎页、登录页、点击跳过后移动端内容页,即为移动端首次运行的页面。

 

测试注册及登录功能图:

在经过配置——选择无线网络——选择无线模组——搜索设备并连接的流程后,在移动端中出现了“智能植物墙”这一设备,这表明设备能够顺利完成与移动端的绑定操作。

测试绑定后的设备实现远程查看数据并控制水泵开关。

技术交流:

◆ 机智云开发者:www.gizwits.com

◆ 机智云开发者社区:club.gizwits.com

◆ QQ技术交流群:378683984

◆ 官方淘宝店:http://shop159680395.taobao.com/index.htm

◆ 客服电话/微信:18002215823