10a7ce71fSopenharmony_ci# HiSpark WiFi-IoT 套件样例开发--harmonyos-ssd1306 20a7ce71fSopenharmony_ci 30a7ce71fSopenharmony_ci 40a7ce71fSopenharmony_ci 50a7ce71fSopenharmony_ci[HiSpark WiFi-IoT开发套件](https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w5003-23341819265.1.bf644a82Da9PZK&id=622343426064&scene=taobao_shop) 首发于HDC 2020,是首批支持OpenHarmony 2.0的开发套件,亦是官方推荐套件,由润和软件HiHope量身打造,已在OpenHarmony社区和广大OpenHarmony开发者中得到广泛应用。 60a7ce71fSopenharmony_ci 70a7ce71fSopenharmony_ci 80a7ce71fSopenharmony_ci 90a7ce71fSopenharmony_ci 100a7ce71fSopenharmony_ci 110a7ce71fSopenharmony_ci## 一、I2C API 120a7ce71fSopenharmony_ci 130a7ce71fSopenharmony_ci| API名称 | 说明 | 140a7ce71fSopenharmony_ci| ------------------------------------------------------------ | ------------------------------- | 150a7ce71fSopenharmony_ci| I2cInit (WifiIotI2cIdx id, unsigned int baudrate) | 用指定的波特速率初始化I2C设备 | 160a7ce71fSopenharmony_ci| I2cDeinit (WifiIotI2cIdx id) | 取消初始化I2C设备 | 170a7ce71fSopenharmony_ci| I2cWrite (WifiIotI2cIdx id, unsigned short deviceAddr, const WifiIotI2cData *i2cData) | 将数据写入I2C设备 | 180a7ce71fSopenharmony_ci| I2cRead (WifiIotI2cIdx id, unsigned short deviceAddr, const WifiIotI2cData *i2cData) | 从I2C设备中读取数据 | 190a7ce71fSopenharmony_ci| I2cWriteread (WifiIotI2cIdx id, unsigned short deviceAddr, const WifiIotI2cData *i2cData) | 向I2C设备发送数据并接收数据响应 | 200a7ce71fSopenharmony_ci| I2cRegisterResetBusFunc (WifiIotI2cIdx id, WifiIotI2cFunc pfn) | 注册I2C设备回调 | 210a7ce71fSopenharmony_ci| I2cSetBaudrate (WifiIotI2cIdx id, unsigned int baudrate) | 设置I2C设备的波特率 | 220a7ce71fSopenharmony_ci 230a7ce71fSopenharmony_ci## 二、ssd1306 API 240a7ce71fSopenharmony_ci 250a7ce71fSopenharmony_ci本样例提供了一个HarmonyOS IoT硬件接口的SSD1306 OLED屏驱动库,其功能如下: 260a7ce71fSopenharmony_ci 270a7ce71fSopenharmony_ci* 内置了128*64 bit的内存缓冲区,支持全屏刷新; 280a7ce71fSopenharmony_ci* 优化了屏幕刷新速率,实测最大帧率10fps; 290a7ce71fSopenharmony_ci* `libm_port`是从musl libc中抽取的`sin`和`cos`的实现; 300a7ce71fSopenharmony_ci * 用于规避链接Hi3861 SDK中的libm_flash.a报错的问题; 310a7ce71fSopenharmony_ci* `gif2imgs.py` 可用于将gif动图中的帧分离出来; 320a7ce71fSopenharmony_ci * 依赖 pillow 包,可以使用 `pip install pillow` 命令安装; 330a7ce71fSopenharmony_ci* `img2code.py` 可用于将图片转为C数组,每个字节表示8个像素; 340a7ce71fSopenharmony_ci * 依赖 opecv-python 包,可以使用 `pip install opencv-python` 命令安装; 350a7ce71fSopenharmony_ci 360a7ce71fSopenharmony_ci* 使用Harmony OS的IoT硬件接口; 370a7ce71fSopenharmony_ci* 接口简洁易于使用、易于移植; 380a7ce71fSopenharmony_ci* 内置了测试程序,可直接进行测试; 390a7ce71fSopenharmony_ci 400a7ce71fSopenharmony_ci| API名称 | 说明 | 410a7ce71fSopenharmony_ci| ------------------------------------------------------------ | -------------------------- | 420a7ce71fSopenharmony_ci| void ssd1306_Init(void) | 初始化 | 430a7ce71fSopenharmony_ci| void ssd1306_Fill(SSD1306_COLOR color) | 以指定的颜色填充屏幕 | 440a7ce71fSopenharmony_ci| void ssd1306_SetCursor(uint8_t x, uint8_t y) | 定位光标 | 450a7ce71fSopenharmony_ci| void ssd1306_UpdateScreen(void) | 更新屏幕内容 | 460a7ce71fSopenharmony_ci| char ssd1306_DrawChar(char ch, FontDef Font, SSD1306_COLOR color) | 在屏幕缓冲区绘制1个字符 | 470a7ce71fSopenharmony_ci| char ssd1306_DrawString(char* str, FontDef Font, SSD1306_COLOR color) | 将完整字符串写入屏幕缓冲区 | 480a7ce71fSopenharmony_ci| void ssd1306_DrawPixel(uint8_t x, uint8_t y, SSD1306_COLOR color) | 在屏幕缓冲区中绘制一个像素 | 490a7ce71fSopenharmony_ci| void ssd1306_DrawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, SSD1306_COLOR color) | 用Bresenhem算法画直线 | 500a7ce71fSopenharmony_ci| void ssd1306_DrawPolyline(const SSD1306_VERTEX *par_vertex, uint16_t par_size, SSD1306_COLOR color) | 绘制多段线 | 510a7ce71fSopenharmony_ci| void ssd1306_DrawRectangle(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, SSD1306_COLOR color) | 绘制矩形 | 520a7ce71fSopenharmony_ci| void ssd1306_DrawArc(uint8_t x, uint8_t y, uint8_t radius, uint16_t start_angle, uint16_t sweep, SSD1306_COLOR color) | 绘图角度 | 530a7ce71fSopenharmony_ci| void ssd1306_DrawCircle(uint8_t par_x, uint8_t par_y, uint8_t par_r, SSD1306_COLOR color) | 用Bresenhem算法画圆 | 540a7ce71fSopenharmony_ci| void ssd1306_DrawBitmap(const uint8_t* bitmap, uint32_t size) | 绘图位图 | 550a7ce71fSopenharmony_ci| void ssd1306_DrawRegion(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint8_t* data, uint32_t size, uint32_t stride) | 绘制区域 | 560a7ce71fSopenharmony_ci 570a7ce71fSopenharmony_ci## 三、如何编译 580a7ce71fSopenharmony_ci 590a7ce71fSopenharmony_ci1. 将此目录复制到openharmony源码的根目录下 600a7ce71fSopenharmony_ci 610a7ce71fSopenharmony_ci2. 修改openharmony源码的`build/lite/product/wifiiot.json`文件: 620a7ce71fSopenharmony_ci 630a7ce71fSopenharmony_ci 将`//applications/sample/wifi-iot/app`替换为`//12_ssd1306:app`保存; 640a7ce71fSopenharmony_ci 650a7ce71fSopenharmony_ci3. 在openharmony源码目录下执行:`python build.py wifiiot` 660a7ce71fSopenharmony_ci 670a7ce71fSopenharmony_ci 680a7ce71fSopenharmony_ci## 四、编译错误解决 690a7ce71fSopenharmony_ci 700a7ce71fSopenharmony_ci本项目代码使用了IoT硬件子系统的I2C API接口,需要连接到hi3861的I2C相关接口;默认情况下,Hi3861的I2C编译配置没有打开,编译时会有如下错误: 710a7ce71fSopenharmony_ci 720a7ce71fSopenharmony_ci```txt 730a7ce71fSopenharmony_ciriscv32-unknown-elf-ld: ohos/libs/libhal_iothardware.a(hal_wifiiot_i2c.o): in function `.L0 ': 740a7ce71fSopenharmony_cihal_wifiiot_i2c.c:(.text.HalI2cWrite+0x12): undefined reference to `hi_i2c_write' 750a7ce71fSopenharmony_ciriscv32-unknown-elf-ld: hal_wifiiot_i2c.c:(.text.HalI2cInit+0x12): undefined reference to `hi_i2c_init' 760a7ce71fSopenharmony_ciscons: *** [output/bin/Hi3861_wifiiot_app.out] Error 1 770a7ce71fSopenharmony_ciBUILD FAILED!!!! 780a7ce71fSopenharmony_ci``` 790a7ce71fSopenharmony_ci 800a7ce71fSopenharmony_ci**解决方法** 810a7ce71fSopenharmony_ci 820a7ce71fSopenharmony_ci需要修改vendor\hisi\hi3861\hi3861\build\config\usr_config.mk文件: 830a7ce71fSopenharmony_ci`# CONFIG_I2C_SUPPORT is not set`行,修改为:`CONFIG_I2C_SUPPORT=y` 840a7ce71fSopenharmony_ci 850a7ce71fSopenharmony_ci## 五、效果演示 860a7ce71fSopenharmony_ci 870a7ce71fSopenharmony_ci1. 播放gif:https://www.bilibili.com/video/BV1Af4y1B7TD/ 880a7ce71fSopenharmony_ci * 使用本项目中的转换脚本将gif每一帧画面提取出来,转成bitmap数组,程序里循环播放 890a7ce71fSopenharmony_ci2. 播放视频:https://www.bilibili.com/video/BV1DK4y1f7yw/ 900a7ce71fSopenharmony_ci * C/S架构,开发板作为客户端,PC作为服务端,使用TCP传输每帧画面(因为视频帧数较多,开发板闪存放不下) 910a7ce71fSopenharmony_ci * 播放项目源码: https://gitee.com/hihopeorg/harmonyos_oled_player 920a7ce71fSopenharmony_ci 930a7ce71fSopenharmony_ci## 六、参考链接 940a7ce71fSopenharmony_ci 950a7ce71fSopenharmony_ci本项目是基于afiskon的stm32-ssd1306移植的,对部分细节做了修改和优化,原项目链接: 960a7ce71fSopenharmony_ci 970a7ce71fSopenharmony_ci* https://github.com/afiskon/stm32-ssd1306 980a7ce71fSopenharmony_ci 990a7ce71fSopenharmony_ci 1000a7ce71fSopenharmony_ci 1010a7ce71fSopenharmony_ci### 【套件支持】 1020a7ce71fSopenharmony_ci 1030a7ce71fSopenharmony_ci##### 1. 套件介绍 http://www.hihope.org/pro/pro1.aspx?mtt=8 1040a7ce71fSopenharmony_ci 1050a7ce71fSopenharmony_ci##### 2. 套件购买 https://item.taobao.com/item.htm?id=622343426064&scene=taobao_shop 1060a7ce71fSopenharmony_ci 1070a7ce71fSopenharmony_ci##### 3. 技术资料 1080a7ce71fSopenharmony_ci 1090a7ce71fSopenharmony_ci- Gitee码云网站(OpenHarmony Sample Code等) **https://gitee.com/hihopeorg** 1100a7ce71fSopenharmony_ci 1110a7ce71fSopenharmony_ci- HiHope官网-资源中心(SDK包、技术文档下载)[**www.hihope.org**](http://www.hihope.org/) 1120a7ce71fSopenharmony_ci 1130a7ce71fSopenharmony_ci##### 4. 互动交流 1140a7ce71fSopenharmony_ci 1150a7ce71fSopenharmony_ci- 润和HiHope技术交流-微信群(加群管理员微信13605188699,发送文字#申请加入润和官方群#,予以邀请入群) 1160a7ce71fSopenharmony_ci- HiHope开发者社区-论坛 **https://bbs.elecfans.com/group_1429** 1170a7ce71fSopenharmony_ci- 润和HiHope售后服务群(QQ:980599547) 1180a7ce71fSopenharmony_ci- 售后服务电话(025-52668590)