实现效果:
启动单片机,默认灯熄灭。
按一下按键开始点亮,
单击,以三种亮度循环(低亮,中亮,高亮)。
双击,闪烁模式。(高亮和熄灭间切换)。
长按,熄灭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() {
// 空函数,不需要在循环中执行任何操作
}