命令通过蓝牙时不执行代码
Code not executing when command comes over bluetooth
我正在使用 HC-05 蓝牙设备和 Arduino Mega(不是重点,但是我以为我会包括它)。
我想通过单击 processing
中的按钮打开和关闭 LED。我的 processing
代码是:
import processing.serial.*;
Serial myPort;
String state = "Turn On";
void setup() {
size(600, 600);
myPort = new Serial(this, Serial.list()[0], 9600);
}
void draw() {
background(255);
fill(0, 150, 150);
rectMode(CENTER);
rect(width/2, height/2, 200, 75, 50);
textSize(32);
fill(0);
text(state , width/2 - textWidth(state) / 2, height/2 + 16);
}
void mousePressed() {
if (mouseX < 400 && mouseX > 200 && mouseY < 333.5 && mouseY > 266.5) {
if (state == "Turn On") {
state = "Turn Off";
myPort.write('1');
} else {
state = "Turn On";
myPort.write('0');
}
}
}
我的arduino代码是:
const int ledPin = 7;
char ledState;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
}
void loop() {
// put your main code here, to run repeatedly:
if (Serial.available() > 0) {
ledState = Serial.read();
}
if (ledState == '0') {
digitalWrite(ledPin, LOW);
ledState = '3';
}
if (ledState == '1') {
digitalWrite(ledPin, HIGH);
ledState = '3';
}
}
然而,led 始终不亮。我知道蓝牙信号通过了,因为 Arduino 上的 RX
灯闪烁,意味着它通过了,但灯从未亮起。
代码有什么问题?我怀疑我可能在 Arduino 程序中读取了错误的数据,除了几天前这种方法有效...
提前致谢,干杯!
您的 arduino 代码中有一个包含 0 或 1 的标志,您将其与字符“0”(相当于 48)进行比较。
if (ledState == "0") {
去掉 0 上的引号。这是一个整数。一个号码。不是字符串。
另请注意,在这两种情况下,您都将 ledState 设置为 0。我也有一种错误的感觉。
I figured it out (after 5 days - didn't ask question right away)!
如果Arduino连接到电脑,不要进行任何连接,因为数据已经通过电缆传输到Arduino,取代了RX和TX引脚,否则RX和TX引脚会产生负面影响你的结果。但是,如果您从外部供电,请连接 RX 和 TX 引脚(因为没有电缆)。该模块似乎有点挑剔,我可能有问题,但经过这么多天的调试,我怀疑它。我希望这有帮助!干杯!
编辑:它实际上与代码有关,代码中的问题使上述工作。问题是Serial.list()[0]
,这会找到列表顶部的东西。这实际上是 Arduino USB 电缆!因此,Processing 正在通过电缆与 Arduino 通信。所以这就是为什么它可以取出 RX 和 TX 引脚,它们没有被使用。我认为当 RX 和 TX 引脚插入时它不起作用的原因是我认为 Arduino 的 RX 和 TX 引脚优先于 USB 电缆,这意味着 Arduino 只有 有点听电缆,因此RX指示灯闪烁的原因。
所以继续前进,当我从计算机上拔下它时它起作用了,因为 Arduino COM 消失了,这意味着顶部的 COM 是蓝牙本身。所以它实际上与蓝牙模块通信,蓝牙模块将信息沿其 TX 引脚发送到 Arduino 的 RX 引脚,然后 Arduino 执行命令。
所以,总而言之,最好查看设备管理器并找出模块的 COM 并使用它而不是 Serial.list()[0]
,这可能会导致意外结果。所以,最后一次......干杯!
最终编辑:我最后的陈述已经通过我的测试得到证实,所以最后一次……干杯!
我正在使用 HC-05 蓝牙设备和 Arduino Mega(不是重点,但是我以为我会包括它)。
我想通过单击 processing
中的按钮打开和关闭 LED。我的 processing
代码是:
import processing.serial.*;
Serial myPort;
String state = "Turn On";
void setup() {
size(600, 600);
myPort = new Serial(this, Serial.list()[0], 9600);
}
void draw() {
background(255);
fill(0, 150, 150);
rectMode(CENTER);
rect(width/2, height/2, 200, 75, 50);
textSize(32);
fill(0);
text(state , width/2 - textWidth(state) / 2, height/2 + 16);
}
void mousePressed() {
if (mouseX < 400 && mouseX > 200 && mouseY < 333.5 && mouseY > 266.5) {
if (state == "Turn On") {
state = "Turn Off";
myPort.write('1');
} else {
state = "Turn On";
myPort.write('0');
}
}
}
我的arduino代码是:
const int ledPin = 7;
char ledState;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
}
void loop() {
// put your main code here, to run repeatedly:
if (Serial.available() > 0) {
ledState = Serial.read();
}
if (ledState == '0') {
digitalWrite(ledPin, LOW);
ledState = '3';
}
if (ledState == '1') {
digitalWrite(ledPin, HIGH);
ledState = '3';
}
}
然而,led 始终不亮。我知道蓝牙信号通过了,因为 Arduino 上的 RX
灯闪烁,意味着它通过了,但灯从未亮起。
代码有什么问题?我怀疑我可能在 Arduino 程序中读取了错误的数据,除了几天前这种方法有效...
提前致谢,干杯!
您的 arduino 代码中有一个包含 0 或 1 的标志,您将其与字符“0”(相当于 48)进行比较。
if (ledState == "0") {
去掉 0 上的引号。这是一个整数。一个号码。不是字符串。
另请注意,在这两种情况下,您都将 ledState 设置为 0。我也有一种错误的感觉。
I figured it out (after 5 days - didn't ask question right away)!
如果Arduino连接到电脑,不要进行任何连接,因为数据已经通过电缆传输到Arduino,取代了RX和TX引脚,否则RX和TX引脚会产生负面影响你的结果。但是,如果您从外部供电,请连接 RX 和 TX 引脚(因为没有电缆)。该模块似乎有点挑剔,我可能有问题,但经过这么多天的调试,我怀疑它。我希望这有帮助!干杯!
编辑:它实际上与代码有关,代码中的问题使上述工作。问题是Serial.list()[0]
,这会找到列表顶部的东西。这实际上是 Arduino USB 电缆!因此,Processing 正在通过电缆与 Arduino 通信。所以这就是为什么它可以取出 RX 和 TX 引脚,它们没有被使用。我认为当 RX 和 TX 引脚插入时它不起作用的原因是我认为 Arduino 的 RX 和 TX 引脚优先于 USB 电缆,这意味着 Arduino 只有 有点听电缆,因此RX指示灯闪烁的原因。
所以继续前进,当我从计算机上拔下它时它起作用了,因为 Arduino COM 消失了,这意味着顶部的 COM 是蓝牙本身。所以它实际上与蓝牙模块通信,蓝牙模块将信息沿其 TX 引脚发送到 Arduino 的 RX 引脚,然后 Arduino 执行命令。
所以,总而言之,最好查看设备管理器并找出模块的 COM 并使用它而不是 Serial.list()[0]
,这可能会导致意外结果。所以,最后一次......干杯!
最终编辑:我最后的陈述已经通过我的测试得到证实,所以最后一次……干杯!