宿舍关灯神器鸿蒙版

打印 上一主题 下一主题

主题 1718|帖子 1718|积分 5154

一、前言

宿舍关灯神器应该是一个已经被玩烂了的项目了,我也废话不多说。本篇文章就如标题所说,教大家如何开发一个鸿蒙NEXT版的APP来对单片机举行蓝牙通信。本文的关灯器将采用ESP32作为控制器。
二、材料准备


  • ESP32
  • SG90舵机
  • 杜邦线
  • 5v锂电池
设备组装

舵机上赤色的线是接vin(也就是esp32上的5v引脚,不同的板子叫法不同),黑色的接GND,另外一个是信号线,任意接一个GPIO引脚即可,我这里接的是12,这个要记着反面要用。

三、单片机代码

  1. #include <BluetoothSerial.h>
  2. #include <string>
  3. #include <ESP32Servo.h>
  4. using namespace std;
  5. BluetoothSerial SerialBT;
  6. Servo myservo;
  7. int servoPin = 12;
  8. int ini_pos = 90;
  9. bool is_on = false;
  10. void turn_mid_light()
  11. {
  12.   myservo.write(90);
  13. }
  14. void turn_light()
  15. {
  16.   myservo.write(90 + 45);
  17.   delay(500);
  18.   turn_mid_light();
  19. }
  20. void turn_off_light()
  21. {
  22.   myservo.write(90 - 45);
  23.   delay(500);
  24.   turn_mid_light();
  25. }
  26. void setup() {
  27.   myservo.attach(servoPin);
  28.   Serial.begin(115200);
  29.   SerialBT.begin("ESP32_Server"); // 设定蓝牙服务器名称
  30.   int init_angle = myservo.read();     // 读取初始角度
  31.   if (init_angle != ini_pos)
  32.   {
  33.     myservo.write(ini_pos);
  34.   };
  35. }
  36. void loop() {
  37.   if(SerialBT.available()){
  38.     String cmd = SerialBT.readString();
  39.     Serial.print(cmd);
  40.     if(cmd == "switch"){
  41.       if(is_on){
  42.         turn_off_light();
  43.         is_on = false;
  44.       }else{
  45.         turn_light();
  46.         is_on = true;
  47.       }
  48.     }
  49.   }
  50. }
复制代码
下面我来解释一下这段代码:
起首引入了三个头文件<BluetoothSerial.h>(蓝牙库)、和<ESP32Servo.h>(控制舵机的库)。定义了蓝牙串口对象SerialBT和舵机对象myservo,以及servoPin(舵机引脚,就是组装时信号线接的位置)、ini_pos(初始位置角度)、is_on(表现灯是否开启的标志)。
接着定义了三个函数turn_mid_light(将舵机转到中心位置,避免影响人手正常开关灯)、turn_light(将舵机转到特定角度开启灯光,然后再转到中心位置)、turn_off_light(将舵机转到特定角度关闭灯光,然后再转到中心位置)。
在setup函数中,将舵机毗连到指定引脚,初始化串口通信,设置蓝牙服务器名称,读取舵机初始角度,假如初始角度不是设定的初始位置角度,则将舵机转到初始位置。
在loop函数中,假如蓝牙串口有数据可读,就读取数据并存储在cmd字符串中。假如cmd等于 “switch”,根据is_on的状态来决定是开启灯光还是关闭灯光。
四、鸿蒙APP代码

1.蓝牙接口

我先不直接放代码,这里要先着重说一下鸿蒙蓝牙开发的方式,由于授之以鱼不如授之以渔,我解释了这一点以后,你在开发其他蓝牙应用的时间你就知道该怎么做了。
由于鸿蒙版本迭代快,api之间差别也不小,你在网上任意搜的教程指不定是哪个api的,而且写教程的人也没说,这就会造成许多误解。以是我会告诉大家我用的api版本,起首Dev eco studio版本是5.0.9.300,compatibleSdkVersion是 5.0.0(12)。
(由于这个项目是24年写的,如今整理的时间发现当前最新的api版本是16,但是主要的用法没有什么大变化。)
在华为官方文档中搜刮的时间注意要选上你如今用的api版本

假如直接搜刮蓝牙,会找到一些过时的文档,请注意看上边标注了从某某api后不再支持,假如用错了版本就会影响反面的开发

经过我的查找,我发现了这个接口@ohos.bluetooth.connection (蓝牙connection模块),这个就是标准蓝牙通信的接口,当然你在左侧的栏目中也会发现有蓝牙ble模块,这个对应的是低功耗蓝牙,不过我这个项目用的是经典蓝牙,假如想试试ble肯定也可以,只不过固件代码也得相应的更改,有爱好的读者可以研究一下。

