引子
单纯觉得我的ESP32吃灰太浪费了。纯纯伪需求。
那么,问题就来到了我的树莓派,What can I do with it?
功能
本次的小项目实现了这么几个功能:
- 通过ESP32连接Wi-Fi。
- 通过爬虫,检测博客是否宕机。
- 通过计时功能,每隔一个小时检测。
- 能够计算每天的宕机次数,并显示在一个八段数码管上。
ESP32
首先我们来简单介绍一下ESP32究竟是什么,通俗来讲,ESP32就是一个「带有Wi-Fi、蓝牙功能的微型电脑」,可以通过「一些管脚控制其它的电子外设工作」。长这个样子:

如您所见,在电路板的两侧有两排引脚,可以输出数字信号,接收信号,并对信号进行处理。在下面,是一个Micro USB接口,可以连接电脑下载程序,也可以连接充电器作为供电接口。
MicroPython
嵌入式通常使用C语言进行开发,但是最近几年也出现了能够用Python语言进行开发的方法——MicroPython。MicroPython就是为嵌入式设备专门设计的一种Python语言,是常用Python语言的精简版,也增加了一些嵌入式设备独有的库。利用MicroPython开发,相比于C语言效率非常高,牺牲的是一部分性能和存储空间。
环境配置
安装Thonny,随后右下角-「配置解释器」,选择MicroPython(ESP32),选择好端口,然后点击「安装或更新MicroPython(esptool)」,然后根据自己板子的实际情况,填好相关内容,下载即可。
当写好Python文件时,只需要在Thonny中点击「视图-文件」,然后在写好的文件上右键,点选「上传到/」即可。在ESP32中,只有main.py才会在上电后直接运行。
接线
这边本来想用FritZing画一个面包板连线图的,但是没有找到板子的资料,姑且口述吧,这里也不是特别重要。
面包板上有这么几个东西:一个红色LED、一个绿色LED、一个八段数码管、三个适当阻值的电阻、一个按钮、一块ESP32和若干杜邦线。
- 连接LED:随便找两个引脚,分别引出两根线,分别接到红绿LED的正极引脚,两个LED的负极引脚分别接到电阻上,然后接地。
- 连接数码管:我所使用的是5011AS共阴八段数码管,通过查询引脚图,则将3号和8号引脚接地,其余引脚连接到适当引脚即可。在ESP32中,大于34的引脚为纯输入引脚,所以需要选择34以内的引脚连接。
- 连接按键:我所使用的是四脚按键,这种按键长边的两个引脚是默认导通的,短边的两个引脚是不导通的,所以,可以在一个引脚上接一个电阻,随后接到ESP32的引脚上,另一个短边引脚则接地。
LED是为了显示「网络连接错误」和「正在验证博客状态」的,数码管是为了显示一天之内的宕机次数,而按键则是为了开启数码管,只有按下才开启数码管显示。
代码逻辑
代码逻辑其实很简单,可以分为以下几个部分:
- 初始化引脚。
- 连接Wi-Fi网络。
- 第一次检测网站是否宕机。
- 主循环:
- 检测按钮是否被按下。
- 检测时间是否满足要求。
初始化引脚
这里的操作很简单:
1 | if __name__ == "__main__": |
连接Wi-Fi
1 | # Init Networks |
WIFI通常有AP和STA模式,AP相当于热点,STA相当于客户端。
检测网站是否宕机
这里就使用HTTP状态码进行检测,逻辑如下:
1 | def get_status_code(): |
在主函数中:
1 | fail_time = 0 |
检测按键是否被按下
我们的按键接地,所以在引脚内部要使用上拉输入,检测逻辑如下:
1 | while True: |
这里其实最好加一个防抖处理。我将dot位用作十位。
显示数字
显示数字没什么好说的,就是根据想要的数字,分别控制不同引脚的高电平,我们的是共阴数码管,所以给高电平是亮:
1 | def show_num_list(num: int): |
检测时间
我设定的是一个小时检测一次:
1 | curr_hour, curr_min, curr_sec = time.localtime()[3:6] |
完整代码
1 | import network |
