极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13340|回复: 8

长按开关控制LED

[复制链接]
发表于 2013-4-7 14:18:33 | 显示全部楼层 |阅读模式
本人新人从来没接触过代码 跟着入门教程做了几个实验,照葫芦画瓢还能做成,自己写就挂了
想做一个LED的自行车尾灯 带转向和刹车灯 长按任意转向按键 进入夜间状态 再长按关闭,这个基础的实验我都完成不了 真是太废了 看人家长长代码都不知道怎么码出来的,自叹智商真心不够用呵呵。以下为自己改的代码 请各位前辈帮忙看看


  1. int Button=4;
  2. int LED=6;
  3. boolean onoff= LOW;
  4. long buttonHoldTime = 0;
  5. int buttonState = 0;
  6. void setup()
  7. {
  8.   pinMode(Button,INPUT);
  9.   pinMode(LED,OUTPUT);

  10. }
  11. void loop(){

  12.   buttonState = digitalRead(Button);
  13.   delay(20);
  14.   if(buttonState==HIGH)        
  15.   {
  16.     buttonHoldTime = millis();     
  17.   }
  18.   if (buttonState ==HIGH && (millis()-buttonHoldTime)>1000)
  19.   {
  20.     digitalWrite(LED,onoff);
  21.     onoff=(!onoff);
  22.     delay(10);
  23.     while(buttonState==HIGH)
  24.     {
  25.       delay(1);
  26.     }
  27.   }
  28. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2013-4-7 14:19:13 | 显示全部楼层
顺便请问以下 代码怎么能复制那种比较清晰的带行数和颜色的格式?
回复 支持 反对

使用道具 举报

发表于 2013-4-7 15:09:37 | 显示全部楼层
Athlon 发表于 2013-4-7 14:19
顺便请问以下 代码怎么能复制那种比较清晰的带行数和颜色的格式?

编辑栏高级模式下,有一个“<>”样子的功能图标。。就是代码高亮了
回复 支持 反对

使用道具 举报

发表于 2013-4-7 16:53:23 | 显示全部楼层
第二个if进不去
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-7 19:03:37 | 显示全部楼层
还是不懂怎么修改
回复 支持 反对

使用道具 举报

发表于 2013-4-7 19:53:48 | 显示全部楼层
Athlon 发表于 2013-4-7 19:03
还是不懂怎么修改

(millis()-buttonHoldTime)
这个不是会等于0吗?
用pulseIn函数应该会更简单的。
回复 支持 反对

使用道具 举报

发表于 2013-4-7 22:45:14 | 显示全部楼层
(millis()-buttonHoldTime)>1000  这儿有问题
还有boolean onoff= LOW; 初始值应该设成HIGH
我也是初学,不晓得对不
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-7 22:50:03 | 显示全部楼层
本帖最后由 Athlon 于 2013-4-7 22:51 编辑

稀里糊涂看了几个例程竟然解决了,现在可以按住1秒后点亮再按住一秒熄灭而且非常准确没有抖动的现象。但是不知道是不是最佳方案还有没有优化的空间?还有 那个  buttonStateOld =buttonState;  怎么理解,程序总体逻辑还不是太清楚 有大神给解释一下吗?一知半解以后遇到相同问题还是不能解决 多谢各位了

  1. int Button=4;
  2. int LED= 6;
  3. unsigned long buttonHoldTime;
  4. int buttonStateOld;
  5. boolean onoff=   LOW;


  6. void setup()
  7. {
  8.   //Serial.begin(9600);
  9.   pinMode(Button,INPUT);
  10.   pinMode(LED,OUTPUT);


  11. }
  12. void loop(){

  13.   int buttonState = digitalRead(Button);

  14.   if(buttonState==HIGH && buttonStateOld==LOW){
  15.     buttonHoldTime = millis();  
  16.   }
  17.   else if(buttonState==HIGH && buttonStateOld==HIGH){


  18.     if ( millis() - buttonHoldTime>1000){
  19.       digitalWrite(LED,onoff);
  20.       onoff=(!onoff);
  21.       delay(10);
  22.       while(digitalRead(Button)==HIGH)
  23.       {
  24.         delay(1);
  25.       }
  26.     }
  27.   }
  28.   buttonStateOld =buttonState;

  29. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-7 22:52:20 | 显示全部楼层
没想到一个点灯程序这么复杂 跟我想象完全不一样
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-5 10:06 , Processed in 0.037827 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表