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

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

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

GD32F310連接ESP8266實(shí)現(xiàn)遠(yuǎn)程燈控制

冬至配餃子 ? 來源:兆易創(chuàng)新GD32 MCU ? 作者:Ljfly ? 2022-09-22 18:10 ? 次閱讀

功能描述

通過mcu與esp01通過uart連接,通過at指令來創(chuàng)建socket連接,接收遠(yuǎn)端控制燈的指令,來實(shí)現(xiàn)燈亮,滅及閃爍;

開啟兩路串口,usart0(GPIO09-TX,GPIO10-RX)連接esp01,進(jìn)行收發(fā)at指令,usart1(GPIO02-TX,GPIO03-RX)作為log輸出口;

接線圖

poYBAGMsNFOATpujAADTzf4hZCo728.png

ps.電阻可以不接,直接EN和3.3V拉一根線也能起來;

有條件的話,可以選esp01s,不用接電阻。

代碼流程介紹

uart0連接esp01,收發(fā)數(shù)據(jù)使用中斷方式進(jìn)行,接收數(shù)據(jù)檢測(cè)到OK,ERROR等關(guān)鍵字以后關(guān)閉接收。

uart中斷

void USART0_IRQHandler(void) {

    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) {
        /* receive data */
        rx_buffer[rx_count++] = usart_data_receive(USART0);
        if(rx_count >= BUFFER_SIZE) {
            usart_interrupt_disable(USART0, USART_INT_RBNE);
                        printf("rx buffer is full!!\n");
                        recv_flag = 0;
        }
                
                if(strstr((const char *)rx_buffer, "OK\r\n") || 
                    strstr((const char *)rx_buffer, "ERROR\r\n")
                ){
                    usart_interrupt_disable(USART0, USART_INT_RBNE);
                    recv_flag = 0;
                }
                else if(strstr((const char *)rx_buffer, "blink") || 
                    strstr((const char *)rx_buffer, "on") || 
                    strstr((const char *)rx_buffer, "off")
                ){
                    usart_interrupt_disable(USART0, USART_INT_RBNE);
                    recv_flag = 0;
                }
    }

    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE)) {
        /* transmit data */
        usart_data_transmit(USART0, tx_buffer[tx_count++]);
        if(tx_count >= BUFFER_SIZE) {
          usart_interrupt_disable(USART0, USART_INT_TBE);
                    send_flag = 0;
        }
                if(tx_count >= send_len)
                {
                    usart_interrupt_disable(USART0, USART_INT_TBE);
                    send_flag = 0;
                    send_len = 0;
                }
    }
}

uart初始化:

    /* enable COM GPIO clock */
    rcu_periph_clock_enable(RCU_GPIOA);

    /* connect port to USARTx_Tx */
    gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);

    /* connect port to USARTx_Rx */
    gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_10);

    /* configure USART Tx as alternate function push-pull */
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_9);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_9);

    /* configure USART Rx as alternate function push-pull */
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_10);

    /* enable USART clock */
    rcu_periph_clock_enable(RCU_USART0);

    /* USART configure */
    usart_deinit(USART0);
    usart_baudrate_set(USART0, 115200U);
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);

    usart_enable(USART0);
    nvic_irq_enable(USART0_IRQn, 0, 0);

LED初始化:

GPIO_InitTypeDef GPIO_InitStruct = {0};
    /*GPIO Port Clock Enable */
    rcu_periph_clock_enable(RCU_GPIOA);
    
    /*Configure GPIO pin : PtPin  PA8*/
    GPIO_InitStruct.gpio_periph = GPIOA;
    GPIO_InitStruct.mode = GPIO_MODE_OUTPUT;
    GPIO_InitStruct.pin = GPIO_PIN_8;
    GPIO_InitStruct.otype = GPIO_OTYPE_PP;
    GPIO_InitStruct.speed = GPIO_OSPEED_50MHZ;
    GPIO_InitStruct.pull_up_down = GPIO_PUPD_NONE;
    gpio_mode_set(GPIO_InitStruct.gpio_periph,GPIO_InitStruct.mode,GPIO_InitStruct.pull_up_down,GPIO_InitStruct.pin);

    /*Configure GPIO pin Output Level */
    gpio_output_options_set(GPIO_InitStruct.gpio_periph,GPIO_InitStruct.otype,GPIO_InitStruct.speed,GPIO_InitStruct.pin);
    GPIO_BC(GPIO_InitStruct.gpio_periph) = GPIO_InitStruct.pin;
    /* EXTI interrupt init*/

程序代碼

