Arduino + ESP32 高分开源项目推荐

作为一个 ESP32 重度用户,并且一直使用 Arduino 框架开发嵌入式应用的爱好者,在过去开发的项目过程中使用过不少开源项目,这里稍微总结一下比较有意思的,以及比较有用的开源项目列表。

其中一些项目不光是固件方面的程序,也包含了对应的硬件设计,可以当作一个电子 DIY 入门的学习项目。

开源项目集合

awesome-esp

项目地址:https://github.com/agucova/awesome-esp

一个国外爱好者收集的 ESP32/ESP8266 开源项目集合,主要偏完整的固件应用。

固件应用

这里是一些完整的固件开源项目,通常也会包含一个完整的硬件项目,不管是用来学习硬件开发,还是学习嵌入式软件开发,都是很好的例子。

ESPHome

ESPHome Logo

项目地址:https://github.com/esphome/esphome

算是最流行的开源智能家居固件之一了,通过编写 YAML 配置文件的方式来快速集成各种传感器、开关、屏幕等设备到一个固件中,并且内置了 Home Assistant 等智能家居平台的支持,可以一键添加到这些平台中。

要使用 ESPHome,基于上只需要了解大概的 GPIO 知识,I2C 以及 SPI 总线的概念就可以上手了,传感器或者其他外设的驱动都已经包含在固件中,并且官方文档也包含了详细的配置教程。

之前就使用 ESPHome 快速搭建了两个应用:

tasmota

项目地址:https://github.com/arendst/Tasmota

另外一个支持 ESP32/ESP8266 的智能家居固件,但是配置方式和 ESPHome 不太一样。ESPHome 是基于配置文件去编译每个设备需要的固件,Tasmota 是基于它的 WebUI 去配置所需要使用的外设,相对而言,可能对于不喜欢写配置文件的用户来说,Tasmota 用起来更方便。

X-Knob

xknob

项目地址:https://github.com/SmallPond/X-Knob

基于 smartknob 和 X-Track 的一个开源无刷电机旋钮固件,相比原版的自定义绘制界面,X-Knob 使用 LVGL 渲染界面,扩展性和开发的便捷性要好很多,并且作者也搭建了一套 UI 生命周期管理,在页面管理上更加舒适。

WLED

wled

项目地址:https://github.com/Aircoookie/WLED

开源的 WS2812B 灯带控制固件,配套有 App 和 Web 控制界面,可以提供各种灯光切换效果,使用流水灯、彩虹灯之类,并且固件还提供了 API 来控制灯带,理论上淘宝上随便买一个滴胶 WS2812B 灯带再加上一个 NodeMCU/ESP8266 开发板,就可以代替 YeeLight 那些卖得巨贵的灯带了。

AWTRIX

awtrix

项目地址:https://github.com/awtrix/AWTRIX2.0-Controller

网红像素钟,包含了各种应用,天气预报、空气质量、时间、日期、各个平台粉丝数等,我复刻了两个版本,一个直接使用淘宝上购买的 32x8 WS2812 像素屏,使用的 5050 封装灯珠,体积比较大,另外一个就是自己画板子做了个小尺寸的,使用 3528 封装的灯珠。

AWTRIX 配套的服务器功能还挺强大的,不光可以安装应用,还支持画图标等,也有 API 来推送通知,这样可以拿 AWTRIX 像素钟当一个通知中心。

这个项目是使用 ESP8266 的,目前已经停止维护了,作者新开了一个坑使用的 ESP32,不过功能和生态并不如旧版强大,主要是可以单机运行,不再需要单独部署一个服务端,但是如果想要扩展更多功能,还是需要例如 Home Assistant 或者 NodeRED 这样的服务端程序。

AWTRIX Light: https://github.com/Blueforcer/awtrix-light

HoloCubie_AIO

holocubic

项目地址:https://github.com/ClimbSnail/HoloCubic_AIO

由稚晖君在很早的时候推出的透明小电视,算是一个很不错的桌面小摆件。这个项目是第三方在原版硬件基础之上推出的独立固件,相比原版包含了更多功能,还有上位机程序可以控制小电视。

mongoose-os

mongooseos

