使用蓝牙+Arduino+MIT App Inventor调光时LED随机熄灭问题求助
Arduino蓝牙控制LED亮度与开关指令冲突解决方案
你当前代码的核心问题是串口数据没有做类型区分,亮度调节的数值范围0-255完全覆盖了控制指令a/b/c/d的ASCII码范围,两个逻辑共用同一串口通道且没有标识区分,就会出现亮度数值刚好命中指令ASCII码时,意外触发开关动作的故障。


方案1:取值范围隔离(改造成本最低)
- 直接在MIT App Inventor端将滑动条的输出范围调整为
256-511,对应原亮度值0-255 - Arduino端收到数据后先判断数值范围:≥256则减去256作为亮度值输出,<256则判定为开关指令走switch逻辑
- 该方案不需要修改复杂的串口协议,只需要调整两端的数值映射即可,同时修复了原代码两次读串口导致的数据丢包问题
修改后的Arduino代码示例:
const int ledPin = 9; // LED连接的引脚 void setup() { // 初始化串口通信 Serial.begin(9600); // 初始化引脚为输出模式 pinMode(ledPin, OUTPUT); pinMode(8, OUTPUT); pinMode(13, OUTPUT); } void loop() { if (Serial.available()) { int recvData = Serial.read(); // 数值≥256为亮度数据,做偏移转换 if(recvData >= 256){ byte brightness = recvData - 256; analogWrite(ledPin, brightness); }else{ // 数值<256为开关控制指令 switch(recvData) { case 'a': digitalWrite(13, HIGH);break; case 'b': digitalWrite(13, LOW);break; case 'c': digitalWrite(8, HIGH);break; case 'd': digitalWrite(8, LOW);break; default : break; } } } }
方案2:串口协议加标识(扩展性更好)
如果后续还要加其他控制功能,可以给不同类型数据加前缀标识:
- App端发送亮度数据时,先发标识字符
'B',再发亮度数值;发送开关指令时先发标识字符'K',再发指令字符 - Arduino端先读标识位,再根据标识位处理后续对应的数据,完全避免类型混淆
内容的提问来源于stack exchange,提问作者Maaz Hasnain
相关产品推荐
相关产品推荐