int main(void)
{
        e_at_state at_state = e_init;
    /* enable DMA clock */
    
        init();
        led_flash(5);
    while(1) {
            switch (at_state)
            {
                case e_init:
                    sat("ATE0\r\n", "OK");
                
                    if(!sat("AT\r\n", "OK")){
                        led_on();
                        at_state = e_at_ok;
                    }
                    else{
                        delay_1ms(100);
                        led_off();
                    }
                break;
                case e_at_ok:
                    if(!sat("AT+CWJAP="testssid","12345678"\r\n", "WIFI GOT IP"))
                    {
                        at_state = e_wifi_ok;
                    }
                    else{
                        delay_1ms(100);
                    }
                break;
                case e_wifi_ok:
                    if(!sat("AT+CIFSR\r\n", "CIFSR:STAIP"))
                    {
                        at_state = e_sock_ok;
                    }
                    else
                    {
                        delay_1ms(100);
                    }
                    at_state = e_sock_ok;
                break;
                case e_sock_ok:
                    //close socket
                    sat("AT+CIPCLOSE\r\n", "OK");
                    //start a new socket
                    if(!sat("AT+CIPSTART="TCP","192.168.1.36",1314\r\n", "CONNECT"))
                    {
                        //sat("AT+CIPSEND=10","OK");
                        at_state = e_connect_ok;
                    }
                    else
                    {
                        delay_1ms(100);
                    }
                break;
                case e_connect_ok:
                {
                    char at_resp[128] = {0};
                    wait_atrsp(at_resp);
                    
                    if(strstr(at_resp,"on")){
                        printf("light on\n");
                        led_on();
                    }
                    else if(strstr(at_resp,"off")){
                        printf("light off\n");
                        led_off();
                    }
                    else if(strstr(at_resp, "blink"))
                    {
                        printf("buling buling\n");
                        led_flash(10);
                    }
                    else
                    {
                        printf("other cmd got:[%s]\r\n", at_resp);
                    }
                }
                break;
                default:
                    printf("Get into other:%d\n",at_state);
                break;
            }
            //delay_1ms(100);
    }
}

待改善

usart接收數(shù)據(jù)采用關(guān)鍵字判斷結(jié)束,效率較低;

at指令接收沒有超時(shí),如果得不到期望結(jié)果會(huì)卡住;

socket異常斷開沒有做處理;

后面可以接一個(gè)繼電器控制插座或者臺(tái)燈

因?yàn)閑sp01升級(jí)不到最新版本,無法支持mqtt,只能點(diǎn)對(duì)點(diǎn)控制玩玩了,支持mqtt就可以做更多事情;

異步中斷處理usart_interrupt_flag_get不是很理解,正常接收或者發(fā)送完數(shù)據(jù)應(yīng)該是可以退出,但是好像一直無法退出,不知道是使用的問題還是哪里出的問題,有經(jīng)驗(yàn)的大神可以交流交流指導(dǎo)指導(dǎo)。