项目地址:https://github.com/cesanta/mongoose-os

一个面向 IoT 设备使用的固件,集成了很多 IoT 设备常用的功能,例如 OTA 固件更新以及远程管理等,并且内置了很多大平台的 IoT 能力支持,例如 AWS IoT、Google IoT Core、Microsoft Azure。

这个固件的另外一大特色就是,它可以使用 JavaScript 来编写业务代码,对于熟悉 JavaScript 的工程师来说,可以完全不关心固件是如何编译、打包的,只需要专注于业务逻辑的编写。

open-ip-kvm

open-ip-kvm

项目地址:https://github.com/Nihiue/open-ip-kvm

一个开源的 IP-KVM,类似于 Pi-KVM,但是 Pi-KVM 的使用成本太高了,这个开源项目使用了 Arduino Leonardo 开发板模拟 HID 设备,并使用 MS2109 采集卡来采集目标设备的 HDMI 输出画面,最终使用 nodejs + Web 的方式给用户提供操作界面。

整个项目还是比较完整的,相比 Pi-KVM,整体搭建成本可以低一个数量级。

基础库

ArduinoJson

项目地址:https://github.com/bblanchon/ArduinoJson

对于带网络请求的应用来说,JSON 的解析和生成是必不可少的,基本上大多数接口都使用 JSON 来作为 HTTP API 的请求和响应格式。

ArduinoJson 支持静态和动态分配内存,在 ESP32 上,基本上不太用担心内存占用问题,解析速度也还不错,使用静态解析时,需要注意对象是否在引用有效范围内,否则可能会出现数据错乱的情况。

Nanopb

项目地址:https://github.com/nanopb/nanopb

Protobuf 在一些长连接通信的场合也是一种经常使用的通信格式,体积小、解析速度快、向前兼容性好使得它的应用范围相当广泛,在嵌入式应用中,可能有一些场合也需要解析 Protobuf,使用 Nanopb 就可以用于解析这些数据。

Arduino-SHA-1-Hash

项目地址:https://github.com/mr-glt/Arduino-SHA-1-Hash

对比过几个库之后觉得比较好用的 SHA-1 Hash 生成库,通常用于 API 请求生成签名。

arduino-crypto

项目地址:https://github.com/intrbiz/arduino-crypto

测试过比较好用的 AES 加解密以及 SHA256-HMAC 生成库,在有些需要使用 HMAC 的场合时,就可以使用这个库。

开发辅助

EspArduinoExceptionDecoder

项目地址:https://github.com/janLo/EspArduinoExceptionDecoder

对于 ESP32 应用,在出现 crash 的时候,通常只会给一个包含了各种代码地址的 coredump,这个时候就可以使用这个工具,结合本地编译的固件映像,将那一堆十六进制的代码地址转换为实际源代码中的位置,从来更方便地排查异常是怎么发生的。

外设驱动

ClickEncoder

项目地址:https://github.com/soligen2010/encoder

旋转编码器驱动,支持点击、双击、长按等事件检测,基于计时器,适用性比较好。

Adafruit_GPS

项目地址:https://github.com/adafruit/Adafruit_GPS

GPS 协议解析库,支持 NMEA-0183,在 ESP32 上编译比较顺利,其他几个库会有这样那样的问题。

不过需要注意的是,这个库并不支持所有 NMEA 指令,在使用时需要查看实际数据是否符合预期。

INA219_WE

项目地址:https://github.com/wollewald/INA219_WE

电流/功率计 INA219 芯片的驱动库,代码比较整洁,并且支持设置采样电阻大小,这样在实际使用过程中,可以通过降低采样精度的方式来增加电流采样范围。

MT6701-Arduino-Library

项目地址:https://github.com/S-LABc/MT6701-Arduino-Library

MT6701 磁编码器驱动库,在 smartknob 项目中可以作为 TLV493D 的替代。

OneButton

项目地址:https://github.com/mathertel/OneButton

支持多种触发方式的按键检测库,以及支持单击、双击、长按等事件的检测。

IRremoteESP8266

项目地址:https://github.com/crankyoldgit/IRremoteESP8266

