基于ESP8266-WiFi和Android的空调控制系统

方鸿羲
2023-12-01

基于ESP8266-WiFi和Android的空调控制系统

一、实验目标
通过ESP8266-WiFi芯片、红外线发射器、DHT11温度传感器与Android客户端实现空调的远程控制(空调开关、温度调节、风速调节、机房温度监测、定温开关、定时开关)与服务器机房温度的实时监控与控制。

二、主要技术

1、MQTT协议(Message Queuing Telemetry Transport)
MQTT协议是一种轻量级的发布/订阅消息传输协议。对于需要较小代码占用空间或网络带宽非常宝贵的远程连接非常有用,是专为受限设备和低带宽、高延迟或不可靠的网络而设计。这些原则也使该协议成为新兴的“机器到机器”(M2M)或物联网(IoT)世界的连接设备,以及带宽和电池功率非常高的移动应用的理想选择。
特点:开放消息协议,简单易实现;发布订阅模式,一对多消息发布;基于TCP/IP网络连接,提供有序,无损,双向连接;1字节固定报头,2字节心跳报文,最小化传输开销和协议交换,有效减少网络流量;消息QoS支持,可靠传输保证
MQTT协议广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等领域。

2、HTTP协议(HyperText Transfer Protocol)
HTTP是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。

3、JDBC
JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。本次实验采用JDBC三层架构。

4、JSON
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得
JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

5、SPIFFS文件系统
SPI Flash File System,简称SPIFFS闪存文件系统。即使文件系统与程序存储在同一个闪存芯片上,烧入新的代码也不会修改文件系统内容。这允许使用文件系统来存储Web服务器的代码数据、配置文件或内容。而这个SPIFFS文件系统的大小可以通过烧写环境来配置,目前一般有1M,2M,3M等等。

5、NTP
Network Time Protocol,网络时间协议是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。NTP的目的是在无序的Internet环境中提供精确和健壮的时间服务。

三、功能说明

1、空调开关
开关功能通过MQTT协议与红外线发射管实现,Android端发布消息到mosquitto服务器,Arduino端订阅Android端发布消息的主题,即可从mosquitto服务器接收信息。Arduino端再接收到信息后,红外线发射管发出指令,控制空调开关。

2、空调模式调节
实现原理同上

3、空调温度调节
实现原理同上

4、空调风速调节
实现原理同上

5、扇叶摆动
实现原理同上

6、定温开关机
Android端使用MQTT协议将温度信息发送到Arduino端,Arduino端将温度信息写入到ESP8266的SPIFFS文件系统的tempon和tempoff文件中。DHT11温湿度传感器每隔10S,测量一次温度信息,然后读出文件中的温度信息并进行比较,然后由红外线发射管发出指令控制空调定温开关。

7、定时开关机
在Android端通过DatePickerDialog和TimePickerDialog选择日期与时间,然后通过MQTT协议将时间传送至Arduino端,Arduino端将时间信息保存至文件系统中的timeoff与timeon文件中。Arduino端在每次开机上电时会使用NTP协议进行一次时间校准,然后通过时间库生成内部时钟,时钟运行时会与读出文件中的时间信息,并作比较如果已到达时间则通过红外线发射管发出红外信信号,控制空调开关。

8、温度信息的保存与分析
Arduino端再使用DHT11温湿度传感器获取温度后使用http协议,将数据传送至Tomcat服务器,服务器会将数据保存至本地的Mysql数据库中。Android端可以通过http协议向Tomcat服务器请求数据,当服务器收到请求后会从Mysql数据库中读取数据并组装成JSON字符串传送给Android。Android端解析JSON字符串后调用hellochart库生成温度曲线。

数据库名:test_mqtt 表名:ht

建表语句:create
table ht(id int primary key,hum text,temp text,date text);

                alter table ht modify id integer default '1';

                alter table ht modify id integer auto_increment;

四、实现过程

硬件准备:

1、NodeMCU开发板(ESP8266-WiFi芯片)

2、红外发射管

3、DHT11温度传感器

4、5V电源适配器一个

5、USB公母头数据线一根

6、Android数据线一根

7、Ubuntu系统电脑一台

软件准备:

1、Android Studio Android集成开发工具

2、Eclipse javaEE环境

3、Mosquitto服务器

4、Tomcat服务器

