写点什么

CC2530+ESP8266 与手机 APP 通信

作者:DS小龙哥
  • 2023-06-22
    湖北
  • 本文字数:3758 字

    阅读完需:约 12 分钟

一、案例介绍

下面是一个基于 CC2530 和 ESP8266 的项目示例,它演示了如何使用 CC2530 与 ESP8266 通信以及使用 AT 指令控制其 WiFi 模块设置和数据传输。


项目概述: 通过 CC2530 控制 ESP8266 将其配置成 AP+TCP 服务器模式,并通过手机 APP 连接到 TCP 服务器并完成数据传输。ESP8266 将作为一个热点(AP)来工作,其 WiFi 模块被配置为建立一个 TCP 服务器并监听端口号。CC2530 将使用其串口与 ESP8266 进行通信,并通过 AT 指令控制 ESP8266 的 WiFi 模块设置和数据传输。



硬件组件:


  1. CC2530 芯片

  2. ESP8266 WiFi 模块

  3. USB 转 TTL 串口转接板

  4. Android 手机


软件组件:


  1. IAR Embedded Workbench for 8051

  2. ESP8266 AT 指令集

  3. Android Studio


实现步骤:


  1. 硬件连接: 将 ESP8266 模块与 USB 转 TTL 串口转接板相连,然后将串口转接板连接到 PC 上的 USB 接口。 在开发板上焊接 CC2530,然后将其连接到 ESP8266 模块的 TXD 和 RXD 引脚上(即 CC2530 的 P0.2 与 P0.3 引脚,分别连接到 ESP8266 的 RXD 和 TXD 引脚)。

  2. 配置 ESP8266 模块: 使用串口工具连接到 ESP8266 模块,然后根据 AT 指令集将其配置为 AP+TCP 服务器模式。例如,可以使用以下 AT 指令来配置 ESP8266 的 WiFi 模块:


AT+CWMODE=3AT+CWSAP="MyWiFi","12345678",1,0AT+CIPMUX=1AT+CIPSERVER=1,8080
复制代码


其中,“MyWiFi”和“12345678”分别是热点的名称和密码,“1”表示加密方式为 WPA2-PSK,“0”表示不隐藏 SSID,而“8080”则是 TCP 服务器监听的端口号。


编写 CC2530 程序: 在 IAR Embedded Workbench for 8051 中创建一个新的工程,在其中添加串口驱动程序以及 ESP8266 通信所需的 AT 指令函数。然后,编写主程序代码来实现以下功能:


  • 初始化串口

  • 向 ESP8266 发送 AT 指令以配置其 WiFi 模块

  • 等待 ESP8266 向 CC2530 发送 TCP 连接请求

  • 接受从 ESP8266 传回的数据并将其显示在串口工具中


以下是示例代码的一部分,用于初始化串口并向 ESP8266 发送 AT 指令:


