智慧家居 - 基于 IOT Pi 的智能甲醛检测器

之前的文章体验 MS-RTOS 的时候动手了一个块 IOT Pi ,放着也是节约,这次咱们就利用 IOT PI 开发一个智能甲醛检测器。(><*)

对于 IOT Pi 和 MS_RTOS 的介绍能够看看 (初识 IOT Pi 与 MS-RTOS),这两个一个是翼辉推出的物联网开发板(官网介绍),一个是新一代小型物联网操作系统(官网介绍),之前只是跟着官网文档大略体验了一下,始终有想法去钻研真正实际一下,最近家里新买了一些家具正好做一个智能甲醛检测器来检测下甲醛是否超标。

软件筹备

应用 MS-RTOS 须要下载对应的 IDE 开发环境,下载资源以及装置应用能够参考官网教程:IoT Pi 疾速入门

其中须要装置的有 IoT Studio 、MS-RTOS AutoTester 这两个软件,别离是集成开发 IDE 和 烧写及日志查看工具。官网文档写得十分具体可,具体应用上遇到什么问题能够看看我之前写的:初识 IOT Pi 与 MS-RTOS 外面有我首次应用的时候遇到坑和解决办法。

硬件筹备

一块 IOT Pi 开发板、配合烧写的 Jlink ARM 仿真器(某宝一搜全都是)、一个甲醛检测传感器 (在写这篇文章的时候发现之前买的传感器下架了,链接是他们家另一款甲醛传感器,看了一下,uart 协定尽管有些些差距,然而和之前适配其余气体类传感器构造统一,只须要改变一处宏定义就能够兼容了,具体批改参照后文中的代码解析)

管脚连贯如下:3V3 - 3V3 、GND - GND 、RXD - PA2、 TXD - PA3

工程配置

依据官网文档 IoT Pi Pro 疾速入门 实现以下步骤:

在 MS-RTOS 云开发平台上实现 msrtos_base_sdk 配置和下载

在 IoT Stduio 上实现 msrtos_base_sdk 工程导入和编译

在 IoT Stduio 上实现 bspstm32f4xx 工程的下载和导入,如下图所示:

Wi-Fi AP 列表配置

bspstm32f4xx/src/board/IOT_PI/iot_pi_init.c 为 IoT Pi 开发板的初始化源文件,在此源文件中的 ap_list[] 变量用于指定手动连贯模式下尝试连贯到的 Wi-Fi AP 列表:

