//长按选择具体灯,松手上升沿触发中断更换频率
// 定义 LED 引脚
const int ledPin1 = 5;//红灯
const int ledPin2 = 18;//蓝灯
const int ledPin3 = 11;//黄灯
const int keyPin1 = 42; //按键
int deng=0;
// 定义亮度调节相关变量
int brightness = 0; // 当前亮度值 (0-255)
int fadeAmount = 0; // 每次调节的亮度增量
int ledbule = 0;
int ledbule1 = 0;
int ledyellow = 0;
int ledyellow1 = 0;
unsigned long lastInterruptTime = 0; // 上次中断的时间
const unsigned long debounceDelay = 100; // 防抖延迟(毫秒)
void setup() {
Serial.begin(115200); // 初始化串口,波特率设置为115200
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(keyPin1, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(keyPin1), key1,RISING); //松手切换频率
}
void loop() {
// 设置 LED 的亮度
analogWrite(ledPin1, brightness);
brightness += fadeAmount;
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount; // 反转增量方向
}
analogWrite(ledPin2, ledbule);
ledbule += ledbule1;
if (ledbule <= 0 || ledbule >= 255) {
ledbule1 = -ledbule1; // 反转增量方向
}
analogWrite(ledPin3, ledyellow);
ledyellow += ledyellow1;
if (ledyellow <= 0 || ledyellow >= 255) {
ledyellow1 = -ledyellow1; // 反转增量方向
}
delay(20);
if(digitalRead(keyPin1)==0)
{
delay(20);
if(digitalRead(keyPin1)==0)
{
if(deng<3)
{
deng++;
Serial.print(deng);
Serial.println("灯"); // 打印换行符
}else
{
deng=1;
Serial.print(deng);
Serial.println("灯"); // 打印换行符
}
}
delay(2000);//长按选择具体的灯
}
}
void key1()
{
unsigned long interruptTime = millis(); // 当前时间
// 检查与上次中断时间的间隔是否大于防抖延迟
if (interruptTime - lastInterruptTime > debounceDelay)
{
// 禁用中断
detachInterrupt(digitalPinToInterrupt(keyPin1));
Serial.println("更改频率成功"); // 输出信息
if(deng==1)
{
if(fadeAmount<15)
{
fadeAmount+=5;
}else
{
fadeAmount=0;
}
}
if(deng==2)
{
if(ledbule1<15)
{
ledbule1+=5;
}else
{
ledbule1=0;
}
}
if(deng==3)
{
if(ledyellow1<15)
{
ledyellow1+=5;
}else
{
ledyellow1=0;
}
}
attachInterrupt(digitalPinToInterrupt(keyPin1), key1, RISING);
}
lastInterruptTime = interruptTime; // 更新上次中断时间
}