0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32L4小熊派設(shè)計(jì)的云端綠化管理系統(tǒng)(華為云IOT)

DS小龍哥-嵌入式技術(shù) ? 來(lái)源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2023-07-12 09:39 ? 次閱讀

1. 設(shè)計(jì)需求、硬件環(huán)境介紹

1.1 項(xiàng)目背景

隨著城市化進(jìn)程的不斷加快,綠化管理成為城市建設(shè)和環(huán)境保護(hù)的重要組成部分。為了實(shí)現(xiàn)對(duì)城市綠化的智能化管理和優(yōu)化,決定設(shè)計(jì)一個(gè)基于STM32L4小熊派的云端綠化管理系統(tǒng),利用華為云IoT物聯(lián)網(wǎng)平臺(tái)來(lái)實(shí)現(xiàn)數(shù)據(jù)的采集、傳輸和分析。

該系統(tǒng)的設(shè)備平臺(tái)采用小熊派開(kāi)發(fā)板,搭載了意法半導(dǎo)體的低功耗芯片STM32L431。該芯片具有低功耗和高性能的特點(diǎn),非常適合用于物聯(lián)網(wǎng)設(shè)備。通過(guò)配合外部的專(zhuān)業(yè)傳感器,如溫濕度傳感器和光照度傳感器,系統(tǒng)能夠?qū)崟r(shí)獲取空氣中的溫濕度數(shù)據(jù)和光照度數(shù)據(jù)。

系統(tǒng)的核心是華為云IoT物聯(lián)網(wǎng)平臺(tái),它提供了豐富的功能和服務(wù),包括設(shè)備接入、數(shù)據(jù)采集、消息通信、云端數(shù)據(jù)存儲(chǔ)和分析等??梢岳迷撈脚_(tái)的能力來(lái)接收來(lái)自小熊派設(shè)備的數(shù)據(jù),并進(jìn)行云端的數(shù)據(jù)分析和處理。

當(dāng)傳感器獲取到空氣中的溫濕度數(shù)據(jù)和光照度數(shù)據(jù)后,小熊派將數(shù)據(jù)通過(guò)無(wú)線(xiàn)通信發(fā)送到華為云IoT物聯(lián)網(wǎng)平臺(tái)。云平臺(tái)接收到數(shù)據(jù)后,會(huì)進(jìn)行實(shí)時(shí)的數(shù)據(jù)分析和處理。根據(jù)預(yù)設(shè)的綠化管理規(guī)則和條件,系統(tǒng)可以判斷當(dāng)前種植區(qū)的空氣溫濕度是否適合進(jìn)行灌溉。

當(dāng)系統(tǒng)判斷需要進(jìn)行灌溉時(shí),它可以通過(guò)華為云IoT物聯(lián)網(wǎng)平臺(tái)向指定的灌溉設(shè)備發(fā)送指令,實(shí)現(xiàn)自動(dòng)灌溉操作。同時(shí),系統(tǒng)還可以將實(shí)時(shí)的溫濕度數(shù)據(jù)和光照度數(shù)據(jù)存儲(chǔ)在云端,以便后續(xù)的數(shù)據(jù)分析和管理。

通過(guò)這個(gè)云端綠化管理系統(tǒng),可以實(shí)現(xiàn)對(duì)城市綠化的智能化管理和優(yōu)化。通過(guò)實(shí)時(shí)監(jiān)測(cè)和分析空氣溫濕度和光照度數(shù)據(jù),系統(tǒng)可以根據(jù)植物的生長(zhǎng)需求進(jìn)行精確的灌溉控制,提高綠化效果,節(jié)約水資源。同時(shí),利用華為云IoT物聯(lián)網(wǎng)平臺(tái)的強(qiáng)大功能,可以實(shí)現(xiàn)設(shè)備的遠(yuǎn)程管理和數(shù)據(jù)的實(shí)時(shí)監(jiān)控,提高綠化管理的效率和便捷性。

本項(xiàng)目利用STM32L4小熊派設(shè)計(jì)基于華為云IoT物聯(lián)網(wǎng)平臺(tái)的云端綠化管理系統(tǒng),通過(guò)實(shí)時(shí)監(jiān)測(cè)和控制空氣溫濕度和光照度,實(shí)現(xiàn)智能化的綠化管理和優(yōu)化,為城市綠化工作提供科技支持,促進(jìn)城市的可持續(xù)發(fā)展和環(huán)境保護(hù)。

