• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

想在按键控制LED的程序下实现按一下按键使灯亮10秒,怎么做

10a逝 2018-03-17 浏览量:4329

应该使用的是延时函数吗

int Button=3; //连接开关到D3。
int LED=13; //连接LED到13(实际上UNO等版本已经有了)。
boolean onoff=LOW; //设定一个变量用于记录开关状态。
void setup() {
  pinMode(Button,INPUT); //按钮端子作为输入
  pinMode(LED,OUTPUT); //LED端子作为输出

}

void loop() {
   if(digitalRead(Button)==LOW)  //由于本例检测上升沿触发,所以先检测输入是否低电平,
  {
    delay(10); //然后延时一段时间,
    if(digitalRead(Button)==HIGH) //然后检测是不是电平变为高了。是的话,就是刚好按钮按下了。
    {
      digitalWrite(LED,onoff);  //写入当前LED状态onoff,
      onoff=(!onoff); //然后LED状态反转,以便下一次使用。
      delay(10);  //延时一段时间,防止按钮突然断开再按下。
      while(digitalRead(Button)==HIGH) //判断按钮状态,如果仍然按下的话,等待松开。防止一直按住导致LED输出端连续反转
      {
        delay(1);
      }
    }
  }
}
​函数应该加在什么地方?

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 简单点,可以这样写,最好按键加下消抖。
    #define   LED   13
    #define   KEY   6
    #define   LED_ON_TIME 10000 //10s
    bool led_flag=0;
    unsigned int led_count_start=0;
    
    void setup() {
      // put your setup code here, to run once:
      pinMode(KEY, INPUT_PULLUP);
      pinMode(LED, OUTPUT);
      digitalWrite(LED, LOW);
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      if (digitalRead(KEY) == LOW)
      {
        led_flag = 1;
        digitalWrite(LED, HIGH);
        led_count_start = millis();
      }
      if(led_flag)
      {
        if( (millis()-led_count_start) >= LED_ON_TIME)
        {
          led_flag = 0;
          digitalWrite(LED, LOW);
        }
      }
    }
    • 发布于 2018-03-18
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了 :https://atta.szlcsc.com/upload/public/pdf/source/20160218/1457707761116.pdf 回复

其他答案 数量:13
  • 用延时函数的话,delay之后你的按键就无法响应了
    • 发布于2018-03-17
    • 举报
    • 评论 3
    • 0
    • 0
10a逝 回复了 skawu :我是否能实现这个功能,用其他方法 回复
skawu 回复了 skawu :可以,定时器中断或者自己做个计时 回复
电子老工程师 回复了  :这个型号查不到信息,这个厂牌只提供系列资料,没有提供具体的型号信息。需要跟供应商确认 回复

  • 在main的while中测按键,在中断中进行LED的控制,

    或是中断中进行按键检测,而main中进行LED控制,

    • 发布于2018-03-17
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :20 或 40 安培电源触点、5 安培信号。 单位:英寸/mm 回复

  • 你写的这个函数应该是按一下按键,LED灯状态翻转,看到你在按键识别函数中延时参数是10,假设这个10代表延时10ms,你希望做按一下按键,LED灯亮10s,可以这么做:

    先设一个亮灯计数器LED_Cnt,初始化时,LED_Cnt= 0;当识别到按键按下后,不是执行onoff=!onoff 翻转,而是将LED_Cnt=1;在loop函数中,加入一段判断LED_Cnt的函数,如果LED_Cnt>0,则LED亮,如果=0,则灭,现在已经可以控制LED灯亮了,如何让他灭呢:在loop中加入一个delay,如上所示是10ms,如果LED_Cnt不等于0,则LED_Cnt+1,这样如果LED亮起来了,则每10ms这个计数器就会加1,等增加到10s/10ms=1000时,这个计数器设为0,当这个计数器为0时,由于上面的判断LED灯就灭了。

    自己理一理逻辑,很简单的。

    • 发布于2018-03-17
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :安装方式不同 5559-02P 带面板安装。 5559-02P1不带 回复

  • 可以这样来,

    #define LED_LIGHT_TIME 10

    u8 button_set_fg=0;

    u32 led_light_cnt=0;


    while(1)

    {

        if(1==get_key())

        {

            button_set_fg=1;

            led_light_cnt=get_system_tick();

        }

        if(1==button_set_fg)

        {

            if(get_system_tick()<=led_light_cnt+LED_LIGHT_TIME*1000)

            {

                led_on();

            }

            else

            {

                led_off();

                button_set_fg=0;

            }

        }

    }

    • 发布于2018-03-17
    • 举报
    • 评论 6
    • 0
    • 0
10a逝 回复了 大写加粗的L :程序有错,while(1) 回复
10a逝 回复了 大写加粗的L :未通过编译 回复
10a逝 回复了 大写加粗的L :不好意思,忘了主函数 回复
大写加粗的L 回复了 大写加粗的L :那个get_key()之类的是伪代码,你要替换自己的函数的,这几个函数什么意思看函数名就好,不可能直接复制粘贴就能编译过的,关键要理解这段代码的功能,然后自己写 回复
电子老工程师 回复了  :ADSP-BF524BBCZ-3A, Analog Devices Inc.,供参考,不是完全替代 回复
电子老工程师 回复了  :没有替代型号 回复

  • 使用定时器来做,按一下按键就进入定时器中断,在中断里面将灯点亮,然后定时十秒,在将灯熄灭就行了
    • 发布于2018-03-18
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :E32/6/20/R-3F36这个型号是个磁芯,客户视频中测量的是板子的电感值,没办法直观判断该磁芯是否有问题 建议客户进一步说明测试方式和过程 回复

  • 就是你用延时器,你的参数也不对啊,10是10ms,要10000才是10秒
    • 发布于2018-03-18
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :封装不同,R是贴片,不带R是直插 回复

  • 直接用延时函数比较简单,如果想精确点,可以用电时器TIM达到精确定时,按键按下开启定时器,达到时置位并且关闭
    • 发布于2018-03-18
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :厂牌:Microchip Technology 制造商产品编号 ATSAM4N16CA-AUR 需要发客户确认一下 回复

  • 不需要延时,检测到按键之后,点亮led灯,然后定一个10s的定时器就行了,定时器中断中把灯关掉
    • 发布于2018-03-18
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :没有找到 回复

  • 还行,不过这里有个问题,就是如果是按下之后抬起,再按下,这个过程发生在10s内的话依然不会翻转,建议还是使用定时器计时翻转
    • 发布于2018-03-18
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :A和B 分别代表修订版本 回复

  • 按钮的延时一般不要用delay了,除非你是用来做实验玩一下,一般是定时检测按钮两次的时间差就认为是延时,跟你delay 再读延时一样
    • 发布于2018-03-19
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :原厂官网以下文件请参考。 回复

  • 按一下,点亮LED,打工定时器,设置定时时间10s,打开定时器中断,在中断中关 了LED。
    • 发布于2018-03-19
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :TBD62004AFNG 回复

  • 用按键扫描,当扫描得出是这个按键之后执行亮灯的代码,就是轮询+判断而已,非常简单。​

    • 发布于2018-03-31
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :https://files.seeedstudio.com/products/104020249/Grove-OLED-Yellow&Blue-Display-0.96-(SSD1315)_V1.0-SCH.pdf 回复

  • 这个loop函数里面一个判断,延时再判断就行了,判断案件按下就亮起来
    • 发布于2018-06-21
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

想在按键控制LED的程序下实现按一下按键使灯亮10秒,怎么做