Prj1:智能远程开关灯
一、硬件:
Arduino Uno。
SG90舵机X2。
HC-06蓝牙模块。(应该买HC-05可作主从机,HC-06仅作从机无法主动连接其他蓝牙设备,例如台式电脑(USB转蓝牙模块)连蓝牙耳机。若通信时数据不匹配,是波特率默认9600。)
高粘度双面胶。
二、遇到的问题:
1.(现象):Arduino连接蓝牙模块,下载程序会一直提示uploading,无法下载成功。
(解决):串口冲突通常是因为两个设备试图同时使用同一个串口引脚。在 Arduino 中,串口通常使用引脚 0(RX)和引脚 1(TX)来进行通信。如果你连接了一个外部设备(例如蓝牙模块),并且该设备也试图使用这些引脚来进行通信,就会发生串口冲突。
2.(现象):【手机蓝牙调试工具】发送字符命令一直返回数据一直不正确。
(解决):这类串口工具有2个格式设置,一个是发送格式,一个是显示格式。把发送格式调为utf-8即可。
3.(现象):门口有2个灯的开关,舵机太小了,转动角度时长度不够,无法开关。
(解决)用小木棍和胶带绑住,或者3D打印,学学Solidwork / MAYA。
4.(现象):3.3V、5V供电问题,用9V,12V电池盒+降压模块,或者直接接线路。MP1584EN。
供电时间(单位:小时,h)= 电池容量(Ah) / (单片机的平均功耗(W) × 电池的额定电压(V))
三、接线
四、程序:
1 #include <SoftwareSerial.h> // 导入软串口库 2 3 SoftwareSerial BTSerial(0, 1); // 声明软串口对象,参数分别为 RX、TX 引脚 4 5 const int servoPin1 = 9; // 第一个舵机的 PWM 引脚 6 // const int servoPin2 = 10; // 第二个舵机的 PWM 引脚 7 8 void setup() { 9 pinMode(servoPin1, OUTPUT); 10 // pinMode(servoPin2, OUTPUT); 11 12 // 初始化软串口,设置波特率为 9600 13 BTSerial.begin(9600); 14 15 Serial.begin(9600); 16 Serial.println("Bluetooth Module HC-06 Ready!"); 17 } 18 19 void loop() { 20 // 等待蓝牙模块发送数据 21 while (BTSerial.available()) { 22 // 读取一行数据 23 String cmd = BTSerial.readStringUntil('\n'); 24 cmd.trim(); // 去除字符串前后的空格 25 26 if (cmd) { 27 // 设置舵机转动角度 28 int angle = cmd.toInt(); // 将字符串转换为整数 29 if (angle >= 0 && angle <= 180) { 30 // 舵机转动角度在 0-180 度之间 31 analogWrite(servoPin1, map(angle, 0, 180, 0, 255)); 32 // analogWrite(servoPin2, map(angle, 0, 180, 0, 255)); 33 Serial.print("Servo Angle: "); 34 Serial.println(angle); 35 } else { 36 Serial.println("Invalid Angle!"); 37 } 38 } else { 39 Serial.println("Invalid Command!"); 40 } 41 } 42 }
蓝牙串口调试软件:输出格式和显示格式都从hex改为utf-8,即可显示字符正常通信。