天天看點

基于ESP8266-WiFi和Android的空調控制系統

基于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