審核編輯:劉清

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

    關(guān)注

    16

    文章

    1175

    瀏覽量

    51515
  • UART接口
    +關(guān)注

    關(guān)注

    0

    文章

    124

    瀏覽量

    15199
  • ESP8266
    +關(guān)注

    關(guān)注

    50

    文章

    959

    瀏覽量

    44545
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    遠(yuǎn)程控制通訊--基于Arduino + ESP8266控制LED

    Arduino是許多智能硬件愛好者的首選,使用簡(jiǎn)單快捷,而ESP8266模塊也是當(dāng)前最為熱門的WIFI模塊。本項(xiàng)目完成了Arduino使用EDP協(xié)議通過ESP8266 WIFI模塊接入OneNET服務(wù)器,并通過在接入設(shè)備中創(chuàng)建的應(yīng)用來實(shí)
    的頭像 發(fā)表于 02-27 09:10 ?4w次閱讀
    <b class='flag-5'>遠(yuǎn)程控制</b>通訊--基于Arduino + <b class='flag-5'>ESP8266</b><b class='flag-5'>控制</b>LED<b class='flag-5'>燈</b>

    使用CW32單片機(jī)通過ESP8266連接OneNET物聯(lián)網(wǎng)平臺(tái)

    這期視頻向大家介紹如何使用CW32單片機(jī)通過ESP8266連接OneNET物聯(lián)網(wǎng)平臺(tái),發(fā)送溫濕度數(shù)據(jù)到平臺(tái),并接受平臺(tái)的云控制。
    的頭像 發(fā)表于 11-09 14:32 ?1210次閱讀

    關(guān)于esp8266連接互聯(lián)網(wǎng)問題

    esp8266怎么連接上互聯(lián)網(wǎng),以實(shí)現(xiàn)遠(yuǎn)程通過3G網(wǎng)控制esp8266
    發(fā)表于 07-30 22:06

    STM32F4/F1+ESP8266連接OneNET的主要問題有哪些

    STM32F4/F1+ESP8266是怎樣與OneNET進(jìn)行連接的?STM32F4/F1+ESP8266
    發(fā)表于 10-25 08:15

    STM32F103如何驅(qū)動(dòng)ESP8266連接貝殼物聯(lián)?

    STM32F103如何驅(qū)動(dòng)ESP8266連接貝殼物聯(lián)?
    發(fā)表于 12-14 06:18

    Rtthread stm32f103rct6 esp8266連接超時(shí)怎么處理?

    Rtthread stm32f103rct6 esp8266連接超時(shí)
    發(fā)表于 04-18 09:17

    如何解決esp8266連接不穩(wěn)定問題?

    如何解決esp8266連接不穩(wěn)定問題
    發(fā)表于 11-03 07:03

    使用esp8266實(shí)現(xiàn)STM32聯(lián)網(wǎng)(最簡(jiǎn)單USART方法)

    到電腦上的java程序 這一篇 esp8266與STM32連接,電腦通過STM32配置esp8266實(shí)現(xiàn)聯(lián)網(wǎng)發(fā)送數(shù)據(jù)具體流程如下圖 2= esp82
    發(fā)表于 11-22 11:51 ?1.2w次閱讀

    如何將ESP8266連接到WiFi

    在之前的ESP8266項(xiàng)目中,我簡(jiǎn)要介紹了ESP8266 WiFi模塊,如何開始使用ESP8266和Arduino,ESP8266 ESP-
    的頭像 發(fā)表于 07-29 11:32 ?8.7w次閱讀
    如何將<b class='flag-5'>ESP8266</b><b class='flag-5'>連接</b>到WiFi

    Arduino 編程 ESP8266 12F NodeMCU 實(shí)現(xiàn) PWM 控制呼吸

    Arduino 編程 ESP8266 12F NodeMCU 實(shí)現(xiàn) PWM 控制呼吸
    發(fā)表于 11-18 19:21 ?47次下載
    Arduino 編程 <b class='flag-5'>ESP8266</b> 12<b class='flag-5'>F</b> NodeMCU <b class='flag-5'>實(shí)現(xiàn)</b> PWM <b class='flag-5'>控制</b>呼吸<b class='flag-5'>燈</b>

    HC05-ESP8266實(shí)現(xiàn)控制LED的閃爍

    藍(lán)牙設(shè)備是不可或缺的一部分,在這里我們將用HC05-ESP8266實(shí)現(xiàn)控制LED的閃爍在本篇文章中,將HC-05藍(lán)牙模塊與流行的Wi-Fi模塊ESP8266
    發(fā)表于 11-23 18:06 ?1次下載
    HC05-<b class='flag-5'>ESP8266</b><b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>控制</b>LED的閃爍

    ESP8266連接手機(jī)

    esp8266的三種模式1為Station 模式:ESP8266 模塊通過路由器連接互聯(lián)網(wǎng),手機(jī)或電腦通過互聯(lián)網(wǎng)實(shí)現(xiàn)對(duì)設(shè)備的遠(yuǎn)程控制。2為A
    發(fā)表于 11-30 16:06 ?37次下載
    <b class='flag-5'>ESP8266</b><b class='flag-5'>連接</b>手機(jī)

    Esp8266連接器擴(kuò)展器開源項(xiàng)目

    電子發(fā)燒友網(wǎng)站提供《Esp8266連接器擴(kuò)展器開源項(xiàng)目.zip》資料免費(fèi)下載
    發(fā)表于 07-05 11:15 ?4次下載
    <b class='flag-5'>Esp8266</b><b class='flag-5'>連接</b>器擴(kuò)展器開源項(xiàng)目

    使用ESP8266 wifi DIY控制

    電子發(fā)燒友網(wǎng)站提供《使用ESP8266 wifi DIY控制.zip》資料免費(fèi)下載
    發(fā)表于 07-25 09:18 ?13次下載
    使用<b class='flag-5'>ESP8266</b> wifi DIY<b class='flag-5'>控制</b><b class='flag-5'>燈</b>

    ESP8266 01S繼電器控制智能實(shí)現(xiàn)

    是GPIO3繼電器控制端,繼電器選 擇常閉端接線高電平觸發(fā),控制LED亮滅。 補(bǔ)充說明:①市面上的LED大多是直接用簡(jiǎn)單的整流橋芯
    發(fā)表于 04-27 11:31 ?5次下載
    <b class='flag-5'>ESP8266</b> 01S繼電器<b class='flag-5'>控制</b>智能<b class='flag-5'>燈</b><b class='flag-5'>實(shí)現(xiàn)</b>