基于華為云物聯網設計的澆花神器【玩轉華為云】
1. 前言
隨著社會的不斷發展和人們生活水平的逐漸提高,人們逐漸追求高質量的生活,很多人都會選擇在家里或辦公室種植一些花卉以凈化家庭空氣,陶冶情操,但是很多人忙于工作、學習、出差、旅游或者一些其他的原因,不能及時地對花卉進行照料,短時間內導致很多花卉因缺水分而影響正常生長,長時間不照料有些名貴的花卉直接死亡。基于上述狀況,提出了此基于物聯網的智慧澆花系統。該系統采用工業級高精度土壤溫濕度傳感器采集花盆中的突然溫濕度,環境的溫度濕度,通過ESP8266 WIFI實時上傳當前的土壤溫濕度、環境光照度等數據到華為云物聯網云平臺,可以通過 app實時查看花卉的土壤濕度、環境溫度等信息,并且本地通過OLED顯示屏實時顯示這些信息,可以設定某種花適宜的生長的土壤濕度條件,實現自動控制給花澆水,即能讓花卉生長在適宜的濕度下,與目前市場上的自動澆花系統相比,該系統的特點具有遠程控制,低成本、極高的資源利用率、操作簡單和反應靈敏等。
2. 整體系統設計
主控MCU選擇STM32F103芯片,通過土壤濕度傳感器、環境溫濕度傳感器,檢測整個周邊環境信息,再通過ESP8266 WIFI傳遞到物聯網平臺。程序里可以預設濕度閥值,當檢測到土壤濕度低于閥值就自動澆花。在手機APP上可以實現遠程控制水泵澆花,本地在搭載一個TFT小尺寸顯示屏,可以實時顯示測量檢測的數據,在辦公室里也可以通過TFT彩屏顯示屏解周圍環境的信息。
3. 硬件選型
3.1 STM32開發板
https://detail.tmall.com/item.htm?spm=a1z0d.6639537.1997196601.92.4d297484dTJ7qS&id=540109077095
3.2 土壤濕度傳感器
https://detail.tmall.com/item.htm?spm=a230r.1.14.16.f54e4813fvxQrB&id=37365775741&ns=1&abbucket=19&skuId=4136086852947
3.3 ESP8266 WIFI
https://detail.tmall.com/item.htm?spm=a1z10.3-b.w4011-22301073509.42.30fc7467rD0xNw&id=609757779633&skuId=4447338308661
3.4 環境溫濕度
https://detail.tmall.com/item.htm?id=15598344236&ali_refid=a3_430582_1006:1104520036:N:TAiHo9GD8eTurMzH21/csQ==:a9713f529e04b83568179509c64f1d18&ali_trackid=1_a9713f529e04b83568179509c64f1d18&spm=a230r.1.14.1&skuId=4835521242382
3.5 水泵電機
https://item.taobao.com/item.htm?spm=a230r.1.14.21.55d23042dg3Mbz&id=593925938205&ns=1&abbucket=19#detail
4. 華為云物聯網平臺
采用現成的物聯網云平臺,可以方便設備上云,完成設備與上位機之間雙向通信,不需要自己搭建服務器,還可以通過云端的存儲桶存儲數據,分析數據等。
4.1 創建產品
登錄官網,找到物聯網產品
https://www.huaweicloud.com
選擇產品、IOT物聯網、設備接入
選擇產品選項欄,點擊右上角創建產品;先創建產品、再創建設備。一個產品下可以創建多個設備。
點擊確定,產品創建成功后,點擊查看詳情,保存好產品ID等信息
點擊自定義模型按鈕,創建服務器ID
添加的這個屬性非常重要,就是設置設備與服務器之間數據傳輸的屬性,設備端哪些傳感器需要上傳數據到服務器,這里就按照傳感器的數據類型給它添加屬性。
【1】添加環境溫度屬性:溫度屬性是設備主動上傳,這里就設置為只讀屬性。
【2】添加環境濕度屬性:濕度屬性是設備主動上傳,這里就設置為只讀屬性。
【3】添加環境濕度屬性:濕度屬性是設備主動上傳,這里就設置為只讀屬性。
【4】添加灌溉電機的屬性:電機需要下發指令控制,就設置為只讀只寫屬性。
【5】所有的屬性如下
4.2 創建設備
產品創建好之后,在下面創建對應的設備。這個設備創建一般可以采用服務器提供的接口,在應用端開發引導界面自動創建,這里采用手動形式創建,方便了解設備創建流程,需要填充什么屬性參數等等。
選擇所有設備選項卡、跳轉到設備頁面、點擊右上角創建設備。
根據提示填充設備參數。
創建成功后,保存設備密匙,后續生成MQTT登錄密碼、賬號需要使用。
{ "device_id": "622ef2e8c4e6a958e356fe84_STM32", "secret": "12345678" }
4.3 生成MQTT登錄參數
華為云提供的MQTT賬戶信息生成在線小工具:
https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com
生成密匙:
ClientId 622ef2e8c4e6a958e356fe84_STM32_0_0_2022031408 Username 622ef2e8c4e6a958e356fe84_STM32 Password c9bc1837fc5cba8728a5e7ad625e422799e9a96975e3836a0054ea8e00f9ae5d
4.4 主題訂閱格式
在上面的步驟中,產品、設備、MQTT登錄信息都已經創建好,接下來要考慮的的就是,如何登錄華為云物聯網平臺,登錄之后數據如何交互等問題。
端口: 1883 域名: a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com IP地址: 121.36.42.100
格式: $oc/devices/{device_id}/sys/messages/down //訂閱主題: 平臺下發消息給設備 $oc/devices/622ef2e8c4e6a958e356fe84_STM32/sys/messages/down
格式: $oc/devices/{device_id}/sys/properties/report //設備上報主題請求 $oc/devices/622ef2e8c4e6a958e356fe84_STM32/sys/properties/report //上報的數據格式如下 {"services": [{"service_id": "STM32","properties": {"temp":12,"humidity":21,"soil_moisture":15,"motor":1}}]}
參數說明:
device_id 設備ID這個字段,在創建設備時生成的。
service_id 這個字段填服務ID,這個ID在產品頁面下面自定義模型的位置可以看到,這個服務ID就在創建
數據模型時設置的。
后面的{}里表示上傳到服務器的數據屬性字段。這個屬性的名稱是自己在自定義模型頁面自己填的。
4.5 軟件模擬測試
為了驗證云端設備的情況,這里先采用MQTT客戶端軟件模擬設備,登錄云端服務器,測試數據交互。
MQTT客戶端軟件-: https://download.csdn.net/download/xiaolong1126626497/18784012
登錄服務器,測試主題上報,訂閱等功能。
在設備詳情頁面開啟消息跟蹤,可以查看設備與服務器交互的過程,調試比較方便,如果數據不對,或者其他問題,在服務器消息跟蹤頁面可以快速定位問題。
5. 上位機軟件開發
為了方便查看設備的環境溫濕度、土壤濕度信息,遠程控制電機澆花,還需要開發一款可視化界面軟件。
華為云物聯網平臺提供了應用端開發的API接口,可以通過對應的API完成數據交互。
5.1 應用端開發接口
查詢設備列表這個接口是查詢在這個產品目錄下有幾個設備,返回設置設備的列表信息。
前面也說過,一個產品下可以創建很多個設備。
幫助文檔地址: https://support.huaweicloud.com/api-iothub/iot_06_v5_0048.html
官方提供了API接口,可以直接獲取產品下面的所有設備詳細信息返回。
關于請求參數,返回結果的字段含義,在幫助文檔里有詳細介紹。
接口的在線調試地址:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ListDevices
第一次使用接口時,可以使用在線調試接口測試參數,交互過程。
URL格式: /v5/iot/{project_id}/devices 示例: https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/611f253373344433821fb63448091eec/devices
響應的數據:
{ "devices": [ { "app_id": "e91f518007424be0bbe2763d0e2e1c0d", "app_name": "DefaultApp_622ezesm", "device_id": "622ef2e8c4e6a958e356fe84_STM32", "node_id": "STM32", "gateway_id": "622ef2e8c4e6a958e356fe84_STM32", "device_name": "澆花設備", "node_type": "GATEWAY", "description": null, "fw_version": null, "sw_version": null, "device_sdk_version": null, "product_id": "622ef2e8c4e6a958e356fe84", "product_name": "澆花神器", "status": "OFFLINE", "tags": [] } ], "page": { "count": 1, "marker": "622ef8e6b617d2412bae4c7e" } }
通過查詢屬性的接口,可以主動請求獲取設備詳細屬性。
流程是:應用層調用這個API接口---->請求服務器----->請求客戶端設備------>返回給服務器----->返回給應用層調用處。
文檔地址:https://support.huaweicloud.com/api-iothub/iot_06_v5_0034.html
在線調試接口:https://apiexplorer.developer.huaweicloud.com/apiexplorer/debug?product=IoTDA&api=ListProperties
采用MQTT客戶端軟件模擬,設備登錄,再使用上面的調試接口調試。
數據總結:
設備端響應的主題格式: $oc/devices/{device_id}/sys/properties/get/response/request_id={request_id} 示 例: $oc/devices/622ef2e8c4e6a958e356fe84_STM32/sys/properties/get/response/request_id=43408b9d-41d1-48a6-a2e7-ece314dbd0a3 設備端響應的數據格式: {"services": [{"service_id": "STM32","properties":{"temp":14,"humidity":22,"soil_moisture":16,"motor":0}}]} 應用端上位機收到設備端的響應數據: { "response": { "services": [ { "service_id": "STM32", "properties": { "temp": 14, "humidity": 22, "soil_moisture": 16, "motor": 0 } } ] } }
設備的產品模型中定義了物聯網平臺可向設備下發的屬性,應用服務器可調用此接口向指定設備下屬性。平臺負責將屬性以同步方式發送給設備,并將設備執行屬性結果同步返回。
文檔地址: https://support.huaweicloud.com/api-iothub/iot_06_v5_0035.html
在線調試地址: https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=UpdateProperties
請求URL: https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/611f253373344433821fb63448091eec/devices/622ef2e8c4e6a958e356fe84_STM32/properties 請求體: { "services": [ { "service_id": "STM32", "properties": { "motor": 1 } } ] }
設備響應格式:https://support.huaweicloud.com/api-iothub/iot_06_v5_3008.html
響應的主題格式: $oc/devices/{device_id}/sys/properties/set/response/request_id={request_id} 示例: $oc/devices/622ef2e8c4e6a958e356fe84_STM32/sys/properties/set/response/request_id=ad492c4f-7498-4243-b6ae-93089eda1945 響應的數據: {"result_code": 0,"result_desc": "success"}
5.2 創建IAM賬戶
創建一個IAM賬戶,方便接下來使用API接口訪問華為云服務時,生成token登錄密匙。
地址:https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/users
User Name Access Key Id Secret Access Key ds_abc IQJXEPFKUALTIBKYKJ0Q xweOS1ohe9c5KQ2fqyYPhwmdv37WicxGOaybi1FC
5.3 開發上位機軟件
上位機軟件采用Qt框架設計,Qt是一個跨平臺的C++圖形用戶界面應用程序框架。Qt是一個1991年由Qt Company開發的跨平臺C++圖形用戶界面應用程序開發框架。它既可以開發GUI程序,也可用于開發非GUI程序,比如控制臺工具和服務器。簡單來說,QT可以很輕松的幫你做帶界面的軟件,甚至不需要你投入很大精力。
QT官網: https://www.qt.io/
QT入門實戰專欄: https://blog.csdn.net/xiaolong1126626497/category_11400392.html
//手動澆花 void Widget::on_pushButton_ditu_clicked() { //修改屬性 function_select=2; QString requestUrl; QNetworkRequest request; //設置請求地址 QUrl url; //修改屬性的地址 requestUrl="https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/611f253373344433821fb63448091eec/devices/622ef2e8c4e6a958e356fe84_STM32/properties"; //設置數據提交格式 request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json")); //設置token request.setRawHeader("X-Auth-Token",Token); //構造請求 url.setUrl(requestUrl); request.setUrl(url); //打包請求參數賦值 QString post_param=QString("{\"service_id\":\"STM32\",\"properties\":{\"motor\":1}}"); //發送請求 manager->put(request, post_param.toUtf8()); } //查詢所有設備 void Widget::Get_AllDevice() { //查詢設備列表 function_select=1; QString requestUrl; QNetworkRequest request; //設置請求地址 QUrl url; //設備列表請求地址 requestUrl = QString("https://iotda.%1.myhuaweicloud.com/v5/iot/%2/devices?product_id=%3&is_cascade_query=false&limit=10&marker=ffffffffffffffffffffffff&offset=0") .arg(SERVER_ID) .arg(PROJECT_ID) .arg(Product_id); //設置數據提交格式 request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json")); //設置token request.setRawHeader("X-Auth-Token",Token); //構造請求 url.setUrl(requestUrl); request.setUrl(url); //發送請求 manager->get(request); } //查詢設備屬性 void Widget::Get_device_properties() { //表示查詢設備屬性 function_select=0; QString requestUrl; QNetworkRequest request; //設置請求地址 QUrl url; if(device_id_lis.size()<=0) { //顯示錯誤代碼 QMessageBox::information(this,"提示","未選擇設備,請先獲取設備列表\n選擇設備后重試.",QMessageBox::Ok,QMessageBox::Ok); return; } //獲取token請求地址 requestUrl = QString("https://iotda.%1.myhuaweicloud.com/v5/iot/%2/devices/%3/properties?service_id=%4") .arg(SERVER_ID) .arg(PROJECT_ID) .arg(device_id_lis.at(ui->comboBox->currentIndex())) .arg(service_id); //自己創建的TCP服務器,測試用 //requestUrl="http://10.0.0.6:8080"; //設置數據提交格式 request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json")); //設置token request.setRawHeader("X-Auth-Token",Token); //構造請求 url.setUrl(requestUrl); request.setUrl(url); //發送請求 manager->get(request); }
6. STM32設備端開發
6.1 設備實物圖
6.3 運行過程
(1)下載程序
(2)正常上電串口調試助手輸出。
(3)登錄成功后,設備上線:
(4)澆水測試
(5)更新數據
6.4 土壤濕度傳感器代碼
#include "adc.h" /* 函數功能:初始化ADC1為規則通道 轉換通道1-->PA1 */ void AdcInit(void) { /*開啟端口時鐘*/ RCC->APB2ENR|=1<<2; //PA GPIOA->CRL&=0xFFFFFF0F; GPIOA->CRL|=0x00000000; //配置PA1為模擬輸入 /*開啟ADC1的外設時鐘*/ RCC->APB2ENR|=1<<9; /*開啟ADC1的外設復位時鐘*/ RCC->APB2RSTR|=1<<9; //開始復位 RCC->APB2RSTR&=~(1<<9); //停止復位 /*配置ADC預分頻器*/ RCC->CFGR&=~(0X3<<14); //清除預分頻寄存器 RCC->CFGR|=0x2<<14; //配置ADC時鐘為12MHZ.注意:ADC的時鐘不能超過14MHZ /*ADC相關的基本配置*/ ADC1->CR1&=~(0xF<<16); //ADC工作在獨立模式 ADC1->CR2|=1<<20; //使用外部事件啟動轉換。 ADC1->CR2|=0X7<<17; //選擇啟動規則通道組轉換的外部事件 ADC1->CR2&=~(1<<11); //0:數據右對齊; ADC1->CR2&=~(1<<1); //0:單次轉換模式; /*ADC輸入通道配置*/ ADC1->SQR1&=~(0XF<<20); //規則通道序列長度 : 1個轉換 /*ADC通道1采樣時間配置*/ ADC1->SMPR2&=~(0x7<<(3*1)); ADC1->SMPR2|=0x7<<(3*1); //通道1的采樣時間239.5周期 ADC1->CR2|=1<<0; //1:開啟ADC并啟動轉換。 ADC1->CR2|=1<<3; //1:初始化校準寄存器。 while(ADC1->CR2&1<<3){} //等待校準結束 ADC1->CR2|=1<<2; //1:開始校準。 while(ADC1->CR2&1<<2){} //等待校準結束 } /* 獲取ch通道的ADC轉換值 ch的范圍:0-17 16 :內部溫度 17 :內部參考電壓值 0-15 :外部輸入引腳 */ u16 GetAdcCHxDATA(u8 ch) { ADC1->SQR3&=0XFFFFFFE0; //E=:1110 清除通道號 ADC1->SQR3|=ch; //設置要轉換的通道 ADC1->CR2|=1<<22; //開始轉換規則通道 while(!ADC1->SR&1<<1){} //等待規則通道轉換完畢 return ADC1->DR; //返回采集的值 } /* dat=temp*3.3/4095; //轉換的電壓值 dat=(1.43-dat)/0.0043+25; //實際溫度=(1.43-測出的電壓)/0.0043+25; */
6.5 DHT11溫濕度傳感器代碼
#include "dht11.h" #include "delay.h" //復位DHT11 void DHT11_Rst(void) { DHT11_IO_OUT(); //SET OUTPUT DHT11_DQ_OUT=0; //拉低DQ DelayMs(20); //拉低至少18ms DHT11_DQ_OUT=1; //DQ=1 DelayUs(30); //主機拉高20~40us } //等待DHT11的回應 //返回1:未檢測到DHT11的存在 //返回0:存在 u8 DHT11_Check(void) { u8 retry=0; DHT11_IO_IN();//SET INPUT while (DHT11_DQ_IN&&retry<100)//DHT11會拉低40~80us { retry++; DelayUs(1); }; if(retry>=100)return 1; else retry=0; while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后會再次拉高40~80us { retry++; DelayUs(1); }; if(retry>=100)return 1; return 0; } //從DHT11讀取一個位 //返回值:1/0 u8 DHT11_Read_Bit(void) { u8 retry=0; while(DHT11_DQ_IN&&retry<100)//等待變為低電平 { retry++; DelayUs(1); } retry=0; while(!DHT11_DQ_IN&&retry<100)//等待變高電平 { retry++; DelayUs(1); } DelayUs(40);//等待40us if(DHT11_DQ_IN)return 1; else return 0; } //從DHT11讀取一個字節 //返回值:讀到的數據 u8 DHT11_Read_Byte(void) { u8 i,dat; dat=0; for (i=0;i<8;i++) { dat<<=1; dat|=DHT11_Read_Bit(); } return dat; } //從DHT11讀取一次數據 //temp:溫度值(范圍:0~50°) //humi:濕度值(范圍:20%~90%) //返回值:0,正常;1,讀取失敗 u8 DHT11_Read_Data(u8 *temp,u8 *humi) { u8 buf[5]; u8 i; DHT11_Rst(); //printf("------------------------\r\n"); if(DHT11_Check()==0) { for(i=0;i<5;i++)//讀取40位數據 { buf[i]=DHT11_Read_Byte(); } if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) { *humi=buf[0]; *temp=buf[2]; } }else return 1; return 0; } //初始化DHT11的IO口 DQ 同時檢測DHT11的存在 //返回1:不存在 //返回0:存在 u8 DHT11_Init(void) { RCC->APB2ENR|=1<<2; //使能PORTA口時鐘 GPIOA->CRL&=0XFF0FFFFF;//PORTA.5 推挽輸出 GPIOA->CRL|=0X00300000; GPIOA->ODR|=1<<5; //輸出1 DHT11_Rst(); return DHT11_Check(); }
6.6 主函數邏輯代碼
#include "stm32f10x.h" #include "led.h" #include "delay.h" #include "key.h" #include "usart.h" #include
6.7 硬件接線說明
1. ESP8266 WIFI接線 ATK-ESP8266串口WIFI模塊與STM32的串口2相連接。 PA2(TX)--RXD 模塊接收腳 PA3(RX)--TXD 模塊發送腳 GND---GND 地 VCC---VCC 電源(3.3V~5.0V) 2. TFT 1.44 寸彩屏接線 GND 電源地 VCC 接5V或3.3v電源 SCL 接PC8(SCL) SDA 接PC9(SDA) RST 接PBPC10 DC 接PB7 CS 接PB8 BL 接PB11 3. DHT11 溫濕度 VCC--VCC GND---GND DAT---PA5 4. 澆水電機 GND---GND VCC---5V AO----PA4 5. 土壤濕度 GND---GND VCC---3.3V AO----PA1 6. 板載LED燈接線 LED1---PA8 LED2---PD2 7. 板載按鍵接線 K0---PA0 K1---PC5 K2---PA15
云端實踐 IoT 硬件開發
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。