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

目录

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

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

编译下载烧写执行

...

相关推荐
物联网软硬件开发-轨物科技3 小时前
【轨物方案】无刷 vs 有刷:针对不同电站需求的清洁机器人智能硬件选型指南
网络·机器人·智能硬件
学嵌入式的小杨同学14 天前
嵌入式硬件开发入门:PCB 设计核心流程 + 基础元器件实战指南
vscode·后端·嵌入式硬件·架构·vim·智能硬件·pcb工艺
国产化创客24 天前
ESP32+Web实现智能气象站
前端·物联网·智能家居·智能硬件
产品经理邹继强1 个月前
技术债:智能硬件与时间的对赌协议
智能硬件
国产化创客1 个月前
ESP32+Web服务器实现室内环境数据采集
物联网·智能家居·智能硬件
学AI不秃头1 个月前
一键部署到 Jetson:在 PC 上开发,点击一下自动同步代码 + 配环境 + 运行(demo 开源)
人工智能·深度学习·计算机视觉·开源·智能硬件
暖馒1 个月前
Modbus应用层协议的深度剖析
网络·网络协议·c#·wpf·智能硬件
蓝帆傲亦1 个月前
智能体革命!我用ModelEngine三小时打造智能面试官,效果震惊HR部门
机器人·智能硬件
zzdYEjLL1 个月前
探索MATLAB在雷达信号仿真中的奇妙世界:从LFM脉冲压缩到信号分析
智能硬件