色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

CW32模塊使用 ESP01S WIFI模塊

CW32生態(tài)社區(qū) ? 來源:CW32生態(tài)社區(qū) ? 作者:CW32生態(tài)社區(qū) ? 2025-01-23 13:08 ? 次閱讀

ESP8266系列無線模塊是安信可科技自主研發(fā)設(shè)計(jì)的一系列高性價(jià)比WiFisOC模組。該系列模塊支持標(biāo)準(zhǔn)的IEEE802.11 b/g/n 協(xié)議,內(nèi)置完整的TCP/IP協(xié)議棧。用戶可以使用該系列模塊為現(xiàn)有的設(shè)備添加聯(lián)網(wǎng)功能,也可以構(gòu)建獨(dú)立的網(wǎng)絡(luò)控制器。即使在不了解其原理的情況下,只要有一定的串口知識理解,那么就可以輕松上手該模塊,進(jìn)而實(shí)現(xiàn)手機(jī)WiFi操作。功能特點(diǎn):基于ESP8266芯片開發(fā),模組集成了透傳功能,即買即用,支持串口AT指令集,用戶通過串口即可實(shí)現(xiàn)網(wǎng)絡(luò)訪問,廣泛應(yīng)用于智能穿戴,智能家居,家庭安防,遙控器,汽車電子,智慧照明,工業(yè)物聯(lián)網(wǎng)等領(lǐng)域。

一、模塊來源

模塊實(shí)物展示:

wKgZO2eRztaACmi1AAAwkJ05H4w66.webp


資料鏈接:https://pan.baidu.com/s/13mQInPq5drMzs8sXzC14dQ
資料提取碼:pj4z

二、規(guī)格參數(shù)

工作電壓:3.0V-3.6V

工作電流:IMAX = 170mA

模塊尺寸:14.4 x 24.7 MM

控制方式:串口

三、移植過程

我們的目標(biāo)是在立創(chuàng)·CW32F030C8T6開發(fā)板上能夠完成無線傳輸?shù)墓δ堋J紫纫@取資料,查看數(shù)據(jù)手冊應(yīng)如何實(shí)現(xiàn),再移植至我們的工程。

3.1查看資料

該WIFI模塊,有三種模式即STA、AP、STA+AP。

這里主要使用AP和STA模式作為案例,實(shí)現(xiàn)近距離無線控制和遠(yuǎn)距離無線控制。

  • STA模式是指ESP8266作為客戶端連接到一個無線路由器上(或者無線熱點(diǎn)),可以訪問網(wǎng)絡(luò)中的其他設(shè)備。
  • AP模式是指ESP8266作為熱點(diǎn),其他設(shè)備可以連接到它上面,實(shí)現(xiàn)無線網(wǎng)絡(luò)通信。
  • STA+AP模式就是兩者同時實(shí)現(xiàn)。、

使用前,需要燒入MQTT固件,后續(xù)的案例有使用MQTT,如不燒入MQTT固件,在涉及到MQTT的AT命令時會不斷失敗。

固件下載地址:

鏈接:https://pan.baidu.com/s/1BB_X7XhKpedunGY1EIFX7A?pwd=LCKF

提取碼:LCKF

固件燒錄接線:

wKgZPGeRztaAZDDPAABlkmV1BqE43.webp

燒錄步驟:

鏈接:https://pan.baidu.com/s/1acnXmU3ASNQMjsner4DSrA?pwd=LCKF

提取碼:LCKF

3.2引腳選擇

使用串口2(串口2-TX=PA2,串口2-RX=PA3)

wKgZO2eRzteAK2YhAABnZPFY9qw23.webp

模塊接線圖

3.3移植至工程

移植步驟中的導(dǎo)入.c和.h文件與【CW32模塊使用】DHT11溫濕度傳感器相同,只是將.c和.h文件更改為bsp_esp01s.c與bsp_esp01s.h。這里不再過多講述,移植完成后面修改相關(guān)代碼。

在文件bsp_esp01s.c中,編寫如下代碼。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-21     LCKFB-LP    first version
 */

#include "bsp_ESP01S.h"
#include "stdio.h"
#include "hmacsha1.h"
#include "string.h"
#include 

unsigned char WIFI_RX_BUFF[WIFI_RX_LEN_MAX];
unsigned char WIFI_RX_FLAG = 0;
unsigned char WIFI_RX_LEN = 0;

uint8_t wifi_link_flag = 0;//設(shè)備連接狀態(tài)
//配合    Get_Device_connection_status    函數(shù)使用
// *              0=沒有設(shè)備連接
// *              1=有設(shè)備連接了WIFI
// *              0=有設(shè)備斷開了WIFI
// *              2=有設(shè)備連接了服務(wù)器
// *              3=有設(shè)備斷開了服務(wù)器



