我正在尝试使用 Arduino 中的按钮开关来触发处理中的视觉显示。我使用"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);
}
}
}
write()
将二进制数据写入串行端口。此数据以字节或一系列字节的形式发送。
Serial.write(str)
str:作为一系列字节发送的字符串
所以当你在Serial.write
中使用写HIGH
和LOW
时,它将被作为一系列字节发送。编辑处理部分以处理传入的字节。如下:
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);
}
}
}
只需将 buttonState 变量类型从整数更改为布尔值,然后使用
if(buttonState) {
Serial.println("HIGH");
}
else {
Serial.println("LOW");
}
在Arduino中,HIGH
和LOW
定义为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("HIGHn");
和Serial.print("LOWn");
.