ESP32 - Micropython ESP-IDF 双线教程GPIO(1)

ESP32 - Micropython ESP-IDF 双线教程(1)

1. micropython介绍

Micropython 是 Python 3 编程语言的一种精简高效的实现,专门设计用于在微控制器和资源受限的设备上运行。ESP32 是一款非常受欢迎的微控制器,具有 WiFi 和 BLE 支持,适用于各种物联网项目。

以下是 Micropython 在 ESP32 上的一些常见应用:

  1. 控制硬件:使用 Micropython 可以轻松地控制 ESP32 的 GPIO 引脚,实现对 LED 灯、电机、传感器等硬件的控制。
  2. 网络通信:ESP32 支持 WiFi 和 BLE,Micropython 可以用于实现网络通信功能,如连接到网络、发送和接收数据等。
  3. 数据采集:通过连接传感器,如温度传感器、湿度传感器、光照传感器等,使用 Micropython 可以采集环境数据,并进行处理和分析。
  4. 智能家居:可以使用 Micropython 和 ESP32 构建智能家居系统,实现对家电的远程控制、自动化控制等功能。
  5. 物联网项目:结合云服务和其他物联网技术,使用 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)

代码解释

  1. 首先,我们从machine模块中导入了Pin类。
  2. 我们使用Pin(13, Pin.OUT)创建了一个Pin对象,指定引脚13为输出模式,并将其赋值给变量led
  3. 定义了一个名为blink的函数,该函数接受一个Pin对象和闪烁次数作为参数。在函数内部,我们循环指定的次数,每次循环中,我们设置引脚为高电平(打开LED),等待0.5秒,然后设置引脚为低电平(关闭LED),再等待0.5秒。
  4. 最后,我们调用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);
}

代码解释

  1. 包含必要的头文件。
  2. 定义LED连接的GPIO引脚号(LED_GPIO_NUM)。
  3. 定义blink_task函数,该函数是一个FreeRTOS任务,用于执行LED的闪烁。首先,它设置GPIO13为输出模式,然后在一个循环中交替设置GPIO13的电平为高和低,每次改变后都使用vTaskDelay函数等待0.5秒。
  4. app_main函数是ESP-IDF应用程序的入口点。在这里,我们创建了一个名为blink_task的任务来执行LED的闪烁。任务的栈大小设置为2048字节,优先级设置为5(FreeRTOS的优先级数值越低,优先级越高)。
  • 22
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

San_jin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值