您的代码有一些小错误和需要改进的地方。下面是经过修正和优化的版本:
#include "BluetoothSerial.h"
// 检查蓝牙是否启用
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to enable it
#endif
BluetoothSerial SerialBT;
// 定义LED引脚
const int ledPin1 = 2; // ESP32的板载LED通常连接到GPIO 2
const int ledPin2 = 3; // 可以自定义其他引脚
void setup() {
// 初始化串口通信
Serial.begin(115200);
// 初始化蓝牙
SerialBT.begin("COME-CAR_001"); // 蓝牙设备名称
Serial.println("蓝牙已启动,等待连接...");
// 初始化LED引脚
pinMode(ledPin1, OUTPUT);
digitalWrite(ledPin1, LOW); // 初始状态关闭LED
pinMode(ledPin2, OUTPUT);
digitalWrite(ledPin2, LOW); // 初始状态关闭LED
}
void loop() {
// 检查是否有蓝牙数据可读
if (SerialBT.available()) {
char command = SerialBT.read();
Serial.write(command); // 将接收到的命令发送到串口监视器
// 根据接收到的命令控制LED
switch (command) { // 修复了switch语法错误并正确使用变量名 command
case '0': // 注意这里的字符比较,需要用单引号包围数字字符(如'0')
digitalWrite(ledPin1, HIGH); // 打开第一个LED
digitalWrite(ledPin2, LOW); // 确保第二个LED关闭
SerialBT.println("电动车已打开");
break; // 添加break以防止fall-through
case '1':
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH); // 打开第二个LED
SerialBT.println("电动车已打开,车灯已打开");
break;
case '2':
digitalWrite(ledPin1, LOW); // 确保所有LED关闭
digitalWrite(ledPin2, LOW);
SerialBT.println("电动车已关闭");
break;
default:
SerialBT.println("无效命令"); // 添加默认情况处理无效命令的反馈。
}
delay(100); // 可以加一个短暂延迟,避免过于频繁地读取数据。
}
}
更改说明:
switch
语句修正:原来的代码中switch (cmd):
是错误的,应为switch (command)
并且case
后面的条件需要与读取到的字符进行比较。字符比较:在
case
中比较字符时,用单引号'0'
,'1'
, 和'2'
。添加
break
:确保在每个 case 完成后退出 switch,防止继续执行下一个 case 的代码(fall-through)。添加默认情况处理:对输入其他不符合要求的命令给予反馈。
延迟:增加一段延迟以避免反复读取导致的数据丢失或异常行为。
这些更改使代码更加健壮和易于维护。如果还有其他问题或需求,请随时告知!
内容由零声教学AI助手提供,问题来源于学员提问