• [技术干货] 【OpenHarmony样例】基于启航KP_IOT开发板的智能风扇模块【转】
    本示例将演示如何利用启航KP_IOT主控板和智能风扇模块进行案例开发。模块介绍智能风扇模块主要的部件有STH30温湿度传感器,一个红外传感器,一个led灯,一个按键和电机,该模块能够实现按键控制电机的启停,电机启动一共分三档,按一次按键增加一个档位,控制电机这一部分用到了pwm,和gpio的知识点。该模块上的STH30传感器可以监控环境温湿度,STH30是通过i2c进行数据交互的,采集的数据还可以显示在oled屏上,oled屏是通过spi进行数据交互。模块上的红外传感器能够实现对物体的检测,当红外传感器检测到物体时led灯会被点亮。智能风扇模块主要试验步骤我们将调用motor_demo()函数,我们就可以在motor_module.c文件中motor_demo()函数声明中完成电机的控制功能,电机控制需要用到pwm,按键需要用到一个gpio,第一步先对io口进行复用,像i2c,pwm,spi,uart等这样功能性引脚复用是在wifiiot/init/app_io_init.c文件中完成的。查看电路原理图和芯片手册中可以知道电机是使用的pwm2,知道电机使用的是pwm2之后,就要知道pwm2是哪个gpio引脚输出的,在include/hi_io.h中可以查看,每个gpio引脚可以复用的功能。gpio2管能够复用成gpio,uart1_rts,spi,pwm2_out等功能,我们需要用到的是pwm2_out,所以在wifiiot/init/app_io_init.c中将gpio_2复用成pwm2_out功能,设置引脚功能的函数hi_u32hi_io_set_func(hi_io_name id, hi_u8 val)的具体功能介绍可以在include/hi_io.h中可以查看。pwm设置完成之后在motor_module.c文件中motor_gpio_io_init()函数中对按键接入的引脚进行复用,从原理图可看到按键KEY-1是接GPIO_05。步骤1 按键对应io5之后在motor_gpio_io_init()中将io5复用成gpio/*gpio5按键控制电机速度*/ ret = hi_io_set_func(HI_IO_NAME_GPIO_5, HI_IO_FUNC_GPIO_5_GPIO); if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_io_set_func ret:%d\r\n", ret); return; } printf("----- gpio5 fan set func success-----\r\n"); ret = hi_gpio_set_dir(HI_GPIO_IDX_5, HI_GPIO_DIR_IN); if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_gpio_set_dir1 ret:%d\r\n", ret); return; } printf("----- gpio set dir success! -----\r\n");io设置完成之后,就可以进行功能的编写了,我们想要实现的功能是通过按键控制电机的启停,电机有三个档位,按键按一次增加一个档位,电机处于三档时再按一次按键电机将停止。首先我们要创建一个任务去实时监听按键接入io引脚的状态,OpenHarmony系统中任务的创建调用hi_u32hi_task_create(hi_u32 *taskid, const hi_task_attr attr,hi_void (*task_route)(hi_void *), hi_void *arg);步骤2 创建的电机任务的属性,包括任务优先级,任务栈的大小,任务名,在任务处理函数中去实现我们想要的功能//创建的电机任务的属性,包括任务优先级,任务栈的大小,任务名等 static unsigned int g_MonitorTask; const hi_task_attr MonitorTaskAttr = { .task_prio = 20, //优先级范围20~30之间 .stack_size = 4096, //任务大小 .task_name = "BuggyNetworkMonitorTask",//任务名称,可自行修改 }; void *MonitorOledTask(void * para) /* OLEDtask处理函数 */ { while(1){ test_led_screen(); printf("OLED task \r\n"); } return NULL; } // 电机task处理函数 void *MonitorMotorTask(void * para) { while(1){ gpio_getval(); //主要任务,对电机的控制在此函数中实现 infrared_ctrl(); //printf("fan task \r\n"); } return NULL; }步骤3 在gpio_getval()实现对电机控制;//按键控制电机程序 hi_void gpio_getval(hi_void) { hi_u32 ret; int temp; static int key = 0; //将gpio_val_1置为1,置为1是因为从原理图中可知按键默认是高电平,按下为低电平 hi_gpio_value gpio_val_1 = HI_GPIO_VALUE1; temp = infrared_ctrl(); //获取gpio5引脚电平,并赋值给gpio_val_1 ret = hi_gpio_get_input_val(HI_GPIO_IDX_5, &gpio_val_1); if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_gpio_get_input_val ret:%d\r\n", ret); return; } //printf("----- gpio input val is:%d. -----\r\n", gpio_val_1); //当gpio_val_1为低电平是说明按下了按键,按1次按键增加一个档位 if(gpio_val_1 == 0){ //休眠1s是为了消除按键的抖动 sleep(1); if(gpio_val_1 == 0){ key++; } //key表示是几档,根据不同的档位再输出不同占空比的pwm波去控制电机 switch(key){ case 0: break; case 1: //电机1档,控制端口2输出1占空比的pwm波 motor_pwm_start(1); break; case 2: //电机2档,控制端口2输出2占空比的pwm波 motor_pwm_start(2); break; case 3: //电机3档,控制端口2输出3占空比的pwm波 motor_pwm_start(3); break; default: printf("invalid mode \r\n"); } //当key大于4或等于0时停止电机 if(key >= 4 || key == 0 || temp == 1){ key = 0; ret = hi_pwm_stop(HI_PWM_PORT_PWM2); if(ret != 0){ printf("hi_pwm_stop failed \r\n"); } } } //printf("key : %d \r\n",key); }pwm波控制电机输出部分程序:在使用pwm之前需要先对pwm进行初始化,初始化pwm只需要调用hi_pwm_init(parm),函数中的参数(parm)是需要初始化的端口,使用的pwm2需要填宏定义HI_PWM_PORT_PWM2,具体宏定义含义在include/hi_pwm.h中有说明。步骤4 对端口的初始化只需要完成一次,所以在创建电机任务之前调用一次motor_pwm_init()即可hi_void motor_pwm_init(hi_void) { int ret = -1; ret = hi_pwm_deinit(HI_PWM_PORT_PWM2); //初始化端口2 if(ret != 0){ printf("hi_pwm_deinit failed :%#x \r\n",ret); } ret = hi_pwm_init(HI_PWM_PORT_PWM2); //初始化端口2 if(ret != 0){ printf("hi_pwm_init failed :%#x \r\n",ret); } ret = hi_pwm_set_clock(PWM_CLK_160M); //设置端口2的时钟源频率 if(ret != 0){ printf("hi_pwm_set_clock failed ret : %#x \r\n",ret); } }对电机速度的控制实际上就是控制pwm的占空比和频率,想要输出不同占空比的pwm波调用函数hi_u32hi_pwm_start(hi_pwm_port port, hi_u16 duty, hi_u16freq);参数port表示端口号,duty占空比值,freq频率。在我们使用的模块中,时钟频率默认是160000000hz,所以可以定义一个宏去表示时钟频率,这里我们是用PWM_CLK_FREQ表示时钟频率,分频倍数165535,频率范围就是2441160000000(频率=时钟源频率/分频倍数),我们用最低频率就可以了,所以将频率用一个宏freq去表示值为2441。步骤5 motor_pwm_start(unsigned int duty)中duty就表示占空比,想让pwm2端口输出多少占空比的波形,直接在调用该函数时传入占空比值就可以了。hi_void motor_pwm_start(unsigned int duty) { int ret = 0; DBG("motor start \r\n"); if(duty == 0){ ret = hi_pwm_stop(HI_PWM_PORT_PWM2); //停止pwm2端口输出 if(ret != 0){ printf("hi_pwm_start failed ret : %#x \r\n",ret); } } ret = hi_pwm_start(HI_PWM_PORT_PWM2, duty*(PWM_CLK_FREQ/freq)/100, PWM_CLK_FREQ/freq); //输出duty占空比的pwm波 if(ret != 0){ printf("hi_pwm_start failed ret : %#x \r\n",ret); } }步骤6 motor_pwm_start(unsigned int duty)中duty就表示占空比,想让pwm2端口输出多少占空比的波形,直接在调用该函数时传入占空比值就可以了。hi_void motor_demo(hi_void) { int ret; motor_gpio_io_init(); //完成对按键所接io的复用 motor_pwm_init(); //对pwm进行初始化 //创建一个任务去专门处理电机控制任务 ret = hi_task_create(&g_MonitorTask, // task标识// &MonitorTaskAttr, MonitorMotorTask, // task处理函数 // NULL); // task处理函数参数 // if (ret < 0) { printf("Create monitor motor task failed [%d]\r\n", ret); return; } return; }红外传感器模块红外传感器有一个发射端和一个接收端,当发射端发出的电磁波被挡住返回,接收端接收到后红外传感器接到模块上的引脚就会从低电平变成高电平,所以我们可以通过监控红外传感器的引脚电平高低来判断是否检测到物体,目前实现的现象是,当检测到物体时led就会被点亮,没检测到物体led就灭。写程序之前我们要先确定红外传感器接入的引脚和led接入的引脚,从原理图中可以看到红外传感器LED_infrared接入的引脚是GPIO_07,LED_SW1灯接入的引脚是GPIO_06。步骤1 知道红外传感器和led接入的引脚后,就需要对相应的IO进行复用,因为是同一个模块所以可以在motor_gpio_io_init()中实现io7,io8的复用。//设置io8的方向,因为led灯是输出信号,所以设置成out ret = hi_gpio_set_dir(HI_GPIO_IDX_8, HI_GPIO_DIR_OUT); if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_gpio_set_dir1 ret:%d\r\n", ret); return; } /*gpio7 电机模块红外传感*/ ret = hi_io_set_func(HI_IO_NAME_GPIO_7, HI_IO_FUNC_GPIO_7_GPIO); if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_io_set_func ret:%d\r\n", ret); return; } printf("----- io set func success-----\r\n"); //设置io7的方向,因为红外传感器是输入信号,所以设置成输入 ret = hi_gpio_set_dir(HI_GPIO_IDX_7, HI_GPIO_DIR_IN); if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_gpio_set_dir1 ret:%d\r\n", ret); return; } printf("----- gpio set dir success! -----\r\n");步骤2对io功能复用完成后,就可以完成对led控制这一部分的功能了,首先这两引脚的默认值都是低电平,所以先将这两个引脚赋值HI_GPIO_VALUE0,然后根据gpio_val_7引脚的电平高低来判断红外传感器是否检测到物体,检测到物体是将gpio_val_8置为高电平点亮led。hi_void infrared_ctrl(hi_void) { hi_u32 ret; hi_gpio_value gpio_val_7 = HI_GPIO_VALUE0; //设置gpio_val_7默认值 hi_gpio_value gpio_val_8 = HI_GPIO_VALUE0; //设置gpio_val_8默认值 ret = hi_gpio_get_input_val(HI_GPIO_IDX_7, &gpio_val_7); //监控gpio_val_7的电平 if (ret != HI_ERR_SUCCESS) { printf("===== ERROR ===== gpio -> hi_gpio_get_input_val ret:%d\r\n", ret); return; } //printf("----- gpio input val is:%d. -----\r\n", gpio_val_7); if(gpio_val_7 == 1){ hi_gpio_set_ouput_val(HI_GPIO_IDX_8,HI_GPIO_VALUE1); //gpio_val_7为高电平时,将HI_GPIO_IDX_8置为高电平输出 }else{ hi_gpio_set_ouput_val(HI_GPIO_IDX_8,HI_GPIO_VALUE0);//gpio_val_7为低电平时,将HI_GPIO_IDX_8置为低电平输出 } }步骤3 功能完成后就需要在适合的时机去调用,因为红外线监控也是需要实时监控gpio引脚,和监控按键一样所以可以在电机任务中去调用。void *MonitorMotorTask(void * para) /* 电机task处理函数 */ { while(1){ gpio_getval(); //电机按键监控 infrared_ctrl(); //红外传感器监控 } return NULL; }sht3x温湿度传感器模块SHT3x-DIS是Sensirion新一代的温湿度传感器,精度为±2%RH和±0.3℃,输入电压范围从2.4V到5.5V,采用IIC总线接口,速率可达1MHz。测量温湿度范围分别为是-40℃ ~ 125℃和0 ~ 100%。具体规格和原理参考说明手册。步骤1 初始化sth3xvoid SHT3X_init(void) { int ret = 0; unsigned short data[2] = {0}; SHT3X_SoftReset(); //软件复位SHT3X SHT3x_WriteCMD(CMD_READ_SERIALNBR); //向i2c发送读命令 SHT3x_WriteCMD(CMD_MEAS_PERI_2_M); //设置读取周期为2hz }步骤2 读取测量数据void SHT3X_ReadMeasurementVal(unsigned int para) { (void) para; static int cunt = 0; static float humidity = 0.0; static float temperature = 0.0; SHT3X_ReadMeasurementBuffer(&temperature,&humidity); //将读取数据存到temperature和humidity中 } //数据存储的具体实现 void SHT3X_ReadMeasurementBuffer(float* temperature, float* humidity) { unsigned int rawValueTemp = 0; SHT3x_WriteCMD(CMD_FETCH_DATA); //读取数据前先发送一个周期读取指令 SHT3x_Read4BytesDataAndCrc((unsigned short *)&rawValueTemp);//读取i2c上四个字节的数据 dump_buf((unsigned char *)&rawValueTemp,sizeof(rawValueTemp)); //调试打印读取的数据 *temperature = SHT3X_CalcTemperature(rawValueTemp); //将读取的数据转换成浮点型温度数据 *humidity = SHT3X_CalcHumidity(*((unsigned short *)(&rawValueTemp)+1));//将读取的数据转换成浮点型湿度数据 Temperature = *temperature; Humidity = *humidity; DBG("temp :%f,hum :%f \r\n",Temperature,Humidity); //打印读取的温湿度 } //将读取的数据转换成浮点型的温度 static float SHT3X_CalcTemperature(unsigned short rawValue) { return 175.0f * (float)rawValue / 65535.0f - 45.0f; //转换公式 } //将读取的数据转换成浮点型的湿度 static float SHT3X_CalcHumidity(unsigned short rawValue) { return 100.0f * (float)rawValue / 65535.0f; //转换公式 } //读取4字节数据的具体实现 int SHT3x_Read4BytesDataAndCrc(unsigned short *data) { int ret = -1; unsigned char sendbuf[2] = {0}; unsigned char rcvbuf[6] = {0}; hi_i2c_data sht3x_i2c_data = { 0 }; //i2c在该模块的数据收发数据都是存储在结构体中的,该结构体可以再include/hi_i2c.h中查看 sht3x_i2c_data.send_buf = sendbuf; sht3x_i2c_data.send_len = sizeof(sendbuf); sht3x_i2c_data.receive_buf = rcvbuf; sht3x_i2c_data.receive_len = sizeof(rcvbuf); if(data == NULL){ DBG("invalid para \r\n"); return ret; } ret = hi_i2c_read(0, ((unsigned char)0x44) << 1 | 0x01, &sht3x_i2c_data); //sht3x地址为0x44,读温湿度传感器中数据,数据存储在sht3x_i2c_data中 if(ret != 0){ DBG("hi_i2c_read failed ret :%#x \r\n",ret); return ret; } ret = SHT3X_CheckCrc(rcvbuf,2,rcvbuf[2]); //将读取的数据进行校验 if(ret != NO_ERROR){ DBG("read serial number crc check failed \r\n"); return ret; } ret = SHT3X_CheckCrc(&rcvbuf[3],2,rcvbuf[5]); //将读取的数据进行校验 if(ret != NO_ERROR){ DBG("read serial number crc check failed \r\n"); return ret; } data[0] = rcvbuf[0] << 8 | rcvbuf[1]; //将数据存到data数组中 data[1] = rcvbuf[3] << 8 | rcvbuf[4]; return 0; }步骤3 任务调用hi_void motor_demo(hi_void) { int ret; SHT3X_init(); //初始化SHT3X ret = hi_task_create(&g_MonitorTask, // task标识 // &MonitorTaskAttr, MonitorSthTask, // task处理函数 // NULL); // task处理函数参数 // if (ret < 0) { printf("Create monitor motor task failed [%d]\r\n", ret); return; } return; }到这一步温湿度传感器的程序已经编写完成了,可以将程序进行编译然后下载到模组中验证一下是否可以读取温湿度,如果能读取到温湿度,在日志中会打印出读取的数据。OLED显示模块采集完成数据之后可以在oled模块上显示,oled模块的具体开发详见oled开发流程知道,这里是直接使用oled去显示SHT3X读取的温湿度,显示温湿度首先我们要对oled进行初始化,我们使用的spi0所以初始化时spi_id=0。hi_void screen_spi_master_init(hi_spi_idx spi_id){int ret = -1;//screen_ERR;test_spi_para spi_para; //test_spi_para结构体是spi的基础属性,定义在oled_module/spi_screen.h文件中步骤1 给spi基础属性赋值spi_para.spi_id = spi_id; //spi端口号,我们是用的是0 spi_para.irq = HI_FALSE; //是否启用中断,选择否 spi_para.cfg_info.data_width = HI_SPI_CFG_DATA_WIDTH_E_8BIT; //传输数据位为8位 spi_para.cfg_info.cpha = HI_SPI_CFG_CLOCK_CPHA_0; //时钟相位0,采集第一个跳变沿数据 spi_para.cfg_info.cpol = HI_SPI_CFG_CLOCK_CPOL_0; //时钟极性0,空闲状态为低电平 spi_para.cfg_info.fram_mode = HI_SPI_CFG_FRAM_MODE_MOTOROLA; //选用的通讯协议 spi_para.cfg_info.endian = HI_SPI_CFG_ENDIAN_LITTLE; //数据传输为小段模式 spi_para.slave = HI_FALSE; //没有从机 spi_para.lb = HI_FALSE; //不设置回环测试模式 spi_para.dma_en = HI_FALSE; //不采用dma spi_para.cfg_info.freq = 2000000; //通讯频率2Mhz test_spi_printf("app_demo_spi_test_cmd_mw_sr Start"); ret = screen_spi_init(spi_para.spi_id, &(spi_para.cfg_info), spi_para.slave); //spi的系统初始化 if (ret == HI_ERR_SUCCESS) { test_spi_printf("SPI init succ!"); } else { test_spi_printf("SPI init fail! %x ", ret); return; } hi_spi_set_loop_back_mode(spi_para.spi_id, spi_para.lb); //设置回环测试模式 hi_sleep(1000); /* 1000 */ hi_spi_set_irq_mode(spi_para.spi_id, spi_para.irq); //设置中断模式 hi_spi_set_dma_mode(spi_para.spi_id, spi_para.dma_en); //设置dma模式 hi_sleep(1000); /* 1000 */ }步骤2 初始化完成之后,需要创建一个oled任务去完成显示功能ret = hi_task_create(&g_MonitorTask, // task标识 // &MonitorTaskAttr, MonitorOledTask, // task处理函数 // NULL); // task处理函数参数 // if (ret < 0) { printf("Create monitor oled task failed [%d]\r\n", ret); return; } void *MonitorOledTask(void * para) /* OLEDtask处理函数 */ { while(1){ test_led_screen(); //显示功能 printf("OLED task \r\n"); } return NULL; }温湿度的显示主要是由TEST_Menu2()显示的,这个oled模块显示数字有一个特点,它显示20这样的两位数时,是将这两位数分开来显示的,先显示2再显示0,我们读取的温度是一个浮点型数据,所以在显示时需要将各个位上的数字分离出来。void TEST_Menu2(void) { extern float Temperature; //Temperature的读取是在不同的文件中,所以想在这个文件中使用就需要将Temperature定义成全局变量,这边引用时加extern extern float Humidity; printf("Temperature:%f Humidity:%f \r\n",Temperature,Humidity); int a = 0; int b = 0; int c = 0; int d = 0; int e = 0; int f = 0; int g = 0; a = Temperature; b = a / 10; //整除获取十位上的数据 c = a % 10; //取余获取个位上的数据 d = (Temperature - a) * 10; //Temperature为浮点型数据,a为整形,相减之后就是小数,再乘十,获取到的就是小数后的第一位 e = Humidity; f = e / 10; //整除获取十位上的数据 g = e % 10; //取余获取各位上的数据 printf("b:%d c:%d d:%d f:%d g:%d\r\n",b,c,d,f,g); u8 i; //图形界面的绘制 GUI_DrawLine(0, 10, WIDTH-1, 10,1); GUI_DrawLine(WIDTH/2-1,11,WIDTH/2-1,HEIGHT-1,1); GUI_DrawLine(WIDTH/2-1,10+(HEIGHT-10)/2-1,WIDTH-1,10+(HEIGHT-10)/2-1,1); GUI_ShowString(0,1,"2021-08-1",8,18); GUI_ShowString(14,HEIGHT-1-10,"Cloudy",8,1); GUI_ShowString(WIDTH/2-1+2,13,"TEMP",8,1); GUI_DrawCircle(WIDTH-1-19, 25, 1,2); GUI_ShowString(WIDTH-1-14,20,"C",16,1); GUI_ShowString(WIDTH/2-1+2,39,"HUMI",8,1); GUI_DrawBMP(6,16,51,32, BMP5, 1); //温湿度的显示 GUI_ShowNum(WIDTH/2-1+9,20,b,1,16,1); //温度的十位数字显示 GUI_ShowNum(WIDTH/2-1+9+8,20,c,1,16,1); //温度的十位数字显示 GUI_ShowString(WIDTH/2-1+9+8+8,20,".",16,1); //小数点显示 GUI_ShowNum(WIDTH/2-1+9+8+16,20,d,1,16,1); //温度的小数显示 GUI_ShowNum(WIDTH/2-1+5,46,f,1,16,1); //湿度的十位显示 GUI_ShowNum(WIDTH/2-1+5+8,46,g,1,16,1); //湿度的个位显示 GUI_ShowString(WIDTH/2-1+5+8+8,46,"/rh",16,1); //湿度的单位显示 sleep(2); }步骤1 在motor_demo()中去调用hi_void motor_demo(hi_void) { int ret; motor_gpio_io_init(); //智能风扇模块gpio的初始化 SHT3X_init(); //温湿度传感器的初始化 motor_pwm_init(); //pwm的初始化 hi_spi_deinit(HI_SPI_ID_0); screen_spi_master_init(0); //spi的初始化 ret = hi_task_create(&g_MonitorTask, // task标识 // &MonitorTaskAttr, MonitorOledTask, // oled task处理函数 // NULL); // task处理函数参数 // if (ret < 0) { printf("Create monitor oled task failed [%d]\r\n", ret); return; } ret = hi_task_create(&g_MonitorTask, // task标识 // &MonitorTaskAttr, MonitorMotorTask, // motor task处理函数 // NULL); // task处理函数参数 // if (ret < 0) { printf("Create monitor motor task failed [%d]\r\n", ret); return; } ret = hi_task_create(&g_MonitorTask, // task标识 // &MonitorTaskAttr, MonitorShtTask, // sht task处理函数 // NULL); // task处理函数参数 // if (ret < 0) { printf("Create monitor motor task failed [%d]\r\n", ret); return; } return; }修改 applications / sample / wifi-iot / app / 路径下 BUILD.gn 文件,指定 motor_module 参与编译。"22_KP_SHT30_example:motor_module",运行结果将智能风扇模块和oled模块安装在开发板上,将上面编译好的程序下载到模组上验证温湿度的显示。原文地址:【OpenHarmony样例】基于启航KP_IOT开发板的智能风扇模块 - OpenHarmony开源社区 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com)
  • [技术干货] 启航kp OpenHarmony环境搭建
    前提启航kp OpenHarmony环境搭建搭建好OpenHarmony环境未搭建好可以参考OpenHarmony docker环境搭建安装vscode下载好启航kp所需的开发包和样例下载地址搭建过程进入正确文件夹首先要进入 /home/openharmony 目录下,如果没有打开在vsc左上角找到文件,点击,然后找到打开文件夹,输入想要进入的目录。能看到便代表成功进入。配置开发板所需要的文件在vendor文件夹内新增文件夹:isoftstone,把从gitee下载文件中vendor_isoftstone文件夹中的qihang文件夹复制到isoftstone目录下。device/board文件夹内新增文件夹:isoftstone,在isoftstone文件夹中新建文件夹:qihang,再将附加包内的board_qihang文件夹的人内容拷贝到这个文件夹内:检验是否安装成功输入hb set选中启qihang输入hb build -f尝试编译输出 qinghang build success则构建成功。制作“hello word”案例在device/board/isoftstone/qihang/app目录建一个目录:01hello,然后在这个目录下新建文件:hello.c内容如下#include "ohos_init.h" void hello_demo(void) { printf("hello word!\n") } SYS_RUN(oled_demo); 在hello.c同级别目录添加文件BUILD.gn,填入以下内容static_library("hello_demo"){ sources=["hello.c"] } 在app目录BUILD.gn添加01hello模块import("//build/lite/config/component/lite_component.gni") lite_component("app") { features = [ "01hello:hello_demo", ] } hb set选择启航开发板hb build -f进行编译有以下输出表示编译成功6。 编译成功后可以在out/qihang/qihang/Hi3861_wifiiot_app_allinone.bin找到编译后的二进制文件
  • [技术干货] OpenHarmony docker环境搭建
    OpenHarmony docker环境搭建要求一台安装ubuntu的虚拟机,vscode软件安装docker在 Ubuntu 上安装 Docker 非常直接。我们将会启用 Docker 软件源,导入 GPG key,并且安装软件包。首先,更新软件包索引,并且安装必要的依赖软件,来添加一个新的 HTTPS 软件源:sudo apt update sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common使用下面的 curl 导入源仓库的 GPG key:curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -将 Docker APT 软件源添加到你的系统:sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"现在,Docker 软件源被启用了,你可以安装软件源中任何可用的 Docker 版本。01.想要安装 Docker 最新版本,运行下面的命令。如果你想安装指定版本,跳过这个步骤,并且跳到下一步。sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io02.想要安装指定版本,首先列出 Docker 软件源中所有可用的版本:sudo apt update apt list -a docker-ce可用的 Docker 版本将会在第二列显示。docker-ce/focal 5:19.03.93-0ubuntu-focal amd64 通过在软件包名后面添加版本=<VERSION>来安装指定版本:sudo apt install docker-ce=<VERSION> docker-ce-cli=<VERSION> containerd.io 一旦安装完成,Docker 服务将会自动启动。你可以输入下面的命令,验证它: sudo systemctl status docker 输出将会类似下面这样:● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2020-05-21 14:47:34 UTC; 42s ago ...当一个新的 Docker 发布时,你可以使用标准的sudo apt update && sudo apt upgrade流程来升级 Docker 软件包。拉取镜像运行 Docker 软件,打开 CMD 命令行或者 PowerShell 终端,使用指令下载 docker 官方镜像:docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0等待下载完成之后,使用 docker images 可以查看到已下载的 docker 镜像 此时镜像名称太长不方便使用,可以使用重命名操作对镜像重命名:docker image tag swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 openharmony-docker:1.0.0此时使用 docker images 再次查看镜像,发现多出一个名为 openharmony-docker:1.0.0 的镜像 可以执行docker rmi swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0删除旧的镜像: 执行docker run -it openharmony-docker:1.0.0 指令可以运行镜像可以看到系统直接进入到了/home/openharmony,但是此时仅是容器运行成功了,还没有代码,无法完成开发,接下来需要获取代码OpenHarmony 代码获取通过git(不推荐,有时会卡死)首先要设置git用户名和邮箱,否则拉去代码时会报错git config --global user.name "Your Name" git config --global user.email "youremail@yourdomain.com"拉去代码repo init -u git@gitee.com:openharmony/manifest.git -b OpenHarmony-3.2-Release -g ohos:mini repo sync -c repo forall -c 'git lfs pull'通过httprepo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony-3.2-Release -g ohos:mini repo sync -c repo forall -c 'git lfs pull'检验输入hb -v如果出现版本号代表成功Vscode 安装开发板实验需要烧录固件,所以要用到 vscode 编辑器导出固件 到该网址下载最新版的 Visual Studio Code,简称 vscode,下载完成后执行安装. 网址: cid:link_0安装 vscode 插件打开安装好的 vscode 编辑器,点击左侧插件图标,输入 remote ssh 点击安装图标,等待安装完成,安装完成之后左侧会出现下面的图标 然后重复步骤安装入 dev contains 远程连接服务器3、添加服务器连接配置 点击该选项卡,会进入SSH TARGETS的添加,如下图所示:点击添加按钮,输入远程服务器的地址,账号和ip根据自己的情况进行修改,如下图所示:保存之后,会将刚才的连接信息存储在 C:\Users\chaxun.ssh\config 中。此时就可以在SSH TARGETS中看到添加的远程服务器地址了:4、连接服务器 右键选择远程服务器,如果远程服务器能够连接成功,此时会需要你输入密码:5、基本操作例如我点击Open Folder,这里就会让你选择打开的文件目录:点击ok按钮打开 /home/zhaxun 之后,会需要再次输入密码:启动和连接镜像启动镜像的方式可以是终端命令行,如果容器已启动,可以选择 attach 连接容器 点击连接容器之后,会弹出一个新窗口,点击左侧上面第一个图标,会显示该 容器内的文件系统(需要一点缓冲时间) 如果界面同以上截图不一样,而是如下所示: 就点击打开文件夹,在上方弹出的对话框输入/home/openharmony,再点击确 定, 等待片刻就会显示出文件列表,接下来就可以像操作本地文件一样打开文件 并进行编辑,然后修改一个文件:在顶部菜单栏点击终端,再选择新建终端,可以打开终端: 注意观察弹出来的终端,工作目录是否是/home/openharmony,如果不是请检 查前面的操作是否错误或有遗漏 在终端命令行输入:hb set 指令,再输入回车,到达选择开发板的界面,用鼠标 或键盘上下键选择 qemu_mini_system_demo,再敲回车:选择好了开发板,就可以执行构建命令: hb build -f 此时系统开始构建,由于我们使用的是 docker 环境,在制作镜像的时候环境已 经准备好了,所以不需要配置其他的脚本或者工具即可以达到编译固件的目的. 最后终端会显示编译成功,我们可以在 out 相应的目录下找到对应的固件,输 入:ls out/arm_mps2_an386/qemu_mini_system_demoqemu 模拟器的运行 由于模拟器的运行不涉及到具体的硬件,所以本实验不需要烧录步骤,在 docker 控制台终端输入./qemu-run,再输入 y 就能运行 qemu 模拟器了,下面是运 行状态的截图: 在 qemu 的终端里可以输入 help 命令查看该模拟器支持运行哪些指令: 同学们可以自行尝试列出来的指令退出模拟器的运行: 按住 Ctrl+a 然后同时放开,再按一下 x 键即可退出 qemu 终端可以看出,系统此处退出了 qemu 模拟器回到了 doc
  • [HCSD校园沙龙] 广西首站!华为云HCSD校园沙龙走进广西制造工程职业技术学院!
    8⽉21⽇晚,华为云HCSD校园沙龙·广西制造工程职业技术学院顺利举办!本次活动由华为云计算技术有限公司主办,广西制造工程职业技术学院承办。活动以物联网+鸿蒙为主题,围绕端云生态协同展开技术交流分享,现场华为云专家带领200余名学生了解物联网、鸿蒙技术知识及发展动态。华为自发布鸿蒙系统以来,就引起广泛大众的关注,经过几年的打磨,目前鸿蒙系统已初具规模,在8月4日第五届华为开发者大会2023上又正式发布了全新升级的HarmonyOS 4(以下简称鸿蒙4)。全面进化的智能终端操作系统,更是带来前所未有的个性化,高效、智慧、流畅、安全的革新和体验,如今鸿蒙系统已成为最具生命力的生态底座,为用户提供了全新体验和全场景智慧生活。在万物互联的时代,鸿蒙智联势必加速了物联网时代的真正到来,华为云IoT高级工程师王婵,则以“物联网+鸿蒙,打开校园新方式”为主题,向与会师生详细讲述了物联网与鸿蒙的关系演进、物联网+鸿蒙使能千行百业、当代大学生如何玩转物联网+鸿蒙等,还特别讲述了鸿蒙4在个性化、高效性、智慧化、流畅度以及安全性等五个方面进行了全新升级,带来了前所未有的个性化与高效交互体验,打破了传统操作系统呆板、扁平、无趣的特点,为学生们揭开物联网与鸿蒙系统的神秘面纱。在训练营环节,带领学生们体验了基于现实使用案例场景搭建的实验【10分钟快速体验恒温空调云端控制】,学习如何基于物联网平台,在应用侧或者设备接入控制台设置设备影子,将预置的温度通过设备影子下达属性修改给空调,以实现空调收到修改属性的要求后,自动调节温度。通过理论讲解+实验练习,学生们深入学习如何基于物联网平台实现端云互通、万物智联,并体验开发乐趣。活动现场,氛围十分活跃,学生们不仅踊跃参与实践,还和专家进行互动问答,切磋交流。本次华为云HCSD校园沙龙活动为同学们提供了一个与专家互动交流的平台,拓宽了他们的视野,激发了他们对于科技创新的热情和动力。华为云将继续致力于与高校合作,并为人才培养提供更多支持,共同推动数字产业人才生态发展。
  • [HCSD校园沙龙] HCSD夏令营 · 厦门大学走进华为(龙岗)工业互联网创新中心
    8月10日上午,HCSD夏令营·厦门大学走进华为专场活动圆满落幕!厦门大学刘长青书记及师生等一行人至华为(龙岗)工业互联网创新中心参观交流。华为云工业软件人才培养合作经理欧阳航先生全方位介绍了工业互联网整个生命周期及展厅的布局,并带领厦大师生沉浸式体验了工业互联网创新中心的能力。工业软件是现代工业的灵魂,是制造大国迈向制造强国的基础,是研发创新摸高的底线能力。华为云工业软件产教融合总监侯建国基于工业软件人才培养的背景,展开“集众智、聚众力,为突破自主创新工业软件贡献力量”的主旨演讲,他提到,随着工业软件在工业产品的全生命周期性的广泛应用,核心工业软件能力更需要可信可用。华为以云计算框架为核心,开放华为工程场景,与伙伴共建自主创新工业软件体系;以工业数字模型驱动引擎,筑牢工业软件根技术底座。华为云开发者创新中心运营经理邓大启以“智能世界的云底座,支撑华为各大开发者生态发展”为背景,华为云协同鸿蒙生态,全面解读鸿蒙技术优势、鸿蒙ToB、ToC产品能力,带领开发者基于端云协同能力无限创新,从而构建优良生态,全方面使能开发者。人才因产业而聚,产业因人才而兴。发现、培育、凝聚一批有自主创新潜力、政治素质过硬、专业能力突出的卓越工程师,有助于形成“产业聚集人才、人才支撑产业”的良性互动。华为云招聘经理蔡云丽则围绕以华为云为底座的数字技术背景,讲解华为云的发展历程、业务进展、架构技术和应用。她还深度剖析行业发展方向,介绍华为云校招的岗位&流程,为学生们未来择业做行业洞察。华为(龙岗)工业互联网创新中心作为深圳首个工业互联网创新中心,依托于华为云的数字化赋能服务,致力于带动龙岗区整体制造业产业集群转型升级、提升工业互联网能力,助力龙岗区打造成为创新驱动、应用引领、生态活跃的全国工业互联网领先地区。截至目前,创新中心提供场景解决方案100余个,已服务区内工业企业1200余家。接下来,也将持续构建工业互联网产业生态,加速数字龙岗发展,推动龙岗区工业企业数字化转型、助力传统制造业向制造服务业升级。
  • [活动公告] 华为云移动应用开发暑期师资培训来啦!!!
    为帮助高校教师更加全面系统了解华为云生态与鸿蒙技术,助力产教融合,更好的开展相关教学工作,探索更多人才培养新方案,华为云将于7月-8月开展暑期移动应用开发师资培训,诚邀各院校老师参与研修,具体培训计划如下:培训时间:2023年7月 -8月 形式:线下培训,每期5天,每天8课时,共计40 课时培训对象对华为云生态和鸿蒙感兴趣或计划了解相关内容的院校教师;从事计算机网络技术、移动应用技术与服务、软件与信息服务、软件技术、物联网工程等相关专业的教师或研究带头人;有计划了解和建设华为云开发者创新中心实训基地的院校教师。课程内容本次课程主要包含如何使用ArkTS开发HarmonyOS应用、HMS服务集成、OpenHarmony硬件开发相关技术知识,通过理论授课结合实操演练的方式,帮助院校教师扎实掌握课程知识,支撑院校更好的开展教学工作。线下培训标题活动时间承办院校华为云移动应用开发暑期师资培训·新疆7.3-7.7克拉玛依职业技术学院华为云移动应用开发暑期师资培训·安徽7.10-7.14安徽工业经济职业技术学院华为云移动应用开发暑期师资培训·福建7.17-7.21福州职业技术学院华为云移动应用开发暑期师资培训·河北7.24-7.28河北师范大学华为云移动应用开发暑期师资培训·深圳7.31-8.4深圳信息职业技术学院华为云移动应用开发暑期师资培训·广西8.21-8.  25广西制造工程职业技术学院相关说明请自带笔记本电脑参加本次培训,培训不提供OpenHarmony硬件开发设备,参培老师按自己需求选择是否自备(设备名称:润和HiSpark系列Pegasus智能家居开发套件);华为云侧不收取任何费用,培训费用由承办方经由成本核算后收取;完成培训并考核合格教师,将现场颁发华为云师资培训证书,同时可登录华为云官网在个人中心查看电子版证书;如因不可抗力原因造成培训不能按计划进行,主办单位将另行通知。联系方式培训相关咨询联系人:李雪:电话:15668332687(微信同号),邮箱:lixue90@huawei.com报名二维码   扫码后选择想要参加的时间与城市并填写报名问卷报名
总条数:51 到第
上滑加载中