/************************************************************
 * 函數(shù)名稱:WIFI_USART_Init
 * 函數(shù)說明:連接WIFI的初始化
 * 型    參:bund=串口波特率
 * 返 回 值:無
 * 備    注:無
*************************************************************/
void WIFI_USART_Init(unsigned int bund)
{
    GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化結(jié)構(gòu)體

    RCC_WIFI_GPIO_ENABLE();        // 使能GPIO時鐘
    RCC_WIFI_USART_ENABLE();       // 使能UART時鐘

    GPIO_InitStruct.Pins = GPIO_WIFI_TX;                 // GPIO引腳
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;          // 推挽輸出
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;             // 輸出速度高
    GPIO_Init(PORT_WIFI_GPIO, &GPIO_InitStruct);         // 初始化

    GPIO_InitStruct.Pins = GPIO_WIFI_RX;                 // GPIO引腳
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;       // 上拉輸入
    GPIO_Init(PORT_WIFI_GPIO, &GPIO_InitStruct);         // 初始化

    BSP_GPS_AF_UART_TX(); // UART_TX復(fù)用
    BSP_GPS_AF_UART_RX(); // UART_RX復(fù)用

    // 配置UART
    USART_InitTypeDef USART_InitStructure;

    USART_InitStructure.USART_BaudRate = bund;                          // 波特率
    USART_InitStructure.USART_Over = USART_Over_16;                     // 配置USART的過采樣率。
    USART_InitStructure.USART_Source = USART_Source_PCLK;               // 設(shè)置時鐘源
    USART_InitStructure.USART_UclkFreq = 64000000;                      //設(shè)置USART時鐘頻率(和主頻一致即可)
    USART_InitStructure.USART_StartBit = USART_StartBit_FE;             //RXD下降沿開始
    USART_InitStructure.USART_StopBits = USART_StopBits_1;              // 停止位1
    USART_InitStructure.USART_Parity = USART_Parity_No ;                // 不使用校驗(yàn)
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 不使用流控
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;     // 收發(fā)模式
    USART_Init(WIFI_USART, &USART_InitStructure);                       // 初始化串口2

    // 優(yōu)先級,無優(yōu)先級分組
    NVIC_SetPriority(WIFI_USART_IRQ, 0);

    // UARTx中斷使能
    NVIC_EnableIRQ(WIFI_USART_IRQ);

    // 使能UARTx RC中斷
    USART_ITConfig(WIFI_USART, USART_IT_RC, ENABLE);
}

/******************************************************************
 * 函 數(shù) 名 稱:WIFI_USART_Send_Bit
 * 函 數(shù) 說 明:向WIFI模塊發(fā)送單個字符
 * 函 數(shù) 形 參:ch=字符
 * 函 數(shù) 返 回:無
 * 作       者:LC
 * 備       注:無
******************************************************************/
void WIFI_USART_Send_Bit(unsigned char ch)
{
    // 發(fā)送一個字節(jié)
    USART_SendData_8bit(WIFI_USART, (uint8_t)ch);

    // 等待發(fā)送完成
    while( RESET == USART_GetFlagStatus(WIFI_USART, USART_FLAG_TXE) ){}
}


/******************************************************************
 * 函 數(shù) 名 稱:WIFI_USART_send_String
 * 函 數(shù) 說 明:向WIFI模塊發(fā)送字符串
 * 函 數(shù) 形 參:str=發(fā)送的字符串
 * 函 數(shù) 返 回:無
 * 作       者:LC
 * 備       注:無
******************************************************************/
void WIFI_USART_send_String(unsigned char *str)
{
        printf("string : %srn",str);
        while( str && *str ) // 地址為空或者值為空跳出
        {
                WIFI_USART_Send_Bit(*str++);
        }
}
//清除串口接收的數(shù)據(jù)
/******************************************************************
 * 函 數(shù) 名 稱:Clear_WIFI_RX_BUFF
 * 函 數(shù) 說 明:清除WIFI發(fā)過來的數(shù)據(jù)
 * 函 數(shù) 形 參:無
 * 函 數(shù) 返 回:無
 * 作       者:LC
 * 備       注:無
******************************************************************/
void Clear_WIFI_RX_BUFF(void)
{
        unsigned char i = WIFI_RX_LEN_MAX-1;
        while(i)
        {
                WIFI_RX_BUFF[i--] = 0;
        }
        WIFI_RX_LEN = 0;
        WIFI_RX_FLAG = 0;
}


/******************************************************************
 * 函 數(shù) 名 稱:WIFI_Send_Cmd
 * 函 數(shù) 說 明:向WIFI模塊發(fā)送指令,并查看WIFI模塊是否返回想要的數(shù)據(jù)
 * 函 數(shù) 形 參:cmd=發(fā)送的AT指令  ack=想要的應(yīng)答    waitms=等待應(yīng)答的時間     cnt=等待應(yīng)答多少次
 * 函 數(shù) 返 回:1=得到了想要的應(yīng)答   0=沒有得到想要的應(yīng)答
 * 作       者:LC
 * 備       注:無
******************************************************************/
char WIFI_Send_Cmd(char *cmd,char *ack,unsigned int waitms,unsigned char cnt)
{
        uint8_t tt = 0;

        re:

        WIFI_USART_send_String((unsigned char*)cmd);//1.發(fā)送AT指令
        while(cnt--)
        {
                //時間間隔
                delay_1ms(waitms);
                //串口中斷接收藍(lán)牙應(yīng)答
                if( WIFI_RX_FLAG == 1 )
                {
                        WIFI_RX_FLAG = 0;
                        WIFI_RX_LEN = 0;
                        //查找是否有想要的數(shù)據(jù)
                        if( strstr((char*)WIFI_RX_BUFF, ack) != NULL )
                        {
                                        return 1;
                        }
                        //清除接收的數(shù)據(jù)
                        memset( WIFI_RX_BUFF, 0, sizeof(WIFI_RX_BUFF) );
                }
        }
        WIFI_RX_FLAG = 0;
        WIFI_RX_LEN = 0;

        if(tt < 3)
        {
                tt++;
                goto re;
        }

        return 0;
}

/******************************************************************
 * 函 數(shù) 名 稱:WIFI_ESP01S_Init
 * 函 數(shù) 說 明:WIFI模塊ESP01S初始化
 * 函 數(shù) 形 參:無
 * 函 數(shù) 返 回:無
 * 作       者:LC
 * 備       注:ESP01S的默認(rèn)波特率是115200
******************************************************************/
void WIFI_ESP01S_Init(void)
{
        WIFI_USART_Init(115200);//默認(rèn)波特率為115200
}

/******************************************************************
 * 函 數(shù) 名 稱:WIFI_MODE_AP_Init
 * 函 數(shù) 說 明:開啟AP模式,即模塊開啟熱點(diǎn)讓手機(jī)連接
 * 函 數(shù) 形 參:無
 * 函 數(shù) 返 回:1=配置成功   其他=失敗
 * 作       者:LC
 * 備       注:手機(jī)通過WIFI模塊默認(rèn)的IP地址192.168.4.1和設(shè)置的端口號,進(jìn)行連接
******************************************************************/
uint8_t WIFI_MODE_AP_Init(void)
{
    uint8_t ret = 0;
    char send_buff[200];

        ret = WIFI_Send_Cmd("ATrn", "OK", 10, 3);//測試指令:ATrn  成功返回OK  失敗返回ERROR
        if( ret != 1 ) return ret;

    ret = WIFI_Send_Cmd("AT+CWMODE=2rn","OK",30,3);   //配置WIFI AP模式
    if( ret != 1 ) return ret;

    sprintf(send_buff, "AT+CWSAP="%s","%s",11,4rn", AP_WIFISSID,AP_WIFIPASS );
        ret = WIFI_Send_Cmd(send_buff,"OK",30,3);  //設(shè)置wifi賬號與密碼
        if( ret != 1 ) return ret;

    ret = WIFI_Send_Cmd("AT+RSTrn","ready",800,3); //重新復(fù)位
        if( ret != 1 ) return ret;
    ret = WIFI_Send_Cmd("AT+CIPMUX=1rn","OK",50,3); //開啟多個連接
        if( ret != 1 ) return ret;
    ret = WIFI_Send_Cmd("AT+CIPSERVER=1,5000rn","OK",50,3); //開啟服務(wù)器設(shè)置端口號為5000
    if( ret != 1 ) return ret;
    return ret;
}





/******************************************************************
 * 函 數(shù) 名 稱:Get_Device_connection_status
 * 函 數(shù) 說 明:獲取設(shè)備連接狀態(tài)(AP模式)
 * 函 數(shù) 形 參:無
 * 函 數(shù) 返 回:0=沒有設(shè)備連接
 *              1=有設(shè)備連接了WIFI
 *              2=有設(shè)備斷開了WIFI
 *              3=有設(shè)備連接了服務(wù)器
 *              4=有設(shè)備斷開了服務(wù)器
 * 作       者:LC
 * 備       注:手機(jī)要連接WIFI模塊的步驟是先連接WIFI再連接服務(wù)器
//當(dāng)有設(shè)備連接AP模式下的熱點(diǎn)時,WIFI模塊會給連接的設(shè)備分配IP地址
//我們只需檢測是否有分配地址,則知道是否有設(shè)備連接。
//設(shè)備連接時WIFI返回:
//  +STA_CONNECTED:"f0:6c:5d:d6:f6:18"
//  +DIST_STA_IP:"f0:6c:5d:d6:f6:18","192.168.4.2"
//設(shè)備斷開連接時返回:
//  +STA_DISCONNECTED:"f0:6c:5d:d6:f6:18"
******************************************************************/
uint8_t Get_Device_connection_status(void)
{
    //串口中斷接收WIFI應(yīng)答
    if( WIFI_RX_FLAG == 1 )
    {
        WIFI_RX_FLAG = 0;
        WIFI_RX_LEN = 0;
        //有設(shè)備連接了熱點(diǎn)
        if( strstr((char*)WIFI_RX_BUFF, "+STA_CONNECTED") != NULL )
        {
            //清除接收的數(shù)據(jù)
            wifi_link_flag = 1;
            memset( WIFI_RX_BUFF, 0, sizeof(WIFI_RX_BUFF) );
#if        DEBUG
 printf("The device is connected to a hotspot.rn");
 #endif
            return 1;
        }
        //有設(shè)備斷開了熱點(diǎn)
        if( strstr((char*)WIFI_RX_BUFF, "+STA_DISCONNECTED") != NULL )
        {
            //清除接收的數(shù)據(jù)
            wifi_link_flag = 0;
            memset( WIFI_RX_BUFF, 0, sizeof(WIFI_RX_BUFF) );
#if        DEBUG
 printf("The device is disconnected from the hotspot.rn");
 #endif
            return 2;
        }
        //有設(shè)備連接了服務(wù)器
        if( strstr((char*)WIFI_RX_BUFF, ",CONNECT") != NULL )
        {
            //清除接收的數(shù)據(jù)
            wifi_link_flag = 2;
            memset( WIFI_RX_BUFF, 0, sizeof(WIFI_RX_BUFF) );
            return 3;
#if        DEBUG
 printf("The device is connected to the server.rn");
 #endif
        }
        //有設(shè)備斷開了服務(wù)器
        if( strstr((char*)WIFI_RX_BUFF, ",CLOSED") != NULL )
        {
            //清除接收的數(shù)據(jù)
            wifi_link_flag = 3;
            memset( WIFI_RX_BUFF, 0, sizeof(WIFI_RX_BUFF) );
            return 4;
#if        DEBUG
 printf("The device is disconnected from the server.rn");
 #endif
        }
    }
    return 0;
}