5、Arduino IDE

6、Mysql数据库

7、MQTTBox

实验过程中需要的库文件:

Android端:

1、org.eclipse.paho.client.mqttv3_1.2.5.jar

下载地址:https://projects.eclipse.org/projects/iot.paho/downloads

2、SwitchButton-master.zip

下载地址:https://github.com/zcweng/SwitchButton

3、hellocharts-library-1.5.8.jar

下载地址:https://github.com/lecho/hellocharts-android

Tomcat端:

1、JSONObject库

下载地址:http://pan.baidu.com/s/1miJxBao
密码:7y2m

2、mysql-connector-java-8.0.21.zip

下载地址:https://dev.mysql.com/downloads/connector/j/

Arduino端:

1、ESP8266 Arduino开发环境

下载地址:https://github.com/esp8266/Arduino

2、PubSubClient-2.8.0.zip

下载地址:https://pubsubclient.knolleary.net/

3、IRremoteESP8266-2.7.8.zip

下载地址:https://github.com/crankyoldgit/IRremoteESP8266

4、NTPClient-3.2.0.zip

下载地址:https://github.com/arduino-libraries/NTPClient

5、Time-1.6.0.zip

下载地址:https://github.com/PaulStoffregen/Time

6、ESP8266FS-0.5.0.zip

下载地址:https://github.com/espressif/arduino-esp32/tree/master/libraries/SPIFFS

7、Adafruit_Unified_Sensor-1.1.4.zip

下载地址:https://github.com/adafruit/Adafruit_Sensor

8、DHT_sensor_library-1.3.10.zip

下载地址:https://github.com/adafruit/DHT-sensor-library

大多数库文件可以从Github上下载,Github上也有相对应的使用说明。在配置库文件时会遇到一些问题会在下面说明。

软件配置与安装:

1、安装Android Studio并配置Android开发环境

可在网上查找Ubuntu系统中的Android Studio教程,注意安装前需要确认是否安装并配置好JDK。

2、安装mosquitto服务器

①Ctrl+Alt+T打开终端

②引入mosquitto仓库并更新

输入:sudo
apt-add-repository ppa:mosquitto-dev/mosquitto-ppa

按回车运行

③更新依赖

输入:sudo
apt-get update

④安装mosquitto

输入:sudo
apt-get install mosquitto

⑤查看mosquitto服务是否开启

输入:sudo
service mosquitto status

如果active显示running,至此说明mqtt服务器已成功开启 , 可以使用以下命令开启/停止

mosquitto服务:
sudo service mosquitto start和sudo service mosquitto stop

2、安装MQTTBox

MQTTBox是一款MQTT客户端工具,可用于测试MQTT协议的发布与订阅功能。

下载地址:http://workswithweb.com/html/mqttbox/downloads.html

安装过程可在网上查阅或查询安装向导程序。。

3、使用MQTTBox检查mosquitto是否正常运行

①打开终端,输入ifconfig查询电脑ip地址

②按照MQTTBox提供的设置程序建立连接,使用MQTTBox发布与订阅消息,测试mosquitto服务是否正常运行

4、安装Arduino IDE

下载地址:https://www.arduino.cc/en/Main/Software

选择与电脑对应版本即可,安装教程可在网上查阅

5、配置Arduino IDE ESP8266开发环境,即在Arduino IDE中导入ESP8266的库

下载地址:https://github.com/esp8266/Arduino

安装教程:https://arduino-esp8266.readthedocs.io/en/latest/installing.html#using-git-version

建议使用Using git
version 方法进行安装,安装过程较为缓慢需要耐心等待。如出现安装失败,请更具教程到相应目录下删除下载失败的文件夹后,再重新运行安装命令。

6、将Arduino所需的库导入Arduino中,可使用Arduino IDE集成的Library Manager进行库文件的下载安装,也可根据上文给出的Github网址手动下载并将库文件导入到Arduino IDE中。

7、下载并安装配置Tomcat服务器

下载地址:https://tomcat.apache.org/

安装即配置教程:https://blog.csdn.net/weixx3/article/details/80808484

选择合适版本的安装包进行安装与配置,此处不建议使用APT命令行进行安装虽然此种安装方式不需要手动配置环境变量,但是由于Ubuntu系统的特性会将文件打散,在后续的开发过程中造成麻烦。

