Skip to content

实现 LED 灯点亮

使用 wokwi 之前,最好是注册一个账号,否则无法保存项目。

在使用之前,还需要选择开发板。wokwi 提供了很多类型的板子,这里我使用 ESP32-S3,因为我还购买了开发板,方便后面直接调试。

并且在尝试之前,最好是线阅读一下关于开发板的技术文档,后面使用起来更加顺畅。

ESP32-S3-DevKitC-1 官方快速入门教程

新建项目

首先打开 Wokwi 的网站 https://wokwi.com/

需要注册并且登录账户,如果不注册的话,无法选择更多型号的板子。

我们需要选择 Micropython ESP32-S3 进行开发。

进入个人项目中心,新建项目,选择 ESP32-S3 的板子

然后选择开发语言

然后就可以进到如下开发界面

在右侧可以看到 main.py 文件是用来编辑代码的。

旁边的 diagram.json 文件是用来显示和编辑硬件开发板和元器件的。

保存编辑的代码可以使用 Ctrl+s 或者也可以点击左上方的保存按钮。也可以分享你的项目给别人,通过 SHARE 按钮。

再看右边,绿色的按钮是运行,加号按钮可以添加元器件到开发板中,三个点按钮是其他的一些方便使用的功能。

点灯实验

首先通过 + 加号按钮添加一个 LED 灯和一个电阻。通过 diagram.json 可以改变电阻的阻值。找到后我们把阻值改为 470 ,默认是1000 欧姆。

js
{
  "version": 1,
  "author": "zhengxinonly",  // 作者
  "editor": "wokwi",
  "parts": [  // 存放的元器件
    {
      "type": "board-esp32-s3-devkitc-1",
      "id": "esp",
      "top": 0,
      "left": 0,
      "attrs": { "env": "micropython-20231227-v1.22.0", "flashSize": "8" }
    },
    { "type": "wokwi-led", "id": "led1", "top": 16, "left": -160, "attrs": { "color": "red" } },
    {
      "type": "wokwi-resistor",
      "id": "r1",
      "top": 51.95,
      "left": -76.8,
      "attrs": { "value": "1000" } 
    }
  ],
  "connections": [],
  "dependencies": {}
}

这里我们在LED灯正极(弯脚的那个脚是正极)接一个 470 欧姆的电阻,然后电阻的另一端连叫道 GPIO4 口上(D4脚),然后 LED 的负极接到开发板的 GND 上。

然后编写代码:

python
from machine import Pin  # 导入 Pin (开发板中 Pin 代表 GPIO)
from time import sleep_ms  # 导入时间

led = Pin(4, Pin.OUT)  # 定义一个 LED 灯,D4 脚,输出
while 1:
    led.on()  # 灯亮
    sleep_ms(500)  # 等待500毫秒
    led.off()  # 灯灭
    sleep_ms(500)

参考项目: https://wokwi.com/projects/406339430591504385

LED 连接方法说明

我们在连接是LED的正极并不一定连接在GPIO上,负极连接在GND上。只不过这是一种习惯性的连接方法。我们可以通过该表连接方法实现不一样的效果。

例如:正极通过电阻接到5V上,负极接在D4上。代码不变同样可实现LED闪烁。

然后修改一下灯灭时间,再次看一下效果

python
from machine import Pin
from time import sleep_ms

led = Pin(4, Pin.OUT)
while 1:
    led.on()  # 灯亮
    sleep_ms(500)  # 等待500毫秒
    led.off()  # 灯灭
    sleep_ms(1500)

仔细观察会发现,效果反过来了,我们把等待的时间调整一下,效果更明显:我们代码期望是亮灯500毫秒,结果实际上是灭灯500毫秒。

当我们把正极接到D4上时,输出高电平亮灯,输出低电平灭灯。当把LED接到5V上时,这种揭发逻辑刚好反过来,当GPIO输出低电平的时候亮灯。

可以使用LED.value来设置和开始一样的效果。设置LED.value(0),即亮灯的时候输出0。

python
from machine import Pin
from time import sleep_ms

LED = Pin(4, Pin.OUT)
while 1:
    LED.value(0)  # led.on()  # 灯亮
    sleep_ms(500)  # 等待 500 毫秒
    LED.value(1)  # led.off()  # 灯灭
    sleep_ms(1500)

这样就可以看到,输出结果和代码是对应的。

参考项目:https://wokwi.com/projects/406341381775665153

案例:莫尔斯码-SOS

这里实现外部LED模拟发送摩尔斯码的SOS信号(3个点,3个杠,3个点)。一个点表示LED灯亮0.25秒(点的时间),一个杠表示LED灯亮1秒(杠的时间),点与点和杠与杠之间的延迟是0.2秒(间隔时间);字母之间的延迟是0.5秒,这个语句有2秒的延迟然后重复。

python
from machine import Pin
import time

dot = 0.25  # 点的时间
dash = 1.0  # 杠的时间
gap = 0.2  # 点与点和杠与杠之间的延迟
letterDelay = 0.5  # 每个字母之间的间隔时间
ON = 1  # 亮灯
OFF = 0  # 熄灯

LED = Pin(4, Pin.OUT)  # 端口4
while True:
    for i in range(0, 3):
        LED.value(ON)
        time.sleep(dot)
        LED.value(OFF)
        time.sleep(gap)

    time.sleep(letterDelay)

    for i in range(0, 3):
        LED.value(ON)
        time.sleep(dash)
        LED.value(OFF)
        time.sleep(gap)

    time.sleep(letterDelay)

    for i in range(0, 3):
        LED.value(ON)
        time.sleep(dot)
        LED.value(OFF)
        time.sleep(gap)

    time.sleep(letterDelay)

附件

https://blog.csdn.net/zhusongziye/article/details/126669348