我正在尝试使用Arduino中的按钮开关来触发Processing中的视觉显示。我使用“HIGH”和“LOW”来识别按钮是否被按下。
但是,我的代码不断给出null,而不是根据按钮状态给出“HIGH”或“LOW”。我认为这是非常基本的,但我很遗憾。任何帮助或评论将不胜感激!
以下是我的Arduino和Processing代码。
const int buttonPin = 2;
const int LEDPin = 13;
int buttonState = 0;
void setup() {
pinMode(buttonPin, INPUT);
pinMode(LEDPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
int analogValue = analogRead(A0)/4;
Serial.write(analogValue);
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
Serial.write(HIGH);
digitalWrite(LEDPin, HIGH);
} else {
Serial.write(LOW);
digitalWrite(LEDPin, LOW);
}
delay(100);
}
处理代码:
import processing.serial.*;
Serial myPort;
String val;
void setup() {
size(400,400);
String portName = Serial.list()[1];
myPort = new Serial(this, portName, 9600);
}
void draw() {
if (myPort.available() > 0) {
val = myPort.readStringUntil('\n');
println(val);
if (val == "HIGH") {
background(127,0,0);
}
if (val == "LOW") {
background(144, 26, 251);
}
}
}
答案 0 :(得分:3)
<强> write() 强>
将二进制数据写入串行端口。该数据以字节或字节序列的形式发送。
Serial.write(str)
str:要作为一系列字节发送的字符串
因此,当您在HIGH
中使用写LOW
和Serial.write
时,它将作为一系列字节发送。编辑处理部分以处理传入的字节。如下:
import processing.serial.*;
Serial myPort;
String val;
int len; //length of byte array
void setup() {
size(400,400);
String portName = Serial.list()[1];
myPort = new Serial(this, portName, 9600);
}
void draw() {
if ((len=myPort.available()) > 0) {
for(i=0;i<len;i++)
myByteArray=myPort.read();
String val = String(myByteArray);
println(val);
if (val == "HIGH") {
background(127,0,0);
}
if (val == "LOW") {
background(144, 26, 251);
}
}
}
答案 1 :(得分:2)
只需将buttonState变量类型从integer更改为boolean,然后使用
if(buttonState) {
Serial.println("HIGH");
}
else {
Serial.println("LOW");
}
答案 2 :(得分:1)
在Arduino中,HIGH
和LOW
are defined为1和0。
执行Serial.write(HIGH);
和Serial.write(LOW);
,您只需发送一个字节1或0。
但根据您的处理代码,您希望Serial.write(HIGH);
发送'H'
,'I'
,'G'
,'H'
和'\n'
个字符
在您的Arduino代码中,您需要将Serial.write(HIGH);
和Serial.write(LOW);
替换为Serial.print("HIGH\n");
和Serial.print("LOW\n");
。