共计 7518 个字符,预计需要花费 19 分钟才能阅读完成。
前言
本文由 OpenAtom OpenHarmony(以下简称“OpenHarmony”)开源开发者成长打算流动的参与者李建涛提供,具体论述了由搭载 OpenHarmony 零碎的拓维 Niobe 开发套件开发而来的智能阳台我的项目的全过程,包含我的项目流程、硬件筹备、软件剖析,以及问题剖析等,可能为开发者后续开发相似我的项目时提供一些参考。
一、我的项目设计与剖析
1.1 我的项目形容
基于 OpenHarmony 的智能阳台具体性能如下:
- 可能实时监测室外环境是否下雨;
- 可能对接华为 IoT 物联网平台,从平台上接入设施实时查看到以后状态(窗户开关状况、室外是否下雨);
- 当传感器采集到的数据超过事后设定的阈值时,本地启动关窗马达,并上报关窗信息;
- 本设施可能胜利搭载 OpenHarmony 开发板的环境监测设施,并实现环境监测性能。
1.2 零碎架构图
基于 OpenHarmony 的智能阳台零碎架构图如下:依据零碎架构图,能够看出基于 OpenHarmony 的智能阳台次要是由三局部组成:
- 数据采集:由雨滴传感器采集室外的环境状况;
- 信号传送:开发板接管到传感器的数据进行判断,并且发送判断后的信号给电机驱动模块;开发板通过 MQTT 协定将数据上传到华为云平台;华为云平台也能够通过下发命令给开发板并将该命令的信号发送给电机驱动模块;
-
执行部件:电机管制模块依据单片机的信号管制电机执行相应的动作(开窗或关窗的动作)。
1.3 零碎流程图
基于 OpenHarmony 的智能阳台零碎流程图如下:1.4 零碎原理图
基于 OpenHarmony 的智能阳台零碎原理图如下:二、硬件筹备
2.1 基于 OpenHarmony 的智能阳台硬件筹备状况如下:
(1)预装 windows 零碎的 PC 机
(2)拓维信息 Niobe Wifi IoT 开发板套件
(3)雨滴传感器模块一套
(4)电机及驱动电机模块一套(步进电机、直流电机、舵机等都能够)
(5)USB Type- C 线(用于连贯 Windows 工作台与 Niobe Wifi IoT 开发板)
2.2 硬件一:OpenHarmony 开发板
拓维 Niobe 开发板是一块专门基于 OpenHarmony 3.0 LTS 版本设计的开发板,板载高度集成了 2.4GHz WLAN SoC 芯片 Hi3861V100。
Hi3861V100 WiFi 基带反对正交频分复用(OFDM)技术,并向下兼容间接序列扩频(DSSS)和补码键控(CCK)技术,反对 IEEE 802.11 b/g/ n 协定的各种数据速率。Hi3861V100 芯片集成高性能 32bit 微处理器、硬件安全引擎以及丰盛的外设接口,外设接口包含 SPI、UART、I2C、PWM、GPIO 和多路 ADC。
Hi3861V100 芯片适应于智能家电等物联网智能终端畛域。
拓维信息 -OpenHarmony 开发板(Talkweb Niobe)的相干材料能够在拓维信息的 Gitee 仓库中查看。2.3 硬件二:雨滴传感器模块
本我的项目选用雨滴传感器,目标是监测天气状况并转成 AO 电压输入。
(1)材质:雨滴传感器采纳 FR-04 双面资料,并用镀镍解决外表,具备抗氧化,导电性等性能。
(2)输入模式:模拟量 AO 电压输入。
(3)AO 模拟输出,连贯单片机的 AD 口检测滴在下面的雨量大小(雨量越大输入电压越小)。2.4 硬件三:电机模块
2.4.1 本我的项目选用直流电机目标是模仿窗户开关的情景(可依据本人的须要抉择步进电机或者舵机也是能够的)。
电机正转肯定角度示意开窗,反转肯定角度示意关窗。注:直流电机的工作电压为 5V 左右。
2.4.2 本我的项目选用了直流电机,故要另外选用 L298N 直流电机驱动模块,目标是驱动直流电机的运作。(1)本模块应用 L298N 作为主驱动芯片,具备驱动能力强,发热量低,抗干扰能力强的特点。
(2)L298N 直流电机驱动模块,反对双轴管制,其电路原理就是两个 H 桥电路。
(3)该模块能够间接驱动两路 3 -30V 直流电机,并提供 5V 输入接口,能够不便地管制直流电机速度和方向
(4)该模块和管制端口的接口:管制直流电机时 IN1、IN2 和 ENA 为一组,IN1 和 IN2 是逻辑信号,管制电机的正反转;OUT1 和 OUT2 它们管制电机 A,接在 A + 和 A -。三、软件剖析
3.1 开发环境的搭建
万事开头难,要实现基于 OpenHarmony 智能阳台的我的项目开发,首先第一件事就是开发环境的搭建。搭建好开发环境是学习 OpenHarmony 开发板以及后续我的项目开发的根底,其中包含装置虚拟机,配置 Docker 编译环境,下载开发板源码等步骤,每一步都十分重要,且须要确保零谬误。对于一个有教训的开发者来说,从开发环境的搭建到编译胜利可能会花一两天工夫,而对于像我这样刚接触 OpenHarmony 开发板的小白来说破费的工夫会更多,且十分艰难。对此我通过几天的查阅材料和观看一些导师的课程,一步一步地进行开发环境的搭建以及烧录过程。对此也编写了一篇《基于 OpenHarmony 开发板的环境搭建及烧录过程(拓维 Niobe 开发板)》的文章,具体文章已公布于 Gitee 上。
链接如下 https://gitee.com/lijiantao20…
3.2 要害代码剖析
本我的项目的代码能够在 Gitee 仓库里下载 https://gitee.com/openharmony… 代码目录如下:3.2.1 电机配置局部
电机配置分为电机的初始化和设置电机的开关状态两个局部,相应代码地位都在 motor.c 文件里。
(1)电机的初始化
应用开发板上的 GPIO7、GPIO8 管脚管制电机正反转,应用 PWM 输入电压管制电机转动速度。
代码如下:
GPIO7 和 GPIO8 的配置一样。但 GPIO7 应用 PWM0,而 GPIO8 应用 PWM1。
IoTGpioInit(IoT_GPIO_IO_GPIO_7);//GPIO 初始化 | |
IoTIoSetFunc(IoT_GPIO_IO_GPIO_7,IoT_IO_FUNC_GPIO_7_PWM0_OUT);//GPIO 使能 | |
IoTGpioSetDir(IoT_GPIO_IO_GPIO_7, IoT_GPIO_DIR_OUT);// 设置 GPIO 方向 ---IoT_GPIO_DIR_OUT--- 输入 | |
IoTGpioSetOutputVal(IoT_GPIO_IO_GPIO_7, IoT_GPIO_VALUE0);// 设置 GPIO 输入电平 --- 低电平 | |
IoTPwmInit(IoT_PWM_PORT_PWM0);// 初始化 PWM 设施 |
(2)设置电机的开关状态
启动 PWM 信号输入:应用 PWM 给定输入频率和相应的占空比指定给端口。
代码如下:
开窗情景为:MotorStatusSet(ON); 电机正转。
关窗情景为:MotorStatusSet(OFF); 电机反转。
void MotorStatusSet(Motor_Status_ENUM status) | |
{if (status == ON)// 正转 | |
{IoTPwmStart(IoT_PWM_PORT_PWM1, 30, 15000); | |
usleep(400000); | |
IoTPwmStop(IoT_PWM_PORT_PWM1); | |
} | |
if (status == OFF)// 反转 | |
{IoTPwmStart(IoT_PWM_PORT_PWM0, 30, 15000); | |
usleep(400000); | |
IoTPwmStop(IoT_PWM_PORT_PWM0); | |
} | |
} |
3.2.2 雨滴传感器配置局部
雨滴传感器配置分为雨滴传感器的初始化和应用 ADC 采集雨滴传感器数据两个局部,雨滴传感器的初始化代码地位在 motor.c 文件里,应用 ADC 采集雨滴传感器数据代码地位在 balcony.c 文件里。
(1)雨滴传感器初始化
应用开发板上的 GPIO4 管脚管制雨滴传感器(有雨输入低电平,雨量越大电压越低)
代码如下:
IoTGpioInit(IoT_GPIO_IO_GPIO_4);//GPIO 初始化 | |
IoTIoSetFunc(IoT_GPIO_IO_GPIO_4,IoT_IO_FUNC_GPIO_4_GPIO);//GPIO 使能 | |
IoTGpioSetDir(IoT_GPIO_IO_GPIO_4,IoT_GPIO_DIR_IN);// 设置 GPIO 方向 ---IoT_GPIO_DIR_IN--- 输出 |
(2)应用 ADC 采集雨滴传感器数据
代码如下:
//GPIO4 的 ADC 转换通道号为 ADC1 | |
ret = IoTAdcRead(IoT_ADC_CHANNEL_1,&val,IoT_ADC_EQU_MODEL_8, IoT_ADC_CUR_BAIS_DEFAULT, 256); | |
// 将电压数值转化为百位数,以便数据分析与察看 | |
val = IoTAdcConvertToVoltage(val); | |
val = 3.4 - val; | |
voltage = (float)((float)val)/3.5 * 100; |
3.2.3 连贯华为 IoT 平台局部
连贯华为 IoT 平台后,设施端可向华为 IoT 平台上传设施状态、数据等信息。同时华为 IoT 平台也能够下发命令给设施端,设施端收到命令后进行响应。
咱们把设施端与华为 IoT 平台连贯分为获取华为 IoT 平台 IP 地址、华为 IoT 平台的搭建、编写上传数据相干代码以及编写下发命令相干代码四个局部。
(1)获取华为 IoT 平台 IP 地址
设施端与云端通信采纳的相干协定为 MQTT 协定。
首先在华为 IoT 平台抉择 MQTT 协定的接入地址,并复制接入地址在 PC 终端上 ping 一下该接入地址。失去一个地址为 121.36.42.100 的 IP 地址,该地址为华为 IoT 平台的 IP 地址。
在 oc_mqtt.h 文件里咱们能够查看到相应代码配置。
(2)华为 IoT 平台的搭建
华为 IoT 平台的搭建首先创立产品并且注册对应的设施,华为 IoT 平台就会调配给设施一个设施 ID,设施端可通过设施 ID 和相应的密钥来确保安全可信地连贯到华为 IoT 平台。
注册对应的设施步骤如下:
① 所有设施 –> 注册设施
② 抉择所属产品、填写标识符和设施名称,调配设施 ID 平台会主动调配能够不必批改
③ 点击确认后会有两条设施信息,一条为设施 ID 另外一条为设施密钥,点击保留并敞开会提醒你下载一个 txt 文件,txt 文件外面就蕴含这两条信息。
④ 进去设施对接信息网站填写设施 ID、设施密钥:https://IoT-tool.obs-website….
生成相应信息:ClientID、Username、Password。(每设施生成的信息都是不一样的)
代码如下:
在 balcony.c 文件里能够查看到以下配置:
注册设施后,咱们能够在华为 IoT 平台产品中的模型定义里创立一个产品,并增加服务、属性、命令等内容。
服务信息:(服务 ID、服务类型)
属性信息:(属性名称、数据类型)
命令信息:(命令名称、参数名称、数据类型、长度、枚举)
注:代码中的服务 ID、属性名称、命令名称等与华为 IoT 平台一一对应。
援用开源代码 oc_mqtt.c 和 oc_mqtt_profile_package.c 函数编写代码。
Wi-Fi 连贯配置:援用开源代码 wifi_connect.c 函数编写代码,连贯 Wi-Fi 须要用到本地的 Wi-Fi 账号密码,在 balcony.c 文件里批改 Wi-Fi 信息。
(3)上传数据的配置
代码如下:
static void deal_report_msg(report_t *report) | |
{ | |
// 定义 Service 级别数据,该处对应云平台配置的 Balcony 服务下的数据 | |
oc_mqtt_profile_service_t service; | |
// 定义属性级别数据,该处对应云平台配置的属性 voltage 信息 | |
oc_mqtt_profile_kv_t voltage; | |
// 定义属性级别数据,该处对应云平台配置的属性 Window_flag 信息 | |
oc_mqtt_profile_kv_t Window_flag; | |
// 定义属性级别数据,该处对应云平台配置的属性 Rain_flag 信息 | |
oc_mqtt_profile_kv_t Rain_flag; | |
// 定义属性级别数据,该处对应云平台配置的属性 motor 信息 | |
oc_mqtt_profile_kv_t motor; | |
service.event_time = NULL; | |
// 对应云平台配置的服务 ID | |
service.service_id = "Balcony"; | |
// 在 Balcony 服务下增加属性信息 | |
service.service_property = &voltage; | |
// 该产品上报数据中仅存在 Balcony 一种服务,所以 next 指针为空 | |
service.nxt = NULL; | |
// 对应云平台配置的属性名称 | |
voltage.key = "voltage"; | |
//voltage 的取值由设施理论状态 voltage 决定 | |
voltage.value = &report->voltage; | |
// 对应云平台配置的数据类型 | |
voltage.type = EN_OC_MQTT_PROFILE_VALUE_FLOAT; | |
// 持续增加 Balcony 服务下的另一属性 | |
voltage.nxt = &Window_flag; | |
Window_flag.key = "Window_flag"; | |
Window_flag.value = g_app_cb.Window_flag ? "ON" : "OFF"; | |
Window_flag.type = EN_OC_MQTT_PROFILE_VALUE_STRING; | |
Window_flag.nxt = &Rain_flag; | |
Rain_flag.key = "Rain_flag"; | |
Rain_flag.value = g_app_cb.Rain_flag ? "ON" : "OFF"; | |
Rain_flag.type = EN_OC_MQTT_PROFILE_VALUE_STRING; | |
Rain_flag.nxt = &motor; | |
motor.key = "Motor_Status"; | |
//Motor_Status 的 ON,OFF 取值由设施理论 | |
motor.value = g_app_cb.motor ? "ON" : "OFF"; | |
motor.type = EN_OC_MQTT_PROFILE_VALUE_STRING; | |
//Balcony 服务下没有其它属性了,next 置为 null。motor.nxt = NULL; | |
// 打包数据 | |
oc_mqtt_profile_propertyreport(USERNAME, &service); | |
return; | |
} |
(4)下发命令管制电机的配置
代码如下:
if(0==strcmp(cJSON_GetStringValue(obj_cmdname), "Balcony_Control_Motor")) | |
{obj_para = cJSON_GetObjectItem(obj_paras, "Motor"); | |
if (NULL == obj_para) | |
{goto EXIT_OBJPARA;} | |
// 操作电动马达 | |
if (0 == strcmp(cJSON_GetStringValue(obj_para), "ON")) | |
{ | |
g_app_cb.motor = 1; | |
MotorStatusSet(ON);// 开窗 | |
g_app_cb.Window_flag = 1; | |
Window_flag = 1; | |
} | |
else | |
{ | |
g_app_cb.motor = 0; | |
MotorStatusSet(OFF);// 关窗 | |
g_app_cb.Window_flag = 0; | |
Window_flag = 0; | |
} | |
} |
四、问题总结及解决过程
4.1 问题一:硬件连贯
在硬件连贯的过程,电机驱动模块的 GND 没有和开发板的 GND 相连,导致电机不转,输入端电压为 0V。
查阅了材料发现 L298N 供电的 12V 如果是用另外电源供电的话,那么须要将单片机的 GND 和驱动模块的 GND 连接起来,这样单片机上过去的逻辑信号才有个参考点,板载 12V 稳压芯片的输出引脚和电机供电驱动接线端子导通的。
4.2 问题二:烧录问题
在烧录的时候,如果外接的传感器(雨滴传感器)的 VCC 接口接在开发板的 5V 上可能会导致烧录的时候复位不胜利。
所以咱们在烧录的时候须要将传感器接在开发板的 5V 及 GND 先断开,期待烧录胜利后就可连接起来。
4.3 问题三:连贯华为云 IoT 平台
在连贯华为 IoT 平台的过程中,咱们须要留神的问题是代码中的服务 ID、属性名称、命令名称等信息与华为 IoT 平台一一对应,否则会导致数据上传不胜利或者命令下发不胜利。
五、我的项目作品演示
- 能在华为 IoT 平台上下发命令管制电机的转动。
- 可在雨滴传感器上滴上水珠,达到预约的阈值时,电机转动模仿关窗。
- 可能在华为 IoT 平台上查看相干传感器测得的数值以及窗户(是否开窗)、环境(是否下雨)状态的状况。
Wi-Fi 连贯胜利串口显示:
华为 IoT 平台在线调试 – 可看到数据接管和命令发送的状况:
华为 IoT 平台查看到最新的上报数据:
以下别离对四个情景进行剖析与阐明:
情景一:无雨天气并且应用华为 IoT 平台下发命令开窗
当华为 IoT 平台下发命令 Balcony_Control_Motor –> ON。窗户马达则会转动,将窗户关上并且将数据信息上传回华为 IoT 平台。
华为 IoT 平台数据信息同步更新:
硬件图如下:
情景二:无雨天气并且应用华为 IoT 平台下发命令关窗
当华为 IoT 平台下发命令 Balcony_Control_Motor –> OFF。窗户马达则会转动将窗户敞开并且将数据信息上传回华为 IoT 平台。
华为 IoT 平台数据信息同步更新:
硬件图如下:
情景三:窗户开着,检测到下雨天气,则会关窗并且上报数据
当窗户开着的状况,天气从晴朗天气变成下雨天气,当雨滴检测板检测到雨滴,并且超过设定的阈值的时候,窗户马达将转动将窗户敞开并且将数据信息上传回华为 IoT 平台。
华为 IoT 平台数据信息同步更新:
硬件图如下:
情景四:下完雨后,雨滴检测板没有雨滴
当天气从下雨天气变成晴朗天气,雨滴检测板没有检测到雨滴(此处为了不便试验,应用了纸巾擦除雨滴检测板上的水),并且将数据信息上传回华为 IoT 平台。
华为 IoT 平台数据信息同步更新:
硬件图如下:
六、心得体会加入本次 OpenHarmony 开源开发者成长打算流动,让我播种良多,不仅理解到 OpenHarmony 的生态系统,也在开发我的项目的过程中深刻接触到 OpenHarmony 的开发板。在开发我的项目的过程中已经呈现大大小小的问题,例如环境搭建、硬件连贯、WiFi 连贯配网和连贯华为云平台等,但有问题并不可怕,只有下定决心去解决就总会找到相应的办法。我在这个实际过程中积攒了不少教训,这让我对 OpenHarmony 开发产生了更浓重的趣味,让我更想往下一直学习,学习一些更有深度和更乏味的 OpenHarmony 常识。