【鸿蒙智能硬件】(三)环境监测板的开发与应用

目录

五.环境监测板的开发与应用

MQ-2燃气传感器开发

电路图分析

实现步骤

1.创建工程目录code3及工程源码mq2demo.c

2.编写构建文件BUILD.gn(app/youdianjike/code3/BUILD.gn)

3.注册组件到子系统,修改app下的BUILD.gn文件(app/BUILD.gn)

AHT20温湿度传感器开发

板载器件介绍

[AHT20 温湿度传感器](#AHT20 温湿度传感器)

电路图分析

实现步骤

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

2.创建aht20demo.c,引入头文件并声明宏

3.打开I2C的CONFIG选项

4.修改模块构建脚本

5.配置模块到应用子系统(app/BUILD.gn)

6.编译下载烧写运行测试

综合气味温湿度传感器构建环境检测

OLED液晶显示屏开发

板载器件介绍

电路图分析

实现步骤

1.导入驱动文件oled_ssd1306.c、oled_ssd1306.h

2.创建oleddemo.c,创建初始化oled函数

3.修改模块的构建脚本

4.配置工程模块(app/BUILD.gn)

在OLED上显示环境监测的数据(气味、温度、湿度值)

修改envdemo.c文件

code3/BUILD.gn

app/BUILD.gn

编译下载烧写执行


五.环境监测板的开发与应用

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",
    ]
}

编译下载烧写执行

...

相关推荐
聆思科技AI芯片20 小时前
【AI硬件开发上手教程】怎么使用AI编程实现小聆AI语音控制舵机
人工智能·嵌入式硬件·开源·ai编程·智能硬件
AiNightVision3 天前
星光级 是什么?——星光级摄像机是什么?0.001Lux 照度门槛与选型真相
人工智能·算法·车载系统·自动驾驶·无人机·视频·智能硬件
美摄科技5 天前
智能硬件如何增加一键成片剪辑功能?
数码相机·智能手机·智能硬件
光子物联单片机5 天前
ESP32传感器模块编程实践(一)DIY智能WIFI视频控制小车
嵌入式硬件·esp32·智能硬件·硬件
蒲公英内测分发5 天前
智能家居厂商有多个产品线,包装上的 App 下载入口该共用还是分开?
android·人工智能·数码相机·机器人·智能家居·智能硬件
老孟说禅7 天前
测试中的安全规范
智能硬件
Industio_触觉智能8 天前
把NPU检测直接嵌进采集终端|RK3576 AI采集终端全链路拆解教程-上
人工智能·嵌入式硬件·硬件架构·硬件工程·智能硬件·npu·rk3576
键道之下8 天前
便携标签机在墨西哥经销体系中的 App 交付责任怎么划分?
人工智能·智能手机·零售·智能硬件·智能硬件出海·硬件出海
蒲公英内测分发9 天前
智能手表卖出去后,包装、说明书和官网里的 App 下载入口怎么统一?
前端·人工智能·测试工具·智能家居·智能硬件·智能手表
Alinket9 天前
不训练模型也能加 AI:5 套可直接量产的组合方案
人工智能·物联网·ai·健康医疗·无线通信·智能硬件·iot