解决了接口问题,下一步让Arduino拥有网络通信能力,我们就可以用它做很多事情了:写一个小说阅读器、作为电脑扩展屏……
本文我们扩展Arduino的网络通信能力,而这,经过筛选,我选择了ESP8266芯片。实际上ESP系列芯片都可以作为选择,只是我手中刚好有一个8266,用作讲解。(实际上,8266的淘宝价格只有两块钱,属于成本极低的实验材料)。
8266具有以下五个优点:1.工作温度范围大,且能够保持稳定的性能,能适应各种操作环境;2.集成了 32 位 Tensilica 处理器、标准数字外设接口、天线开关、射频 balun、功率放大器、低噪放大器、过滤器和电源管理模块等,仅需很少的外围电路,可将所占 PCB 空间降低;3.专为移动设备、可穿戴电子产品和物联网应用而设计,通过多项专有技术实现了超低功耗。
ESP8266EX 具有的省电模式适用于各种低功耗应用场景;4.内置超低功耗 Tensilica L106 32 位 RISC 处理器,CPU 时钟速度最高可达 160 MHz,支持实时操作系统 (RTOS) 和 Wi-Fi 协议栈,可将高达 80% 的处理能力留给应用编程和开发。怎么,是不是看的心痒痒?下面咱们就来看看怎么使用它吧。5.还有一个激动人心的,它自带一个Flash。我们甚至可以向里面存一些自己的东西进去。不过,这个功能未向用户开放,我们需要自己实现API才可以使用。
ESP的教程不多,我是从知乎上的一个教程里入门的,不过那个讲的不太符合初学者的逻辑,当时学的一头雾水,不甚理解。如今,对ESP的基本用法掌握后,我想为硬件爱好者提供一个简易的ESP入门教程。本教程假定读者拥有串口通信的知识,关于串口通信,可以参考我的下一篇文章《Arduino教程系列:串口通信指南》。两者一并食用,味道更加。
这是一个8266的下面,上面一共有八个接口,两个用于供电,两个用于串口通信。一个使能端,还余三个。对于入门,了解这五个足以,其他的可以参考下文中我推荐的资料。
在使用时,ESP采用串口的形式与其中的芯片进行通信,这个模块就像Arduino一样,可以看作是一个独立的板子,只是上面没有额外的通信引脚罢了。第一段中我介绍的优点中,它甚至可以支持RTOS。
所以,我们对待它就要像对待Arduino一般。通常在我们购买了ESP后,它里面已经烧录好了功能代码,负责Wifi通信(它支持链接其他的Wifi,也可以作为Wifi使用,这两个功能可以同时打开,我们叫着叫什么?对,路由。我们甚至可以把它当作路由器使用。)我们只需要对它下达相应的指令,便可以打开相应的功能。Wifi通信的数据它会通过串口的形式传递给其他芯片。也即我们利用串口通信的两根线便扩展了Wifi功能。
有一点我想提前点明:不知道是我的设备原因还是其他不知名的原因,利用串口通信获取信息时总会出现一定概率的乱码。鉴于我的其他设备采用串口通信时并无障碍,猜测是我手中这款ESP芯片是次品。
为ESP下指令就和Linux一样,向其传送指令,它会回显或者返回相应的信息。
使用流程如下:
1. 启动
通电后,系统进行初始化。确保功能正常。
2. 配网
发送指令,链接wifi或设置链接密码,供其他设备链接。
"AT CWMODE=3\r\n"。设置wifi模式。3表示SoftAP Station模式,即热点 终端。即能接受外部wifi信号,又能为其他设备提供wifi信号。
"AT CIPMUX=1\r\n"。设置多链接。可以供多个设备链接。
“AT CIPSERVER=1,5000\r\n“。建立TCP服务器,端口设为5000。
3. 循环
等待接受消息,并进行处理。
接受信息的代码如下:
```
String _comdata_wifi = ""; //for incoming wifi serial data
void getWifiSerialData(){//获取原始通信信息
while (wifi.available() > 0){
_comdata_wifi = char(wifi.read()); //get wifi data
delay(4);
}
}
```
在loop循环中处理接受的消息即可。
ESP的波特率为115200.初始IP为192.168.4.1。向ESP发送指令时要确保至少间隔500ms,否则会出错。
完整代码:
#include <SoftwareSerial.h>
#define WIFI_TX 9
#define WIFI_RX 8
#define LED 13
SoftwareSerial wifi(WIFI_RX, WIFI_TX); //RX, TX
String _comdata_wifi = ""; //for incoming wifi serial data
String _prodata = "";
void setup() {
pinMode(LED,OUTPUT);
digitalWrite(LED,LOW);
Serial.begin(9600);
wifi.begin(115200);
Serial.println("system is ready!");
wifi.println("AT CWMODE=3\r\n");
delay(500);
wifi.println("AT CIPMUX=1\r\n");
delay(500);
wifi.println("AT CIPSERVER=1,5000\r\n");
delay(500);
}
void loop() {
getWifiSerialData();
if(Serial.available()){
String order = "";
while (Serial.available()){
char cc = (char)Serial.read();
order = cc;
delay(2);
}
order.trim();
wifi.println(order);
}
if(_comdata_wifi!=""){
if((_comdata_wifi[2]==' ')&&(_comdata_wifi[3]=='I')&&(_comdata_wifi[4]=='P'))//MCU接收到的数据为 IPD时进入判断控制0\1来使小灯亮与灭
{
if((_comdata_wifi[5]=='D')&&(_comdata_wifi[8]==','))
{
if(_comdata_wifi[11]=='0')
{
digitalWrite(LED,LOW);//0 灯灭 }
else if (_comdata_wifi[11]=='1')
{
digitalWrite(LED,HIGH); //1 灯亮
}
}
}
else{
if(_comdata_wifi[0] == '1'){
digitalWrite(LED,HIGH);
}
else if(_comdata_wifi[0] == '0'){
digitalWrite(LED,LOW);
}
}
_comdata_wifi = String("");
}
}
void getWifiSerialData(){//获取原始通信信息
while (wifi.available() > 0){
_comdata_wifi = char(wifi.read()); //get wifi data
delay(4);
}
}
这是一个控制灯开关的代码。
其他资料及说明我使用的是乐鑫的固件,硬件不知道什么牌子的,买的套装。
技术文档 | 乐鑫科技 (espressif.com)
上面有所有的指令及其示例。
可以参考乐鑫的文档刷入RTOS,也就可以作为板子玩了。
我还有其他示例代码和指令集参考的PDF,不方便访问官网的可以向我发送邮件获取。邮件地址见第一篇教程。