衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于STM32L431設計的云端綠化管理系統(騰訊云IOT)

DS小龍哥-嵌入式技術 ? 來源:DS小龍哥-嵌入式技術 ? 作者:DS小龍哥-嵌入式技 ? 2022-05-26 09:52 ? 次閱讀

?

一、環境介紹

MCU: 采用意法半導體低功耗芯片 STM32L431RCT6

編譯軟件: Keil5 +CubeMX

云平臺: 采用騰訊物聯網云平臺

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?編輯

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?編輯

二、功能與硬件介紹

2.1 功能介紹

這是采用STM32L431 + ES8266設計的云端綠化管理系統,可以通過ESP8266 WIFI連接騰訊云物聯網平臺,使用微信小程序遠程進行綠化管理,比如:實時獲取光照強度、溫度、濕度、遠程控制水泵進行澆水灌溉,在任何地方都可以給自己種的花花草草澆水,了解周邊環境情況。

騰訊物聯網平臺支持微信小程序+WIFI一鍵配網,想學習如何配網的請看這里:基于STM32+ESP8266設計物聯網產品(重點:支持微信小程序一鍵配網連接騰訊云平臺)_DS小龍哥的博客-CSDN博客_基于esp8266設計

2.2 硬件介紹

開發板采用的是小熊開發板,包括完成綠化管理系統的所有功能都是采用小熊派開發板的配套套件完成。

小熊開發板板載了一個stlink調試器(就是STM32F103C8T6實現的),程序下載非常方便。串口1用來調試打印數據,ESP8266是接在串口LPUART1上的。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?編輯

小熊派開發板本身自帶的例子程序也比較豐富,自帶例子里采用的云平臺是華為的物聯網云平臺,工程比較龐大使用了LiteOS操作系統。本文里的工程是重新編寫的代碼,使用裸機完成項目功能,沒有跑操作系統,MQTT協議和ESP8266驅動代碼都是重新編寫,框架、邏輯比較清晰,代碼量也較少,適合初學者入門學習。

相關傳感器模塊型號:(采用的是小熊開發板配套的E53_IA1擴展板)

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?編輯

WIFI采用:ESP8266

溫濕度檢測傳感器采用:SHT30

光照強度檢測傳感器采用:BH1750

電機采用:微型直流電機

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?編輯

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?編輯

三、騰訊物聯網云平臺

關于騰訊物聯網平臺的創建已經介紹很多篇了,如果之前沒有使用過騰訊物聯網云平臺,先參考這里學習了解一下:STM32+ESP8266+MQTT協議連接騰訊物聯網開發平臺_DS小龍哥的博客-CSDN博客_esp8266mqtt協議

下面就截圖介紹一下云端綠化管理系統用到的產品功能。

用到的功能屬性:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?編輯

小程序面板配置:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?編輯

手機微信小程序運行效果:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?編輯

串口打印的提示:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?編輯

四、STM32源代碼

STM32的代碼主要分為以下幾個部分:

1. ESP8266底層驅動代碼: 完成ESP8266模式配置、數據發送,應答檢測等底層網絡接口

2. MQTT協議代碼:這是參考標準MQTT編寫C語言版本MQTT協議框架代碼,實現了重要的幾個接口(主題訂閱、主題發布、心跳包、登錄MQTT服務器),底層采用ESP8266發送數據。 這個MQTT協議不是使用ESP8266本身的SDK,是根據MQTT協議自己實現的,所以如果使用其他的網卡,移植也很方便,不挑網卡設備。

3. 傳感器初始化代碼: 完成溫濕度傳感器、光照強度傳感器的驅動代碼編寫。

4. LCD屏代碼: LCD是SPI接口的,可以顯示溫濕度、光照強度數據。

5. main函數: 完成整個邏輯代碼編寫,檢測微信小程序是否有下發的指令,進行分析,完成水泵的開關控制;當溫室和濕度到達某個閥值,自動控制水泵澆水,并上報給微信小程序;主程序里1秒檢測一次溫濕度、光照強度、電機狀態主動上報給微信小程序;在設備端按下按鍵(模擬現場實體開關)也可以控制水泵澆水或者關閉,這些狀態都會實時上報給云平臺,微信小程序。

工程的get地址:https://download.csdn.net/download/xiaolong1126626497/19246016

程序的模板是使用CubeMX生成的。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?編輯

4.1 main.c代碼: 邏輯代碼