1.2 實(shí)現(xiàn)功能

本項(xiàng)目利用意法半導(dǎo)體的STM32L431微控制器ESP8266 WiFi模塊,配合華為云物聯(lián)網(wǎng)平臺(tái)服務(wù)器,構(gòu)建了一個(gè)微型綠化管理系統(tǒng)。該系統(tǒng)包括六個(gè)功能模塊:

  1. 基礎(chǔ)系統(tǒng)模塊:負(fù)責(zé)接收和轉(zhuǎn)發(fā)各種數(shù)據(jù),并控制掃水作業(yè)的進(jìn)行。澆水作業(yè)是通過(guò)板載電機(jī)進(jìn)行模擬控制。
  2. 溫度采集模塊:用于采集監(jiān)測(cè)區(qū)域的溫度數(shù)據(jù),并將數(shù)據(jù)傳輸給微控制器。
  3. 濕度采集模塊:用于采集監(jiān)測(cè)區(qū)域的濕度數(shù)據(jù),并將數(shù)據(jù)傳輸給微控制器。
  4. 光照采集模塊:用于采集監(jiān)測(cè)區(qū)域的光照數(shù)據(jù),并將數(shù)據(jù)傳輸給微控制器。
  5. 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)模塊:負(fù)責(zé)將采集到的數(shù)據(jù)上傳至云平臺(tái),并進(jìn)行數(shù)據(jù)下發(fā)和交互等操作。
  6. OLED顯示屏模塊:實(shí)時(shí)顯示監(jiān)測(cè)到的各項(xiàng)數(shù)據(jù)。

當(dāng)前項(xiàng)目選用了ESP8266作為無(wú)線(xiàn)WiFi通信模塊,因其價(jià)格低廉、支持串口編程、提供完善的AT指令資料等特點(diǎn),非常適合學(xué)習(xí)使用。通過(guò)對(duì)ESP8266的編程實(shí)驗(yàn),可以學(xué)習(xí)TCP和MQTT網(wǎng)絡(luò)編程相關(guān)知識(shí)。

本項(xiàng)目通過(guò)整合各個(gè)功能模塊,實(shí)現(xiàn)了對(duì)溫度、濕度和光照等數(shù)據(jù)的采集,并利用這些數(shù)據(jù)判斷是否需要進(jìn)行灌溉。同時(shí),通過(guò)無(wú)線(xiàn)傳感器網(wǎng)絡(luò)模塊將數(shù)據(jù)上傳至云平臺(tái),并在OLED顯示屏上實(shí)時(shí)展示監(jiān)測(cè)到的數(shù)據(jù)。這個(gè)綠化管理系統(tǒng)為學(xué)習(xí)者提供了一個(gè)理想的實(shí)踐平臺(tái),可以加深對(duì)TCP、MQTT和物聯(lián)網(wǎng)技術(shù)的理解和應(yīng)用。

1.3 設(shè)備實(shí)物圖

小熊開(kāi)發(fā)板的設(shè)備相關(guān)實(shí)物圖如下:

2. 創(chuàng)建IOT服務(wù)器端產(chǎn)品

2.1 創(chuàng)建產(chǎn)品

直接打開(kāi)物聯(lián)網(wǎng)產(chǎn)品頁(yè)面: https://www.huaweicloud.com/product/iothub.html

image-20211230104413905

打開(kāi)產(chǎn)品頁(yè)面,選擇右上角創(chuàng)建產(chǎn)品。

image-20211230104528780

根據(jù)自己情況填寫(xiě)信息。

image-20211230104628676

創(chuàng)建成功后打開(kāi)產(chǎn)品詳情頁(yè)面,拉到最下面,點(diǎn)擊創(chuàng)建自定義模型文件。

image-20211230104743669

這里創(chuàng)建模型文件主要就是為了MQTT客戶(hù)端能夠正確的上傳傳感器數(shù)據(jù)上來(lái),每個(gè)傳感器設(shè)置一個(gè)屬性,這個(gè)屬性就是表示了傳感器的數(shù)據(jù)值類(lèi)型。

