为什么我的Arduino在使用中继板时会冻结?

为什么我的Arduino在使用中继板时会冻结?,arduino,Arduino,我正在做一个项目,我用midi音符用Arduino Uno切换8个旧灯。我已经为Arduino建造了一个带有8个墙壁插座的机箱,这些插座连接到一个继电器板上。我正在使用通过USB向Arduino发送midi音符 这一切工作,直到我把电源插座与我的Uno。大约5~10秒后,Arduino冻结。继电器屏蔽保持其当前状态,串行通信指示灯停止闪烁。当继电器没有220伏电压时,一切都很好 (我的示意图如下。)Arduino通过USB供电。我还尝试用额外的5伏和500毫安适配器为Arduino供电,但没有任

我正在做一个项目,我用midi音符用Arduino Uno切换8个旧灯。我已经为Arduino建造了一个带有8个墙壁插座的机箱,这些插座连接到一个继电器板上。我正在使用通过USB向Arduino发送midi音符

这一切工作,直到我把电源插座与我的Uno。大约5~10秒后,Arduino冻结。继电器屏蔽保持其当前状态,串行通信指示灯停止闪烁。当继电器没有220伏电压时,一切都很好

(我的示意图如下。)Arduino通过USB供电。我还尝试用额外的5伏和500毫安适配器为Arduino供电,但没有任何区别

代码:

#包括
字节incomingByte=0;
字节notebyte=0;
字节速度字节=0;
字节状态缓冲区=0;
字节注释_ON=144;
字节注释=128;
布尔arp_triggernext=false;
布尔第一字节;
void MIDI_Poll(){
如果(Serial.available()>0){
做{
//读取传入字节:
incomingByte=Serial.read();
如果(输入字节>247){
//这就是MIDI时钟工作的地方
开关(输入字节){
}
}
否则如果(输入字节>240){
statusbuffer=0;
//sysex在这里做的事
}
否则如果(输入字节>127){
statusbuffer=输入字节;
firstbyte=true;
notebyte=0;
速度字节=0;
}
否则如果(statusbuffer!=0){
if(firstbyte==true){
//必须是第一个字节
notebyte=incomingByte;
firstbyte=false;
}
否则{
//所以必须是第二个字节
速度字节=输入字节;
//在这里处理消息
if(statusbuffer==注释&&velocitybyte!=0){
开关(notebyte){
案例60:
digitalWriteFast2(2,高);
打破
案例61:
digitalWriteFast2(3,高);
打破
案例62:
digitalWriteFast2(4,高);
打破
案例63:
digitalWriteFast2(5,高);
打破
案例64:
digitalWriteFast2(6,高);
打破
案例65:
digitalWriteFast2(7,高);
打破
案例66:
digitalWriteFast2(8,高);
打破
案例67:
digitalWriteFast2(9,高);
打破
}
}
else if(statusbuffer==NOTE_OFF | | |(statusbuffer==NOTE_ON&&velocitybyte==0)){
开关(notebyte){
案例60:
digitalWriteFast2(2,低);
打破
案例61:
digitalWriteFast2(3,低);
打破
案例62:
digitalWriteFast2(4,低);
打破
案例63:
digitalWriteFast2(5,低);
打破
案例64:
digitalWriteFast2(6,低);
打破
案例65:
digitalWriteFast2(7,低);
打破
案例66:
digitalWriteFast2(8,低);
打破
案例67:
digitalWriteFast2(9,低);
打破
}
}
//现在清除它们以便下一个注释
notebyte=0;
速度字节=0;
firstbyte=true;
}
}
}while(Serial.available()>0);
}
}
无效设置(){
pinMode(2,输出);
pinMode(3,输出);
pinMode(4,输出);
pinMode(5,输出);
pinMode(6,输出);
pinMode(7,输出);
pinMode(8,输出);
pinMode(9,输出);
Serial.begin(9600);
}
void循环(){
MIDI_Poll();
}

它基于我找到的处理串行midi的代码