/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  ** This notice applies to any and all portions of this file
  * that are not between comment pairs USER CODE BEGIN and
  * USER CODE END. Other portions of this file, whether 
  * inserted by the user or by software development tools
  * are owned by their respective copyright owners.
  *
  * COPYRIGHT(c) 2019 STMicroelectronics
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#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"   //將要連接的路由器名稱 --不要出現中文、空格等特殊字符
#define ESP8266_AP_PASSWORD "99pu58cb"     //將要連接的路由器密碼


//騰訊物聯網服務器的設備信息
#define MQTT_ClientID "6142CX41XESmartAgriculture"
#define MQTT_UserName "6142CX41XESmartAgriculture;12010126;HUA2G;1624271589"
#define MQTT_PassWord "a8aadebe9721f70e6f9e14fe56ff1d2b5cac9625fa1f96af2f0e0098597fe78b;hmacsha256"
 
//訂閱與發布的主題
#define SET_TOPIC  "$thing/down/property/6142CX41XE/SmartAgriculture"  //訂閱
#define POST_TOPIC "$thing/up/property/6142CX41XE/SmartAgriculture"  //發布


//保存溫濕度、光照強度
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);				//搶占優先級3,子優先級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()
{
    //接收到數據
    if(__HAL_UART_GET_FLAG(&at_usart, UART_FLAG_RXNE) != RESET)
    {
        if(ESP8266_Recv_cntRDR & 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;iISR & 0X40) == 0); //循環發送,直到發送完畢
        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();
    
    //初始化硬件 STM32L431RC_BearPiBH1750_I2C1\STM32L431RC_BearPiBH1750_I2C1.axf: Error: L6218E: Undefined symbol printf (referred from main.o).
    Init_E53_IA1();

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

    if(ESP8266_Init())
   {
      printf("ESP8266硬件檢測錯誤.\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("準備連接到指定的服務器.\n");
      //非加密端口
      printf("WIFI:%d\r\n",ESP8266_STA_TCP_Client_Mode(ESP8266_WIFI_AP_SSID,ESP8266_AP_PASSWORD,"106.55.124.154",1883,1));
   }
   
    //2. MQTT協議初始化	
    MQTT_Init(); 
   
    //3. 連接騰訊云IOT服務器        
    while(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord))
    {
        printf("服務器連接失敗,正在重試...\n");
        HAL_Delay(500);
    }
    printf("服務器連接成功.\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)//查詢按鍵KEY1低電平
            {
                HAL_Delay(10);//消抖
                if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_RESET)//查詢按鍵KEY1低電平
                {
                    HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);//亮
                    
                    //補光燈亮
                    HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_SET);
                    
                    //電機轉
                    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)//查詢按鍵KEY2低電平
            {
                HAL_Delay(10);//消抖
                if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==GPIO_PIN_RESET)//查詢按鍵KEY2低電平
                {
                    HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);//滅
                    
                     //補光燈滅
                    HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_RESET);
                    
                     //電機停
                    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("光照強度:%d %%\r\n", (int)E53_IA1_Data.Lux);
            printf("濕度:%d %%\r\n",(int)E53_IA1_Data.Humidity);
            printf("溫度:%d ℃\r\n", (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);

            //切換引腳的狀態
            HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
             
               //上傳數據
            sprintf(mqtt_message,"{"method":"report","clientToken":"123","params":{"temperature":%d,"humidity":%d,"machine":%d,"illumination":%d}}",
            (int)E53_IA1_Data.Temperature,(int)E53_IA1_Data.Humidity,motor_state,(int)E53_IA1_Data.Lux);
            MQTT_PublishData(POST_TOPIC,mqtt_message,0);
            
            //根據濕度自動灌溉
            if((int)E53_IA1_Data.Humidity<50)  //小于50自動灌溉
            {
                 printf("自動灌溉....\n");
                 motor_state=1; //電機狀態更新
                 //電機轉
                 HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_SET);
            }  
         }

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

4.2 mqtt.c : MQTT協議代碼

#include "mqtt.h"

u8 *mqtt_rxbuf;
u8 *mqtt_txbuf;
u16 mqtt_rxlen;
u16 mqtt_txlen;
u8 _mqtt_txbuf[256];//發送數據緩存區
u8 _mqtt_rxbuf[256];//接收數據緩存區