比如: 先添加一個(gè)電機(jī),這個(gè)電機(jī)就是澆水電機(jī),能上報(bào)開(kāi)關(guān)狀態(tài),云端也能下發(fā)命令控制電機(jī),所以需要添加屬性和下發(fā)的命令。

image-20211230104855227

添加屬性:

image-20211230105133158

添加命令: 因?yàn)殡姍C(jī)需要云端遠(yuǎn)程控制。

image-20211230105322105

接下來(lái)就創(chuàng)建溫度、濕度、光照度傳感器的屬性,這些傳感器只是向云端上傳數(shù)據(jù),不需要下發(fā)指令控制,所以只創(chuàng)建屬性就行了。

image-20211230105541888

image-20211230105609401

image-20211230105640730

創(chuàng)建完畢效果,一共有4個(gè)屬性,電機(jī)、溫度、濕度、光強(qiáng)度:

image-20211230105707542

2.2 創(chuàng)建設(shè)備

選擇設(shè)備頁(yè)面,注冊(cè)設(shè)備。

image-20211230105936066

創(chuàng)建后保持設(shè)備密匙等信息,接下來(lái)登錄服務(wù)器時(shí),生成MQTT賬號(hào)密匙需要用到這些參數(shù)。

image-20211230110048677

當(dāng)前創(chuàng)建的設(shè)備信息如下:

{
     "device_id": "61cd1d97078a93029b84e7b6_1126626497",
     "secret": "1126626497"
 }

2.3 生成MQTT登錄賬號(hào)信息

官微提供的在線(xiàn)小工具: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

按照提示填入數(shù)據(jù),生成,非常方便。

image-20211230110439211

當(dāng)前生成的信息如下:

ClientId 61cd1d97078a93029b84e7b6_1126626497_0_0_2021123003
 Username 61cd1d97078a93029b84e7b6_1126626497
 Password b219f3a0099fa0284a2671a5c699b67a7cf6d5f7355d9ee8190011f3b64f71b5

3. 使用MQTT客戶(hù)端模擬測(cè)試

為了驗(yàn)證服務(wù)器配置是否OK,先使用MQTT客戶(hù)端軟件進(jìn)行連接測(cè)試。

3.1 華為云IOT服務(wù)器地址與端口

image-20211230110724920

端口: 1883
 域名: a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
 IP地址: 121.36.42.100

3.2 訂閱主題

在產(chǎn)品頁(yè)面,可以看到主題管理頁(yè)面,能看到當(dāng)前設(shè)備可以訂閱的主題有哪些。

image-20211230110922857

一般訂閱下發(fā)的數(shù)據(jù):

格式: $oc/devices/{device_id}/sys/messages/down
 //訂閱主題: 平臺(tái)下發(fā)消息給設(shè)備
 $oc/devices/61cd1d97078a93029b84e7b6_1126626497/sys/messages/down

3.3 上報(bào)主題數(shù)據(jù)

官方文檔介紹: https://support.huaweicloud.com/devg-iothub/iot_01_2127.html

image-20211230111152241

服務(wù)ID,屬性ID在產(chǎn)品頁(yè)面查看,2.1小節(jié)創(chuàng)建產(chǎn)品里就講了這個(gè)屬性的作用。

image-20211230111748205

每次可以單個(gè)屬性上報(bào),也可以一起上報(bào)。

格式: $oc/devices/{device_id}/sys/properties/report
 //設(shè)備上報(bào)主題請(qǐng)求
 $oc/devices/61cd1d97078a93029b84e7b6_1126626497/sys/properties/report
 ?
 //上報(bào)的數(shù)據(jù)格式如下
     
 //電機(jī)開(kāi)狀態(tài)反饋
 {"services": [{"service_id": "motor","properties":{"motor":1}}]}
 ?
 //電機(jī)關(guān)狀態(tài)反饋
 {"services": [{"service_id": "motor","properties":{"motor":0}}]}
 ?
 //溫度上報(bào)
 {"services": [{"service_id": "motor","properties":{"SHT30_H":14}}]}
 ?
 //濕度上報(bào)
 {"services": [{"service_id": "motor","properties":{"SHT30_L":70}}]}
 ?
 //光照強(qiáng)度上報(bào)
 {"services": [{"service_id": "motor","properties":{"BH1750":80}}]}
 ?
 //也可以一起上報(bào)
 {"services": [{"service_id": "motor","properties":{"motor":1}},{"service_id": "motor","properties":{"SHT30_H":15}},{"service_id": "motor","properties":{"SHT30_L":70}},{"service_id": "motor","properties":{"BH1750":80}}]}

