极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19943|回复: 8

按键控制LED开关,有定时功能

[复制链接]
发表于 2017-12-16 17:20:52 | 显示全部楼层 |阅读模式
                                                         按键控制LED开关,有定时功能


                 有个程序不知道怎么编写,请大侠指教;  我用按键控制LED开和关,但当LED亮时同时有一个定时控制,不按关机,自动停机。谢谢了!
回复

使用道具 举报

 楼主| 发表于 2017-12-21 18:08:15 | 显示全部楼层
const int buttonPin = 12;       //button pin number
const int ledPin =  13;         //LED pin number
int buttonState = 2;            //button state  1,2,3
unsigned long currentMillis;    //record the current time for blinking
long previousMillis = 0;        //store the last time LED was updated
long interval = 1000;           //interval at which to blink (milliseconds)
/////////////////////////////////////////////////////////////////////////////////////////
void setup()
{
  pinMode(ledPin, OUTPUT);      
  pinMode(buttonPin, INPUT);   
  digitalWrite(buttonPin, HIGH); //use internal pull up resistor
}////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
void loop()
{
if (digitalRead(buttonPin) == LOW)   //Not pressed - HIGH; Pressed - LOW
   {  
    buttonState++;
    if (buttonState > 2) buttonState = 1;  //button State from 1 to 3
    //  
    delay(450);             /////handle debouncing//////////////
   }// end if digitalRead(buttonPin)
///////////////////////////////////
switch (buttonState)
{
   当按键按下时有一个定时90秒,不按按键到时间停止,但按按键还可以关

case 1:
       想在这个位置加一个LED闪烁10秒钟后执行下面的功能循环,但是只循环下面的这个程序

  currentMillis = millis();                           //start the timer
         if (currentMillis - previousMillis > interval)      //timer moved forward by the preset interval
           {
            previousMillis = currentMillis;   
            digitalWrite( ledPin, digitalRead( ledPin ) ^ 1 );   //read the state of the Led, reverse it and turn it on or off accordingly
           }
         break;
  case 2:
         digitalWrite(ledPin, LOW);  
         break;
}//end switch        
}/////end loop
这个程序不知道怎么加请各位帮帮忙,谢谢!
回复 支持 1 反对 0

使用道具 举报

发表于 2017-12-16 23:34:46 | 显示全部楼层
//定義你要關機的定時時間,比方說 1 小時=1秒*60*60
#define AUTO_OFF 1000*60*60

//設定時間記錄變數
unsigned long START_TIME;

//當 LED 亮時(比方用 I/O 13)記錄下當時的系統時間
digitalWrite( 13 ,HIGH );
START_TIME=millis();

//在 loop() 中比對時間是否已達你要關掉的時間,達到的話就關掉 13 的輸出
if ( millis() - START_TIME > (unsigned long) AUTO_OFF )
  digitalWrite( 13 ,LOW );

大致上就是這樣子
回复 支持 反对

使用道具 举报

发表于 2017-12-18 17:33:16 | 显示全部楼层
shouzama 发表于 2017-12-16 23:34
//定義你要關機的定時時間,比方說 1 小時=1秒*60*60
#define AUTO_OFF 1000*60*60

#define AUTO_OFF 1000*60*60    这个1000指的是毫秒?
回复 支持 反对

使用道具 举报

发表于 2017-12-18 21:32:24 | 显示全部楼层
書雲 发表于 2017-12-18 17:33
#define AUTO_OFF 1000*60*60    这个1000指的是毫秒?

對,以 millis() 以 0.001 秒為基本單位, 1秒=1000ms
回复 支持 反对

使用道具 举报

发表于 2017-12-24 10:34:49 | 显示全部楼层
shouzama 发表于 2017-12-16 23:34
//定義你要關機的定時時間,比方說 1 小時=1秒*60*60
#define AUTO_OFF 1000*60*60

你好,能来个详细的历程吗?谢谢!!
回复 支持 反对

使用道具 举报

发表于 2018-6-13 16:55:45 | 显示全部楼层
shouzama 发表于 2017-12-16 23:34
//定義你要關機的定時時間,比方說 1 小時=1秒*60*60
#define AUTO_OFF 1000*60*60

请教!为何我的程序根据您的提示加入时间控制,LED灯无法自动熄灭,请指点谢谢
程序代码如下:
// 人体热释感应开关控制LED灯
#define AUTO_OFF 1000*60    //定義你要關機的定時時間,比方說 1 分钟=1秒*60*60
#define LED 7      //定义LED引脚为13
#define BUTTON 2   //定义按钮开关引脚
unsigned long START_TIME;    //設定時間記錄變數
int val=0;         //变量用来储存按钮状态      
int old_val=0;    //暂存val变量的上一个时间单位
int state=0;       //0表示LED关闭,1表示打开
void setup()
{
  pinMode(LED,OUTPUT);      //设定LED引脚为输出状态
  pinMode(BUTTON,INPUT);    //设定按钮引脚为输入状态
}
void loop()
{
  val=digitalRead(BUTTON);    //读取按钮状态并储存
  if((val==HIGH)&&(old_val==LOW))    //检查按钮的变化情况
  {
    state=1-state;
    delay(40);   //延时简单抗抖动
  }
  old_val=val;   //VAL下载已经是旧的,让我们暂存一下
  if(state==1)
  {    digitalWrite(LED,HIGH); //开启LED
      
     }
      
  else
  {
    digitalWrite(LED,LOW); //关闭LED
  }
    START_TIME=millis();
     if ( millis() - START_TIME > (unsigned long) AUTO_OFF )
     {
      digitalWrite(LED,LOW);
     }
}

回复 支持 反对

使用道具 举报

发表于 2018-6-14 16:08:42 | 显示全部楼层
qqboy1978 发表于 2018-6-13 16:55
请教!为何我的程序根据您的提示加入时间控制,LED灯无法自动熄灭,请指点谢谢
程序代码如下:
// 人 ...

根據我的提示...

我說:
//當 LED 亮時(比方用 I/O 13)記錄下當時的系統時間
digitalWrite( 13 ,HIGH );
START_TIME=millis();
二條程式碼是相鄰的喔,LED 作動後立即記錄作動的時間


而您卻在條件判斷式前記錄時間,條件判斷可能成立嗎?
START_TIME=millis();
     if ( millis() - START_TIME > (unsigned long) AUTO_OFF )
     {
      digitalWrite(LED,LOW);
     }

回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 04:45 , Processed in 0.045249 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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