#include "uart.h"#include <string.h>
// AT指令函数void at_command(char* cmd){ uart_puts(cmd); uart_puts("\r\n"); delay_ms(1000);}
int main(){ // 初始化串口 uart_init(); // 发送AT指令以配置ESP8266的WiFi模块 at_command("AT+CWMODE=3"); at_command("AT+CWSAP=\"MyWiFi\",\"12345678\",1,0"); at_command("AT+CIPMUX=1"); at_command("AT+CIPSERVER=1,8080");
while (1) { // 接受从ESP8266传回的数据并将其显示在串口工具中 if (uart_available()) { char c = uart_read(); uart_putc(c); } }
return 0;}
复制代码

二、CC2530 与 ESP8266 科普

CC2530 是德州仪器(Texas Instruments,简称 TI)公司推出的一款基于 ZigBee 协议的 SoC 单芯片解决方案,它集成了一个 8051 内核、硬件 AES 加密加速器、具备丰富外设的低功耗射频芯片和物理层。CC2530 支持 IEEE 802.15.4 标准和 ZigBee 协议,并且具有低功耗、高可靠性和长距离等特点,广泛应用于物联网、智能家居、智能医疗、无线传感网和工业自动化等领域。


ESP8266 是一款由中国企业乐鑫(Espressif Systems)研发的超低功耗 Wi-Fi 芯片,被广泛应用于物联网相关设备的开发中。该芯片采用 Tensilica L106 32 位处理器,内置 TCP/IP 协议,可以实现 Wi-Fi 通信,同时也支持传统的 UART 协议、SPI 协议等串行通信方式。ESP8266 芯片集成了射频电路、天线、Flash 存储器和电源管理等,体积小巧、功耗低,具有高度集成性和低成本的特点。


ESP8266 芯片的主要特点如下:


1.  支持802.11 b/g/n Wi-Fi协议,通信距离远,数据传输速度快;2.  内置32位低功耗Tensilica L106 CPU,主频可达80MHz;3.  支持UART、SPI、I2C等多种串行通信协议;4.  集成了高速缓存和SRAM,具有强大的处理性能和存储能力;5.  支持蓝牙4.2、BLE等无线通信协议(部分型号支持);6.  能够与各种MCU和传感器等外设进行协同工作,大大降低了开发成本和门槛。
复制代码


ESP8266 芯片具有成本低、功耗低、尺寸小和易于开发等优点,在物联网、智能家居、智能手环、智能家电等领域广泛应用。同时,ESP8266 芯片也被视为低功耗 Wi-Fi IoT 领域中的杀手锏,为物联网设备的互联提供了更为简便、稳定、高效的解决方案。

三、功能代码实现介绍

在 CC2530 上实现控制 ESP8266 配置成 AP+TCP 服务器模式,与手机 APP 之间完成数据传输,需要使用 CC2530 的串口与 ESP8266 通信,以及使用 ESP8266 AT 指令控制 ESP8266 的 WiFi 模块设置和数据的发送,代码如下:


#include <stdio.h>#include <stdint.h>#include <string.h>
#define ESP_ON P1_0 // ESP8266电源控制引脚#define ESP_RST P1_1 // ESP8266复位引脚#define UART_TX P0_2 // CC2530串口发送引脚#define UART_RX P0_3 // CC2530串口接收引脚
// ESP8266 AT指令常用指令const char* AT_RST = "AT+RST";const char* AT_CWMODE = "AT+CWMODE=3"; // 设置ESP8266为AP+STA模式const char* AT_CWSAP = "AT+CWSAP="ssid","pass",1,3"; // 设置ESP8266 AP模式下的WiFi名称和密码const char* AT_CIPMUX = "AT+CIPMUX=1"; // 设置ESP8266多路连接模式const char* AT_CIPSERVER = "AT+CIPSERVER=1,8888"; // 设置ESP8266 TCP服务器端口const char* AT_CIPSEND = "AT+CIPSEND=0,50"; // 设定ESP8266发送数据的长度,50字节
// ESP8266 AT指令回应标志const char* RESPONSE_OK = "OK"; // AT指令执行成功const char* RESPONSE_ERROR = "ERROR"; // AT指令执行失败const char* RESPONSE_READY = "ready"; // ESP8266已经准备就绪const char* RESPONSE_CONNECT = "CONNECT"; // ESP8266连接成功const char* RESPONSE_CLOSED = "CLOSED"; // ESP8266连接关闭
// ESP8266的WIFI名称和密码const char* SSID = "esp8266";const char* PASSWORD = "wifipassword";
// 存储ESP8266返回的数据char response[100];
// 延时函数void delay(int ms) { while (--ms > 0) __delay_cycles(48000);}
// 向ESP8266发送AT指令,并获取ESP8266的回应void sendATCommand(const char* cmd, uint8_t wait) { uint8_t i = 0; memset(response, 0, sizeof(response)); printf("AT command: %s\n", cmd); printf("AT response:\n"); while (cmd[i]) { while (!(UCA0IFG & UCTXIFG)); UCA0TXBUF = cmd[i++]; } while (wait && !(UCA0IFG & UCRXIFG)); while (UCA0IFG & UCRXIFG) { if (response[0] == '\0' && UCA0RXBUF != '\r' && UCA0RXBUF != '\n') { response[0] = UCA0RXBUF; response[1] = '\0'; continue; } if (strlen(response) < sizeof(response) - 1) { int len = strlen(response); response[len] = UCA0RXBUF; response[len + 1] = '\0'; } } printf("%s", response);}
void main(void) { uint8_t retry = 5; _BIS_SR(GIE);
// 配置IO口 P1DIR |= BIT0 + BIT1; P1OUT &= ~(BIT0 + BIT1); P1OUT |= ESP_ON; // 打开ESP8266电源 P1OUT &= ~ESP_RST; // 复位ESP8266 delay(500); P1OUT |= ESP_RST; delay(1000);
// 配置串口 P0SEL |= BIT2 + BIT3; UCA0CTL1 = UCSSEL_2; UCA0BR0 = 130; UCA0BR1 = 6; UCA0MCTL = UCBRS_4;
// 逐步执行AT指令,确保每一步配置都执行成功 while (retry-- > 0) { sendATCommand(AT_RST, 1); sendATCommand(AT_CWMODE, 1); sendATCommand(AT_CWSAP, 1); sendATCommand(AT_CIPMUX, 1); sendATCommand(AT_CIPSERVER, 1); if (strstr(response, RESPONSE_OK) != NULL) break; } if (retry == 0) return; // 配置失败,退出程序
// 等待ESP8266准备就绪 while (1) { sendATCommand("", 1); if (strstr(response, RESPONSE_READY) != NULL) break; delay(500); }
// 等待手机APP连接 while (1) { sendATCommand("", 1); if (strstr(response, RESPONSE_CONNECT) != NULL) { printf("Client connected.\n"); // 发送数据 sendATCommand(AT_CIPSEND, 0); while (!(UCA0IFG & UCTXIFG)); UCA0TXBUF = 'H'; UCA0TXBUF = 'e'; UCA0TXBUF = 'l'; UCA0TXBUF = 'l'; UCA0TXBUF = 'o'; UCA0TXBUF = ','; UCA0TXBUF = 'W'; UCA0TXBUF = 'o'; UCA0TXBUF = 'r'; UCA0TXBUF = 'l'; UCA0TXBUF = 'd'; UCA0TXBUF = '!'; delay(100); // 延时确保数据发送完成 // 关闭连接 sendATCommand("AT+CIPCLOSE=0", 1); printf("Client disconnected.\n"); } delay(10); }}
复制代码


这是 CC2530 的代码,其中 ESP8266 的控制使用了 AT 指令。也就是说,ESP8266 作为网络模块,只是负责在指定的端口上监听客户端的连接和传输数据,真正控制数据传输的是 CC2530,CC2530 还要负责 ESP8266 的 WiFi 模块设置和 TCP 服务器的建立。这里只是给出了用 CC2530 控制 ESP8266 的代码,手机 APP 的代码需要自行开发。

发布于: 刚刚阅读数: 2
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022-01-06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
CC2530+ESP8266与手机APP通信_6 月优质更文活动_DS小龙哥_InfoQ写作社区