那曲檬骨新材料有限公司

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

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

3天內不再提示

GD32F310連接ESP8266實現遠程燈控制

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

功能描述

通過mcu與esp01通過uart連接,通過at指令來創建socket連接,接收遠端控制燈的指令,來實現燈亮,滅及閃爍;

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

接線圖

poYBAGMsNFOATpujAADTzf4hZCo728.png

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

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

代碼流程介紹

uart0連接esp01,收發數據使用中斷方式進行,接收數據檢測到OK,ERROR等關鍵字以后關閉接收。

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接收數據采用關鍵字判斷結束,效率較低;

at指令接收沒有超時,如果得不到期望結果會卡住;

socket異常斷開沒有做處理;

后面可以接一個繼電器控制插座或者臺燈

因為esp01升級不到最新版本,無法支持mqtt,只能點對點控制玩玩了,支持mqtt就可以做更多事情;

異步中斷處理usart_interrupt_flag_get不是很理解,正常接收或者發送完數據應該是可以退出,但是好像一直無法退出,不知道是使用的問題還是哪里出的問題,有經驗的大神可以交流交流指導指導。




審核編輯:劉清

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

    關注

    16

    文章

    1216

    瀏覽量

    52387
  • UART接口
    +關注

    關注

    0

    文章

    124

    瀏覽量

    15363
  • ESP8266
    +關注

    關注

    50

    文章

    962

    瀏覽量

    45338
收藏 人收藏

    評論

    相關推薦

    遠程控制通訊--基于Arduino + ESP8266控制LED

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

    使用CW32單片機通過ESP8266連接OneNET物聯網平臺

    這期視頻向大家介紹如何使用CW32單片機通過ESP8266連接OneNET物聯網平臺,發送溫濕度數據到平臺,并接受平臺的云控制
    的頭像 發表于 11-09 14:32 ?1640次閱讀

    關于esp8266連接互聯網問題

    esp8266怎么連接上互聯網,以實現遠程通過3G網控制esp8266
    發表于 07-30 22:06

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

    STM32F4/F1+ESP8266是怎樣與OneNET進行連接的?STM32F4/F1+ESP8266
    發表于 10-25 08:15

    STM32F103如何驅動ESP8266連接貝殼物聯?

    STM32F103如何驅動ESP8266連接貝殼物聯?
    發表于 12-14 06:18

    Rtthread stm32f103rct6 esp8266連接超時怎么處理?

    Rtthread stm32f103rct6 esp8266連接超時
    發表于 04-18 09:17

    如何解決esp8266連接不穩定問題?

    如何解決esp8266連接不穩定問題
    發表于 11-03 07:03

    使用esp8266實現STM32聯網(最簡單USART方法)

    到電腦上的java程序 這一篇 esp8266與STM32連接,電腦通過STM32配置esp8266實現聯網發送數據具體流程如下圖 2= esp82
    發表于 11-22 11:51 ?1.3w次閱讀

    如何將ESP8266連接到WiFi

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

    Arduino 編程 ESP8266 12F NodeMCU 實現 PWM 控制呼吸

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

    HC05-ESP8266實現控制LED的閃爍

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

    ESP8266連接手機

    esp8266的三種模式1為Station 模式:ESP8266 模塊通過路由器連接互聯網,手機或電腦通過互聯網實現對設備的遠程控制。2為A
    發表于 11-30 16:06 ?37次下載
    <b class='flag-5'>ESP8266</b><b class='flag-5'>連接</b>手機

    Esp8266連接器擴展器開源項目

    電子發燒友網站提供《Esp8266連接器擴展器開源項目.zip》資料免費下載
    發表于 07-05 11:15 ?4次下載
    <b class='flag-5'>Esp8266</b><b class='flag-5'>連接</b>器擴展器開源項目

    使用ESP8266 wifi DIY控制

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

    ESP8266 01S繼電器控制智能實現

    是GPIO3繼電器控制端,繼電器選 擇常閉端接線高電平觸發,控制LED亮滅。 補充說明:①市面上的LED大多是直接用簡單的整流橋芯
    發表于 04-27 11:31 ?7次下載
    <b class='flag-5'>ESP8266</b> 01S繼電器<b class='flag-5'>控制</b>智能<b class='flag-5'>燈</b><b class='flag-5'>實現</b>
    百家乐谋略| 榕江县| 百家乐官网软件辅助器| 牌九百家乐的玩法技巧和规则 | 百家乐官网娱乐网送68元| 现金百家乐信誉| 百家乐官网稳定打法| 娱乐城百家乐论坛| 淘宝皇冠网店| 澳门百家乐海洋阿强| 真人21点| 百家乐澳门百家乐澳门赌场| 周至县| 百家乐搏牌| 百家乐官网博送彩金18| 威尼斯人娱乐场 28| 百家乐官网这样赢保单分析 | 三原县| 易胜博百家乐娱乐城| 澳门百家乐官网娱乐城开户 | 百家乐官网一拖三| 大发888缺casino组件| 真人百家乐官网新开户送彩金| 百家乐路单下| 百家乐官网tt赌场娱乐网规则| 龙岩棋牌乐| 怎样赢百家乐官网的玩法技巧和规则 | 大发888官方正版网| 百家乐官网博弈之赢者理论坛| 钱柜娱乐城现金网| 百家乐技术交流群| 百家乐官网视频游戏网址| 免费百家乐平预测软件| 华硕百家乐官网的玩法技巧和规则 | 百家乐官网大钱赢小钱| bet365备用器| 百家乐投注平台信誉排名| 真人百家乐官网娱乐场| 大发888黄金版娱乐场| 百家乐桌台布| 百家乐官网小钱赢钱|