目录
2.编写构建文件BUILD.gn(app/youdianjike/code3/BUILD.gn)
3.注册组件到子系统,修改app下的BUILD.gn文件(app/BUILD.gn)
[AHT20 温湿度传感器](#AHT20 温湿度传感器)
1.导入驱动文件aht20.c、aht20.h到code3工程目录
1.导入驱动文件oled_ssd1306.c、oled_ssd1306.h
五.环境监测板的开发与应用
MQ-2燃气传感器开发

MQ-2 气体传感器所使用的气敏材料是在清洁空气中导电率较低的二氧化锡(SnO2)。当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。
使用简单的电路即可将电导率的变化转化为与该气体浓度相对应的输出信号。
MQ-2 气体传感器对丙烷、烟雾的灵敏度高,对天然气和其他可燃蒸汽的检测也很理想
检测气体:可燃气体、烟雾
检测浓度:300-10000ppm(1ppm=1立方厘米/1立方米)
控制方式: 本传感器通过 J7 接口 ADC 引脚上报检测结果
电路图分析
Hi3861 通过 CON10 接口ADC引脚访问该传感器


实现步骤
1. 创建工程目录 code3 及工程源码mq2demo.c
在工程源码mq2demo.c中引入头文件及声明宏
完成可燃气体浓度值读取功能
创建线程并初始化
//在工程源码mq2demo.c中引入头文件及声明宏
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_adc.h"
#include "wifiiot_errno.h"
#define GAS_SENSOR_CHAN_NAME WIFI_IOT_ADC_CHANNEL_5//传感器通道
//编写函数,完成可燃气体值的读取函数
static void Mq2DemoTask(void *arg)
{
(void)arg;
GpioInit();//初始化设备
while (1)
{
unsigned short data = 0;//读取的传感器数据
//读取可燃气体值
//.equ_model 4: 12位分辨率,1.2V参考电压
//.cur_bais_default: 默认电流基准
if (AdcRead(GAS_SENSOR_CHAN_NAME, &data, WIFI_IOT_ADC_EQU_MODEL_4, WIFI_IOT_ADC_CUR_BAIS_DEFAULT, 0) == WIFI_IOT_SUCCESS)
{
printf("qi wei value:%d\n", data);
}
sleep(1);
}
}
//创建线程并初始化
static void Mq2DemoTaskEntry(void)
{
osThreadAttr_t attr;
attr.name = "Mq2DemoTask";//线程名称
attr.attr_bits = 0;//线程属性
attr.cb_mem = NULL;//回调函数内存
attr.cb_size = 0;//回调函数内存大小
attr.stack_mem = NULL;//栈内存
attr.stack_size = 2048;//栈内存大小
attr.priority = osPriorityNormal;//线程优先级
//创建线程,并初始化,Mq2DemoTask为任务函数的名称
if (osThreadNew(Mq2DemoTask, NULL, &attr) == NULL)
{
printf("Failed to create Mq2DemoTask!\n");
}
}
//执行线程任务
APP_FEATURE_INIT(Mq2DemoTaskEntry);
2.编写构建文件BUILD.gn(app/ youdianjike/code3/BUILD.gn )
static_library("mq2app") {
sources = [
"mq2demo.c"
]
include_dirs = [
"//utils/native/lite/include",
"//kernel/liteos_m/components/cmsis/2.0",
"//base/iot_hardware/interfaces/kits/wifiiot_lite",
]
}
3.注册组件到子系统,修改app下的BUILD.gn文件(app/BUILD.gn)
import("//build/lite/config/component/lite_component.gni")
lite_component("app") {
features = [
"youdianjike/code3:mq2app",
]
}
4.编译下载烧写运行
....
AHT20温湿度传感器开发
板载器件介绍

AHT20 温湿度传感器
产品特点 :
测量范围:
温度:-40℃ to 80℃
湿度:0%RH to 80%RH
相对湿度误差±2%RH
温度误差±0.3%
电路图分析
Hi3861 通过 CON10 接口 SCL 引脚、SDA 引脚以 IIC 接口方式访问该传感器
GPIO13 连接SDA 引脚
GPIO14 连接SCL 引脚


实现步骤
1.导入驱动文件aht20.c、aht20.h到code3工程目录

2.创建aht20demo.c,引入头文件并声明宏
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_i2c.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_errno.h"
#include "aht20.h"
#define AHT20_BAUDRATE 400 * 1000
#define AHT20_I2C_IDX WIFI_IOT_I2C_IDX_0
//初始化I2C
void init(void)
{
GpioInit();
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_13, WIFI_IOT_IO_FUNC_GPIO_13_I2C0_SDA);
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_14, WIFI_IOT_IO_FUNC_GPIO_14_I2C0_SCL);
I2cInit(AHT20_I2C_IDX, AHT20_BAUDRATE);
}
//编写温湿度数据读取功能的函数
static void AhtDemoTask(void *arg){
(void)arg;
init();//调用设备初始化
uint32_t retval = 0;//返回值
float humidity = 0.0f;//湿度值
float temperature = 0.0f;//温度值
while (WIFI_IOT_SUCCESS != AHT20_Calibrate()){//AHT20校准
printf("AHT20 sensor init failed!\r\n");
sleep(5);//等待1ms
}
//循环获取温湿度传感器的数据
while (1){
retval = AHT20_StartMeasure();//触发AHT20测量
printf("retval:%d\n", retval);
if (retval != WIFI_IOT_SUCCESS){//触发AHT20测量失败
printf("trigger measure failed!\r\n");
sleep(5);
}else {
retval = AHT20_GetMeasureResult(&temperature, &humidity);//获取AHT20测量结果
printf("temp: %.2f, humi: %.2f\n", temperature, humidity);//打印AHT20测量结果
}
sleep(1);
}
}
//创建线程函数并初始化
static void AhtDemoTaskEntry(void)
{
osThreadAttr_t attr;
attr.name = "AhtDemoTask";//线程名称
attr.attr_bits = 0;//线程属性
attr.cb_mem = NULL;//回调函数内存
attr.cb_size = 0;//回调函数内存大小
attr.stack_mem = NULL;//栈内存
attr.stack_size = 2048;//栈内存大小
attr.priority = osPriorityNormal;//线程优先级
//创建线程,并初始化,AhtDemoTask为任务函数的名称
if (osThreadNew(AhtDemoTask, NULL, &attr) == NULL)
{
printf("Failed to create AhtDemoTask!\n");
}
}
//执行线程函数
APP_FEATURE_INIT(AhtDemoTaskEntry);
3.打开I2C的CONFIG选项
修改vendor\hisi\hi3861\hi3861\build\config\usr_config.mk文件中的CONFIG_PWM_SUPPORT行
默认情况下,hi3861_sdk中,I2C的CONFIG选项没有打开
CONFIG_I2C_SUPPORT is not set
CONFIG_I2C_SUPPORT=y
4.修改模块构建脚本
BUILD.gn(app/youdianjike/code3/BUILD.gn)
static_library("envapp") {
sources = [
"aht20demo.c",
"aht20.c",
]
include_dirs = [
"//utils/native/lite/include",
"//kernel/liteos_m/components/cmsis/2.0",
"//base/iot_hardware/interfaces/kits/wifiiot_lite",
]
}
5.配置模块到应用子系统(app/BUILD.gn)
import("//build/lite/config/component/lite_component.gni")
lite_component("app") {
features = [
"youdianjike/code3:envapp",
]
}
6.编译下载烧写运行测试
....
综合气味温湿度传感器构建环境检测
1.构建环境监测源代码envdemo.c
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_i2c.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_errno.h"
#include "aht20.h"
#include "wifiiot_adc.h"
#define GAS_SENSOR_CHAN_NAME WIFI_IOT_ADC_CHANNEL_5//传感器通道
#define AHT20_BAUDRATE 400 * 1000
#define AHT20_I2C_IDX WIFI_IOT_I2C_IDX_0
//初始化I2C
void init(void)
{
GpioInit();
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_13, WIFI_IOT_IO_FUNC_GPIO_13_I2C0_SDA);
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_14, WIFI_IOT_IO_FUNC_GPIO_14_I2C0_SCL);
I2cInit(AHT20_I2C_IDX, AHT20_BAUDRATE);
}
//编写温湿度数据读取功能的函数
static void AhtDemoTask(void *arg){
(void)arg;
init();//调用设备初始化
uint32_t retval = 0;//返回值
unsigned short data = 0;//读取的气味传感器数据
float humidity = 0.0f;//湿度值
float temperature = 0.0f;//温度值
while (WIFI_IOT_SUCCESS != AHT20_Calibrate()){//AHT20校准
printf("AHT20 sensor init failed!\r\n");
sleep(5);//等待1ms
}
//循环获取温湿度传感器的数据
while (1){
retval = AHT20_StartMeasure();//触发AHT20测量
printf("retval:%d\n", retval);
if (retval != WIFI_IOT_SUCCESS){//触发AHT20测量失败
printf("trigger measure failed!\r\n");
sleep(5);
}else {
//读取可燃气体值
//.equ_model 4: 12位分辨率,1.2V参考电压
//.cur_bais_default: 默认电流基准
if (AdcRead(GAS_SENSOR_CHAN_NAME, &data, WIFI_IOT_ADC_EQU_MODEL_4, WIFI_IOT_ADC_CUR_BAIS_DEFAULT, 0) == WIFI_IOT_SUCCESS)
{
printf("qi wei value:%d\n", data);
}
//读取温湿度传感器的数据
retval = AHT20_GetMeasureResult(&temperature, &humidity);//获取AHT20测量结果
printf("temp: %.2f, humi: %.2f\n", temperature, humidity);//打印AHT20测量结果
}
sleep(1);
}
}
//创建线程函数并初始化
static void AhtDemoTaskEntry(void)
{
osThreadAttr_t attr;
attr.name = "AhtDemoTask";//线程名称
attr.attr_bits = 0;//线程属性
attr.cb_mem = NULL;//回调函数内存
attr.cb_size = 0;//回调函数内存大小
attr.stack_mem = NULL;//栈内存
attr.stack_size = 2048;//栈内存大小
attr.priority = osPriorityNormal;//线程优先级
//创建线程,并初始化,AhtDemoTask为任务函数的名称
if (osThreadNew(AhtDemoTask, NULL, &attr) == NULL)
{
printf("Failed to create AhtDemoTask!\n");
}
}
//执行线程函数
APP_FEATURE_INIT(AhtDemoTaskEntry);
修改模块的构建脚本app/youdianjike/code3/BUILD.gn
static_library("envapp") {
sources = [
"envdemo.c",
"aht20.c",
]
include_dirs = [
"//utils/native/lite/include",
"//kernel/liteos_m/components/cmsis/2.0",
"//base/iot_hardware/interfaces/kits/wifiiot_lite"
]
}
配置模块到子系统(注册模块到子系统)app/BUILD.gn
#youdianjike/code1是模块的工程相对路径
#helloapp是添加的模块,指向./applications/sample/wifi-iot/app/youdianjike/code1/BUILD.gn中的static_library("helloapp")。
import("//build/lite/config/component/lite_component.gni")
lite_component("app") {
features = [
"youdianjike/code3:envapp",
]
}
编译下载烧写执行
....
OLED液晶显示屏开发
板载器件介绍

