Arduino的开关打开中继计时器 [英] Arduino Switch to Turn a Relay timer
问题描述
简单地说:我想打开一个继电器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 /////////////////////////////// /////
您可以使用一个状态机;这使得事情变得更简单效仿。
类似于:
状态机的一个很好的讨论是在这里:
<一个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屋!