面对新的开发板,GPIO口是最好的切入手点,对于ESP32-S2-Kaluga-1 套件自然也不例外。
在例程中所提供的一个基本示例是点亮WS2812,但它还不够直接,于是还是从点亮LED比较典型。
1)LED灯控制
在开发板上,引脚45是通过短接子来连接WS2812,在引脚自然较为紧张时,可直接将其断开来供其它测试用。这里是用一个LED模块来进行测试,见图1所示。
图1 测试电路
对LED所用引脚的配置函数为:
static void configure_led(void)
{
ESP_LOGI(TAG, "Example configured to blink GPIO LED!");
gpio_reset_pin(BLINK_GPIO);
gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
}
控制LED状态切换的函数为:
static void blink_led(void)
{
/* Set the GPIO level according to the state (LOW or HIGH)*/
gpio_set_level(BLINK_GPIO, s_led_state);
}
该函数之所以能切换LED的工作状态,是由于使用全局变量s_led_state,通过语句s_led_state= !s_led_state;
来实现状态的切换。
除前面介绍的2个函数外,其这个程序如下:
#include<stdio.h>
#include"freertos/FreeRTOS.h"
#include"freertos/task.h"
#include"driver/gpio.h"
#include"esp_log.h"
#include"led_strip.h"
#include"sdkconfig.h"
#define BLINK_GPIO 45
staticuint8_ts_led_state = 0;
void app_main(void)
{
/* Configure the peripheral according to the LED type */
configure_led();
while (1)
{
gpio_set_level(BLINK_GPIO, s_led_state);
ESP_LOGI(TAG, "Turning the LED %s!", s_led_state == true ? "ON" :"OFF");
s_led_state= !s_led_state;
vTaskDelay(50);
};
}
经程序的编译与下载,其运行效果如图2所示。
图2 点亮LED
2)按键控制LED灯
若使用引脚46来外接一个按键模块,则所用引脚的配置函数为:
static void configure_key(void)
{
gpio_reset_pin(KEY_GPIO);
gpio_set_direction(KEY_GPIO, GPIO_MODE_INPUT);
}
则实现键控LED的主程序为:
#define BLINK_GPIO 45
void app_main(void)
{
/* Configure the peripheral according to the LED type */
configure_led();
configure_key();
while (1)
{
if(gpio_get_level(BLINK_GPIO)==0)
{
gpio_set_level(BLINK_GPIO, 1);
}
else
{
gpio_set_level(BLINK_GPIO, 0);
}
}
}
至此,基本上就可以自由地使用GPIO口来进行功能设计了。
3)点亮WS2812灯环
其实例程中的BLINK例程是一个十分具有扩展性的示例,在它的基础上稍加修改就可产生丰富多彩的效果。
以一个有12个灯珠的WS2812灯环为例,其测试电路如图3所示。
图3 测试线路
为此,该彩色灯环的配置函数为:
static void configure_led(void)
{
ESP_LOGI(TAG, "Example configured to blink addressable LED!");
/* LED strip initialization with the GPIO and pixels number*/
pStrip_a = led_strip_init(CONFIG_BLINK_LED_RMT_CHANNEL, BLINK_GPIO, 12);
/* Set all LED off to clear all pixels */
pStrip_a->clear(pStrip_a, 50);
}
其实现彩灯闪烁效果的函数为:
static void blink_led(void)
{
/* If the addressable LED is enabled */
if (s_led_state) {
/* Set the LED pixel using RGB from 0 (0%) to 255 (100%) for each color */
pStrip_a->set_pixel(pStrip_a, 0, 16, 16, 16);
pStrip_a->set_pixel(pStrip_a, 1, 255, 16, 16);
pStrip_a->set_pixel(pStrip_a, 2, 16, 255, 16);
pStrip_a->set_pixel(pStrip_a, 3, 16, 16, 255);
pStrip_a->set_pixel(pStrip_a, 4, 255, 255, 16);
pStrip_a->set_pixel(pStrip_a, 5, 16, 255, 255);
pStrip_a->set_pixel(pStrip_a, 6, 255, 16, 255);
pStrip_a->set_pixel(pStrip_a, 7, 255, 16, 16);
pStrip_a->set_pixel(pStrip_a, 8, 16, 255, 16);
pStrip_a->set_pixel(pStrip_a, 9, 16, 16, 255);
pStrip_a->set_pixel(pStrip_a, 10, 255, 255, 16);
pStrip_a->set_pixel(pStrip_a, 11, 16, 255, 255);
/* Refresh the strip to send data */
pStrip_a->refresh(pStrip_a, 100);
} else {
/* Set all LED off to clear all pixels */
pStrip_a->clear(pStrip_a, 50);
}
}
除前面介绍的2个函数外,其这个程序如下:
#define BLINK_GPIO 45
voidapp_main(void)
{
/* Configure the peripheral according to the LED type */
configure_led();
while (1) {
ESP_LOGI(TAG, "Turning the LED %s!", s_led_state == true ? "ON" :"OFF");
blink_led();
/* Toggle the LED state */
s_led_state= !s_led_state;
vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);
}
}
经程序的编译与下载,其运行效果如图4所示。
图4 显示效果
|