一、 背景
nrf24l01的成本较低,但内部需通过spi通信,略显复杂,同时rf过于专用,接入其他系统时需要转换,不方便。
esp8266是乐鑫公司推出的廉价、但几乎全能的wifi芯片,被各种智能硬件广泛使用,根据其datasheet,不但支持spi,也可通过i2c、uart等方式进行通信,尤其是uart,直接支持at指令,大大简化开发难度,相当便利。本文即采用at模式。
esp8266开发板,tb约12块左右,右侧为esp8266,左侧为25q80bvsig,1m闪存。
二、接线
1、esp8266开发板引脚图
tx:串口写
gnd:接地
ch_pd:高电平为可用,低电平为关机
gpio2:可悬空
rst:重置,可悬空
gpio0:上拉为工作模式,下拉为下载模式,可悬空
vcc:3.3v(切不可接5v,烧片)
rx:串口读
2、接线示意
esp8266的串口默认波特率为115200,mega也可直接接rx0/tx0,为调试方便起见,本文中rx0/tx0留做调试窗口,用rx1/tx1和芯片交互。如果是uno,如果要看调试信息,只能增加一个软串口。
三、代码&运行
直接通过串口直接读写at指令,但指令较多,处理繁琐,
找到有如下的库对at指令做了封装,使用十分便利,推荐。
git地址为:
https://github.com/ekstrand/esp8266wifi.git
具体at指令及esp8266相关文档,可见乐鑫官方站点:
http://espressif.com/zh-hans/support/download/documents
1) esp8266库安装
下载上面的esp8266的库后,将其复制到arduino安装目录下的libraries目录下,启动arduinoide后,从例子中选择esp8266_tcp_cli。
该库默认支持3个客户端连接和1个监听连接,如要增大须修改其头文件中的如下两个宏:
1 define server ‘4’
2 define max_connections 312
2) 代码修改
该库设计很灵活,设置了3个串口,入串口,出串口和调试串口。
其中入串口和出串口用于at命令发送和接收,和esp8266的串口相连,调试串口可显示具体交互情况(at指令信息等)原例子中采用的是uno,因其只有一个硬串口,所以改为mega适用,以查看调试信息。
3) 运行
加载运行后,如wifi设置正常,则可接入wifi并取得ip,如下:
可看到调试串口输出的at指令,已经连接到wifi,并取得192.168.80.188的ip.
另外,2121端口被也监听成功。
可用telnet 模拟客户端,连接建立成功后,输入数据0~d,hello world。
输入的数据可从com监视器中看到对应的at指令。如下图:
四、例子代码解析
从原有例子中删除了软串口相关的处理,如下
#include 《esp8266wifi.h》
#define esp8266_reset_pin 5
#define server_port “2121”
#define ssid “xxxx”
#define password “yourpass”
// 初始化,串口1和esp8266交互,串口0做调试输出, pin5做reset
esp8266wifi wifi(serial1, serial1, esp8266_reset_pin, serial);
void processcommand(wifimessage msg);
uint8_t wifi_started = false;
// 自定义的应用层命令,可根据自身应用修改
const char rst[] progmem = “rst”;
const char idn[] progmem = “*idn?”;
void setup() {
// 调试串口启动,波特率可随意指定
serial.begin(115200);
// esp8266默认波特率为115200(可用at指令修改)
serial1.begin(115200);
while (!serial) // 等待串口初始化成功
;
serial1.println(“starting wifi”); // 命令
serial.println(“starting wifi”); // 调试log输出
wifi.settransporttotcp(); // tcp模式(默认设置)
wifi.endsendwithnewline(false); // 发送数据自动以
结尾(默认设置)
wifi_started = wifi.begin(); // wifi启动
if (wifi_started) { // 如果wifi初始化成功
wifi.connecttoap(ssid, password); // 指定用户名密码连接wifi
wifi.startlocalserver(server_port); // 本机(arduino)监听2121端口(做服务端)
} else {
// esp8266 isn‘t working.。
serial.println(“esp8266 isn’t working.。”);
}
}
void loop() {
static wificonnection *connections;
// check connections if the esp8266 is there
if (wifi_started)
wifi.checkconnections(&connections); // 检查/获取当前所有连接的状况
// check for messages if there is a connection
for (int i = 0; i 《 max_connections; i++) { // 默认最大为3
if (connections[i].connected) {
// see if there is a message
wifimessage msg = wifi.getincomingmessage();
if (msg.hasdata) { // 如果有数据
processcommand(msg);
}
}
}
}
void processcommand(wifimessage msg) { // 数据处理函数
char espbuf[msg_buffer_max];
int set;
char str[16];
serial.print(msg.message);
// 以下为应用层面的处理
sscanf(msg.message, “%15s %d”, str, &set);
serial.print(str);
serial.println(set);
if ( !strcmp_p(str, idn) ) {
wifi.send(msg.channel, “esp8266wifi example”);
}
// reset system by temp enable watchdog
else if ( !strcmp_p(str, rst) ) {
wifi.send(msg.channel, “system reset.。。”);
// soft reset by reseting pc
asm volatile (“ jmp 0”);
}
// unknown command
else {
wifi.send(msg.channel, “err”);
}
}
VR眼镜的基础结构解析
车对车技术进入摩托车领域
一新势力资金断裂,吉利接盘
电容出现失效的原因是什么
国内首份《BAT人工智能领域人才发展报告》
esp8266与arduino的实例教程分析
51单片机存储器的结构和原理解析
日本研发掺硼的各向异性钐12薄膜,将应用于汽车电机
加拿大官员表示,不会禁止华为参与下一代5G网络建设
spring分布式框架有哪些
电源管理现代技术趋势解析
简单实用接地气的智能家居设备
超级电容器的主要应用领域
一加11体验报告:不将就,优雅强悍更进一步
什么是SPARC处理器
储能产业大发展利好哪些元器件产品?
PMOS管与NMOS管控制电路设计对比
谷歌计划向安卓手机厂商收费 华为:以谷歌口径为准
DeepMind的最新AI无需知晓规则就能掌握游戏
在FPGA上实现复杂协议处理任务卸载的解决方案