/** * WiFi AP list. */static const ms_esp_at_net_ap_t ap_list[] = {    { "EOS-00000F",    "123456789" }, // Spirit 1 的 Wi-Fi AP SSID 与明码 };

bspstm32f4xx 编译

选中 bspstm32f4xx 工程,点击 “编译” 按钮,将编译 bspstm32f4xx 工程,编译实现后,会在 Debug 目录生成 bspiotpi.bin 文件:

libsddc 配置及编译

在灵感桌面的机密宝库下载 libsddc :https://gitee.com/inspiration-desktop/libsddc.git

将整个目录替换 msrtos_base_sdk 工程中的 libsddc 目录;

选中 msrtos_base_sdk 工程,点击 “编译” 按钮,将编译 msrtos_base_sdk 工程的组件,编译实现后,会在 libsddc/Debug/sddc_examples/src/example/demo 目录生成 sddc_demo.bin 文件:

烧录验证

应用 MS-RTOS AutoTester 烧写镜像,请参考 《IoT Pi 疾速入门》 实现 bspiotpi.bindemo_sddc_sdk.bin 镜像烧写,留神不同的镜像须要烧写到不同的地址,如下表所示:

镜像烧写地址
bspiotpi.bin0x08000000
demo_sddc_sdk.bin0x08040000

按下 IoT Pi 开发板的 RESET 按键,MS-RTOS 操作系统启动后,将主动运行 0x08040000 地址处的 SDDC demo 程序:

能够参考 《IoT Pi 疾速入门》 或之前的文章 智能温度传感器!基于 arduino 的智能测温模块 在 Spirit 1 中进行设施增加,这里就不赘述了,关上之前写的 DDC 协定嗅探器进行下测试,看到甲醛浓度只有 0.01 这下能够释怀了;


还能够设定正告浓度,达到正告浓度后设施会被动上报以后甲醛浓度:

代码解析

因为当初购买到的甲醛传感器模块的协定和我文章中用到的不统一,须要批改 libsddc/src/sddc_sdk_lib/SDDC_SDK_UART_DEV.h 文件中的一个宏值,将 AIR_INFO_TYPE_1 改为 AIR_INFO_TYPE_2 即可:

#define AIR_INFO_TYPE_1   // 改为 AIR_INFO_TYPE_2#ifdef AIR_INFO_TYPE_1#define BUF_SIZE 40#endif#ifdef AIR_INFO_TYPE_2#define BUF_SIZE 24#endif#ifdef  AIR_INFO_TYPE_3#define BUF_SIZE 9#endif#define FRAME_HEADER_AA 0xaa#define FRAME_HEADER_2C 0x2c#define FRAME_HEADER_E4 0xe4#define UART_AIR_NAME "ch2o"#define WARN_REPORT_DATA 0.06  //甲醛超标浓度int uart_dev_init(void);sddc_bool_t uart_dev_state_get(char *objvalue, int value_len);sddc_bool_t uart_dev_state_set(const ms_uint64_t value);

libsddc/src/sddc_sdk_lib/SDDC_SDK_UART_DEV.h 文件中定义了三种类型的数据格式(其实并没有用到。。。)只有下面的宏定义和函数申明有用到。

libsddc/src/sddc_sdk_lib/SDDC_SDK_UART_DEV.c 文件中,有着 uart_dev_init 的实现。包含关上串口并配置,并启用一个线程来定期获取甲醛浓度:

int uart_dev_init(void){    fd = ms_io_open("/dev/uart2", O_RDWR, 0666);    ms_uart_param_t  param;    param.baud      = 9600;    param.data_bits = MS_UART_DATA_BITS_8B;    param.stop_bits = MS_UART_STOP_BITS_1B;    param.parity    = MS_UART_PARITY_NONE;    param.flow_ctl  = MS_UART_FLOW_CTL_NONE;    param.mode = MS_UART_MODE_TX_RX;    param.clk_pol = MS_UART_CPOL_LOW;    param.clk_pha = MS_UART_CPHA_1EDGE;    param.clk_last_bit = MS_UART_LAST_BIT_DISABLE;    int ret = ms_io_ioctl(fd, MS_UART_CMD_SET_PARAM, &param);    if (ret < 0) {        ms_printf("[error]: set uart param failed!\n");        ms_io_close(fd);        return -1;    }    warn_data = WARN_REPORT_DATA;    ret = ms_thread_create("t_uart",                           iot_pi_uart_dev_get_thread,                           MS_NULL,                           2048U,                           30U,                           70U,                           MS_THREAD_OPT_USER | MS_THREAD_OPT_REENT_EN,                           MS_NULL);    sddc_return_value_if_fail(ret == MS_ERR_NONE, -1);    return 0;}

iot_pi_uart_dev_get_thread 线程中定期 3s 获取一次甲醛浓度,校验数据无误后如果超过设置的正告浓度就上报到 Spirit 1下面:

void iot_pi_uart_dev_get_thread(){    ms_uint8_t buf[BUF_SIZE];    while(1) {        usleep(1000 * 3000);        ms_io_read(fd, &buf, sizeof(buf));        if(buf[0] == FRAME_HEADER_AA){//        if(buf[0] == FRAME_HEADER_2C && buf[1] == FRAME_HEADER_E4){            if (CheckSum(&buf, (BUF_SIZE-1)) != buf[BUF_SIZE-1]) {                printf("data checksum fail ...\n");                break;            } else {                printf("data checksum success ...\n");                uart_value_set(&buf);            }            if (data >= WARN_REPORT_DATA) {                uart_report_state();              }         }     }}

总结

MS-RTOS 和 IOT Pi 应用起来更偏差于一般的嵌入式操作系统开发,配置上封装没有 arduino 这么欠缺,还是要本人去配置串口和 GPIO 口什么的,然而 IDE 比 arduino 聪慧多了,MS-RTOS 开发手感也比 arduino 移植下来的那个半残的 FreeRTOS 好很多,欠缺很多。大部分 POSIX 接口都反对,然而用 MS-RTOS 接口代码运行效率更高。不过目前组件太少,只能做一些根底开发,心愿官网能退出更多的组件。