3.4 登錄服務(wù)器

按照軟件提示,填入相關(guān)數(shù)據(jù)即可。

如需要也需要使用和我一樣的同款軟件,打開(kāi)百度搜索MQTT客戶(hù)端_v2.4(協(xié)議3.1.1).exe 即可找到下載地址。

image-20211230112304696

發(fā)送數(shù)據(jù)后查看云端,已經(jīng)登錄成功,數(shù)據(jù)已經(jīng)上傳成功。

image-20211230112059007

3.5 下發(fā)命令

電機(jī)設(shè)備支持讀寫(xiě),支持下發(fā)命令,在設(shè)備頁(yè)面測(cè)試。

image-20211230112844980

image-20211230112932187

點(diǎn)擊確定之后,參看MQTT客戶(hù)端軟件,已經(jīng)收到了下發(fā)的數(shù)據(jù)。

image-20211230113038784

len:174,Data:l$oc/devices/61cd1d97078a93029b84e7b6_1126626497/sys/commands/request_id=390ce15d-6e69-4021-b83a-5e953eea874c{"paras":{"motor":1},"service_id":"motor","command_name":"motor"}

4. 設(shè)備端上華為云IOT

工程代碼:

image-20211230114207096

image-20211230114357552

image-20211230114431687

工程代碼較多,這里就貼出main.c全部代碼:

項(xiàng)目源碼:https://download.csdn.net/download/xiaolong1126626497/81993720

#include "main.h"
#include "stm32l4xx_hal.h"
#include "i2c.h"
#include "usart.h"
#include "gpio.h"
#include "E53_IA1.h"
#include "lcd.h"
#include "spi.h"
#include "mqtt.h"
#include "esp8266.h"


/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

void SystemClock_Config(void);


#define ESP8266_WIFI_AP_SSID  "CMCC-Cqvn"   //將要連接的路由器名稱(chēng) --不要出現(xiàn)中文、空格等特殊字符
#define ESP8266_AP_PASSWORD "99pu58cb"     //將要連接的路由器密碼


//華為云IOT物聯(lián)網(wǎng)服務(wù)器的設(shè)備信息
#define MQTT_ClientID "61cd1d97078a93029b84e7b6_1126626497_0_0_2021123003"
#define MQTT_UserName "61cd1d97078a93029b84e7b6_1126626497"
#define MQTT_PassWord "b219f3a0099fa0284a2671a5c699b67a7cf6d5f7355d9ee8190011f3b64f71b5"
 
//訂閱與發(fā)布的主題
#define SET_TOPIC  "$oc/devices/61cd1d97078a93029b84e7b6_1126626497/sys/messages/down"  //訂閱
#define POST_TOPIC "$oc/devices/61cd1d97078a93029b84e7b6_1126626497/sys/properties/report"  //發(fā)布


//保存溫濕度、光照強(qiáng)度
E53_IA1_Data_TypeDef E53_IA1_Data;

//顯示文本
char lcd_text_str[50];


UART_HandleTypeDef at_usart;

//低功耗串口初始化
int32_t at_usart_init(void)
{
    at_usart.Instance = LPUART1;
    at_usart.Init.BaudRate = 115200;

    at_usart.Init.WordLength = UART_WORDLENGTH_8B;
    at_usart.Init.StopBits = UART_STOPBITS_1;
    at_usart.Init.Parity = UART_PARITY_NONE;
    at_usart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    at_usart.Init.Mode = UART_MODE_RX | UART_MODE_TX;
    
    if(HAL_UART_Init(&at_usart) != HAL_OK)
    {
        _Error_Handler(__FILE__, __LINE__);
    }
   // __HAL_UART_CLEAR_FLAG(usart, UART_FLAG_TC);
    __HAL_UART_ENABLE_IT(&at_usart, UART_IT_IDLE);
    __HAL_UART_ENABLE_IT(&at_usart, UART_IT_RXNE);
    HAL_NVIC_EnableIRQ(LPUART1_IRQn);					//使能USART1中斷通道
    HAL_NVIC_SetPriority(LPUART1_IRQn, 3, 3);				//搶占優(yōu)先級(jí)3,子優(yōu)先級(jí)3
    return 0;
}

