继电器引脚与负载

时间:2016-11-04 01:39:53

标签: arduino

我有以下代码。

 void setup(){
    pinMode(14, OUTPUT);
    digitalWrite(14, HIGH); //Relay
 }
 void loop(){
    if (!digitalRead(14)){
       digitalWrite(10,HIGH); //LED
       digitalWrite(11,LOW);  //LED
    }else{
       digitalWrite(10, LOW);
       digitalWrite(11, HIGH);
    }
 }

在代码的另一部分中,继电器引脚改变状态,并且我在循环中监视digitalRead部分,希望根据状态改变哪个LED开启。

现在困难的部分。所有这些都有效,除非我将继电器连接到磁铁上。这一切都适用于带有磁铁的非常复杂的门控系统。由于某种原因,磁力锁连接到继电器,Arduino表现得非常不同。一旦继电器发生变化,它就会慢慢爬行。直到那时一切都很好,但是一旦继电器被激活,就会导致它慢下来。

我无法弄清楚为什么一切都很好并且没有副作用的继电器触发器,直到负载连接到它。

有什么想法吗?或者更好的监控中继状态的方法? (不将其伪值存储在变量中)

1 个答案:

答案 0 :(得分:1)

您将第14针设置为OUTPUT,但您尝试使用digitalRead进行阅读。

您想知道的是存储端口值的寄存器的值。

您可以轻松地使用辅助变量来存储引脚状态,如下所示:

bool state = true;
void setup(){
  pinMode(14, OUTPUT);
  digitalWrite(14, state); //Relay
}

void loop(){
  if (!state){
    digitalWrite(10,HIGH); //LED
    digitalWrite(11,LOW);  //LED
  }else{
    digitalWrite(10, LOW);
    digitalWrite(11, HIGH);
  }
}

并相应地编辑其余代码,以便相应地更改state

“最难理解”的解决方案是读取寄存器值。因为你正在使用引脚14(与引脚A0相同),你必须查看端口C根据端口操作的Arduino参考(我的答案末尾的链接)。 所以你可以这样做:

void setup(){
  pinMode(14, OUTPUT);
  digitalWrite(14, HIGH); //Relay
}

void loop(){
  if (!BitRead(PORTC,0)){  //Reads bit 0 of the register of PORTC (wich is the state of pin14)
    digitalWrite(10,HIGH); //LED
    digitalWrite(11,LOW);  //LED
  }else{
    digitalWrite(10, LOW);
    digitalWrite(11, HIGH);
  }
}

此解决方案更优雅,正是您所需要的。如果你以后不记得这个,你可能总是使用“状态”变量方法。

参考Bit Read OperationArduino Reference on port manipulation了解详情。