esp32 freertos onebutton 按键控制LED灯效果

实现效果:

启动单片机,默认灯熄灭。
按一下按键开始点亮,
单击,以三种亮度循环(低亮,中亮,高亮)。
双击,闪烁模式。(高亮和熄灭间切换)。
长按,熄灭LED。(0亮度)
在这里插入图片描述

#include <Arduino.h>
#include <OneButton.h>
#include <FreeRTOS.h>
#include <task.h>

#define BUTTON_PIN 0  //0口接按键
#define LED_PIN 46   // 46口接LED
int buttonState = 0;

OneButton button(BUTTON_PIN, true); // true表示低电平触发

void led(void *pvParameters){   //点亮led任务函数

  while (1)
  {    
    if(buttonState ==0){   // 关灯
      analogWrite(LED_PIN, 0); // 0-255之间,对应数值越大,越亮。
    }
    else if (buttonState ==1){  // 第一种效果,低亮
        analogWrite(LED_PIN, 70);  // 0-255之间,对应数值越大,越亮。
        
    }
    
    else if (buttonState ==2){  // 第二种效果,中亮
        analogWrite(LED_PIN, 160);  // 0-255之间,对应数值越大,越亮。
        
      } 
  
    else if (buttonState ==3){   // 第三种效果,高亮
      analogWrite(LED_PIN, 255); // 0-255之间,对应数值越大,越亮。
        } 
      else if(buttonState==4){  // 第四种效果,循环闪烁
        
              analogWrite(LED_PIN, 255); // 0-255之间,对应数值越大,越亮。
              //digitalWrite(LED_PIN,HIGH);}
              vTaskDelay(pdMS_TO_TICKS(300));  //改变延迟时间,可以改变闪烁间隙
              analogWrite(LED_PIN, 0); // 0-255之间,对应数值越大,越亮。
              //digitalWrite(LED_PIN,LOW);}
              vTaskDelay(pdMS_TO_TICKS(300));  //改变延迟时间,可以改变闪烁间隙
      }
      vTaskDelay(pdMS_TO_TICKS(5));  //留时间给狗
      }
      
  }

void key_check_task(void *pvParameters)  // 按键检测任务函数
{

    while (1)
    {
    button.tick();
    vTaskDelay(pdMS_TO_TICKS(5));   //留时间给狗
    }
}

void click() //单击效果,有三种效果,循环
{

  if(buttonState==3 or buttonState==4){
    buttonState=1;
  }else{
    buttonState++;
  }
}

void doubleclick() //双击效果
{   
    buttonState=4;
}
void LongPressStart(){  //长按效果
  buttonState=0;
}

void setup() {
  
  
  button.reset();
  button.attachClick(click);
  button.attachDoubleClick(doubleclick);
  button.attachLongPressStart(LongPressStart);

  pinMode(BUTTON_PIN, INPUT_PULLUP);  //上拉
  pinMode(LED_PIN, OUTPUT);  //输出模式
 
  xTaskCreate(key_check_task, "KeyTask", 1024, NULL, 5, NULL);  //按键检测任务
  xTaskCreate(led, "LedTask", 1024, NULL, 5, NULL); //led点亮任务
}

void loop() {
  // 空函数,不需要在循环中执行任何操作
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeRTOS是一个流行的实时操作系统,用于嵌入式系统的开发。在FreeRTOS中实现按键控制LED可以通过以下步骤实现: 1. 配置按键和LED引脚的GPIO。 2. 创建一个任务,用于检测按键是否按下。 3. 当检测到按键按下时,通过消息队列或信号量向LED控制任务发送消息。 4. 创建另一个任务,用于控制LED的开关。 5. 当收到LED控制任务发送的消息时,控制LED的开关状态。 以下是一个简单的示例代码: ``` // 配置按键和LED引脚的GPIO #define KEY_GPIO GPIOA #define KEY_PIN GPIO_Pin_0 #define LED_GPIO GPIOB #define LED_PIN GPIO_Pin_5 // 创建一个任务,用于检测按键是否按下 void key_task(void* pvParameters) { while (1) { if (GPIO_ReadInputDataBit(KEY_GPIO, KEY_PIN) == Bit_RESET) { // 当检测到按键按下时,通过消息队列或信号量向LED控制任务发送消息 xQueueSend(xQueue, "LED_ON", portMAX_DELAY); } vTaskDelay(10 / portTICK_RATE_MS); } } // 创建另一个任务,用于控制LED的开关 void led_task(void* pvParameters) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = LED_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(LED_GPIO, &GPIO_InitStructure); char buf[10]; while (1) { // 等待接收LED控制任务发送的消息 if (xQueueReceive(xQueue, buf, portMAX_DELAY) == pdTRUE) { // 控制LED的开关状态 if (strcmp(buf, "LED_ON") == 0) { GPIO_SetBits(LED_GPIO, LED_PIN); } else if (strcmp(buf, "LED_OFF") == 0) { GPIO_ResetBits(LED_GPIO, LED_PIN); } } } } int main(void) { xQueue = xQueueCreate(10, sizeof(char[10])); xTaskCreate(key_task, "key_task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); xTaskCreate(led_task, "led_task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); vTaskStartScheduler(); while (1); } ``` 在这个示例中,通过xQueueCreate函数创建一个消息队列,用于存储LED控制任务发送的消息。在key_task任务中检测按键是否按下,当检测到按键按下时,通过xQueueSend函数向LED控制任务发送消息。在led_task任务中等待接收消息,当收到消息时,通过GPIO_SetBits和GPIO_ResetBits函数控制LED的开关状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值