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

    文章

    1186

    浏览量

    51795
  • UART接口
    +关注

    关注

    0

    文章

    124

    浏览量

    15247
  • ESP8266
    +关注

    关注

    50

    文章

    962

    浏览量

    44733
收藏 人收藏

    评论

    相关推荐

    远程控制通讯--基于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 1336次阅读

    关于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.2w次阅读

    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>

    STM32+ESP8266连接电脑Qt网络上位机——QT篇

    本文简单介绍下手写网络调试器并连接ESP8266模块 上篇 : STM32+ESP8266连接电脑Qt网络上位机——准备工作 目录 一、部分Qt代码及
    发表于 05-09 14:22 21次下载
    STM32+<b class='flag-5'>ESP8266</b><b class='flag-5'>连接</b>电脑Qt网络上位机——QT篇