基于華為云物聯網設計的澆花神器【玩轉華為云】

      網友投稿 820 2025-03-31

      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 #include "timer.h" #include "esp8266.h" #include "mqtt.h" #include "motor.h" #include "oled.h" #include "dht11.h" #include "adc.h" /* 硬件連接方式: 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 */ //華為物聯網服務器的設備信息 #define MQTT_ClientID "622ef2e8c4e6a958e356fe84_STM32_0_0_2022031408" #define MQTT_UserName "622ef2e8c4e6a958e356fe84_STM32" #define MQTT_PassWord "c9bc1837fc5cba8728a5e7ad625e422799e9a96975e3836a0054ea8e00f9ae5d" //訂閱與發布的主題 #define SET_TOPIC "$oc/devices/622ef2e8c4e6a958e356fe84_STM32/sys/messages/down" //訂閱 #define POST_TOPIC "$oc/devices/622ef2e8c4e6a958e356fe84_STM32/sys/properties/report" //發布 //設置連接的路由器信息 #define CONNECT_WIFI "Xiaomi_meizi6" //將要連接的路由器名稱 --不要出現中文、空格等特殊字符 #define CONNECT_PASS "12170307yu" //將要連接的路由器密碼 #define CONNECT_SERVER_IP "121.36.42.100" //服務器IP地址 #define CONNECT_SERVER_PORT 1883 //服務器端口號 char mqtt_message[200];//上報數據緩存區 //JTAG模式設置,用于設置JTAG的模式 //mode:jtag,swd模式設置;00,全使能;01,使能SWD;10,全關閉; #define JTAG_SWD_DISABLE 0X02 #define SWD_ENABLE 0X01 #define JTAG_SWD_ENABLE 0X00 void JTAG_Set(u8 mode) { u32 temp; temp=mode; temp<<=25; RCC->APB2ENR|=1<<0; //開啟輔助時鐘 AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24] AFIO->MAPR|=temp; //設置jtag模式 } u32 motor_time_cnt=0; u8 motor_flag=0; //灌溉標志 //開啟抽水點擊、澆花 void open_motor() { motor_flag=1; //開始灌溉標志 motor_time_cnt=0; //計數器--定時 MOTOR=1; //開始灌溉 } //關閉抽水電機 void close_motor() { motor_flag=0; MOTOR=0; //停止灌溉 } u8 temp; u8 humidity; u16 soil_moisture; char request_id[100]; char data_buff[300]; int main() { u8 esp8266_state=0; u8 key; u8 i; u32 time_cnt=0; JTAG_Set(JTAG_SWD_DISABLE); //釋放PA15 LED_Init(); KEY_Init(); USART1_Init(115200); Moto_Init(); //電機初始化 USART2_Init(115200);//串口-WIFI TIMER2_Init(72,20000); //超時時間20ms DHT11_Init(); //初始化DHT11 AdcInit(); //土壤濕度傳感器--ADC檢測 Lcd_Init(); //LCD初始化 Lcd_Clear(0); //清屏為黑色 LCD_LED_SET;//通過IO控制背光亮 printf("正在初始化WIFI請稍等.\r\n"); for(i=0;i<5;i++) { if(ESP8266_Init()==0) { esp8266_state=1; break; } else { esp8266_state=0; printf("ESP8266硬件檢測錯誤.\n"); } } if(esp8266_state) { printf("準備連接服務器....\r\n"); //非加密端口 printf("WIFI:%d\n",ESP8266_STA_TCP_Client_Mode(CONNECT_WIFI,CONNECT_PASS,CONNECT_SERVER_IP,CONNECT_SERVER_PORT,1)); //2. MQTT協議初始化 MQTT_Init(); //3. 連接服務器 for(i=0;i<5;i++) { if(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord)==0) { esp8266_state=1; break; } esp8266_state=0; printf("服務器連接失敗,正在重試...\n"); delay_ms(500); } printf("服務器連接成功.\n"); //3. 訂閱主題 if(MQTT_SubscribeTopic(SET_TOPIC,0,1)) { printf("主題訂閱失敗.\n"); } else { printf("主題訂閱成功.\n"); } } while(1) { //按鍵可以測試澆花 key=KEY_Scan(0); if(key==2) { LED1=0; //亮燈--表示開鎖 time_cnt=0; //開始澆水 open_motor(); printf("啟動電機灌溉..\r\n"); } else if(key==3) { LED2=!LED2; } DelayMs(10); time_cnt++; motor_time_cnt++; //如果需要灌溉 if(motor_flag) { //5秒后停止灌溉 if(motor_time_cnt>500) { close_motor(); printf("灌溉電機停止..\r\n"); } } if(time_cnt>=100) { time_cnt=0; LED1=!LED1; soil_moisture=GetAdcCHxDATA(1); //獲取一次轉換值 //2099 printf("土壤濕度:%d\r\n",soil_moisture); if(DHT11_Read_Data(&temp,&humidity)) { printf("溫度讀取失敗.\r\n"); } printf("環境溫度:%d\r\n環境濕度:%d\r\n",temp,humidity); //Lcd_Clear(0); //清屏為黑色 sprintf(mqtt_message,"H1:%d",soil_moisture); Gui_DrawFont_GBK16(0,16*0,RED,GRAY0,(u8*)mqtt_message); sprintf(mqtt_message,"H2:%d",humidity); Gui_DrawFont_GBK16(0,16*1,RED,GRAY0,(u8*)mqtt_message); sprintf(mqtt_message,"T2:%d",temp); Gui_DrawFont_GBK16(0,16*2,RED,GRAY0,(u8*)mqtt_message); //土壤濕度越高,ADC得到的值越小 //土壤比較干,啟動澆水 if(soil_moisture>4090) { //開始澆水 open_motor(); } //上報數據 sprintf(mqtt_message,"{\"services\": [{\"service_id\":\"STM32\",\"properties\":{\"temp\":%d,\"humidity\":%d,\"soil_moisture\":%d}}]}", temp,humidity,soil_moisture); MQTT_PublishData(POST_TOPIC,mqtt_message,0); printf("更新數據.\r\n"); } // 接收WIFI返回的數據 if(USART2_RX_FLAG) { USART2_RX_BUFFER[USART2_RX_CNT]='\0'; printf("UART3收到數據.....\r\n"); //向串口打印服務器返回的數據 for(i=0;i5) { //使用字符串查找函數 //設置屬性,澆水 //"motor":1 if(strstr((char*)&USART2_RX_BUFFER[5],"properties/set/request_id")) { char *p=NULL; p=strstr((char*)&USART2_RX_BUFFER[5],"request_id"); if(p) { //解析數據 //$oc/devices/6210e8acde9933029be8facf_dev1/sys/properties/get/request_id=5f359b5c-542f-460e-9f51-85e82150ff4a{"service_id":"gps"} strncpy(request_id,p,47); } //上報數據 sprintf(mqtt_message,"{\"result_code\": 0,\"result_desc\": \"success\"}"); sprintf(data_buff,"$oc/devices/622ef2e8c4e6a958e356fe84_STM32/sys/properties/set/response/%s", request_id); MQTT_PublishData(data_buff,mqtt_message,0); printf("發布主題:%s\r\n",data_buff); printf("發布數據:%s\r\n",mqtt_message); //開始澆水 open_motor(); } //獲取屬性 else if(strstr((char*)&USART2_RX_BUFFER[5],"properties/get/request_id")) { char *p=NULL; p=strstr((char*)&USART2_RX_BUFFER[5],"request_id"); if(p) { //解析數據 //$oc/devices/6210e8acde9933029be8facf_dev1/sys/properties/get/request_id=5f359b5c-542f-460e-9f51-85e82150ff4a{"service_id":"gps"} strncpy(request_id,p,47); } //上報數據 sprintf(mqtt_message,"{\"services\": [{\"service_id\":\"STM32\",\"properties\":{\"temp\":%d,\"humidity\":%d,\"soil_moisture\":%d}}]}", humidity,temp,soil_moisture); sprintf(data_buff,"$oc/devices/622ef2e8c4e6a958e356fe84_STM32/sys/properties/get/response/%s", request_id); MQTT_PublishData(data_buff,mqtt_message,0); printf("發布主題:%s\r\n",data_buff); printf("發布數據:%s\r\n",mqtt_message); } USART2_RX_CNT=0; USART2_RX_FLAG=0; } } } }

      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小時內刪除侵權內容。

      上一篇:甘特圖excel模板(甘特圖excel怎么做進度計劃)
      下一篇:wps怎么合并和拆分單元格
      相關文章
      亚洲精品国产摄像头| 亚洲影视一区二区| 内射无码专区久久亚洲| 国产成人精品日本亚洲网址| ZZIJZZIJ亚洲日本少妇JIZJIZ| 精品亚洲成a人在线观看| 亚洲av永久中文无码精品综合 | 亚洲国产精品无码久久久秋霞1 | 67194在线午夜亚洲| 亚洲国产精品无码久久久| 亚洲乱码无限2021芒果| 亚洲乱码卡一卡二卡三| 亚洲国产成人精品激情| 亚洲欧洲日本在线观看| 中文字幕无码精品亚洲资源网久久 | 亚洲精品日韩专区silk| 久久综合亚洲鲁鲁五月天| 狠狠色婷婷狠狠狠亚洲综合| 亚洲偷自拍另类图片二区| 亚洲精品av无码喷奶水糖心| 亚洲heyzo专区无码综合| 国产亚洲综合一区二区三区| 亚洲精品成人久久久| 中文字幕亚洲专区| 国产亚洲综合网曝门系列| 亚洲高清成人一区二区三区| jjzz亚洲亚洲女人| 久久久久亚洲AV成人网人人软件| 中国亚洲女人69内射少妇| 亚洲AV无码一区二区二三区软件| 无码久久精品国产亚洲Av影片| 少妇中文字幕乱码亚洲影视| 亚洲欧洲日韩综合| 亚洲砖码砖专无区2023| 亚洲成a∧人片在线观看无码| 亚洲 自拍 另类小说综合图区| 亚洲午夜成人精品电影在线观看| 亚洲色大成网站WWW久久九九| 久久精品亚洲综合一品| 亚洲成a人片在线观看中文!!!| 亚洲中文字幕AV在天堂|