引言
今天来测试一下润和星闪开发套件中的温湿度功能。
程序分析
润和星闪开发套件所使用的外设板块和润和智能家居套件所采用的基本相同,所以润和提供的WS63E测试程序和hi3861的程序基本相同。。SSD1306和温湿度传感器AHT20都是基于I2C接口的,I2C是一种串行通信协议,允许将多个设备连接到一条总线上。每个连接到总线上的器件都有唯一地址,任何器件既可作为主机也可以作为从机,但同一时刻只允许有一个主机。
aht20_test.c
这段代码是一个嵌入式程序,用于在OLED显示屏上显示温湿度信息。它使用了I2C通信协议与AHT20温湿度传感器进行数据交互,并在OLED屏幕上显示这些数据。下面是对代码的分析:
-
headSize
数组定义了OLED屏幕的宽度和高度,这里都是64像素。 -
app_i2c_init_pin
函数初始化I2C通信的引脚。 -
TempHumChinese
函数用于在OLED屏幕上绘制中文字符“温”和“度”以及“湿”和“度”。这些字符的字模数据是从左到右、从上到下排列的,使用的是横向8位左高位的取模方式。字模数据被存储在fonts
和fonts2
数组中,每个字符占用32个字节,对应16x16像素的显示。 -
Aht20TestTask
函数是程序的主循环,它初始化I2C和OLED屏幕,然后不断循环读取AHT20传感器的温湿度数据,并在OLED屏幕上显示这些数据。温度和湿度的数据显示在屏幕的特定位置,并且每秒钟更新一次。 -
Aht20Test
函数创建了一个任务来运行Aht20TestTask
函数。 -
app_run
函数调用Aht20Test
来启动整个程序的运行。
代码中使用了ssd1306_DrawRegion
函数来在OLED屏幕上绘制字模,ssd1306_DrawString
函数来绘制字符串,以及ssd1306_UpdateScreen
函数来更新屏幕显示。
此外,代码中还包含了一些用于初始化I2C通信和AHT20传感器的函数,如uapi_i2c_master_init
和AHT20_Calibrate
。
整体来看,这段代码是一个完整的嵌入式应用程序,用于从AHT20传感器读取温湿度数据,并在OLED屏幕上以中文字符显示这些数据。
aht20.c
这段代码是用于与AHT20温湿度传感器进行通信的嵌入式程序。AHT20是一款集成了相对湿度和温度传感器的模块,它通过I2C接口与微控制器通信。下面是对代码的分析:
-
定义了一系列宏来表示AHT20传感器的不同命令和状态位。例如,
AHT20_CMD_TRIGGER
是触发测量的命令,AHT20_CMD_RESET
是软复位命令。 -
AHT20_STATUS_BUSY_SHIFT
、AHT20_STATUS_MODE_SHIFT
和AHT20_STATUS_CALI_SHIFT
定义了状态字节中不同位的偏移量。 -
AHT20_STATUS_BUSY_MASK
、AHT20_STATUS_MODE_MASK
和AHT20_STATUS_CALI_MASK
定义了用于提取状态位的掩码。 -
AHT20_STATUS_RESPONSE_MAX
定义了状态命令回复的最大字节数。 -
AHT20_RESLUTION
定义了传感器数据的分辨率,即2的20次方。 -
AHT20_MAX_RETRY
定义了在读取数据时的最大重试次数。 -
CONFIG_I2C_MASTER_BUS_ID
和I2C_SLAVE1_ADDR
定义了I2C总线ID和AHT20传感器的I2C地址。 -
aht20_status_busy
、aht20_status_mode
和aht20_status_cali
函数用于从状态字节中提取不同的状态信息。 -
AHT20_Read
和AHT20_Write
函数用于通过I2C接口读取和写入数据。 -
AHT20_StatusCommand
函数发送获取状态的命令。 -
AHT20_ResetCommand
函数发送软复位命令。 -
AHT20_CalibrateCommand
函数发送初始化校准命令。 -
AHT20_Calibrate
函数用于校准传感器。如果校准使能位不是1,它会发送初始化命令并等待校准完成。 -
AHT20_StartMeasure
函数发送触发测量命令,开始测量温湿度。 -
AHT20_GetMeasureResult
函数用于读取测量结果,并将原始数据转换为标准的温度和湿度值。它还会检查传感器是否忙碌,并在必要时重试读取数据。
代码中使用了osDelay
函数来实现延时,这可能是一个操作系统提供的函数,用于在读取数据前等待传感器完成测量。
整体来看,这段代码提供了完整的流程来初始化、校准、测量和读取AHT20传感器的数据。它处理了传感器的忙碌状态,并在读取数据时进行了错误处理。
ssd1306.c
这段代码是用于控制SSD1306 OLED显示屏的C语言库。SSD1306是一款常用的OLED驱动芯片,广泛应用于小型显示项目中。以下是对代码主要功能的分析:
-
ssd1306_Reset(void):
- 该函数通过延时1毫秒来重置OLED屏幕。这个延时对于屏幕启动非常重要。
-
ssd1306_SendData(uint8_t *buffer, uint32_t size):
- 该函数通过I2C接口发送数据到OLED屏幕。它接受一个数据缓冲区和大小,然后通过I2C写入这些数据。
-
ssd1306_WiteByte(uint8_t regAddr, uint8_t byte):
- 该函数用于向OLED屏幕的特定寄存器地址写入单个字节。
-
ssd1306_WriteCommand(uint8_t byte):
- 该函数发送命令到OLED屏幕的命令寄存器。
-
ssd1306_WriteData(uint8_t *buffer, uint32_t buff_size):
- 该函数将数据写入OLED屏幕的数据寄存器。它还会添加控制字节,以指示数据的开始。
-
SSD1306_Buffer:
- 这是一个静态数组,用作屏幕的缓冲区。
-
SSD1306:
- 这是一个静态结构体,保存了OLED屏幕的状态和配置。
-
ssd1306_FillBuffer(uint8_t *buf, uint32_t len):
- 该函数用固定长度的缓冲区填充屏幕缓冲区。
-
ssd1306_Init_CMD(void):
- 该函数初始化OLED屏幕的命令设置,包括显示模式、时钟分频、预充电周期等。
-
ssd1306_Init(void):
- 该函数初始化OLED屏幕,包括重置屏幕、设置内存地址模式、设置对比度等。
-
ssd1306_Fill(SSD1306_COLOR color):
- 该函数用指定颜色填充整个屏幕缓冲区。
-
ssd1306_UpdateScreen(void):
- 该函数将屏幕缓冲区的内容更新到OLED屏幕上。
-
ssd1306_DrawPixel(uint8_t x, uint8_t y, SSD1306_COLOR color):
- 该函数在屏幕缓冲区中绘制单个像素。
-
ssd1306_DrawChar(char ch, FontDef Font, SSD1306_COLOR color):
- 该函数在屏幕缓冲区中绘制单个字符。
-
ssd1306_DrawString(char *str, FontDef Font, SSD1306_COLOR color):
- 该函数在屏幕缓冲区中绘制字符串。
-
ssd1306_SetCursor(uint8_t x, uint8_t y):
- 该函数设置光标位置。
-
ssd1306_DrawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, SSD1306_COLOR color):
- 该函数使用Bresenham算法绘制直线。
-
ssd1306_DrawPolyline(const SSD1306_VERTEX *par_vertex, uint16_t par_size, SSD1306_COLOR color):
- 该函数绘制多边形线。
-
ssd1306_DrawCircle(uint8_t par_x, uint8_t par_y, uint8_t par_r, SSD1306_COLOR par_color):
- 该函数使用Bresenham算法绘制圆形。
-
ssd1306_DrawRectangle(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, SSD1306_COLOR color):
- 该函数绘制矩形。
-
ssd1306_DrawBitmap(const uint8_t *bitmap, uint32_t size):
- 该函数绘制位图。
-
ssd1306_DrawRegion(uint8_t x, uint8_t y, uint8_t w, const uint8_t *data, uint32_t size):
- 该函数在指定区域绘制数据。
-
ssd1306_SetContrast(const uint8_t value):
- 该函数设置屏幕对比度。
-
ssd1306_SetDisplayOn(const uint8_t on):
- 该函数打开或关闭OLED屏幕显示。
-
ssd1306_ClearOLED(void):
- 该函数清空OLED屏幕。
-
ssd1306_printf(char *fmt, ...):
- 该函数格式化并打印字符串到OLED屏幕。
整体来看,这段代码提供了一套完整的函数库,用于初始化、配置和在SSD1306 OLED屏幕上绘制各种图形和文本。代码中使用了I2C通信协议与OLED屏幕进行数据交换,并通过屏幕缓冲区来管理显示内容。
操作步骤
- 将vendor/HiHope_NearLink_DK_WS63E_V03/demo/environment复制到\src\application\samples\peripheral文件夹下。
- 在src\application\samples\peripheral\CMakeLists.txt文件中新增编译案例,可以在“set(SOURCES "${SOURCES}" PARENT_SCOPE)”上面一行添加。
if(DEFINED CONFIG_SAMPLE_SUPPORT_ENVIRONMENT) add_subdirectory_if_exist(environment) endif()
- 在src\application\samples\peripheral\Kconfig文件中新增编译案例,可以在最后一行添加。
config SAMPLE_SUPPORT_ENVIRONMENT bool prompt "Support ENVIRONMENT Sample." default n depends on ENABLE_PERIPHERAL_SAMPLE help This option means support ENVIRONMENT Sample.
- 在menuconfig中选择“Application/Enable the Sample of peripheral”,在弹出框中选择“support ENVIRONMENT Sample”,点击Save,关闭弹窗。
- 重新编译程序,然后烧写程序即可。
测试结果
软件烧录成功后,按一下开发板的RESET按键复位开发板,板上小屏幕实时显示环境温度和湿度。
结语
由于和hi3861的程序几乎完全相同,这个测试也比较顺利。后面再测试一下雷达模块,然后就可以将几个模块整合到一起了。