当前位置:首页 >时尚 >鸿蒙设备开发Hi3861 鸿蒙由于宿舍们老旧

鸿蒙设备开发Hi3861 鸿蒙由于宿舍们老旧

2024-07-02 11:37:04 [百科] 来源:避面尹邢网

鸿蒙设备开发Hi3861-IoT落地-自动门锁

作者:Hello_Kun 物联网 物联网应用 有一天半夜宿舍门被一个喝晕的鸿蒙哥们打开了,(说他晕吧他居然知道钥匙在门框上)于是设备有了设计自动门锁的想法。正好一直想用Hi3861做一个iot落地项目【之前挖的鸿蒙坑】,一切刚好!

[[443292]]

想了解更多内容,设备请访问:

鸿蒙设备开发Hi3861 鸿蒙由于宿舍们老旧

51CTO和华为官方合作共建的鸿蒙鸿蒙技术社区

鸿蒙设备开发Hi3861 鸿蒙由于宿舍们老旧

https://harmonyos.51cto.com

鸿蒙设备开发Hi3861 鸿蒙由于宿舍们老旧

1. 项目来源

有一天半夜宿舍门被一个喝晕的哥们打开了,(说他晕吧他居然知道钥匙在门框上)于是设备有了设计自动门锁的想法。正好一直想用Hi3861做一个iot落地项目【之前挖的鸿蒙坑】,一切刚好!

2. 需求分析

无钥匙进入

手机端操作

不影响使用钥匙开门

无损安装、设备卸载自动开门机构

3. 宿舍门锁考察

水平向右移动拉闩1cm左右即可开门,鸿蒙由于宿舍们老旧,设备拉力实测在2.5L水左右。鸿蒙经过粗略计算,设备如果使用9g舵机来驱动,鸿蒙单杠驱动结构的设备话,杠杆长度比为2500/9≈278,鸿蒙尺寸有些夸张。不想在机械结构上费时间,所以选取大扭矩舵机驱动。 #星光计划2.0# 鸿蒙设备开发Hi3861-IoT落地-自动门锁(附多案例-鸿蒙HarmonyOS技术社区

4.方案设计

4.1 机械结构

典型的曲柄滑块结构。选取了绳索拉动、连杆方案。综合考虑耐用度和安装便携性,选取绳索驱动方案。

使用套壳的方式安装在门锁体上,拉闩自由移动,不影响手动开门。

 #星光计划2.0# 鸿蒙设备开发Hi3861-IoT落地-自动门锁(附多案例-鸿蒙HarmonyOS技术社区

4.2 控制逻辑

Hi3861根据web端发送过来的质量控制舵机转动即可。控制信号来源于web端,采用MQTT协议来处理数据,电源使用5V 2A模块,一路单独给舵机。

 #星光计划2.0# 鸿蒙设备开发Hi3861-IoT落地-自动门锁(附多案例-鸿蒙HarmonyOS技术社区

5. 软件层

5.1 MQTT移值

这个直接参考连老师的这篇文章【如何在鸿蒙系统中移植 Paho-MQTT 实现MQTT协议】即可,感谢连老师!

本项目只需要将:服务器地址改为自己的IP、订阅自己web端的Topic、提取消息数据。