unsigned char ESP8266_RecvBuf[MAX_RECV_CNT];
unsigned int ESP8266_Recv_cnt=0;
unsigned int ESP8266_Recv_flag=0;
void LPUART1_IRQHandler()
{
    //接收到數(shù)據(jù)
    if(__HAL_UART_GET_FLAG(&at_usart, UART_FLAG_RXNE) != RESET)
    {
        if(ESP8266_Recv_cnt< MAX_RECV_CNT-1)
        {
            ESP8266_RecvBuf[ESP8266_Recv_cnt++] = (uint8_t)(at_usart.Instance- >RDR & 0x00FF);
        } 
        else
        {
             ESP8266_Recv_flag=1;
        }
    }  
    else if (__HAL_UART_GET_FLAG(&at_usart, UART_FLAG_IDLE) != RESET)
    {
        __HAL_UART_CLEAR_IDLEFLAG(&at_usart);
        
         ESP8266_Recv_flag=1;
    }
}


void AT_SendData(unsigned char *p,unsigned int len)
{
    int i=0;
    for(i=0;i< len;i++)
    {
        while((LPUART1- >ISR & 0X40) == 0); //循環(huán)發(fā)送,直到發(fā)送完畢
        LPUART1- >TDR = p[i];
    }
}


char mqtt_message[200];
int main(void)
{
    int i=0;
    int cnt=0;
    int motor_state=0;
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_I2C1_Init();
    MX_SPI2_Init();
    MX_USART1_UART_Init();
    at_usart_init();
    
    //初始化硬件
    Init_E53_IA1();

    LCD_Init();					
    LCD_Clear(BLACK);//清屏為黑色
    LCD_ShowString(0, 00, 240, 32, 32, "Init ESP8266");//顯示字符串,字體大小32*32

    if(ESP8266_Init())
   {
      printf("ESP8266硬件檢測(cè)錯(cuò)誤.n");
      LCD_Clear(BLACK);//清屏為黑色
      LCD_ShowString(0, 00, 240, 32, 32, "ESP8266 ERROR");//顯示字符串,字體大小32*32
   }
   else
   {
       LCD_Clear(BLACK);//清屏為黑色
       LCD_ShowString(0, 00, 240, 32, 32, "ESP8266 OK");//顯示字符串,字體大小32*32
       printf("準(zhǔn)備連接到指定的服務(wù)器.n");
      //非加密端口
      printf("WIFI:%drn",ESP8266_STA_TCP_Client_Mode(ESP8266_WIFI_AP_SSID,ESP8266_AP_PASSWORD,"106.55.124.154",1883,1));
   }
   
    //2. MQTT協(xié)議初始化	
    MQTT_Init(); 
   
    //3. 連接華為云IOT服務(wù)器        
    while(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord))
    {
        printf("服務(wù)器連接失敗,正在重試...n");
        HAL_Delay(500);
    }
    printf("服務(wù)器連接成功.n");
    
    //3. 訂閱主題
    if(MQTT_SubscribeTopic(SET_TOPIC,0,1))
    {
        printf("主題訂閱失敗.n");
    }
    else
    {
        printf("主題訂閱成功.n");
    }        
    
      while (1)
      {
            if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_RESET)//查詢(xún)按鍵KEY1低電平
            {
                HAL_Delay(10);//消抖
                if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_RESET)//查詢(xún)按鍵KEY1低電平
                {
                    HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);//亮
                    
                    //補(bǔ)光燈亮
                    HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_SET);
                    
                    //電機(jī)轉(zhuǎn)
                    HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_SET);
                    
                    motor_state=1;
                }
            }
                
            if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==GPIO_PIN_RESET)//查詢(xún)按鍵KEY2低電平
            {
                HAL_Delay(10);//消抖
                if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==GPIO_PIN_RESET)//查詢(xún)按鍵KEY2低電平
                {
                    HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);//滅
                    
                     //補(bǔ)光燈滅
                    HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_RESET);
                    
                     //電機(jī)停
                    HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_RESET);
                    
                    motor_state=0;
                }
            }
     
         cnt++;
         HAL_Delay(10);   
         
         if(cnt >=100)
         {
            cnt=0;
            E53_IA1_Read_Data();
            printf("光照強(qiáng)度:%d %%rn", (int)E53_IA1_Data.Lux);
            printf("濕度:%d %%rn",(int)E53_IA1_Data.Humidity);
            printf("溫度:%d ℃rn", (int)E53_IA1_Data.Temperature);


            sprintf(lcd_text_str,"L: %d %%",(int)E53_IA1_Data.Lux);
            LCD_ShowString(40, 50+10+32*1, 240, 32, 32,lcd_text_str);


            sprintf(lcd_text_str,"H: %d %%",(int)E53_IA1_Data.Humidity);
            LCD_ShowString(40, 50+10+32*2, 240, 32, 32,lcd_text_str);
             

            sprintf(lcd_text_str,"T: %d C",(int)E53_IA1_Data.Temperature);
            LCD_ShowString(40, 50+10+32*3, 240, 32, 32,lcd_text_str);

            //切換引腳的狀態(tài)
            HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
             
               //上傳數(shù)據(jù)
            sprintf(mqtt_message,"{"services": [{"service_id": "motor","properties":{"motor":%d}},"
            "{"service_id": "motor","properties":{"SHT30_H":%d}},{"service_id": "motor","properties":"
            "{"SHT30_L":%d}},{"service_id": "motor","properties":{"BH1750":%d}}]}",
            motor_state,(int)E53_IA1_Data.Humidity,(int)E53_IA1_Data.Temperature,(int)E53_IA1_Data.Lux);
            
            MQTT_PublishData(POST_TOPIC,mqtt_message,0);
            
            //根據(jù)濕度自動(dòng)灌溉
            if((int)E53_IA1_Data.Humidity< 50)  //小于50自動(dòng)灌溉
            {
                 printf("自動(dòng)灌溉....n");
                 motor_state=1; //電機(jī)狀態(tài)更新
                 //電機(jī)轉(zhuǎn)
                 HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_SET);
            }  
         }

          //接收到數(shù)據(jù)
          if(ESP8266_Recv_flag)
          {
               //如果是下發(fā)了屬性,判斷是開(kāi)鎖還是關(guān)鎖
                if(ESP8266_Recv_cnt >5)
                {
                    ESP8266_RecvBuf[ESP8266_Recv_cnt]='?';
             
                    //使用字符串查找函數(shù)
                    if(strstr((char*)&ESP8266_RecvBuf[5],""machine":1"))
                    {
                         motor_state=1; //電機(jī)狀態(tài)更新
                         //電機(jī)轉(zhuǎn)
                         HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_SET);  
                         printf("開(kāi)啟電機(jī)...n");
                    }
                    else if(strstr((char*)&ESP8266_RecvBuf[5],""machine":0"))
                    {
                        //電機(jī)停
                        HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_RESET);
                    
                        motor_state=0;
                        printf("關(guān)閉電機(jī)...n");
                    }
                    
                    for(i=0;i< ESP8266_Recv_cnt;i++)printf("%c",ESP8266_RecvBuf[i]);
                    
                    ESP8266_Recv_cnt=0;    
                }
                ESP8266_Recv_flag=0;
          }
      }
}


