我正在进行一个项目,我使用midi音符来使用Arduino Uno切换8个旧灯。我已经建造了一个带有8个墙壁插座的外壳,这个插座连接到Arduino的继电器板上。我正在使用Hairless midi serial bridge通过USB将midi音符发送到Arduino。
这一切都有效,直到我用Uno打开插座电源。大约5~10秒后,Arduino冻结了。继电器屏蔽保持在其当前状态,并且串行通信的指示灯停止闪烁。当没有220伏电压通过继电器时,一切都很好。
(我的原理图如下。)Arduino通过USB供电。我还尝试使用额外的5V和500mA适配器为Arduino供电,但这并没有什么不同。
代码:
#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();
}
它基于我发现的用于处理串行midi的代码。
我真的很困惑为什么会这样。我想知道为什么我的Arduino和继电器板会在220伏电压通过继电器时冻结。
答案 0 :(得分:0)
正如我在这里看到的是一些电路问题,所以我将逐一解释它们 1.你不应该直接从Arduino引脚运行继电器,所以使用适当的晶体管电路来运行继电器,并使用arduino引脚作为接收器而不是源更好。 2.使用带继电器线圈的续流二极管。 3.在Rx和Tx使用光隔离器。