型号:JMD0.96 寸 4pin GND 显示屏模块
产品特点 :
高分辨率:128*64
广可视角度:大于 160°
低功耗:正常显示时 0.06W
宽供电范围:直流 3.3V-5V
通信方式:IIC
亮度、对比度可以通过程序指令控制
内部驱动芯片:SSD1306
控制方式: Hi3861 通过 J2 接口 SCL 引脚、SDA 引脚以 IIC 接口方式控制该 OLED 模块
电路图分析
SDA复用GPIO13
SCL复用GPIO14

实现步骤
1. 导入驱动文件oled_ssd1306.c、oled_ssd1306.h

2.创建oleddemo.c,创建初始化oled函数
#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include "oled_ssd1306.h"
//初始化设备的函数
void init(void)
{
GpioInit();
OledInit();
}
//编写呈现数据的函数
static void OledTask(void *arg){
(void)arg;
init();//调用初始化方法
OledFillScreen(0x00);//清空屏幕,填充背景颜色
OledShowString(0, 0, "Hello, HarmonyOS", 1);//在屏幕上显示字符串0列0行呈现字符信息
sleep(1);
for (int i = 0; i < 3; i++) {
OledFillScreen(0x00);//清空屏幕
for (int y = 0; y < 8; y++){
static const char text[] = "ABCDEFGHIJKLMNOP"; // QRSTUVWXYZ
OledShowString(0, y, text, 1);
}
sleep(1);
}
}
//编写线程函数并初始化
static void OledTaskEntry(void)
{
osThreadAttr_t attr;
attr.name = "OledTask";//线程名称
attr.attr_bits = 0;//线程属性
attr.cb_mem = NULL;//回调函数内存
attr.cb_size = 0;//回调函数内存大小
attr.stack_mem = NULL;//栈内存
attr.stack_size = 2048;//栈内存大小
attr.priority = osPriorityNormal;//线程优先级
//创建线程,并初始化,OledTask为任务函数的名称
if (osThreadNew(OledTask, NULL, &attr) == NULL)
{
printf("Failed to create OledTask!\n");
}
}
//执行线程函数
APP_FEATURE_INIT(OledTaskEntry);
3.修改模块的构建脚本
static_library("envapp") {
sources = [
#"envdemo.c",
#"aht20.c",
"oleddemo.c",
"oled_ssd1306.c",
]
include_dirs = [
"//utils/native/lite/include",
"//kernel/liteos_m/components/cmsis/2.0",
"//base/iot_hardware/interfaces/kits/wifiiot_lite"
]
}
4. 配置工程模块 (app/BUILD.gn)
import("//build/lite/config/component/lite_component.gni")
lite_component("app") {
features = [
"youdianjike/code3:envapp",
]
}
编译下载烧写执行
....
在OLED上显示环境监测的数据(气味、温度、湿度值)
修改envdemo.c文件
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_i2c.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_errno.h"
#include "aht20.h"
#include "wifiiot_adc.h"
#include "oled_ssd1306.h"
#define GAS_SENSOR_CHAN_NAME WIFI_IOT_ADC_CHANNEL_5//传感器通道
#define AHT20_BAUDRATE 400 * 1000
#define AHT20_I2C_IDX WIFI_IOT_I2C_IDX_0
//初始化I2C
void init(void)
{
GpioInit();
OledInit();//初始化OLED
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_13, WIFI_IOT_IO_FUNC_GPIO_13_I2C0_SDA);
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_14, WIFI_IOT_IO_FUNC_GPIO_14_I2C0_SCL);
I2cInit(AHT20_I2C_IDX, AHT20_BAUDRATE);
}
//编写温湿度数据读取功能的函数
static void AhtDemoTask(void *arg){
(void)arg;
init();//调用设备初始化
uint32_t retval = 0;//返回值
unsigned short data = 0;//读取的气味传感器数据
float humidity = 0.0f;//湿度值
float temperature = 0.0f;//温度值
OledFillScreen(0x00);//清空屏幕,填充背景颜色
while (WIFI_IOT_SUCCESS != AHT20_Calibrate()){//AHT20校准
printf("AHT20 sensor init failed!\r\n");
sleep(5);//等待1ms
}
//循环获取温湿度传感器的数据
while (1){
retval = AHT20_StartMeasure();//触发AHT20测量
printf("retval:%d\n", retval);
if (retval != WIFI_IOT_SUCCESS){//触发AHT20测量失败
printf("trigger measure failed!\r\n");
sleep(5);
}else {
//读取可燃气体值
//.equ_model 4: 12位分辨率,1.2V参考电压
//.cur_bais_default: 默认电流基准
if (AdcRead(GAS_SENSOR_CHAN_NAME, &data, WIFI_IOT_ADC_EQU_MODEL_4, WIFI_IOT_ADC_CUR_BAIS_DEFAULT, 0) == WIFI_IOT_SUCCESS)
{
printf("qi wei value:%d\n", data);
}
//读取温湿度传感器的数据
retval = AHT20_GetMeasureResult(&temperature, &humidity);//获取AHT20测量结果
printf("temp: %.2f, humi: %.2f\n", temperature, humidity);//打印AHT20测量结果
OledShowString(0, 0, "Env data:", 1);//在屏幕上显示字符串0列0行呈现字符信息
//将温度值转为字符串
char temp_str[10];
snprintf(temp_str, sizeof(temp_str), "Temp: %.2f", temperature);
OledShowString(0, 1, temp_str, 1);//在屏幕上显示字符串0列2行呈现字符信息
//将湿度值转为字符串
char humi_str[10];
snprintf(humi_str, sizeof(humi_str), "Humi: %.2f", humidity);
OledShowString(0, 2, humi_str, 1);//在屏幕上显示字符串0列3行呈现字符信息
//将可燃气体值转为字符串
char gas_str[10];
snprintf(gas_str, sizeof(gas_str), "Gas: %d", data);
OledShowString(0, 3, gas_str, 1);//在屏幕上显示字符串0列4行呈现字符信息
}
sleep(1);
}
}
//创建线程函数并初始化
static void AhtDemoTaskEntry(void)
{
osThreadAttr_t attr;
attr.name = "AhtDemoTask";//线程名称
attr.attr_bits = 0;//线程属性
attr.cb_mem = NULL;//回调函数内存
attr.cb_size = 0;//回调函数内存大小
attr.stack_mem = NULL;//栈内存
attr.stack_size = 2048;//栈内存大小
attr.priority = osPriorityNormal;//线程优先级
//创建线程,并初始化,AhtDemoTask为任务函数的名称
if (osThreadNew(AhtDemoTask, NULL, &attr) == NULL)
{
printf("Failed to create AhtDemoTask!\n");
}
}
//执行线程函数
APP_FEATURE_INIT(AhtDemoTaskEntry);
code3/BUILD.gn
static_library("envapp") {
sources = [
"envdemo.c",
#"oleddemo.c",
"aht20.c",
"oled_ssd1306.c",
]
include_dirs = [
"//utils/native/lite/include",
"//kernel/liteos_m/components/cmsis/2.0",
"//base/iot_hardware/interfaces/kits/wifiiot_lite"
]
}
app/BUILD.gn
import("//build/lite/config/component/lite_component.gni")
lite_component("app") {
features = [
"youdianjike/code3:envapp",
]
}
编译下载烧写执行
...