Arduino的开关打开中继计时器 [英] Arduino Switch to Turn a Relay timer

查看:355
本文介绍了Arduino的开关打开中继计时器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

简单地说:我想打开一个继电器30秒,之后我就拨动一个开关

我想在家里做一个百叶窗自动化。

我有一个简单的ON-OFF-ON开关,连接到一个Arduino连接到继电器。

我想,如果我从心拨动开关向下打开继电器#1为最多30秒。换句话说,继电器接通,当我打开,当计时器达到30秒继电器关闭。

同样我想,如果我从中心开关切换到打开继电器#2,精确至30秒。

当我切换回中心,我想计时器复位。

我无法弄清楚如何。谁能帮助?

我一直在尝试使用elapsedMillis库这一点,这是一个很好的图书馆,可以帮助我避免使用延迟:
http://playground.arduino.cc/$c$c/ElapsedMillis

不过,即使我可以工作继电器没有在30秒的限制,我无法弄清楚code结束继电器工作。这是我目前的code:

 的#include< elapsedMillis.h>
    #定义RELAY_ON 0
    #定义RELAY_OFF 1    #定义RELAY1_TURNS_ON_BLINDS 5
    #定义RELAY2_SHUTS_DOWN_BLINDS 6    #定义shutswitch A0
    OpenSwitch的的#define A1    布尔LocalCommandToOpen;
    布尔LocalCommandToShut;    无效设置()//////// SETUP ////////
    {
    digitalWrite(RELAY1_TURNS_ON_BLINDS,RELAY_OFF);
     digitalWrite(RELAY2_SHUTS_DOWN_BLINDS,RELAY_OFF);     pinMode(RELAY1_TURNS_ON_BLINDS,OUTPUT);
     pinMode(RELAY2_SHUTS_DOWN_BLINDS,OUTPUT);     pinMode(shutswitch,输入);
     pinMode(OpenSwitch的,输入);
        } ////建立  无效循环(){/////// LOOP
         如果(digitalRead(shutswitch)== 1)
     {
       LocalCommandToOpen = 1;
     }
     其他
     {
       LocalCommandToOpen = 0;
     }      如果(digitalRead(OpenSwitch的)== 1)
     {
       LocalCommandToShut = 1;
     }
     其他
     {
       LocalCommandToShut = 0;
     }    unsigned int类型CloseInterval = 14000;
     elapsedMillis timeElapsedSinceCloseButtonPush = 0;
     unsigned int类型OpenInterval = 14000;
     elapsedMillis timeElapsedSinceOpenButtonPush = 0;     //手动开关操作     如果(LocalCommandToShut == 1)
     {
       digitalWrite(RELAY1_TURNS_ON_BLINDS,RELAY_OFF);
       digitalWrite(RELAY2_SHUTS_DOWN_BLINDS,RELAY_ON);
     }
     其他
     {
       digitalWrite(RELAY2_SHUTS_DOWN_BLINDS,RELAY_OFF);
     }    // MANUEL DUGME ILE ACMA
     如果(LocalCommandToOpen == 1)
     {
       digitalWrite(RELAY2_SHUTS_DOWN_BLINDS,RELAY_OFF);
       digitalWrite(RELAY1_TURNS_ON_BLINDS,RELAY_ON);
     }
     其他
     {
       digitalWrite(RELAY1_TURNS_ON_BLINDS,RELAY_OFF);
     }     延迟(500);    } ///////////////// LOOP /////////////////////////////// /////


解决方案

您可以使用一个状态机;这使得事情变得更简单效仿。

类似于:

Arduino的开关打开中继计时器

状态机的一个很好的讨论是在这里:

<一个href=\"https://stackoverflow.com/questions/28356569/complicated-state-transitions-best-practices\">Complicated状态转换:最佳实践

Briefly: I would like to turn on a relay for 30 seconds, after I toggle a switch on.

I'm trying to do a blinds automation at home.

I have a simple ON-OFF-ON switch, attached to an Arduino connected to Relays.

I want to turn on Relay#1 for a maximum of 30 seconds if I toggle the switch down from center. In other words, relay turns on when I switch, and when timer reaches 30 seconds relay turns off.

similarly I want to turn on Relay#2 for exactly 30 seconds if I toggle the switch up from center

And when I switch back to center, I would like the timer to reset.

I could not figure out how. Could anyone help?

I have been trying to use elapsedMillis library for this, which is a nice library that helps me avoid using Delays: http://playground.arduino.cc/Code/ElapsedMillis

However even though I could work the relays without the 30 second limitation, I couldn't figure out the code to end working of the relays. Here is my current code:

      #include <elapsedMillis.h>
    #define RELAY_ON 0
    #define RELAY_OFF 1

    #define RELAY1_TURNS_ON_BLINDS  5
    #define RELAY2_SHUTS_DOWN_BLINDS 6

    #define shutswitch A0
    #define openswitch A1

    bool LocalCommandToOpen;
    bool LocalCommandToShut;

    void setup() ////////SETUP////////
    {
    digitalWrite(RELAY1_TURNS_ON_BLINDS, RELAY_OFF);
     digitalWrite(RELAY2_SHUTS_DOWN_BLINDS, RELAY_OFF);

     pinMode(RELAY1_TURNS_ON_BLINDS, OUTPUT);
     pinMode(RELAY2_SHUTS_DOWN_BLINDS, OUTPUT);

     pinMode(shutswitch, INPUT);
     pinMode(openswitch, INPUT);
        } ////SETUP

  void loop() { ///////LOOP
         if (digitalRead(shutswitch) == 1)
     {
       LocalCommandToOpen = 1;
     }
     else
     {
       LocalCommandToOpen = 0;
     }

      if ( digitalRead(openswitch) == 1)
     {
       LocalCommandToShut = 1;
     }
     else
     {
       LocalCommandToShut = 0;
     }

    unsigned int CloseInterval = 14000;
     elapsedMillis timeElapsedSinceCloseButtonPush = 0;
     unsigned int OpenInterval = 14000;
     elapsedMillis timeElapsedSinceOpenButtonPush = 0;



     //MANUAL SWITCH OPERATION

     if ( LocalCommandToShut == 1 )
     {
       digitalWrite(RELAY1_TURNS_ON_BLINDS, RELAY_OFF);
       digitalWrite(RELAY2_SHUTS_DOWN_BLINDS, RELAY_ON);
     }
     else
     {
       digitalWrite(RELAY2_SHUTS_DOWN_BLINDS, RELAY_OFF);
     }

    //MANUEL DUGME ILE ACMA
     if ( LocalCommandToOpen == 1)
     {
       digitalWrite(RELAY2_SHUTS_DOWN_BLINDS, RELAY_OFF);
       digitalWrite(RELAY1_TURNS_ON_BLINDS, RELAY_ON);
     }
     else
     {
       digitalWrite(RELAY1_TURNS_ON_BLINDS, RELAY_OFF);
     }

     delay(500);

    } /////////////////LOOP////////////////////////////////////

解决方案

You might use a state machine; this makes things a bit easier to follow.

Similar to:

Arduino Switch to Turn a Relay timer

A nice discussion of state machines is here:

Complicated state transitions: best practices

这篇关于Arduino的开关打开中继计时器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