前言
本文由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转换通道号为ADC1ret = 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常识。