运行环境vscode+platformio+arduino框架+esp32s3
#include <Arduino.h>
#include <Ticker.h> //滴答时钟,这个是esp32自有库
Ticker key_tick;
// put function declarations here:
#define KEY_8 18 //按键引脚
#define LED 9 //led引脚
#define BUTTON_8 digitalRead(KEY_8) //读取按键状态
#define NO_KEY_PRES 0 //没有按下状态
#define delay_time 300 //延时300ms
#define short_press_time 10 //短按时间
#define long_press_time 1000 //长按时间
#define KEY8_KEY_PRES 8
#define KEY8_LONG_PRES 80
bool KEY8_UP = 0;
uint8_t KEY8_KEY_READ = 0;
uint16_t KEY8_PRESS_COUNT = 0;
void LED_ON(){
digitalWrite(LED, LOW);
}
void LED_OFF(){
digitalWrite(LED, HIGH);
}
void detection(){
if (BUTTON_8 == 0) {//按键是按下时引脚下拉为0
KEY8_PRESS_COUNT++;//每ms加1
KEY8_UP = 1;
if (KEY8_PRESS_COUNT <= short_press_time)//按下小于10ms,就相当于没按
KEY8_KEY_READ = NO_KEY_PRES;
if (KEY8_PRESS_COUNT >= short_press_time && KEY8_PRESS_COUNT <= long_press_time)//按下在10ms到1000ms之间认为短按
KEY8_KEY_READ = KEY8_KEY_PRES;
if (KEY8_PRESS_COUNT >= long_press_time)//按下超过1000ms认为长按
KEY8_KEY_READ = KEY8_LONG_PRES;
}
if (BUTTON_8) {
KEY8_PRESS_COUNT = 0;
KEY8_UP = 0;//按键状态,0为弹起,1为按下
}
if (KEY8_KEY_READ == KEY8_KEY_PRES && KEY8_UP == 0) { //当短按并且按键回弹时,灯打开
LED_ON();
KEY8_KEY_READ = NO_KEY_PRES;
}//短按
if (KEY8_KEY_READ == KEY8_LONG_PRES && KEY8_UP == 0) { //当长按并且按键回弹时,灯关闭
LED_OFF();
KEY8_KEY_READ = NO_KEY_PRES;
}//长按
}
void setup() {
Serial0.begin(115200);
pinMode(LED, OUTPUT);
key_tick.attach_ms(1, detection);//初始化时钟后会每隔1ms运行一次detection()
}
void loop() {
}
用简单的代码即可实现长按关灯,短按开灯