2.部分代码

先引入一些须要的库,此中connection和socket是蓝牙毗连和通信须要的组件。
  1. import { router } from '@kit.ArkUI';
  2. import { connection } from '@kit.ConnectivityKit';
  3. import { socket } from '@kit.ConnectivityKit';
  4. import { BusinessError } from '@kit.BasicServicesKit';
  5. import { buffer } from '@kit.ArkTS';
  6. import { promptAction } from '@kit.ArkUI';
复制代码
下面来讲几个紧张的函数:

  • connection.getPairedDevices()
    这个是用于获取已配对设备的mac地点,返回是Array
  • connection.getRemoteDeviceName()

    当我们拿到了mac地点后,我们想知道设备名称就要用这个函数,这个函数对于已配对设备和未配对都是一样的,只要传入地点就能返回设备名称。在api16中好像又新加进去了一个参数alias,不过是可选,我们不消管这个。
  • connection.on(‘bluetoothDeviceFind’, Callback<Array>)
    这里可以看到有几个不同的on函数,此中第一个参数传入不同的字符串表现订阅不同的消息,这里我们当然要订阅发现设备的消息,也就是开启蓝牙扫描后只要发现了设备,就执行回调函数。
  • connection.startBluetoothDiscovery();
    这个就不消多说了,就是开启扫描。
  • socket.sppConnect(deviceId: string, options: SppOptions, callback: AsyncCallback): void
    毗连指定地点的设备
  • socket.sppWrite(clientSocket: number, data: ArrayBuffer): void
    发送字节数据
以是有了上面的代码,我们就可以分别写出以下功能:

检查已配对设备有无关灯器

  1. getDevice = (): boolean=>{
  2.     try{
  3.       let devices: Array<string> = connection.getPairedDevices()
  4.       for(let i=0; i<devices.length; i++){
  5.         if(connection.getRemoteDeviceName(devices[i])=="ESP32_Server"){
  6.           this.address = devices[i]
  7.           return true
  8.         }
  9.       }
  10.     } catch (err) {
  11.       console.error("errCode:" + err.code + ",errMessage:" + err.message)
  12.     }
  13.     return false
  14.   }
复制代码
这里的设备名称是你自己设定的,根据你的固件代码举行现实调整。
扫描并配对

  1. scanAndPair = ()=>{
  2.     try {
  3.       connection.on('bluetoothDeviceFind', (data)=>{
  4.         for(let i=0;i<data.length;i++){
  5.           let adrr = data[i]
  6.           if(adrr!=""){
  7.             let name = connection.getRemoteDeviceName(adrr)
  8.             if(name == "ESP32_Server"){
  9.               connection.pairDevice(adrr)
  10.             }
  11.           }
  12.         }
  13.       });
  14.       connection.startBluetoothDiscovery();
  15.     } catch (err) {
  16.       console.error("errCode:" + err.code + ",errMessage:" + err.message);
  17.     }
  18.   }
复制代码
毗连设备

  1. connect = ()=>{
  2.     try{
  3.       socket.sppConnect(this.address, {uuid: '00001101-0000-1000-8000-00805f9b34fb', secure: false, type: 0},
  4.         (code: BusinessError, number: number)=>{
  5.           if (code) {
  6.             console.error('sppListen error, code is ' + code)
  7.             promptAction.showToast({message: '连接失败', duration: 2000})
  8.             return;
  9.           }
  10.           this.client_num = number
  11.           promptAction.showToast({message: '连接成功', duration: 2000})
  12.           this.state = "在线"
  13.           this.color = Color.Green
  14.           // this.sendCmd()
  15.         })
  16.     } catch (err) {
  17.       console.error("errCode:" + err.code + ",errMessage:" + err.message);
  18.       promptAction.showToast({message: '连接失败', duration: 2000})
  19.     }
  20.   }
复制代码
发送消息

  1. sendCmd = ()=>{
  2.     try{
  3.       socket.sppWrite(this.client_num, this.strToBuffer("switch"))
  4.       this.light_color==Color.Gray ? this.light_color = Color.Green : this.light_color = Color.Gray
  5.       socket.sppCloseClientSocket(this.client_num)
  6.     } catch (err) {
  7.       console.error("errCode:" + err.code + ",errMessage:" + err.message);
  8.       if(err.code == 2901054){
  9.         promptAction.showToast({message: '连接已丢失请重试', duration: 2000})
  10.         this.client_num = -1
  11.         this.state = "离线"
  12.         this.color = Color.Red
  13.       }
  14.     }
  15.   }
复制代码
完整代码在此

https://github.com/1wpc/autolight_HMOS.git

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

悠扬随风

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表