创客利器之ESP32(一) - ESP32介绍
什么是ESP32?
ESP32狭义上指的是乐鑫信息科技推出的一类面向物联网应用的嵌入式SoC(System on Chip)芯片,广义上还可以指基于ESP32的软硬件产品。ESP32芯片基于Xtensa LX6 32-bit处理核心研发,并增加WiFi等无线通讯功能,具有单核和双核等不同版本。芯片本身就支持WiFi、蓝牙、USB、GPIO等多种无线和有线接口,不需要再增加接口芯片。可以方便地应用于智慧农业、工业检测、智能家居等IoT场景。这种身材灵巧并且功能强大的芯片很受创客社区的欢迎。在Arduino、MicroPython、CircuitPython等开发平台中都增加了对ESP32的支持。乐鑫和创客社区推出了很多具有USB接口的开发板,插入电脑即可编程,非常方便。有Arduino和Python编程经验的人,可以很快掌握如何在项目中使用ESP32模块。ESP32是一款容易上手且功能强大的物联网芯片,既适合电子爱好者也适合专业人士,有广阔的应用前景。
ESP32可以用来做什么?
因为ESP32支持丰富接口协议,和丰富的应用程序库esp-idf,开发者可以很快地开发出应用程序,不需要详细了解底层硬件协议。ESP32可以用来控制智能小车、智能电路、智能手表等,用户可以根据自己的创意开发新的使用场景。国内外的创客基于ESP32开发了很多个创意项目,下面列出两个基于ESP32制作的有趣项目。
我们可以利用ESP32帮助我们控制家里的电器、自动投喂宠物等等功能,具体能做什么取决于使用者的想象力。
快速玩转ESP32
乐鑫提供了esp-idf环境和ESP32应用程序库,提供给开发者使用,不过需要使用者有一定的编程经验。最近由于arduino-esp32开源社区的努力,我们现在可以使用Arduino软件来编写ESP32程序,将ESP32的使用门槛降低了不少。下面我们通过一个例子介绍使用Arduino来开发ESP32程序。首先我们需要先准备下列硬件:
- ESP32开发版(type-c和mini-usb接口的都可以)
- USB-A转换线(根据开发板的接口类型选择)
市面上有很多ESP32开发板。乐鑫科技自己也有ESP32开发板,还有很多小公司和个人推出的克隆板。淘宝上面很多,大约二十元到五十元不等,比如我用的这个。被金属覆盖的部分就是ESP32模块,ESP32芯片被封装在模块里面。 准备好硬件后,我们可以开始准备开发程序了。这里使用Mac上的Arduino软件作为示例,PC上的操作步骤应该也类似。Arduino软件默认只支持Arduino系列开发版,我们还需要做一些配置使得Arduino支持ESP32。不过不用担心,步骤比较简单。首先安装Arduino程序,可以从Arduino.cc下载程序。安装好程序后,运行arduino程序。我们还需要安装Arduino的ESP32扩展,第一步打开首选项菜单。 设置扩展的开发板描述信息,将如下链接输入到输入栏”附加开发板管理器网址”中:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
第二步是安装arduino-esp32扩展,打开”开发版管理器 …“。 等待索引刷新完成,搜索esp32。 点击安装,等待安装安成。最后设置开发板类型,和使用的串口。在Windows上串口名称与Mac不一样,名字类似COMx,x是个数字,可以在”端口”设置中勾选。 这样就完成了开发环境的安装和配置。
安装好了针对ESP32的环境后,让我们运行一个针对ESP32的程序。ESP32相对其他小行MCU开发板的优势就是支持Wifi和蓝牙等无线协议。所以下面就通过一个示例介绍如何利用Arduino WiFi api查看有哪些无限AP可以接入。下面看这个代码示例,代码来自arduino-esp32项目。可以通过Arduino的菜单项,”文件”->”示例”->”WiFi”->”WiFiScan”,找到这个例子。
/*
* This sketch demonstrates how to scan WiFi networks.
* The API is based on the Arduino WiFi Shield library, but has significant changes as newer WiFi functions are supported.
* E.g. the return value of `encryptionType()` different because more modern encryption is supported.
*/
#include "WiFi.h"
void setup()
{
Serial.begin(115200);
// Set WiFi to station mode and disconnect from an AP if it was previously connected.
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
Serial.println("Setup done");
}
void loop()
{
Serial.println("Scan start");
// WiFi.scanNetworks will return the number of networks found.
int n = WiFi.scanNetworks();
Serial.println("Scan done");
if (n == 0) {
Serial.println("no networks found");
} else {
Serial.print(n);
Serial.println(" networks found");
Serial.println("Nr | SSID | RSSI | CH | Encryption");
for (int i = 0; i < n; ++i) {
// Print SSID and RSSI for each network found
Serial.printf("%2d",i + 1);
Serial.print(" | ");
Serial.printf("%-32.32s", WiFi.SSID(i).c_str());
Serial.print(" | ");
Serial.printf("%4d", WiFi.RSSI(i));
Serial.print(" | ");
Serial.printf("%2d", WiFi.channel(i));
Serial.print(" | ");
switch (WiFi.encryptionType(i))
{
case WIFI_AUTH_OPEN:
Serial.print("open");
break;
case WIFI_AUTH_WEP:
Serial.print("WEP");
break;
case WIFI_AUTH_WPA_PSK:
Serial.print("WPA");
break;
case WIFI_AUTH_WPA2_PSK:
Serial.print("WPA2");
break;
case WIFI_AUTH_WPA_WPA2_PSK:
Serial.print("WPA+WPA2");
break;
case WIFI_AUTH_WPA2_ENTERPRISE:
Serial.print("WPA2-EAP");
break;
case WIFI_AUTH_WPA3_PSK:
Serial.print("WPA3");
break;
case WIFI_AUTH_WPA2_WPA3_PSK:
Serial.print("WPA2+WPA3");
break;
case WIFI_AUTH_WAPI_PSK:
Serial.print("WAPI");
break;
default:
Serial.print("unknown");
}
Serial.println();
delay(10);
}
}
Serial.println("");
// Delete the scan result to free memory for code below.
WiFi.scanDelete();
// Wait a bit before scanning again.
delay(5000);
}
这个例子通过WiFi对象很容易就实现了WiFi扫描的任务。这个代码主要有两个函数:setup和loop。setup函数是Arduino代码中进行初始化设置的地方。这里先配置了串口的传输速率,后面使用串口输出调试信息。然后设置WiFi的工作模式为Station模式,即将ESP32配置成一个WiFi普通接入设备。
Serial.begin(115200); // 设置串口速率
// Set WiFi to station mode and disconnect from an AP if it was previously connected.
WiFi.mode(WIFI_STA); // 设置WiFi模块的工作模式
WiFi.disconnect();
loop函数是扫描有哪些接入点的地方,调用WiFi.scanNetworks函数即可获得有哪些接入点。如果返回值不是零,那么就将扫描到的接入点列表通过串口打印出来。下面是我运行的结果,就这么简单。
Setup done
Scan start
Scan done
24 networks found
Nr | SSID | RSSI | CH | Encryption
1 | MK32-1 | -29 | 1 | WPA+WPA2
2 | tplink-5678 | -48 | 6 | WPA2
3 | tplink-5678_Wi-Fi5 | -49 | 6 | WPA2
4 | HUAWEI-901 | -83 | 1 | WPA2
5 | HUAWEI-1B9E9Z | -83 | 1 | WPA2
6 | APPLE PIE | -84 | 6 | WPA2
7 | sj | -85 | 1 | WPA+WPA2
8 | CU_wwxE | -85 | 10 | WPA+WPA2
9 | YING | -86 | 1 | WPA+WPA2
10 | ChinaNet-CA9s | -87 | 8 | WPA+WPA2
11 | ASUS_14_2G | -88 | 1 | WPA2
12 | Iris | -89 | 4 | WPA+WPA2
13 | ChinaNGB-701 | -89 | 13 | WPA+WPA2
14 | ChinaNet-pJjd | -90 | 8 | WPA+WPA2
15 | China-Andy | -90 | 8 | WPA+WPA2
16 | CMCC-5sRd | -90 | 9 | WPA+WPA2
17 | HUAWEI-E6878-865A | -91 | 5 | WPA2
18 | Xiaomi_1C95 | -91 | 6 | WPA+WPA2
19 | HUAWEI-059 | -91 | 6 | WPA2
20 | CMCC-4arW | -91 | 6 | WPA+WPA2
21 | TP-LINK_6349 | -91 | 11 | WPA+WPA2
22 | ChinaNGB-701 | -92 | 13 | WPA+WPA2
23 | ruijie_RG-EG150-2.4 | -93 | 13 | WPA+WPA2
24 | xulei | -97 | 11 | WPA+WPA2
以上就是如何使用Arduino来编写ESP32程序的例子,是不是很简单?arduino-esp32项目还提供了很多其他示例,比如如何连接WiFi接入点,如何使用蓝牙等等。如果需要完成某个功能的代码,通过浏览示例目录可以很快找到示例代码。不过arduino-esp32采用的是LGPL的开源协议,直接使用代码示例需要承担开源义务。如果不想开源,记得不要直接使用例子。
结束语
如果你喜欢动手,想自己实现一个智能设备,ESP32是一个非常好的选择。我还会继续ESP32这个主题,比如尝试更容易的编程方法,并挑战一些其他任务,比如使用ESP32模拟一个键盘,使用ESP32与手机通信等。如果你想了解ESP32的更多内容,可以继续关注本博客或微信搜索公众号”平民IT技术”。