主要代码如下:

  1. /*连接web端  只展示主要逻辑,完整见附件*/ 
  2. int mqtt_connect(void) 
  3. {     
  4.       //0.连接web端 
  5.     char* payload = "Hello Kun,have a Nice Day!"; 
  6.     int payloadlen = strlen(payload); 
  7.     int len = 0; 
  8.     char *host = "192.168.xxx.xx";  //自己的ip 
  9.     int port = 1883;                //mqtt服务端口 
  10.     mysock = transport_open(host, port); 
  11.     /* 1.订阅web端话题  */ 
  12.     topicString.cstring = "porsche"; 
  13.     if (MQTTPacket_read(buf, buflen, transport_getdata) == SUBACK)  /* wait for suback */ 
  14.     {   
  15.         rc = MQTTDeserialize_suback(&submsgid, 1, &subcount, &granted_qos, buf, buflen); 
  16.     } 
  17.     /*2. 循环接收发布者的话题消息 */ 
  18.     topicString.cstring = "hi3861"; 
  19.     char door_passward[] ="notfound404"; //开门密令 
  20.     char cmd_msg[12]; //存储web端发来的数据 
  21.     while (!toStop) 
  22.     {  
  23.         if (MQTTPacket_read(buf, buflen, transport_getdata) == PUBLISH) 
  24.         {  
  25.             MQTTString receivedTopic; 
  26.             rc = MQTTDeserialize_publish(&dup, &qos, &retained, &msgid, &receivedTopic, 
  27.                     &payload_in, &payloadlen_in, buf, buflen); 
  28.             for ( i = 0; i < payloadlen_in; i++) 
  29.             {  
  30.                 cmd_msg[i]=*payload_in; //save message from MQTT web 
  31.                 payload_in++; //pointer  
  32.                 printf("%c",cmd_msg[i]); 
  33.             } 
  34.             printf("cmd_msg:%s\n",cmd_msg);  
  35.         } 

5.2 .舵机控制

Hi3861控制舵机之前【这篇文章】有配置过,调整20ms控制周期内高电平的占空比模拟PWM代码如下,进行了一下简单的封装,使用哪个IO口记得要初始化输出即可。

  1. /** * @brief  Servo  control * 
  2.  @param servoID number of servo (GPIO) 7-8-9-10 *  
  3.  @param angle  input value: 0-200 *               
  4. */ 
  5. void My_servo(uint8_t servoID,int angle) 
  6. {         
  7.      int j=0;    
  8.      int k=2000/200; //实际应该是2000/180 
  9.      angle = k*angle;    
  10.      for (j=0;j<5;j++) 
  11.       {       
  12.            GpioSetOutputVal(servoID, 1);         
  13.             hi_udelay(angle); //angle ms         
  14.            GpioSetOutputVal(servoID, 0);         
  15.            hi_udelay(20000-angle);//     
  16.        }//20ms 控制舵机          
  17. }  

5.3 业务逻辑

获取web端数据、匹配开门密令是否一致、一致则开门、每次输入密令可以开门三次、也可以一键上锁。

项目完整工程见附件1主要代码如下:

  1. /*逻辑代码为了适应另外一个iot项目。看起来比较臃肿,但能用*/ 
  2. int count =3; //开门次数 
  3. switch (cmd_msg[0]) 
  4. {  
  5.     case 'a': //一键开门 
  6.         printf("up\n"); 
  7.         cmd_msg[0]='n'; 
  8.         break; 
  9.     case 'z': //一键上锁 
  10.         printf("down\n"); 
  11.         cmd_msg[0]='p'; 
  12.         count = 3; 
  13.         break; 
  14.     case 's': //连接上led闪烁 
  15.         printf("Start\n"); 
  16.         GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 0); 
  17.         usleep(LED_INTERVAL_TIME_US); 
  18.         GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1); 
  19.         usleep(LED_INTERVAL_TIME_US); 
  20.         break; 
  21.     default: 
  22.         break; 
  23. if(!(strcmp(cmd_msg,door_passward))) 
  24. {  
  25.     if(count) 
  26.     {    count --; 
  27.         printf("Open the Door!\n"); 
  28.         My_servo(10,100); 
  29.     } 
  30.     else count = 0; 
  31. else  
  32. {  
  33.     printf("Close the Door!\n"); 
  34.     My_servo(10,50); 

6. 测试 【见视频-3min10s】

 #星光计划2.0# 鸿蒙设备开发Hi3861-IoT落地-自动门锁(附多案例-鸿蒙HarmonyOS技术社区

7. 其他案例

7.1 心率传感器

使用I2C通信,查看数据手册后,更具时许来读取数据,比较简单,参考MPU6050的读取方式。

这里展示一下读取max30102原始数据的函数,完整资源见附件2。代码如下:

  1. /** 
  2.  * @brief Send Write command to MAX30102 device before Read a register. 
  3.  * @param regAddr the register address to Read or Writen. 
  4.  * @return Returns{ @link IOT_SUCCESS} if the operation is successful; 
  5.  *  returns an error code defined in { @link iot_errno.h} otherwise. 
  6.  * */  
  7. uint8_t MAX_Cmd(uint8_t regAddr) 
  8. {   
  9.     hi_i2c_idx id = MAX_I2C_IDX; 
  10.     uint8_t buffer[] = { regAddr}; 
  11.     hi_i2c_data i2cData; 
  12.     i2cData.receive_buf = NULL; 
  13.     i2cData.receive_len = 0; 
  14.     i2cData.send_buf = buffer; 
  15.     i2cData.send_len = sizeof(buffer)/sizeof(buffer[0]); 
  16.     return hi_i2c_write((hi_i2c_idx)id, MAX30102_WR_address, &i2cData); //==发送器件地址+写命令 + 寄存器regAddr  
  17.  
  18. /** 
  19.  * @brief Read a data byte from  MAX30102 device. 
  20.  * @param  regAddr the register address.  8bit data 
  21.  * @return *data 
  22.  * */ 
  23. uint32_t MAX_Read_Data(uint8_t regAddr, uint8_t *data, unsigned int dataLen) 
  24. {  
  25.     hi_i2c_idx id = MAX_I2C_IDX; 
  26.     hi_i2c_data i2cData; 
  27.     i2cData.send_buf = NULL; 
  28.     i2cData.send_len = 0; 
  29.     i2cData.receive_buf = data; 
  30.     i2cData.receive_len = dataLen; 
  31.     MAX_Cmd(regAddr); // write device add 0xAE + reg_ADD [目标寄存器] 
  32.     return hi_i2c_read((hi_i2c_idx)id, I2C_READ_ADDR, &i2cData); 
  33.  
  34. /** 
  35.  * @brief read FIFO data in max30102 FIFO register 0x07 
  36.  *  
  37.  * @param RED_channel_data  
  38.  * @param IR_channel_data  
  39.  */ 
  40. void max30102_FIFO_Read_Data(uint8_t *RED_channel_data, uint8_t *IR_channel_data) 
  41. {  
  42.     uint8_t buff[6]; //LSB 
  43.     /*组合数据 
  44.     uint8_t H,M,L; 
  45.     H=buff[0]&0x03; //bit17-bit16 
  46.     M=buff[1];      //bit8-bit15 
  47.     L=buff[2];      //bit0-bit7 
  48.     *RED_channel_data = (H<<16)|(M<<8)|L; */ 
  49.     int res; 
  50.     res=MAX_Read_Data(REG_FIFO_DATA, &buff ,6); 
  51.     if(res == IOT_SUCCESS) 
  52.     {  
  53.        *RED_channel_data=((buff[0]<<16)|(buff[1]<<8)|(buff[2]) & 0x03ffff);  //buff[0-2] 组合 
  54.        *IR_channel_data=((buff[3]<<16)|(buff[4]<<8)|(buff[5]) & 0x03ffff);  //buff[3-5] 组合 
  55.     } 
  56.  

读取到的数据:

 #星光计划2.0# 鸿蒙设备开发Hi3861-IoT落地-自动门锁(附多案例-鸿蒙HarmonyOS技术社区

7.2 Hi3861-润和套件开发案例

套件的模块除了NFC之外,其他都开发了一遍,不一一细说了,具体内容见附件3-个人开发PPT。

 #星光计划2.0# 鸿蒙设备开发Hi3861-IoT落地-自动门锁(附多案例-鸿蒙HarmonyOS技术社区
 #星光计划2.0# 鸿蒙设备开发Hi3861-IoT落地-自动门锁(附多案例-鸿蒙HarmonyOS技术社区

结语:

NFC开门是不是更加便捷呢? 手里没有运行HarmoneyOS的手机,软总线方案技术上自己估计做不到,先做做硬件层的吧,下一步抽空实现,只要有NFC功能的手机都可开门~估计得明年喽

文章相关附件可以点击下面的原文链接前往下载

https://harmonyos.51cto.com/resource/1627

https://harmonyos.51cto.com/resource/1628

https://harmonyos.51cto.com/resource/1629

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

责任编辑:jianghua 来源: 鸿蒙社区 鸿蒙HarmonyOS应用

(责任编辑:热点)

    推荐文章
    热点阅读