智慧家居 - 基于 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.bin 0x08000000
demo_sddc_sdk.bin 0x08040000

按下 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 接口代码运行效率更高。不过目前组件太少,只能做一些基础开发,希望官方能加入更多的组件。

手把手搭建自己的智能家居 - 基于 IOT Pi 的智能甲醛检测器的更多相关文章

  1. Mentor面向智能家居的IoT方案

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wireless_com/article/details/82111734 眼下有各种智能家居的自己主 ...

  2. 从零开始的DIY智能家居 - 基于 ESP32 的智能浇水器

    前言 上次 土壤湿度传感器 完成之后,就立下一个 flag 要搭建一个智慧浇水的智能场景,现在终于有时间填坑了!(o゚▽゚)o 智慧浇水场景的核心设备有三个: 检测土壤状态的:土壤湿度传感器 通过这个 ...

  3. 从零开始的DIY智能家居 - 基于 ESP32 的土壤湿度传感器

    前言 自从上次做了那个 甲醛传感器 和 水浊度传感器 之后开始尝到智能家居的甜头了,这两东西有没有用我不知道,但是没事的时候掏出手机瞄两眼,看着就让人很安心( ̄︶ ̄). 于是懒惰的我开始琢磨把给植物浇 ...

  4. 从零开始的DIY智能家居 - 基于 ESP32 的智能水浊度传感器

    前言 家里有个鱼缸养了几条鱼来玩玩,但是换水的问题着实头疼,经常一个不注意就忘记换水,鱼儿就没了.o(╥﹏╥)o 在获得 Spirit 1 边缘计算机 后就相当于有了一个人智能设备服务器,可以自己开发 ...

  5. 从零开始 DIY 智能家居 - 基于 ESP32 的智能紫外线传感器模块

    目录 前言 硬件选择 二.使用步骤 获取代码 设备控制命令: 设备和协议初始化流程: 配置设备信息 回调函数注册 数据获取与上报流程 总结 前言 做了这么多传感器都是自己玩,这次家里人看不下去了,非得 ...

  6. 从零开始 DIY 智能家居 - 基于 ESP32 的智能语音合成播报模块

    目录 前言 硬件选择 代码解析 获取代码 设备控制命令: 设备和协议初始化流程: 配置设备信息 回调函数注册 语音播报与设置流程 总结 前言 这里这么多设备,突然发现我做的好像都是传感器之类的居多好像 ...

  7. 从零开始的DIY智能家居 - 基于 ESP32 的智能光照传感器

    前言 上周出差有点急,结果家里灯没关,开了整整一周的时间(T▽T),整个人都裂开了,准备做一个能够远程控制灯的东西,让我以后出差能远程把家里灯关了. 第一步就是做这期的主题 - 智能光照传感器,因为我 ...

  8. 【智能家居篇】wifi在智能家居中的应用

    转载请注明出处:http://blog.csdn.net/Righthek 谢谢! 在设计智能家居系统方案时,一个很关键的point就是组网方式.组网方式关系到整个智能家居系统的稳定性.可扩展性.实时 ...

  9. 基于能量收集的智能家居-2013国家级大学生创业实践项目申报_商业计划书_V0.2

    SmartHome项目商业计划 基于能量收集的 免电池无线智能家居系统    IA-SmartHome团队    2012.12     l  基于无线的智能家居解决方案,节省施工成本: l  基于能 ...

随机推荐

  1. P1118 [USACO06FEB]Backward Digit Sums G/S

    P1118 [USACO06FEB]Backward Digit Sums G/S 题解:  (1)暴力法.对1-N这N个数做从小到大的全排列,对每个全排列进行三角形的计算,判断是否等于N.  对每个 ...

  2. 洛谷P1603——斯诺登的密码(字符串处理)

    https://www.luogu.org/problem/show?pid=1603#sub 题目描述 2013年X月X日,俄罗斯办理了斯诺登的护照,于是他混迹于一架开往委内瑞拉的飞机.但是,这件事 ...

  3. django forms的常用命令及方法(二)

    根据别人网上发布,个人爱好收集 1.创建Form类 from django.forms import Form from django.forms import widgets from django ...

  4. 『Python』matplotlib坐标轴应用

    1. 设置坐标轴的位置和展示形式 import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl mpl.use ...

  5. 《DotNet Web应用单文件部署系列》三、混淆dll文件

    众所周知,C#编译后的dll文件可被反编译,网上搜索"C# 反编译"会出现一大堆资料.为了提高反编译成本,我们必须对dll文件进行混淆处理. 目前,C#混淆工具很多,我推荐obfu ...

  6. IdentityServer4系列[6]授权码模式

    授权码模式是一种混合模式,是目前功能最完整.流程最严密的授权模式.它主要分为两大步骤:认证和授权.其流程为: 用户访问客户端,客户端将用户导向Identity Server. 用户填写凭证信息向客户端 ...

  7. 二、mybatis之数据输出

    上一篇我们做了一个入门案例,是我们做mybatis的基本步骤,不熟悉的可以回顾一下https://www.cnblogs.com/jasmine-e/p/15330355.html,在这篇文章中只是简 ...

  8. 1.pytest初尝试

    语法规范 pytest命令会默认执行以 -- test_**.py -- 或 -- **_test.py -- 命名文件的测试用例 pytest的测试用例必须以 -- test -- 开头 def t ...

  9. 分组密码(五)AES算法② — 密码学复习(八)

    在上一篇简单复习了AES的历史时间节点.产生背景.与DES的对比.算法框图(粗略)以及一些数学基础,如果不记得的话点击这里回顾.下面将介绍AES算法的细节. 下面给出AES算法的流程,图片来源:密码算 ...

  10. PHP审计之class_exists与任意实例化漏洞

    PHP审计之class_exists与任意实例化漏洞 前言 发现PHP的一些漏洞函数挺有意思,跟着七月火师傅的文章来学习. class_exists函数 函数说明 class_exists:(PHP ...