我真的不明白为什么会这样。我想知道为什么当有220伏电压通过继电器时,我的Arduino和继电器板会冻结

材料:
  • Arduino Uno第3版
  • 继电器板,带有8个继电器,开关电压为5伏。能够处理10A。在这里购买:
  • 8个普通墙壁插座,220伏供电
  • 8个带E27配件的灯泡

我在这里看到一些电路问题,所以我将逐一解释 1.您不应该直接从Arduino引脚运行继电器,所以使用合适的晶体管电路来运行继电器,并使用Arduino引脚作为接收器,而不是源将更好。 2.使用带继电器线圈的续流二极管。
3.在Rx和Tx处使用光隔离器。

当您的意思是“它在没有电源通过时工作得很好”,您的意思是它在电源流动时冻结(无论它们是否连接)还是在物理连接时冻结?仅供参考。现在有一个专门用于Arduino的堆栈,确保所有地面都在同一个电位下。安诺莫司人:我的意思是,当没有220伏电压通过继电器时,继电器可以完美切换。因此,开关基本上是工作的,直到它们实际切换带电电路。这个问题似乎是离题的,因为它是关于电子设计,而不是代码,所以应该重定向到EE stackexchange!
#include <digitalWriteFast.h>

byte incomingByte=0;
byte notebyte=0;
byte velocitybyte=0;
byte statusbuffer=0;
byte NOTE_ON = 144;
byte NOTE_OFF = 128;
boolean arp_triggernext=false;
boolean firstbyte;
void MIDI_Poll(){
  if (Serial.available() > 0) {
    do {
      // read the incoming byte:
      incomingByte = Serial.read();
      if (incomingByte>247) {
        // this is where MIDI clock stuff is done
        switch (incomingByte){
        }
      }
      else if (incomingByte>240) {
        statusbuffer = 0;
        //sysex stuff done here
      }
      else if (incomingByte>127) {
        statusbuffer = incomingByte;
        firstbyte = true;
        notebyte = 0;
        velocitybyte = 0;
      }
      else if (statusbuffer!=0) {
        if (firstbyte == true) {
          // must be first byte
          notebyte = incomingByte;
          firstbyte = false;
        }
        else {
          // so must be second byte then
          velocitybyte = incomingByte;
          //process the message here
          if (statusbuffer == NOTE_ON && velocitybyte != 0) {
            switch (notebyte) {
               case 60:
               digitalWriteFast2(2, HIGH);
               break;
               case 61:
               digitalWriteFast2(3, HIGH);
               break;
               case 62:
               digitalWriteFast2(4, HIGH);
               break;
               case 63:
               digitalWriteFast2(5, HIGH);
               break;
               case 64:
               digitalWriteFast2(6, HIGH);
               break;
               case 65:
               digitalWriteFast2(7, HIGH);
               break;
               case 66:
               digitalWriteFast2(8, HIGH);
               break;
               case 67:
               digitalWriteFast2(9, HIGH);
               break;
            }
          }
          else if (statusbuffer == NOTE_OFF || (statusbuffer == NOTE_ON && velocitybyte == 0)) {
            switch (notebyte){
               case 60:
               digitalWriteFast2(2, LOW);
               break;
               case 61:
               digitalWriteFast2(3, LOW);
               break;
               case 62:
               digitalWriteFast2(4, LOW);
               break;
               case 63:
               digitalWriteFast2(5, LOW);
               break;
               case 64:
               digitalWriteFast2(6, LOW);
               break;
               case 65:
               digitalWriteFast2(7, LOW);
               break;
               case 66:
               digitalWriteFast2(8, LOW);
               break;
               case 67:
               digitalWriteFast2(9, LOW);
               break;
            }
          }
          //now clear them for next note
          notebyte = 0;
          velocitybyte = 0;
          firstbyte = true;        
        }
      }
    } while (Serial.available() > 0);
  }
}

void setup() {      

  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  MIDI_Poll();
}