我有以下代码。
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表现得非常不同。一旦继电器发生变化,它就会慢慢爬行。直到那时一切都很好,但是一旦继电器被激活,就会导致它慢下来。
我无法弄清楚为什么一切都很好并且没有副作用的继电器触发器,直到负载连接到它。
有什么想法吗?或者更好的监控中继状态的方法? (不将其伪值存储在变量中)
答案 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 Operation和Arduino Reference on port manipulation了解详情。