ESP32 - Micropython ESP-IDF 双线教程(1)
1. micropython介绍
Micropython 是 Python 3 编程语言的一种精简高效的实现,专门设计用于在微控制器和资源受限的设备上运行。ESP32 是一款非常受欢迎的微控制器,具有 WiFi 和 BLE 支持,适用于各种物联网项目。
以下是 Micropython 在 ESP32 上的一些常见应用:
- 控制硬件:使用 Micropython 可以轻松地控制 ESP32 的 GPIO 引脚,实现对 LED 灯、电机、传感器等硬件的控制。
- 网络通信:ESP32 支持 WiFi 和 BLE,Micropython 可以用于实现网络通信功能,如连接到网络、发送和接收数据等。
- 数据采集:通过连接传感器,如温度传感器、湿度传感器、光照传感器等,使用 Micropython 可以采集环境数据,并进行处理和分析。
- 智能家居:可以使用 Micropython 和 ESP32 构建智能家居系统,实现对家电的远程控制、自动化控制等功能。
- 物联网项目:结合云服务和其他物联网技术,使用 Micropython 和 ESP32 可以开发各种物联网项目,如远程监控、智能农业、工业自动化等。
2. GPIO介绍和使用 - Mrcropython
在ESP32的MicroPython环境中,GPIO(General-Purpose Input/Output)库是用于控制和操作GPIO引脚的库。它提供了简单且功能强大的接口,用于读取和写入数字信号,以及设置引脚模式和配置中断。
GPIO库概述
MicroPython的GPIO库允许您:
- 初始化引脚为输出或输入。
- 读取输入引脚的状态。
- 写入输出引脚的状态。
- 配置引脚的上拉/下拉电阻。
- 配置引脚的中断。
GPIO库常用函数
Pin(id, mode=Pin.OUT, pull=None)
: 创建一个Pin对象,id
是引脚编号,mode
是引脚模式(IN, OUT, OPEN_DRAIN, OUT_OD等),pull
是上拉/下拉电阻配置(Pin.PULL_UP, Pin.PULL_DOWN, None)。Pin.value([x])
: 如果传入x
,则设置引脚值为x
(高或低);如果没有传入,则返回引脚值。Pin.irq(handler=None, trigger=Pin.IRQ_FALLING)
: 设置引脚中断。handler
是中断处理函数,trigger
是中断触发条件(IRQ_RISING, IRQ_FALLING, IRQ_LOW_LEVEL, IRQ_HIGH_LEVEL)。
示例代码
以下是一个简单的示例,演示如何使用MicroPython和GPIO库来控制ESP32的一个GPIO引脚:
from machine import Pin
import time
# 初始化引脚13为输出模式
led = Pin(13, Pin.OUT)
# 创建一个简单的闪烁函数
def blink(pin, times):
for i in range(times):
pin.value(1) # 打开LED(高电平)
time.sleep(0.5) # 等待0.5秒
pin.value(0) # 关闭LED(低电平)
time.sleep(0.5) # 等待0.5秒
# 调用blink函数,使LED闪烁5次
blink(led, 5)
代码解释
- 首先,我们从
machine
模块中导入了Pin
类。 - 我们使用
Pin(13, Pin.OUT)
创建了一个Pin对象,指定引脚13为输出模式,并将其赋值给变量led
。 - 定义了一个名为
blink
的函数,该函数接受一个Pin对象和闪烁次数作为参数。在函数内部,我们循环指定的次数,每次循环中,我们设置引脚为高电平(打开LED),等待0.5秒,然后设置引脚为低电平(关闭LED),再等待0.5秒。 - 最后,我们调用
blink
函数,传入led
对象和5作为参数,使LED闪烁5次。
2. GPIO介绍和使用 - ESP-ISF
C/C++ ESP32 IO口驱动详解
在C/C++中,ESP32的IO口(GPIO)驱动主要通过ESP-IDF(Espressif IoT Development Framework)来实现。ESP-IDF是一个官方的、开源的、跨平台的开发框架,用于为Espressif Systems的ESP32、ESP32-S系列和ESP32-C系列芯片开发应用。
在ESP-IDF中,GPIO的操作主要涉及到driver/gpio.h
头文件中的函数和数据结构。以下是一些常用的GPIO操作函数:
gpio_pad_select_gpio(gpio_num_t gpio_num)
: 将指定的GPIO引脚从其他功能(如UART、SPI等)切换回GPIO模式。gpio_set_direction(gpio_num_t gpio_num, gpio_mode_t mode)
: 设置GPIO引脚的方向(输入或输出)。gpio_set_level(gpio_num_t gpio_num, uint8_t level)
: 设置GPIO引脚的电平(高或低)。gpio_get_level(gpio_num_t gpio_num)
: 读取GPIO引脚的电平。gpio_install_isr_service(int intr_alloc_flags)
: 安装GPIO中断服务。gpio_isr_handler_add(gpio_num_t gpio_num, gpio_isr_t isr_handler, void* args)
: 为指定的GPIO引脚添加中断处理函数。gpio_isr_handler_remove(gpio_num_t gpio_num)
: 移除指定GPIO引脚的中断处理函数。
将MicroPython代码该为C/C++代码
以下是上述MicroPython代码的C/C++等价实现,使用ESP-IDF的GPIO API:
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#define LED_GPIO_NUM GPIO_NUM_13
void blink_task(void *pvParameters)
{
// 设置GPIO13为输出模式
gpio_pad_select_gpio(LED_GPIO_NUM);
gpio_set_direction(LED_GPIO_NUM, GPIO_MODE_OUTPUT);
for (int i = 0; i < 5; i++) {
// 打开LED(设置高电平)
gpio_set_level(LED_GPIO_NUM, 1);
vTaskDelay(500 / portTICK_PERIOD_MS); // 等待0.5秒
// 关闭LED(设置低电平)
gpio_set_level(LED_GPIO_NUM, 0);
vTaskDelay(500 / portTICK_PERIOD_MS); // 等待0.5秒
}
// 任务完成,删除自身
vTaskDelete(NULL);
}
void app_main(void)
{
// 创建一个任务来执行LED闪烁
xTaskCreate(&blink_task, "blink_task", 2048, NULL, 5, NULL);
}
代码解释
- 包含必要的头文件。
- 定义LED连接的GPIO引脚号(
LED_GPIO_NUM
)。 - 定义
blink_task
函数,该函数是一个FreeRTOS任务,用于执行LED的闪烁。首先,它设置GPIO13为输出模式,然后在一个循环中交替设置GPIO13的电平为高和低,每次改变后都使用vTaskDelay
函数等待0.5秒。 app_main
函数是ESP-IDF应用程序的入口点。在这里,我们创建了一个名为blink_task
的任务来执行LED的闪烁。任务的栈大小设置为2048字节,优先级设置为5(FreeRTOS的优先级数值越低,优先级越高)。