516|6

1270

帖子

1

TA的资源

纯净的硅(高级)

【便携式环境状态检测器】GPIO口的使用 [复制链接]

面对新的开发板,GPIO口是最好的切入手点,对于ESP32-S2-Kaluga-1 套件自然也不例外。

在例程中所提供的一个基本示例是点亮WS2812,但它还不够直接,于是还是从点亮LED比较典型。

 

1)LED灯控制

在开发板上,引脚45是通过短接子来连接WS2812,在引脚自然较为紧张时,可直接将其断开来供其它测试用。这里是用一个LED模块来进行测试,见图1所示。

image-20221007175329-1.png  

图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所示。

image-20221007175329-2.png  

图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所示。

image-20221007175329-3.png  

图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所示。

image-20221007175329-4.png  

图4 显示效果

最新回复

那不是直接驱动的啊,还得来个器件控制它   详情 回复 发表于 2022-10-9 15:11

回复

4664

帖子

3

TA的资源

版主

老师的Led灯看起来就很舒服,帖子一直是让人学习到许多的东西。感谢分享!

点评

感谢支持!!!  详情 回复 发表于 2022-10-8 09:11

回复

1270

帖子

1

TA的资源

纯净的硅(高级)

lugl4313820 发表于 2022-10-8 08:55 老师的Led灯看起来就很舒服,帖子一直是让人学习到许多的东西。感谢分享!

感谢支持!!!


回复

3263

帖子

1

TA的资源

版主

Led环挺好看的,怎么通过3个引脚控制的,能同时点亮吗

点评

严格说是4个引脚,还有一个出引脚,可串行传递信号,以同时点亮。  详情 回复 发表于 2022-10-9 10:15

回复

1270

帖子

1

TA的资源

纯净的硅(高级)

秦天qintian0303 发表于 2022-10-8 20:51 Led环挺好看的,怎么通过3个引脚控制的,能同时点亮吗

严格说是4个引脚,还有一个出引脚,可串行传递信号,以同时点亮。

点评

那不是直接驱动的啊,还得来个器件控制它  详情 回复 发表于 2022-10-9 15:11

回复

3263

帖子

1

TA的资源

版主

jinglixixi 发表于 2022-10-9 10:15 严格说是4个引脚,还有一个出引脚,可串行传递信号,以同时点亮。

那不是直接驱动的啊,还得来个器件控制它

点评

不用,每个单元都有控制电路,使用时只需将前后的输出与输入连接起来即可。  详情 回复 发表于 2022-10-10 10:22

回复

1270

帖子

1

TA的资源

纯净的硅(高级)

秦天qintian0303 发表于 2022-10-9 15:11 那不是直接驱动的啊,还得来个器件控制它

不用,每个单元都有控制电路,使用时只需将前后的输出与输入连接起来即可。


回复
您需要登录后才可以回帖 登录 | 注册

相关帖子
猜你喜欢
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2023 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表