/**********************************************************
 * 函 數(shù) 名 稱:Get_WIFI_AP_Data
 * 函 數(shù) 功 能:解析設(shè)備發(fā)送過來的數(shù)據(jù)
 * 傳 入 參 數(shù):ap_parameter要將數(shù)據(jù)保存的地址
 * 函 數(shù) 返 回:1:有設(shè)備發(fā)送過來數(shù)據(jù)        0:沒有設(shè)備發(fā)送過來數(shù)據(jù)
 * 作       者:LC
 * 備       注:device_id最大5個  //+IPD,1,4:abcd
**********************************************************/
uint8_t Get_WIFI_AP_Data(AP_PARAMETER *ap_parameter)
{
    char buff[50];
    char *test;

    char i=0;

    //接收到設(shè)備發(fā)過來的數(shù)據(jù)
    if( strstr((char*)WIFI_RX_BUFF,"+IPD,") != NULL )
    {
        test = strstr((char*)WIFI_RX_BUFF,"+IPD,");

        //記錄設(shè)備ID號
        strncpy(buff,test+5,1);
        buff[1] ='';
        ap_parameter-?>device_id = atoi(buff);
        printf("device_id = %srn",buff);

        //記錄發(fā)送過來的數(shù)據(jù)長度
        strncpy(buff,test+7,strcspn(test+7,":") );
        buff[ strcspn(test+7,":") ] ='';
                printf("device_data = %srn",buff);
        ap_parameter->device_datalen = atoi(buff);
        printf("device_datalen = %srn",buff);
        //記錄發(fā)送過來的數(shù)據(jù)
        memset(buff,0,sizeof(buff));
        while(test[i++]!=':');
        strncpy(buff, test+i,strcspn(test+i,"r") );
                printf("device_data = %srn",buff);
        strcpy((char*)ap_parameter->device_data, buff);

        //清除串口接近緩存
        Clear_WIFI_RX_BUFF();
        return 1;
    }
    return 0;
}
/******************************************************************
 * 函 數(shù) 名 稱:WIFI_Send_To_Client
 * 函 數(shù) 說 明:AP模式下,WIFI發(fā)送數(shù)據(jù)至客戶端(連接AP模式下熱點(diǎn)的設(shè)備)
 * 函 數(shù) 形 參:id=向第幾個客戶端發(fā)送數(shù)據(jù)   data=要發(fā)送的數(shù)據(jù)(字符串形式)
 * 函 數(shù) 返 回:0=發(fā)送失敗   1=發(fā)送成功
 * 作       者:LC
 * 備       注:使用該函數(shù)函數(shù)請確保WIFI模塊處于AP模式
******************************************************************/
uint8_t WIFI_Send_To_Client(uint8_t id,char * data)
{
        uint8_t send_buf[20]={0};
        sprintf((char*)send_buf,"AT+CIPSEND=%d,%drn",id,strlen(data));
        if(WIFI_Send_Cmd((char*)send_buf,">",20,3))
        {
                WIFI_USART_send_String((unsigned char *)data);
                return 1;
        }
        return 0;
}

/******************************************************************
 * 函 數(shù) 名 稱:mstrcat
 * 函 數(shù) 說 明:字符串連接
 * 函 數(shù) 形 參:s1:目標(biāo)字符串, s2:源字符串
 * 函 數(shù) 返 回:無
 * 作       者:LC
 * 備       注:哈希使用
******************************************************************/
static void mstrcat(char *s1, const char *s2)
{
    // 尋找s1的末尾(即''字符)
    while(*s1 != '')
        s1++;
    // 將s2的內(nèi)容復(fù)制到s1的末尾,包括s2的結(jié)束字符''
    while((*s1++ = *s2++));
}

