ESP8266 Hello world

本文将介绍如何使用 ESP8266 做最简单的事情,包括

  • 连接 ESP8266 到电脑需要安装驱动
  • 使用 Arduino IDE 为 ESP8266 编辑和部署代码,并通过端口监控代码运行
  • 编写的简单的运行示例
    • 通过端口定时返回字符串,真正的 hello world
    • 连接 Wi-Fi
    • 在连接 Wi-Fi 的基础上发布一个最简单的 HTTP Server,可以访问简单的网页

另外,本文使用了

  • 电脑,MacBook Pro (macOS Mojave)
  • ESP8266 CP2102 ESP-12E 开发板,购买链接

环境安装和配置#

安装 USB 驱动#

安装 CP2102 USB 到 UART 桥接芯片的驱动:https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers

安装好,应该能

  • 关于本机 -> 系统报告USB部分,找到类似CP2012 USB to UART Bridge Controller
  • 或者,命令行,ls /dev/cu*,可以看到类似/dev/cu.SLAB_USBtoUART

如果没有做到,后面无法连接到设备。

Arduino IDE 的安装和配置#

安装#

下载 Arduino IDE,https://www.arduino.cc/en/Main/Software

解压缩,然后拖拽到应用程序

开发板管理器的设置和下载#

启动 Arduino IDE 后,在首选项中设置附加开发板管理器网址

1
https://arduino.esp8266.com/stable/package_esp8266com_index.json

这个网址可在 ESP8266 Arduino 官网查到:https://github.com/esp8266/Arduino

后面的设置会使用这个网址下载正确的包:

  • Arduino IDE 是为了开发 Arduino 硬件提供的 IDE 工具,并不是专门为 ESP8266 准备的
  • ESP8266 Arduino 是 ESP8266 社区搞的一个 Arduino IDE 第三方包,可借助后者做 ESP8266 的开发

继续设置, 工 具-> 开发板 -> 开发板管理器

  • 类型的文本框里输入 esp8266
  • 将出现类似 esp8266 by ESP8266 Community 版本 2.5.2,安装
  • 安装过程将很漫长,可能需要翻墙,否则有的文件下载不了

设置开发板类型和端口#

设置开发板类型,工 具-> 开发板 ,将看到多了一组开发板(ESP8266 Boards),选择NodeMCU 1.0 (ESP-12E Moudle)

设置端口,工 具-> 端 口 -> /dev/cu.SLAB_USBtoUART

打开串口监视器并设置波特率#

打开串口监视器,工 具-> 串口监视器

  • 串口监视器是一个新的单独窗口,如果打不开,一般是端口设置有问题
  • 串口监视器类似一般软件开发的 Console,程序里的打印语句输出,可以通过 ESP8266 设备串口传递到监视器中显示

设置端口的波特率,设置为115200 波特率

  • 设备的串口波特率是由硬件的指标决定的
  • 如果设置错误,显示的信息可能会是乱码

以上所有的设置工作都结束了,后面就是编码和运行了。

编辑、部署和运行 hello world 示例#

hello world 代码#

感受下代码

  • 代码的功能是在串口打印字符串hello world,然后延时 2000ms,循环这个过程
  • 一个用于全局设置的函数,供初始化的时候调用
  • 再有一个大的 loop,就是个无限循环。
1
2
3
4
5
6
7
void setup() {
Serial.begin(115200);
}
void loop() {
Serial.println("hello world");
delay(2000);
}

部署和运行监控#

上述代码复制到 Arduino IDE 的编辑界面中,然后保存。

编译,项 目 -> 验证/编译

  • 检查代码是否有编译错误

部署,在这里叫上传,项 目 -> 上 传

  • 上传包括了编译过程
  • 上传开始前将停止 ESP8266 设备上的程序运行
  • 一旦上传完成,ESP8266 设备将启动新的程序
  • 如果编译错误,将启动程序之前的版本

一旦程序运行,就可以在串口监视器里看到定时打印的信息。

连接 Wi-Fi 并实现简单的 Web 服务示例#

ESP8266 库相关文档到哪里去查#

ESP8266 Arduino Core’s documentation: https://arduino-esp8266.readthedocs.io/en/latest/

后续开发使用到的库文件,都可以在上述文档中找到。

连接 Wi-Fi 的代码#

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <ESP8266WiFi.h>

const char* ssid = "XXX";
const char* password = "xxx";

void setup() {
Serial.begin(115200);
delay(10);
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(1000);
}

Serial.println('\n');
Serial.println("Connection established!");
Serial.print("IP address:\t");
Serial.println(WiFi.localIP());
}

void loop() { }

运行成功后,会打印出 Wi-Fi 获取的 ip 地址。

可参见:https://arduino-esp8266.readthedocs.io/en/2.5.2/esp8266wifi/readme.html#quick-start

实现简单的 Web 服务示例#

在上述建立 Wi-Fi 连接后,还需要通过 WiFiServer对象,这是一个简易的 web server 实现 HTTP 服务的功能。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <ESP8266WiFi.h>

const char* ssid = "XXXX";
const char* password = "xxxx";

int status = WL_IDLE_STATUS;

WiFiServer server(80);

void setup() {
Serial.begin(115200);
delay(10);
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(1000);
}

Serial.println('\n');
Serial.println("Connection established!");
Serial.print("IP address:\t");
Serial.println(WiFi.localIP());

server.begin();
}

void loop() {
WiFiClient client = server.available();

if (client) {
Serial.println("new client");

bool currentLineIsBlank = true;

while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);

if (c == '\n' && currentLineIsBlank) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head>");
client.println("<title>示例</title>");
client.println("</head>");
client.println("<body>");
client.println("<h1>最简单的页面</h1>");
client.println("</body>");
client.println("</html>");
break;
}
if (c == '\n') {
currentLineIsBlank = true;
} else if (c != '\r') {
currentLineIsBlank = false;
}
}
}

delay(1);
client.stop();
Serial.println("client disonnected");
}
}

实现了一个显示静态网页的功能

  • 页面实现比较困难,需要自己拼 html 文本,感觉回到了 Java Servlet 的情况
  • 后续再看,是否有在此基础上的库,更方便实现

另外,如果想不记住 ip 地址访问,可以在程序中设置 hostname:

1
2
3
4
5
6
void setup() {
Serial.begin(115200);
delay(10);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
WiFi.hostname("t123");

可以在同网段下 ping 通:

1
2
3
4
5
$ ping t123
PING t123 (192.168.0.239) 56(84) bytes of data.
64 bytes from t123.lan (192.168.0.239): icmp_seq=1 ttl=254 time=47.2 ms
64 bytes from t123.lan (192.168.0.239): icmp_seq=2 ttl=254 time=67.5 ms
64 bytes from t123.lan (192.168.0.239): icmp_seq=3 ttl=254 time=90.2 ms

可以浏览器直接访问:http://t123

TODO 基本原理需要搞清楚

可参见: