LXYLWJ 发表于 2017-12-16 17:20:52

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

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


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

LXYLWJ 发表于 2017-12-21 18:08:15

const int buttonPin = 12;       //button pin number
const int ledPin =13;         //LED pin number
int buttonState = 2;            //button state1,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
这个程序不知道怎么加请各位帮帮忙,谢谢!

shouzama 发表于 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指的是毫秒?

shouzama 发表于 2017-12-18 21:32:24

書雲 发表于 2017-12-18 17:33
#define AUTO_OFF 1000*60*60    这个1000指的是毫秒?

對,以 millis() 以 0.001 秒為基本單位, 1秒=1000ms

504835618 发表于 2017-12-24 10:34:49

shouzama 发表于 2017-12-16 23:34
//定義你要關機的定時時間,比方說 1 小時=1秒*60*60
#define AUTO_OFF 1000*60*60



你好,能来个详细的历程吗?谢谢!!

qqboy1978 发表于 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);
   }
}

shouzama 发表于 2018-6-14 16:08:42

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

根據我的提示... :L

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


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

qqboy1978 发表于 2018-6-28 16:26:24

谢谢指点!!!
页: [1]
查看完整版本: 按键控制LED开关,有定时功能