Arduino 不同按键控制LED灯多种闪烁频率(非阻塞写法)

设计一个程序,实现按不同的按钮,控制LED以不同频率闪烁的功能。

#define LED1 13

#define s1 0

#define s2 35

#define s3 34

int led_time=0;//led灯时间变量

unsigned char led_keynum=0;//led灯按键值

bool led_state=0;//led灯状态变量

void setup() {

  // initialize digital pin LED_BUILTIN as an output.

  pinMode(LED1, OUTPUT);//设置LED管脚的模式 为输出

  digitalWrite(LED1, HIGH);//设置LED1灯最开始的状态熄灭



  pinMode(s1, INPUT);//设置按键管脚的模式 为输入

  pinMode(s2, INPUT);

  pinMode(s3, INPUT);



}

// the loop function runs over and over again forever

void loop() {

  if(digitalRead(s1)==0 ||digitalRead(s2)==0 ||digitalRead(s3)==0)//判断是否有按键按下

  {

    //空运算

  }

  delay(9);//延迟9ms

  if(digitalRead(s1)==0 ||digitalRead(s2)==0 ||digitalRead(s3)==0)//再次判断是否有按键按下

  {

    if(digitalRead(s1)==0)//s1按下

    {

      led_keynum=1;//赋予键值

      led_time=100;//闪烁的时间

    }

    if(digitalRead(s2)==0)//s2按下

    {

      led_time=50;//闪烁的时间

      led_keynum=2;//赋予键值

    }

    if(digitalRead(s3)==0)//s2按下

    {

      led_time=25;//闪烁的时间

      led_keynum=4;//赋予键值

    }

  }

  if(led_time>0)//判断是否有赋予了闪烁的时间

  {

    led_time--;//每9ms减一下,因为程序执行也需要时间,留1ms当作给程序执行的时间

    if(led_time==0)//走到0

    {

      led_state=!led_state;//状态反转

      led_time=100/led_keynum;//按键1是1s闪烁 按键2是0.5s 按键3是0.25s

      digitalWrite(LED1, led_state?HIGH:LOW);//设置LED1灯点亮或熄灭

    }

  }

}

这个程序和以往的程序不同,以往我们要让LED灯闪烁1s,我们需要先将LED管脚电压改变,然后再进行delay(1000)【延迟一秒】,然后该将LED管脚电压改变,再延迟一秒,然后放在loop函数里面,但是这个程序我们需要很快的判断到按键按下这个时刻,而我们的delay函数是一个阻塞的函数,在没有用到中断时,我们按下按键在很长的阻塞延迟下,是很难被判断到的,所以我们需要做一个非阻塞延迟的程序,或者说尽可能避免长时间的delay,所以可以用按键消抖的delay作为一个闪烁时间的一个单位时间,然后在这个基础上进行程序的循环,这样子在loop函数中,每次执行一个,因为我们的代码执行需要时间,所以这里我给了1ms执行时间,把delay改成9ms,近似可以看成10ms总的时长。

Arduino ESP32平台中,你可以使用GPIO(General Purpose Input Output,通用输入输出)模块配合按键和LED来实现LED闪烁频率的控制。这里是一个基本步骤的概述: 1. **硬件连接**: - 将LED连接到ESP32的数字IO引脚,通常是GPIO针脚。 - 连接一个按键到另一组IO引脚,作为输入信号。 2. **软件配置**: - 使用`#include <SoftwareSerial.h>`包含必要的库,如果你的ESP32没有直接连接到电脑,可能需要通过串口通信。 - 初始化按钮检测函数和定时器,例如使用`TimerOne`库或者Arduino的`millis()`函数来计时。 ```cpp #include <SoftwareSerial.h> SoftwareSerial ss(2, 3); // 如果是通过串口通信,指定串口引脚 const int ledPin = D4; // LED的GPIO引脚 bool buttonState = false; unsigned long previousMillis = 0; void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); // 开始串口通信 ss.begin(9600); // 开始软件串口通信 } ``` 3. **按键监听和LED闪烁**: - 在主循环中,读取按键状态并检查是否按下。如果按下,更新时间戳并开始计时。 - 当一定时间间隔过去后,改变LED的亮度(如50毫秒亮,50毫秒灭),实现闪烁效果。可以使用 `digitalWrite` 函数控制LED的开闭。 ```cpp void loop() { if (ss.available()) { // 检查串口是否有新数据 buttonState = !buttonState; // 按键状态相反 } unsigned long currentMillis = millis(); if (currentMillis - previousMillis > 50) { // 50毫秒周期 previousMillis = currentMillis; digitalWrite(ledPin, buttonState); // 切换LED状态 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值