void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_PeriphCLKInitTypeDef PeriphClkInit;

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_MSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  RCC_OscInitStruct.MSICalibrationValue = 0;
  RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
  RCC_OscInitStruct.PLL.PLLM = 1;
  RCC_OscInitStruct.PLL.PLLN = 40;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1;
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
  PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure the main internal regulator output voltage 
    */
  if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  file: The file name as string.
  * @param  line: The line in file as a number.
  * @retval None
  */
void _Error_Handler(char *file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  while(1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{ 
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %drn", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5052

    文章

    18906

    瀏覽量

    300699
  • STM32
    +關(guān)注

    關(guān)注

    2262

    文章

    10846

    瀏覽量

    353650
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1335

    瀏覽量

    78861
  • 開(kāi)發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    4834

    瀏覽量

    96820
  • IOT
    IOT
    +關(guān)注

    關(guān)注

    186

    文章

    4140

    瀏覽量

    195635
  • 華為云
    +關(guān)注

    關(guān)注

    3

    文章

    2386

    瀏覽量

    17200
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    華為聯(lián)合合作伙伴發(fā)布一站式物聯(lián)網(wǎng)IoT開(kāi)發(fā)工具小熊派BearPi,解決行業(yè)物聯(lián)網(wǎng)產(chǎn)品開(kāi)發(fā)痛點(diǎn)

    的人機(jī)交互接口。??基于華為開(kāi)發(fā)的IoT Studio,小熊派IoT開(kāi)發(fā)工具可實(shí)現(xiàn)根據(jù)云端模型自動(dòng)生成代碼,實(shí)現(xiàn)零代碼快速上
    發(fā)表于 09-21 10:47

    HC2019,華為聯(lián)合合作伙伴發(fā)布一站式物聯(lián)網(wǎng)IoT開(kāi)發(fā)工具小熊派BearPi,解決行業(yè)物聯(lián)網(wǎng)產(chǎn)品開(kāi)發(fā)痛點(diǎn)

    開(kāi)發(fā)工具可實(shí)現(xiàn)根據(jù)云端模型自動(dòng)生成代碼,實(shí)現(xiàn)零代碼快速上。??在IoT的開(kāi)發(fā)中心中集成了小熊派IoT開(kāi)發(fā)工具的案例模板,直接使用,可快速在
    發(fā)表于 09-21 17:27

    小熊派華為物聯(lián)網(wǎng)操作系統(tǒng)LiteOS內(nèi)核教程01-IoT-Studio介紹及安裝

    本帖最后由 小熊派開(kāi)源社區(qū) 于 2020-2-24 17:13 編輯 1. 物聯(lián)網(wǎng)一站式開(kāi)發(fā)工具 —— IoT StudioIoT Studio是支持 LiteOS 嵌入式系統(tǒng)軟件開(kāi)發(fā)的工具
    發(fā)表于 01-18 10:55

    小熊派IOT開(kāi)發(fā)板試用連載】基于小熊派的智控路燈

    項(xiàng)目名稱(chēng):基于小熊派的智控路燈試用計(jì)劃:申請(qǐng)理由:這是一款物聯(lián)網(wǎng)開(kāi)發(fā)者非常適中的開(kāi)發(fā)套件,擁有超低功耗,高性能的MCU,豐富的外設(shè)接口,支持GPRS,WIFI,NB-IoT,4G,Zigbee等模塊
    發(fā)表于 03-31 09:42

    小熊派IOT開(kāi)發(fā)板試用連載】基于小熊派IOT開(kāi)發(fā)板車(chē)載定位系統(tǒng)開(kāi)發(fā)

    項(xiàng)目名稱(chēng):基于小熊派IOT開(kāi)發(fā)板車(chē)載定位系統(tǒng)開(kāi)發(fā)試用計(jì)劃:小熊派IOT開(kāi)發(fā)板是NB開(kāi)發(fā)板,NB是物聯(lián)網(wǎng)最具潛力的通訊方式。搭載
    發(fā)表于 04-01 15:19

    小熊派IoT開(kāi)發(fā)板試用連載】--環(huán)境搭建

    ://www.keil.com/dd2/Pack/“網(wǎng)址下載好Keil.STM32L4xx_DFP.2.3.0.pack文件,解壓”小熊派開(kāi)發(fā)板資料3 案例及代碼5 HiLink智慧臺(tái)燈“下的HiLink壓縮包,則看到
    發(fā)表于 04-13 18:25

    小熊派IOT開(kāi)發(fā)板試用連載】5、華為IOT Booster應(yīng)用開(kāi)發(fā)

    這時(shí)的開(kāi)發(fā)是基于在華為已經(jīng)創(chuàng)建建立項(xiàng)目的基礎(chǔ)上,所作得簡(jiǎn)易管理軟件,可以實(shí)現(xiàn)遠(yuǎn)程設(shè)置參數(shù),遠(yuǎn)程控制,小熊板感知得光照值通過(guò)WIFI主動(dòng)上報(bào)到華為
    發(fā)表于 04-29 10:28

    開(kāi)發(fā)實(shí)踐丨用小熊派STM32開(kāi)發(fā)板模擬自動(dòng)售貨機(jī) 精選資料推薦

    摘要:本文內(nèi)容是講述用小熊派開(kāi)發(fā)板模擬自動(dòng)售貨機(jī),基于論壇提供的工程代碼,通過(guò)云端開(kāi)發(fā)和設(shè)備終端開(kāi)發(fā),實(shí)現(xiàn)終端數(shù)據(jù)在的華為平臺(tái)顯示。本文內(nèi)容是講述用
    發(fā)表于 07-13 07:13

    開(kāi)發(fā)實(shí)踐丨用小熊派STM32開(kāi)發(fā)板模擬自動(dòng)售貨機(jī) 精選資料分享

    摘要:本文內(nèi)容是講述用小熊派開(kāi)發(fā)板模擬自動(dòng)售貨機(jī),基于論壇提供的工程代碼,通過(guò)云端開(kāi)發(fā)和設(shè)備終端開(kāi)發(fā),實(shí)現(xiàn)終端數(shù)據(jù)在的華為平臺(tái)顯示。本文內(nèi)容是講述用
    發(fā)表于 07-13 08:39

    小熊派ART-PIFPGA核心板

    STM32L431RCT6。板載STLink串口二合一,開(kāi)發(fā)起來(lái)還挺方便的。買(mǎi)來(lái)可以學(xué)下華為的lite os和NB-IOT。ART-PI這個(gè)ART-PI的MCU是STM32H750XB
    發(fā)表于 08-06 07:56

    求大神分享小熊派STM32-OTA+IOT的教程

    求大神分享小熊派STM32-OTA+IOT的教程
    發(fā)表于 09-30 08:32

    如何實(shí)現(xiàn)基于STM32L431的云端綠化管理系統(tǒng)的設(shè)計(jì)?

    如何實(shí)現(xiàn)基于STM32L431的云端綠化管理系統(tǒng)的設(shè)計(jì)?
    發(fā)表于 02-09 07:22

    基于STM32L431設(shè)計(jì)的云端綠化管理系統(tǒng)(ESP8266+阿里物聯(lián)網(wǎng)平臺(tái))

    基于STM32L431設(shè)計(jì)的云端綠化管理系統(tǒng)(ESP8266+阿里物聯(lián)網(wǎng)平臺(tái))
    發(fā)表于 12-06 10:06 ?23次下載
    基于<b class='flag-5'>STM32L</b>431設(shè)計(jì)的<b class='flag-5'>云端</b><b class='flag-5'>綠化</b><b class='flag-5'>管理</b><b class='flag-5'>系統(tǒng)</b>(ESP8266+阿里<b class='flag-5'>云</b>物聯(lián)網(wǎng)平臺(tái))

    基于STM32L431設(shè)計(jì)的云端綠化管理系統(tǒng)

    這是采用STM32L431 + ES8266設(shè)計(jì)的云端綠化管理系統(tǒng),可以通過(guò)ESP8266 WIFI連接阿里
    的頭像 發(fā)表于 02-28 13:51 ?3633次閱讀
    基于<b class='flag-5'>STM32L</b>431設(shè)計(jì)的<b class='flag-5'>云端</b><b class='flag-5'>綠化</b><b class='flag-5'>管理</b><b class='flag-5'>系統(tǒng)</b>

    基于小熊派開(kāi)發(fā)板+華為IoT設(shè)計(jì)的云端綠化管理系統(tǒng)

    綠化管理系統(tǒng)在現(xiàn)實(shí)生活、生產(chǎn)中的應(yīng)用十分廣泛,它是集環(huán)境感知、規(guī)劃決策、自動(dòng)管理等功能于一體的綜合系統(tǒng)。目前,在城市道路兩旁的區(qū)域
    的頭像 發(fā)表于 05-27 11:10 ?3212次閱讀