/******************************************************************
 * 函 數(shù) 名 稱:CalculateSha1
 * 函 數(shù) 說 明:計(jì)算sha1密匙
 * 函 數(shù) 形 參:password:密匙存放緩沖區(qū)
 * 函 數(shù) 返 回:無
 * 作       者:LC
 * 備       注:無
******************************************************************/
static void CalculateSha1(unsigned char *password)
{
        unsigned char temp[3] = {0};
        unsigned char digest[30]={0};
        unsigned char cnt = 0;
        hmac_sha1((unsigned char *)DeviceSecret,32,(unsigned char *)Encryption,46,digest);
        memset(temp, 0, sizeof(temp));
        for(cnt=0;cntkeyname,strtok(buff,"""));
                        printf("data->keyname = %srn",data->keyname);
                        //獲取功能值
                        buff = strstr((char*)WIFI_RX_BUFF, "params":" );
                        buff += strlen("params":{"")+strlen(data->keyname)+2;
                        strcpy(data->value, strtok(buff,"}"));
            return 1;
        }
        }
    return 0;
}


/******************************************************************
 * 函 數(shù) 名 稱:Clear_Aliyun_json_data
 * 函 數(shù) 說 明:清除JSON接收過的數(shù)據(jù)
 * 函 數(shù) 形 參:data=要清除的數(shù)據(jù)
 * 函 數(shù) 返 回:無
 * 作       者:LC
 * 備       注:無
******************************************************************/
void Clear_Aliyun_json_data(JSON_PUBLISH *data)
{
        uint16_t i = 0;
        while( data->keyname[i] != 0 )
        {
                data->keyname[i++] = '';
        }
        i= 0;
        while( data->value[i] != 0 )
        {
                data->keyname[i++] = '';
        }
}

//在自定義功能時,有多少個標(biāo)識符,就添加多少個
//我就只有兩個標(biāo)識符。
//LED_Switch=LED開關(guān) 范圍0-1
//brightness=亮度    范圍0-100
JSON_PUBLISH publish_mqtt_message[2]=
{
        { ""LED_Switch":","0" },
        { ""brightness":","0" }
};

/******************************************************************
 * 函 數(shù) 名 稱:Publish_MQTT_message
 * 函 數(shù) 說 明:發(fā)布主題 ,上發(fā)多個數(shù)據(jù)(設(shè)備將數(shù)據(jù)發(fā)送至手機(jī))
 * 函 數(shù) 形 參:data=publish_mqtt_message, data_num=上傳的數(shù)據(jù)個數(shù)
 * 函 數(shù) 返 回:無
 * 作       者:LC
 * 備       注:無
******************************************************************/
void Publish_MQTT_message(JSON_PUBLISH *data,uint8_t data_num)
{
        char AT_CMD[384]={0};
        char params[256]={0},i,*sp;

        sp=params;

        sprintf(data[0].value,"%d",0);   //把傳感器的值賦值給json結(jié)構(gòu)體的value
        sprintf(data[1].value,"%d",90);

        //          4
        for(i=0;i

在文件bsp_esp01s.h中,編寫如下代碼。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-21     LCKFB-LP    first version
 */
#ifndef _BSP_ESP01S_H_
#define _BSP_ESP01S_H_

#include "board.h"
#include "string.h"


//是否開啟串口0調(diào)試,查看WIFI回顯數(shù)據(jù)
#define     DEBUG   1

/****************************   STA模式    ****************************/
//STA模式下,WIFI模塊要連接的熱點(diǎn)(需要自行修改為自己的參數(shù))
#define  WIFISSID       "aaa"               //wifi熱點(diǎn)名稱
#define  WIFIPASS       "12345678"          //wifi熱點(diǎn)密碼

//連接的阿里云IP端口(不可修改)
#define  IP             "203.107.45.14"     //阿里云服務(wù)器IP或域名
//#define  IP           "a1PaQm83lGg.iot-as-mqtt.cn-shenzhen.aliyuncs.com"   //服務(wù)器IP或域名
#define  PORT           1883                            //連接端口號,MQTT默認(rèn)1883

//阿里云三元組(需要自行修改為自己的參數(shù))
#define DeviceName       "TEST"                   //設(shè)備名稱
#define ProductKey       "a1PJRLOWo3p"            //產(chǎn)品密匙
#define DeviceSecret     "3e7a1a43694b65abdcbc4f5c724e9faf"        //設(shè)備密匙

//計(jì)算哈希算法用到加密(不可修改)
#define Client      "clientId123deviceName"
#define productKey  "productKey"
#define Encryption  (Client DeviceName productKey ProductKey)
//AT指令的
#define AND "&"
#define ClientId "123|securemode=3\,signmethod=hmacsha1|"                //客戶端ID
#define UserName (DeviceName AND ProductKey)                               //用戶名

//訂閱發(fā)布的主題(不可修改)
#define SYS "/sys/"
#define LINK "/"
#define TOP "/thing/event/property/"
#define POST "post"
#define ESET  "set"
#define PublishMessageTopPost         (SYS ProductKey LINK DeviceName TOP POST)
#define PublishMessageTopSet         (SYS ProductKey LINK DeviceName TOP ESET)

//上傳數(shù)據(jù)結(jié)構(gòu)體
typedef struct
{
        char keyname[50];   //鍵讀取
        char value[20];     //讀取到的值,類型字符串
}JSON_PUBLISH;

extern  JSON_PUBLISH  publish_mqtt_message[2];

/****************************   AP模式    ****************************/

//AP模式下,WIFI開啟的熱點(diǎn)
#define AP_WIFISSID "ESP-01S"
#define AP_WIFIPASS "12345678"

typedef struct
{
    uint8_t device_id;
    uint8_t device_datalen;
    uint8_t device_data[200];
}AP_PARAMETER;



/****************************   串口配置    ****************************/
#define RCC_WIFI_GPIO_ENABLE()     __RCC_GPIOA_CLK_ENABLE()   // 串口TX的端口時鐘
#define RCC_WIFI_USART_ENABLE()    __RCC_UART2_CLK_ENABLE()   // 串口2的時鐘

#define BSP_GPS_AF_UART_TX()       PA02_AFx_UART2TXD()        // GPIO的引腳復(fù)用
#define BSP_GPS_AF_UART_RX()       PA03_AFx_UART2RXD()        // GPIO的引腳復(fù)用

#define PORT_WIFI_GPIO             CW_GPIOA                   // 串口TX的端口

#define GPIO_WIFI_TX               GPIO_PIN_2                 // 串口TX的引腳
#define GPIO_WIFI_RX               GPIO_PIN_3                 // 串口RX的引腳

#define WIFI_USART                 CW_UART2                   // 串口2
#define WIFI_USART_IRQ             UART2_IRQn                 // 串口2中斷
#define WIFI_USART_IRQHandler      UART2_IRQHandler           // 串口2中斷服務(wù)函數(shù)


#define WIFI_RX_LEN_MAX     200       //串口接收最大長度

extern uint8_t wifi_link_flag;//設(shè)備連接狀態(tài)
//配合    Get_Device_connection_status    函數(shù)使用
// *              0=沒有設(shè)備連接
// *              1=有設(shè)備連接了WIFI
// *              0=有設(shè)備斷開了WIFI
// *              2=有設(shè)備連接了服務(wù)器
// *              3=有設(shè)備斷開了服務(wù)器


void WIFI_ESP01S_Init(void);            //WIFI模塊初始化
uint8_t WIFI_MODE_AP_Init(void);        //AP模式初始化
uint8_t Get_Device_connection_status(void);//獲取連接狀態(tài)
void WIFI_MODE_STA_Aliyun_Init(void);   //連接阿里云初始化
uint8_t Get_WIFI_AP_Data(AP_PARAMETER *ap_parameter);
uint8_t Get_Aliyun_json_data(JSON_PUBLISH *data);
void Clear_Aliyun_json_data(JSON_PUBLISH *data);
void Publish_MQTT_message(JSON_PUBLISH *data,uint8_t data_num);


char WIFI_Send_Cmd(char *cmd,char *ack,unsigned int waitms,unsigned char cnt);
#endif

四、案例一:AP模式下的手機(jī)控制

使用AP模式通過AT命令,控制WIFI模塊開啟熱點(diǎn)、多連接、服務(wù)器。待手機(jī)連接后,通過手機(jī)APP進(jìn)行數(shù)據(jù)互傳。

使用案例前,請確保bsp_esp01s.c和bsp_esp01s.h移植成功。

手機(jī)APP下載地址:

鏈接:https://pan.baidu.com/s/1-wh0aaqRMW8fJ5nLH1Lwyw?pwd=LCKF

提取碼:LCKF

APP操作

首先使用手機(jī)連接WIFI模塊的熱點(diǎn)。其次打開APP連接服務(wù)器。服務(wù)器默認(rèn)IP為192.168.4.1,端口號在代碼中設(shè)置為了5000。

wKgZPGeRzteAL02EAAAWYH6MZi446.webp

連接上WIFI的熱點(diǎn)后,打開APP連接服務(wù)器。

wKgZO2eRztiAHmwhAAA-6FIo-Ow49.webp

編輯各個按鈕值,方便后面我們進(jìn)行控制。

wKgZPGeRztiAHcnBAAAsSsHYQag19.webp

在main.c中,編寫如下代碼。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-21     LCKFB-LP    first version
 */
#include "board.h"
#include "stdio.h"
#include "bsp_uart.h"
#include "bsp_esp01s.h"

int32_t main(void)
{
    AP_PARAMETER ap_parameter={0};
    uint8_t test_ret = 0;

    board_init();

    uart1_init(115200U);

    printf("Startrn");
    //WIFI初始化
    WIFI_ESP01S_Init();

    //設(shè)置WIFI模塊為AP模式
    WIFI_MODE_AP_Init();
    while(1)
    {
        //判斷是否有設(shè)備連接
        Get_Device_connection_status();
        //如果當(dāng)前設(shè)備連接了服務(wù)器(手機(jī)APP連接上熱點(diǎn))
        if( wifi_link_flag == 2 )
        {
            if( Get_WIFI_AP_Data(&ap_parameter) == 1 )//如果接收到數(shù)據(jù)
            {
                                //輸出接收的數(shù)據(jù)
                printf("ID = %drn", ap_parameter.device_id );//設(shè)備ID
                printf("data len = %drn", ap_parameter.device_datalen );//發(fā)送過來的數(shù)據(jù)長度
                printf("data = %srn", ap_parameter.device_data );//發(fā)送過來的數(shù)據(jù)


            }
        }
    }

案例現(xiàn)象:

當(dāng)手機(jī)APP接入WIFI連接成功之后,APP發(fā)送數(shù)據(jù)到開發(fā)板的串口。

默認(rèn)ip:192.168.4.1 默認(rèn)端口:5000

工程代碼下載:

鏈接:https://pan.baidu.com/s/16IPzyT_Rdm2E2BgPvYe-pw?pwd=LCKF

提取碼:LCKF

審核編輯 黃宇

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

    關(guān)注

    456

    文章

    51141

    瀏覽量

    426168
  • WIFI
    +關(guān)注

    關(guān)注

    81

    文章

    5307

    瀏覽量

    204423
  • CW32
    +關(guān)注

    關(guān)注

    1

    文章

    218

    瀏覽量

    706
收藏 人收藏

    評論

    相關(guān)推薦

    CW32模塊使用 紅外接收模塊

    一、模塊來源 模塊實(shí)物展示: ? 資料鏈接:https://pan.baidu.com/s/1dEWVMIFDWb7k1NcsRy5hHA 資料提取碼:uucv 二、規(guī)格參數(shù) 1.CR2025環(huán)保
    的頭像 發(fā)表于 01-23 13:16 ?35次閱讀
    <b class='flag-5'>CW32</b><b class='flag-5'>模塊</b>使用 紅外接收<b class='flag-5'>模塊</b>

    CW32模塊使用 EC-01G NBIOT+GPS模塊

    一、模塊來源 模塊實(shí)物展示: 資料鏈接:https://docs.ai-thinker.com/nb-iot 二、規(guī)格參數(shù) 工作電壓:3.0V-3.6V 工作電流:IMAX = 170mA 模塊尺寸
    的頭像 發(fā)表于 01-23 13:12 ?28次閱讀
    <b class='flag-5'>CW32</b><b class='flag-5'>模塊</b>使用 EC-<b class='flag-5'>01</b>G NBIOT+GPS<b class='flag-5'>模塊</b>

    CW32模塊使用 NEO-6M GPS模塊

    NEO—6M/7M GPS模塊,具有高靈敏度、低功耗、小型化、高追蹤靈敏度,大大擴(kuò)大了其定位的覆蓋面,在普通GPS接收模塊不能定位的地方,如狹窄都市天空下、密集的叢林環(huán)境,NEO-6M都能高精度定位
    的頭像 發(fā)表于 01-23 13:06 ?31次閱讀
    <b class='flag-5'>CW32</b><b class='flag-5'>模塊</b>使用 NEO-6M GPS<b class='flag-5'>模塊</b>

    CW32模塊使用 NRF24L01無線2.4G模塊

    NRF24L01是一款工作在2.4-2.5GHz世界通用ISM頻段的單片收發(fā)芯片, 使用4線SPI通訊端口,通訊速率最高可達(dá)8Mbps,適合與各種MCU連接,編程簡單;輸出功率、頻道選擇和協(xié)議的設(shè)置
    的頭像 發(fā)表于 01-23 13:00 ?36次閱讀
    <b class='flag-5'>CW32</b><b class='flag-5'>模塊</b>使用 NRF24L<b class='flag-5'>01</b>無線2.4G<b class='flag-5'>模塊</b>

    CW32模塊使用 紅外解碼編碼模塊

    紅外解碼編碼模塊采用MCU+紅外發(fā)射頭+紅外接收頭,引出MCU的串口連接其他需要紅外控制的設(shè)備,可作為紅外無線數(shù)據(jù)通信、數(shù)據(jù)傳輸?shù)裙δ堋>邆銷EC格式紅外編碼發(fā)射功能,可控制99%的NEC紅外
    的頭像 發(fā)表于 01-23 12:56 ?31次閱讀
    <b class='flag-5'>CW32</b><b class='flag-5'>模塊</b>使用 紅外解碼編碼<b class='flag-5'>模塊</b>

    CW32模塊使用 TTP224觸摸傳感器

    時,模式又切換為低功耗模式??梢詫?b class='flag-5'>模塊安裝在非金屬材料如塑料、玻璃的表面。也可以將薄薄的紙片(非金屬)覆蓋在模塊的表面,直到觸摸的位置正確,即可做成隱藏在墻壁、桌面等地方的按鍵。該模塊可以讓你免除常規(guī)按壓型鍵的煩惱。
    的頭像 發(fā)表于 09-18 15:35 ?2025次閱讀
    <b class='flag-5'>CW32</b><b class='flag-5'>模塊</b>使用 TTP224觸摸傳感器

    CW32模塊使用 指紋識別傳感器

    指紋特征。模塊配備了串口、USB 通訊接口,用戶無需研究復(fù)雜的圖像處理及及指紋識別算法,只需通過簡單的串口、USB 按照通訊協(xié)議便可控制模塊。本模塊可應(yīng)用于各種考勤機(jī)、保險(xiǎn)箱柜、指紋門禁系統(tǒng)、指紋鎖等場合。
    的頭像 發(fā)表于 09-18 15:15 ?437次閱讀
    <b class='flag-5'>CW32</b><b class='flag-5'>模塊</b>使用 指紋識別傳感器

    單片機(jī)WiFi模塊怎樣連接手機(jī)APP

    將單片機(jī)WiFi模塊連接到手機(jī)APP通常涉及以下幾個步驟: 選擇單片機(jī)和WiFi模塊 :選擇合適的單片機(jī)(如Arduino, ESP32等)
    的頭像 發(fā)表于 09-10 15:31 ?1231次閱讀

    STM32最小系統(tǒng)板與ESP01S接入機(jī)智云教程

    本次采用STM32F103C8T6單片機(jī)、ESP-01S模塊、紅外避障模塊、蜂鳴器模塊,OLED(0.96iic)、繼電器模塊、超聲波
    的頭像 發(fā)表于 09-04 08:02 ?671次閱讀
    STM32最小系統(tǒng)板與<b class='flag-5'>ESP01S</b>接入機(jī)智云教程

    esp8266wifi模塊怎么連接手機(jī)

    ESP8266 WiFi模塊連接手機(jī)主要可以通過兩種方式實(shí)現(xiàn): 通過路由器連接(STA模式)和直接作為熱點(diǎn)連接(AP模式) 。以下是兩種連接方式的步驟: 一、通過路由器連接(STA模式) 配置
    的頭像 發(fā)表于 08-19 17:27 ?3456次閱讀

    ESP01S連接TPLINK路由器TL-WDR5620千兆易展版報(bào)204錯誤怎么解決?

    模組:ESP01S ESP-IDF版本:v3.4-73-gd48c4c17 開發(fā)環(huán)境:Linux VSCode 路由器:TL-WDR5620千兆易展版 之前家里的路由器是華為的,連接都沒有
    發(fā)表于 06-07 07:31

    【項(xiàng)目展示】基于CW32的遙控循跡小車

    CW32循跡小車.zip_免費(fèi)高速下載|百度網(wǎng)盤-分享無限制? 一、概述 CW32循跡、遙控小車具有循跡和遙控兩種功能,小車的硬件模塊CW32F030C8T6小藍(lán)板、智能小車控制底板
    的頭像 發(fā)表于 05-31 17:33 ?1390次閱讀
    【項(xiàng)目展示】基于<b class='flag-5'>CW32</b>的遙控循跡小車

    CW32量產(chǎn)燒錄工具

    本節(jié)主要介紹CW32微控制器的燒錄器CW-Writer,以及與之配合的軟件CW-Programmer的使用方法。燒錄器CW-Writer通過ISP協(xié)議,可實(shí)現(xiàn)對
    的頭像 發(fā)表于 04-25 15:22 ?1467次閱讀
    <b class='flag-5'>CW32</b>量產(chǎn)燒錄工具

    CW32快速開發(fā)入門

    CW32快速開發(fā)入門
    的頭像 發(fā)表于 04-24 18:56 ?2088次閱讀
    <b class='flag-5'>CW32</b>快速開發(fā)入門

    uart-wifi模塊esp-01上電后一直亂碼咋回事

    ESP-01模塊上電后出現(xiàn)亂碼的問題可能是由于多種原因造成的,以下是一些可能的原因及解決方法
    的頭像 發(fā)表于 01-28 17:51 ?2057次閱讀
    主站蜘蛛池模板: 年轻漂亮的妺妺中文字幕版| 美女内射少妇三区五区| 97色伦久久视频在观看| 一个人看的HD免费高清视频| 亚洲、国产综合视频| 特级毛片全部免费播放免下载| 漂亮的保姆6在线观看中文 | 韩国甜性涩爱| 国产深夜福利视频在线| 国产女合集小岁9三部| 国产精品亚洲污污网站入口| 国产精品久久人妻无码网站一区无 | 国产在线观看99| 国产午夜亚洲精品区| 国产亚洲视频在线观看| 国产亚洲色婷婷久久精品99 | 我和黑帮老大第365天第2季在线| 涩涩涩涩爱网站| 外女思春台湾三级| 小处雏一区二区三区| 亚洲AV久久久噜噜噜噜| 亚洲国产中文字幕在线视频| 亚洲欧洲日本无在线码播放| 亚洲精品视频在线播放| 亚洲中文无码永久免费| 在线高清电影理论片4399| 2022久久精品国产色蜜蜜麻豆| 69人体阴展网| Chinesetube国产中文| 成人欧美尽粗二区三区AV| 国产69精品麻豆久久久久| 国产伦精品一区二区三区免费| 果冻传媒视频在线播放 免费观看| 精品无码一区二区三区中文字幕| 久久涩视频| 欧美日韩中文在线字幕视频| 日韩亚射吧| 亚洲春色AV无码专区456| 亚洲午夜精品aaa级久久久久 | 国产成人精品免费视频软件| 国产亚洲精品久久久久久久软件 |