typedef enum
{
	//名字 	    值 			報文流動方向 	描述
	M_RESERVED1	=0	,	//	禁止	保留
	M_CONNECT		,	//	客戶端到服務端	客戶端請求連接服務端
	M_CONNACK		,	//	服務端到客戶端	連接報文確認
	M_PUBLISH		,	//	兩個方向都允許	發布消息
	M_PUBACK		,	//	兩個方向都允許	QoS 1消息發布收到確認
	M_PUBREC		,	//	兩個方向都允許	發布收到(保證交付第一步)
	M_PUBREL		,	//	兩個方向都允許	發布釋放(保證交付第二步)
	M_PUBCOMP		,	//	兩個方向都允許	QoS 2消息發布完成(保證交互第三步)
	M_SUBSCRIBE		,	//	客戶端到服務端	客戶端訂閱請求
	M_SUBACK		,	//	服務端到客戶端	訂閱請求報文確認
	M_UNSUBSCRIBE	,	//	客戶端到服務端	客戶端取消訂閱請求
	M_UNSUBACK		,	//	服務端到客戶端	取消訂閱報文確認
	M_PINGREQ		,	//	客戶端到服務端	心跳請求
	M_PINGRESP		,	//	服務端到客戶端	心跳響應
	M_DISCONNECT	,	//	客戶端到服務端	客戶端斷開連接
	M_RESERVED2		,	//	禁止	保留
}_typdef_mqtt_message;

//連接成功服務器回應 20 02 00 00
//客戶端主動斷開連接 e0 00
const u8 parket_connetAck[] = {0x20,0x02,0x00,0x00};
const u8 parket_disconnet[] = {0xe0,0x00};
const u8 parket_heart[] = {0xc0,0x00};
const u8 parket_heart_reply[] = {0xc0,0x00};
const u8 parket_subAck[] = {0x90,0x03};

void MQTT_Init(void)
{
    //緩沖區賦值
	mqtt_rxbuf = _mqtt_rxbuf;
    mqtt_rxlen = sizeof(_mqtt_rxbuf);
	mqtt_txbuf = _mqtt_txbuf;
    mqtt_txlen = sizeof(_mqtt_txbuf);
	memset(mqtt_rxbuf,0,mqtt_rxlen);
	memset(mqtt_txbuf,0,mqtt_txlen);
	
//	//無條件先主動斷開
//	MQTT_Disconnect();
//    HAL_Delay(100);
//	MQTT_Disconnect();
//    HAL_Delay(100);
}