8、下载Eclipse javaEE

下载地址:https://www.eclipse.org/downloads/packages/

安装与配置教程:https://www.cnblogs.com/Edward-roof/p/12398596.html

选择对应的版本进行下载和安装。安装完成后进行配置。

9、将JSONObject库与mysql-connector-java-8.0.21.zip中的库文件导入到Eclipse javaEE中。

10、将org.eclipse.paho.client.mqttv3_1.2.5.jar库、SwitchButton-master.zip中的库文件和hellocharts-library-1.5.8.jar库导入Android Studio中。

实验步骤:

1、进行WiFi模块、DHT11温度传感器、红外线发射管的单一模块测试,确保其能够正常运行。

问题:

①由于各个空调厂家存在代工现象,所以目标空调所需要红外线指令库文件并不一定和空调品牌名相对应。因此,可以使用 IRremoteESP8266库中examples/CommonAcControl.ino进行测试,找到空调所对应的红外线指令库。

②为了节省时间,在测试中可以使用库文件中的examples测试各个传感器是否正常运行。

2、在Android端建立MQTT传输的demo进行,发布与订阅的测试,确保Android端发布的消息可以被电脑上的MQTTBox客户端与Android自己订阅并接收,以及确保Android端可以接收到MQTTBox客户端所发送的消息。

问题:

①再MQTT协议中每一个客户端都有且只有一个ID,且这些ID必须是唯一的。如有相同ID的设备连接服务器,则客户端会处于反复断连再重连的状态,因此建议可以通过时间戳或者设备编码来设置客户端ID。

②Cannot resolve symbol 'xxx’报错,有时使用Android
Studio时再我们导入库以后依然会出现此类报错。

解决方法:https://blog.csdn.net/hadues/article/details/81603838

③Error while executing: am start -n报错,在连接真机进行app测试的时候会出现这种报错。通常是因为真机上的app没有卸载干净。

解决方案:https://blog.csdn.net/xunxue1523/article/details/107167685/

3、编写服务器端,实现服务器可以访问本地Mysql数据库,以及Arduino与服务器端的连接和Android端和服务器端的连接及Arduino端与Android端可以向服务器发送与接收数据。

问题:

①Arduino端向服务器提交post请求时需要编写http
header中的Conten-Type。常见Content-Type类型:application/x-www-form-urlencoded, multipart/form-data, application/json

application/x-www-form-urlencoded 请求参数在Form
Data中,键值对,用间隔分开,如: name1=value1&name2=value2

multipart/form-data 请求参数在Request
Payload 中, 可以上传文件,也可以上传键值对,最后会转化为一条由boundary字符串分隔的信息体。boundary是一个不可能在数据中出现的字符串。 如:------WebKitFormBoundaryyb1zYhTI38xpQxBK就是boundary

application/json 请求参数在Request
Payload中, 参数形式:{key:value}

②Android端报错:java.net.SocketException:
socket failed: EPERM (Operation not permitted)

解决方案:https://blog.csdn.net/MRYZJ/article/details/101780180

③Android端报错:javax.net.ssl.SSLHandshakeException:
Handshake failed

解决方案:https://blog.csdn.net/zhaohan___/article/details/79630128?utm_source=blogxgwz5

④Eclipse javaEE报错:java.lang.ClassNotFoundException:
net.sf.json.JSONObject

解决方案:https://blog.csdn.net/wochunyang/article/details/51352187

⑤eclipse工程运行正常但是工程有红叉

解决方案:https://blog.csdn.net/lixiaomei0623/article/details/93211556

⑥java中三种截取字符串的方法

https://www.cnblogs.com/jackszc/p/8916837.html

4、编写Android端的操作界面,然后实现功能。编写Arduino可以将之前的单一模块测试进行整合然后再加上NTP协议与时间库,为其设计合适的程序逻辑以实现整体功能。

5、经过实验完成上述工作,实现功能并进行测试大概需要两周左右的时间。

五、实验结果

经过测试,该设备各项功能皆能成功运行。且能够准确的检测机房温度并将其控制在合理范围,确保机房服务器的高效运作。

项目源码:Github日常上不去放百度云了
链接:https://pan.baidu.com/s/1898h9v_YFLmcyUxNuwuB0w
提取码:idme

 类似资料: