单片机
返回首页

GD32F310连接ESP8266实现远程灯控制

2024-12-06 来源:elecfans

功能描述

通过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, 'OKrn') || 

                    strstr((const char *)rx_buffer, 'ERRORrn')

                ){

                    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('ATE0rn', 'OK');

                

                    if(!sat('ATrn', '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'rn', 'WIFI GOT IP'))

                    {

                        at_state = e_wifi_ok;

                    }

                    else{

                        delay_1ms(100);

                    }

                break;

                case e_wifi_ok:

                    if(!sat('AT+CIFSRrn', '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+CIPCLOSErn', 'OK');

                    //start a new socket

                    if(!sat('AT+CIPSTART='TCP','192.168.1.36',1314rn', '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 onn');

                        led_on();

                    }

                    else if(strstr(at_resp,'off')){

                        printf('light offn');

                        led_off();

                    }

                    else if(strstr(at_resp, 'blink'))

                    {

                        printf('buling bulingn');

                        led_flash(10);

                    }

                    else

                    {

                        printf('other cmd got:[%s]rn', at_resp);

                    }

                }

                break;

                default:

                    printf('Get into other:%dn',at_state);

                break;

            }

            //delay_1ms(100);

    }

}

待改善


usart接收数据采用关键字判断结束,效率较低;


at指令接收没有超时,如果得不到期望结果会卡住;


socket异常断开没有做处理;


后面可以接一个继电器控制插座或者台灯


因为esp01升级不到最新版本,无法支持mqtt,只能点对点控制玩玩了,支持mqtt就可以做更多事情;


异步中断处理usart_interrupt_flag_get不是很理解,正常接收或者发送完数据应该是可以退出,但是好像一直无法退出,不知道是使用的问题还是哪里出的问题,有经验的大神可以交流交流指导指导。


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦线性调频增强器

  • 1瓦四级调频发射机

  • 500W MOS场效应管电源逆变器,12V转110V/220V

  • 红外开关

  • LM317过压保护

  • 0-30V/20A 大功率稳压电源(采用LM338)

    相关电子头条文章