1

我的项目是使用我制作的 Visual Basic 程序来控制 LED 灯。

我的项目有一个小问题,如何arduino从我的 PC 发送更多命令?

例如,

这是我上传的 Arduino 代码:

{int ledPin = 13; // the number of the LED pin
void setup() {
Serial.begin(9600); // set serial speed
pinMode(ledPin, OUTPUT); // set LED as output
digitalWrite(ledPin, LOW); //turn off LED
}
}


{void loop(){
while (Serial.available() == 0); // do nothing if nothing sent
int val = Serial.read() - '0'; // deduct ascii value of '0' to find numeric value of sent number

if (val == 1) { // test for command 1 then turn on LED
Serial.println("LED on");
digitalWrite(ledPin, HIGH); // turn on LED
}
}

if (val == 0) // test for command 0 then turn off LED
{
Serial.println("LED OFF");
digitalWrite(ledPin, LOW); // turn off LED
}

如您所见,(Val = 1)将打开 LED 1,(Val = 2)将关闭 LED 1,我还在同一个arduino草图中添加了另外 2 个 LED 灯,所以现在(val = 3)将打开 LED 2 on, (val = 4 ) 将关闭 LED 2,对另一个 LED 执行相同的过程。

但是,当我再添加一个 LED 并输入(val = 10)时,LED 1 将打开,

我不知道为什么当我指定 val = 10 时 LED 1 会亮起。

以下是如何从我用 vb 制作的程序发送 (Val):

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
    SerialPort1.Open()
    SerialPort1.Write("1")                                   'this will turn LED 1 On 
    SerialPort1.Close()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button2.Click
    SerialPort1.Open()
    SerialPort1.Write("0")                                   'this will turn LED 1 off 
    SerialPort1.Close()

End Sub   

其他 LED 的相同过程依此类推,具体取决于它们的 Val。

代码

如何解决这个问题呢?

4

1 回答 1

0

一个粗暴的快速修复将不使用数字来打开/关闭灯光,而是将单个字符传递给 arduino 并将其定义为打开和关闭(例如 A --> 打开 1,B --> 关闭 1),至少您将拥有 26/2 = 13 个(对于大写字母)灯,可以单独打开/关闭。

在arduino中使用serialEvent,转换数据并使用switch;

void serialEvent() {
  while (Serial.available() > 0) {
    // get the new byte:
    inChar = (char)Serial.read();

    switch(inChar){

    case 'A':
      digitalWrite(ledPin, HIGH); //turn ON
      break;

    case 'B':
      digitalWrite(ledPin, LOW); //turn OFF
      break;

    //add more lights here

    }

  }
}

并使用您的代码触发;

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click

    With SerialPort1
        If Not .IsOpen Then
                .Open()
            End If
            .Write("A")                                   'this will turn LED 1 On 
            .Close()
        End Sub
    End With

希望这有帮助。

于 2014-06-02T19:27:07.247 回答