红外遥控协议库,可以用来开发一个万能遥控硬件,支持很多种设备,包含一些国内的家电,例如美的空调,这样可以精确控制空调的温度、风速等选项,而不是只能重放从遥控器获得的红外指令。

网络通信

ESPxWebFIMgr

项目地址:https://github.com/holgerlembke/ESPxWebFlMgr

可以实现通过网页管理 ESP32/ESP8266 内置 SPIFFS 中文件的库,可以实现下载、删除、重命名等操作,并且可以显示 SPIFFS 中可用空间。

加上这个库就可以实现最简单的文件管理功能了,比如在 SPI Flash 中记录的数据,可以通过这个方式来同步到电脑上。

ESPAsync_WiFiManager

项目地址:https://github.com/khoih-prog/ESPAsync_WiFiManager

最常用的通过 Web 配置 ESP32 Wi-Fi 连接的库,在没有连接上 Wi-Fi 时,启动一个 Hotspot,用户连接上之后可以设置需要连接的 Wi-Fi 接入点名称、密码等,集成了已知 SSID 扫描等能力。

不过这个库有一个不太好的地方,在默认实现中,即使已经有保存了之前连接过的网络,还是会扫描一次已知网络,并去跟之前连接过的 BSSID 进行匹配,这导致在启动时连接速度不太理想。这个时候可以直接调用 ESP32 官方库的 WiFi.begin 方法来绕开这个过程,实现更快的连接速度。

NTPClient

项目地址:https://github.com/arduino-libraries/NTPClient

对于 ESP32 系列来说,如果不想加一个 RTC 芯片来保存时间,使用 NTP 获取时间是一个不错的选择,这个库就可以用于同步 NTP 时间并且获取当前时间,使用也比较简单。

arduinoWebSockets

项目地址:https://github.com/Links2004/arduinoWebSockets

需要连接 WebSocket 服务端时,可以使用这个库,对比了其他几个库,这个算比较好用的。

ArduinoHttpClient

项目地址:https://github.com/arduino-libraries/ArduinoHttpClient

相对内置的 HTTPClient,这个库可以支持更多方法去发送 HTTP 请求,封装也比较好,并且支持设置 Header、支持 Basic Auth 等。

EspSoftwareSerial

项目地址:https://github.com/plerup/espsoftwareserial

ESP32 只有 2 个 UART 可用,如果想要连接更多 UART 外设,这个时候可以使用软件模拟的 UART,这个库算是比较常用的了。

OTA

esp32-http-update

项目地址:https://github.com/suculent/esp32-http-update

ESP32 Arduino 内置了 OTA 支持,但是只能使用 HTTPS 地址,不支持 HTTP URL,如果要使用 HTTPS 地址,对于 ESP32 来说,需要配置一堆证书以及网站签名等信息,使用起来比较麻烦,这个库支持直接通过 HTTP URL 更新固件,固件的完整性可以通过其他 HTTPS API 来传递 MD5 等签名来验证。

图形图象

GxEPD2

项目地址:https://github.com/ZinggJM/GxEPD2

SPI 接口电子墨水屏驱动库,支持很多尺寸的 SPI 接口电子墨水屏,使用比较简单。

ArduinoMenu

项目地址:https://github.com/neu-rah/ArduinoMenu

通过配置的方式来生成多级菜单,支持菜单包含设置项,以及支持通过编码器来完成设置,并且可以配置多个输出,在调试的时候也比较方便,比如同时在 0.96 OLED 和 Serial 中输出菜单。

TFT_eSPI

项目地址:https://github.com/Bodmer/TFT_eSPI

TFT LCD 驱动库,支持常见 ST7789V、GC9A01 等主控。

lvgl

项目地址:https://github.com/lvgl/lvgl

跨平台 GUI 框架,内置了相当多的控件,例如 Tab、输入框、下拉框等,以及包含了软键盘等,并且可以集成多种输入设备,例如鼠标、键盘、编码器等,可以用来实现一个完整的嵌入式设备界面程序。

总结

Arduino 还是一个比较方便的开发框架,配置 ESP32 强大的性能和自带联网的特性,开发一些联网设备应用还是很方便的,希望这些开源项目对大家进入电子 DIY 有所帮助。

发表评论?

0 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>