/*
函數功能: 登錄服務器
函數返回值: 0表示成功 1表示失敗
*/
u8 MQTT_Connect(char *ClientID,char *Username,char *Password)
{
    u8 i,j;
    int ClientIDLen = strlen(ClientID);
    int UsernameLen = strlen(Username);
    int PasswordLen = strlen(Password);
    int DataLen;
	mqtt_txlen=0;
	//可變報頭+Payload  每個字段包含兩個字節的長度標識
    DataLen = 10 + (ClientIDLen+2) + (UsernameLen+2) + (PasswordLen+2);
	
	//固定報頭
	//控制報文類型
    mqtt_txbuf[mqtt_txlen++] = 0x10;		//MQTT Message Type CONNECT
	//剩余長度(不包括固定頭部)
	do
	{
		u8 encodedByte = DataLen % 128;
		DataLen = DataLen / 128;
		// if there are more data to encode, set the top bit of this byte
		if ( DataLen > 0 )
			encodedByte = encodedByte | 128;
		mqtt_txbuf[mqtt_txlen++] = encodedByte;
	}while ( DataLen > 0 );
    	
	//可變報頭
	//協議名
    mqtt_txbuf[mqtt_txlen++] = 0;        	// Protocol Name Length MSB    
    mqtt_txbuf[mqtt_txlen++] = 4;           // Protocol Name Length LSB    
    mqtt_txbuf[mqtt_txlen++] = 'M';        	// ASCII Code for M    
    mqtt_txbuf[mqtt_txlen++] = 'Q';        	// ASCII Code for Q    
    mqtt_txbuf[mqtt_txlen++] = 'T';        	// ASCII Code for T    
    mqtt_txbuf[mqtt_txlen++] = 'T';        	// ASCII Code for T    
	//協議級別
    mqtt_txbuf[mqtt_txlen++] = 4;        		// MQTT Protocol version = 4   對于 3.1.1 版協議,協議級別字段的值是 4(0x04)   
	//連接標志
    mqtt_txbuf[mqtt_txlen++] = 0xc2;        	// conn flags 
    mqtt_txbuf[mqtt_txlen++] = 0;        		// Keep-alive Time Length MSB    
    mqtt_txbuf[mqtt_txlen++] = 100;        	// Keep-alive Time Length LSB  100S心跳包    保活時間
	
    mqtt_txbuf[mqtt_txlen++] = BYTE1(ClientIDLen);// Client ID length MSB    
    mqtt_txbuf[mqtt_txlen++] = BYTE0(ClientIDLen);// Client ID length LSB  	
	memcpy(&mqtt_txbuf[mqtt_txlen],ClientID,ClientIDLen);
    mqtt_txlen += ClientIDLen;
    
    if(UsernameLen > 0)
    {   
        mqtt_txbuf[mqtt_txlen++] = BYTE1(UsernameLen);		//username length MSB    
        mqtt_txbuf[mqtt_txlen++] = BYTE0(UsernameLen);    	//username length LSB    
		memcpy(&mqtt_txbuf[mqtt_txlen],Username,UsernameLen);
        mqtt_txlen += UsernameLen;
    }
    
    if(PasswordLen > 0)
    {    
        mqtt_txbuf[mqtt_txlen++] = BYTE1(PasswordLen);		//password length MSB    
        mqtt_txbuf[mqtt_txlen++] = BYTE0(PasswordLen);    	//password length LSB  
		memcpy(&mqtt_txbuf[mqtt_txlen],Password,PasswordLen);
        mqtt_txlen += PasswordLen; 
    }    
	
  
    memset(mqtt_rxbuf,0,mqtt_rxlen);
    
    ESP8266_Recv_flag=0;
    ESP8266_Recv_cnt=0;
    MQTT_SendBuf(mqtt_txbuf,mqtt_txlen);
    HAL_Delay(200);
    
    memcpy((char *)mqtt_rxbuf,ESP8266_RecvBuf,ESP8266_Recv_cnt);
    for(i=0;i;i++)printf("%#x>
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

審核編輯:湯梓紅

?

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17317

    瀏覽量

    352630
  • 意法半導體
    +關注

    關注

    31

    文章

    3153

    瀏覽量

    108939
  • 管理系統
    +關注

    關注

    1

    文章

    2573

    瀏覽量

    36098
收藏 人收藏

    評論

    相關推薦

    基于STM32L4小熊派設計的云端綠化管理系統(華為IOT)

    本項目利用STM32L4小熊派設計基于華為IoT物聯網平臺的云端綠化管理
    的頭像 發表于 07-12 09:39 ?2162次閱讀
    基于<b class='flag-5'>STM32L</b>4小熊派設計的<b class='flag-5'>云端</b><b class='flag-5'>綠化</b><b class='flag-5'>管理</b><b class='flag-5'>系統</b>(華為<b class='flag-5'>云</b><b class='flag-5'>IOT</b>)

    STM32L431出現LSE CSS后RTC的ALARM無法進入中斷是怎么回事啊?

    STM32L431的RTC配置使用LSE時鐘,配置ALARMA中斷,可以正常進入中斷,但是出現LSE CSS后重新配置RTC使用LSI做為系統時鐘,但配置后RTC的ALARMA無法進入中斷,這是怎么回事啊?
    發表于 04-08 06:58

    STM32L431低功耗進入異常的原因?

    各位大佬好,小弟在使用STM32L431單片機的時候遇到一個奇怪的問題,我用的是HAL庫,當我下載完程序后如果不完全斷電,單片機進不了低功耗,即使通過硬件復位現象也是一樣,但是只要我斷開電源重新上電
    發表于 04-09 07:03

    請問STM32L431 STOP2模式DEBUG如何才能好用?

    STM32L431 STOP2模式 DEBUG如何才能好用?跪求幫助謝謝!! STM32L431 進入STOP2模式,已經開啟HAL_DBGMCU_EnableDBGStopMode(); 并且使
    發表于 04-15 08:15

    STM32L431在下載程序時模擬電壓VDDA可不可以不上電?

    STM32L431在下載程序時模擬電壓VDDA可不可以不上電?
    發表于 04-17 06:45

    【小熊派IOT開發板試用連載】基于小熊派IOT開發板車載定位系統開發

    項目名稱:基于小熊派IOT開發板車載定位系統開發試用計劃:小熊派IOT開發板是NB開發板,NB是物聯網最具潛力的通訊方式。搭載華為LiteOS操作系統。低功耗
    發表于 04-01 15:19

    STM32L431的VBAT管腳有何作用

    最近用的STM32L431,發現管腳1是VBAT,主要用作給內部RTC供電,VDD掉電時,保證內部RTC正常工作,一般使用紐扣電池,不需要此功能時,可以和VDD接一起。
    發表于 08-09 07:05

    如何對基于RTT對STM32L431進行OTA

    如何對基于RTT對STM32L431進行OTA?ARM Compiler沒找到6.13用的6.9用其它的版本會出錯的原因及解決辦法是什么?
    發表于 10-11 07:07

    如何對STM32L431的寄存器進行配置呢

    如何對STM32L431的寄存器進行配置呢?有什么方法嗎?
    發表于 11-17 07:12

    使用MQTT方式對接華為IoT平臺的具體過程

    摘要:本文主要講述使用MQTT方式對接華為IoT平臺的具體過程。使用的方案:目標板為STM32L431BearPI(帶E53擴展板); TCPIP功能由開發板的ESP8266提供;MQTT
    發表于 01-27 07:13

    如何實現基于STM32L431云端綠化管理系統的設計?

    如何實現基于STM32L431云端綠化管理系統的設計?
    發表于 02-09 07:22

    如何通過軟件重啟stm32l431

    如何通過軟件重啟stm32l431?我將 MCU 與 sim800l 一起使用,我可以使用短信重新啟動 MCU。是否存在一些HAL功能來重啟MCU?
    發表于 02-01 07:35

    基于STM32L431設計的云端綠化管理系統(ESP8266+阿里物聯網平臺)

    基于STM32L431設計的云端綠化管理系統(ESP8266+阿里物聯網平臺)
    發表于 12-06 10:06 ?23次下載
    基于<b class='flag-5'>STM32L431</b>設計的<b class='flag-5'>云端</b><b class='flag-5'>綠化</b><b class='flag-5'>管理</b><b class='flag-5'>系統</b>(ESP8266+阿里<b class='flag-5'>云</b>物聯網平臺)

    基于STM32L431設計的云端綠化管理系統

    這是采用STM32L431 + ES8266設計的云端綠化管理系統,可以通過ESP8266 WIFI連接阿里
    的頭像 發表于 02-28 13:51 ?3891次閱讀
    基于<b class='flag-5'>STM32L431</b>設計的<b class='flag-5'>云端</b><b class='flag-5'>綠化</b><b class='flag-5'>管理</b><b class='flag-5'>系統</b>

    基于STM32+華為IoT設計的云端綠化管理系統

    綠化管理系統在現實生活、生產中的應用十分廣泛,它是集環境感知、規劃決策、自動管理等功能于一體的綜合系統。目前,在城市道路兩旁的區域
    的頭像 發表于 05-27 10:39 ?1674次閱讀
    基于<b class='flag-5'>STM32</b>+華為<b class='flag-5'>云</b><b class='flag-5'>IoT</b>設計的<b class='flag-5'>云端</b><b class='flag-5'>綠化</b><b class='flag-5'>管理</b><b class='flag-5'>系統</b>
    百家乐官网7杀6| 蓝盾百家乐官网具体玩法技巧 | 大发888博彩| 网上百家乐官网优博| 百家乐官网庄闲对冲| 百家乐开户送彩金28| 大发888手机版下载安| 百家乐官网现金平台排名| 澳门百家乐官网的玩法技巧和规则 | 滨海湾百家乐娱乐城| 大发888电脑版下载| 百家乐官网试玩全讯网2| 百家乐注码技巧| 大发888注册官方网站| 乐清市| 24 山杨公斗首择日吉凶| 百家乐试玩| 366百家乐官网娱乐城| 百家乐娱乐城官方网| 足球网| 康莱德百家乐官网的玩法技巧和规则| 姚记百家乐的玩法技巧和规则| 车险| 金沙百家乐娱乐城场| 大发888娱乐场下载iypuqrd| 太阳城百家乐官网杀祖玛| 百家乐智能分析| 板桥市| 百家乐游戏台| 大发888第一在线| 澳门百家乐官网死局| 百家乐桌台布| 赌场风云主题曲| 百家乐在线直播| 皇冠网888799| 百家乐路单网下载| 大赢家即时比分网| 百家乐官网园天将| 亿酷棋牌官方下载| 百家乐官网对子的玩法| 大发888游戏平台dafa888gw|