OneNET麒麟座应用开发之二:串口读取PM25传感器数据

作为环境数据监测站首先要获取大气中可吸入颗粒物的数据。为了检测PM25数据,我们采用北京海联信为的HLPM025K3型号传感器,该传感器使用激光法测量PM25和PM10的数据。

该型传感器的检测对象如下:

M2.5:测量空气中0.3-2.5微米颗粒物;

PM10:测量空气中 0.3-10微米颗粒物。

该传感器采用的通讯协议如下:

(1)波特率: 9600bit/S;数据位:8位;停止位:1位;校验位:无;

(2)数据发送间隔时间为0.8~1.2S(秒) ,

(3)数据格式:7个字节,其中校验位=PM2.5(H)+PM2.5(L)+PM10(H)+PM10(L)。如图:

(4)数据处理:

接收到的数据按公式计算后得到PM2.5和PM10的值,例如:

PM2.5= ( PM2.5(H)×256+PM2.5(L)) ×0.1;

PM10= ( PM2.5(H)×256+PM2.5(L)) ×0.1

传感器要与OneNet麒麟座相连,我们必须看看其接口需求:

如上图所示其需要5V电源和一个串口以及一个GPIO口,我们在麒麟座上发现USART1(PA9:USART1_TX,PA10:USART1_RX)端口已经引到了J5端子排的J5_6和J5_5。同时需要的一个GPIO口我们选用PA8,因为也被引到了J5端子排的J5_7。只有5V电源我们没有发现引出来,但这没有问题,所有的5V电源均引自电源开关SW1的第6脚,我们焊接一根导线来解决这个问题。至于接地(GND)已经引到了端子排J5_9和J6_2,直接使用就可以了。

接好线后我们使用STM32CubeMX配置好硬件接口,串口的通讯参数,中断,时钟等,并生成基本的配置代码,如下图所示:

配置代码如下:

static void MX_USART1_UART_Init(void)

{

huart1.Instance = USART1;

huart1.Init.BaudRate = 9600;

huart1.Init.WordLength = UART_WORDLENGTH_8B;

huart1.Init.StopBits = UART_STOPBITS_1;

huart1.Init.Parity = UART_PARITY_NONE;

huart1.Init.Mode = UART_MODE_TX_RX;

huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

huart1.Init.OverSampling = UART_OVERSAMPLING_16;

if (HAL_UART_Init(&huart1) != HAL_OK)

{

Error_Handler();

}

HAL_UART_Receive_IT(&huart1, (uint8_t *)rxBuffer, 7);

}

以上最后一行用于开启接收中断并且设置接收缓冲以及接收缓冲接收最大数据量,因为传感器的返回字节为固定的7个字节所以我们就直接设定好了。当然中断产生后,中断服务程序会关掉中断,所以我们在回调函数中要将其重开才能进行下一次接收。

static void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct;

__HAL_RCC_GPIOD_CLK_ENABLE();

__HAL_RCC_GPIOA_CLK_ENABLE();

HAL_GPIO_WritePin(Senser_Set_GPIO_Port, Senser_Set_Pin, GPIO_PIN_SET);

GPIO_InitStruct.Pin = Senser_Set_Pin;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(Senser_Set_GPIO_Port, &GPIO_InitStruct);

}

void HAL_UART_MspInit(UART_HandleTypeDef* huart)

{

GPIO_InitTypeDef GPIO_InitStruct;

if(huart->Instance==USART1)

{

__HAL_RCC_USART1_CLK_ENABLE();

GPIO_InitStruct.Pin = GPIO_PIN_9;

GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

GPIO_InitStruct.Pin = GPIO_PIN_10;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pull = GPIO_NOPULL;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);

HAL_NVIC_EnableIRQ(USART1_IRQn);

}

}

配置完成后我们还需要按照协议对数据进行解析,解析完全就是将协议翻译成编程语言,非常简单,在此就不说了。最后再来一张结果显示:

时间: 2024-10-26 08:56:08

OneNET麒麟座应用开发之二:串口读取PM25传感器数据的相关文章

OneNET麒麟座应用开发之十:空气质量数据监测站项目总结

大气质量数据监测站用于测试空气质量监测及数据采集,实现野外或者室内空气质量的检测. 1.项目概述 本项目是一个定制项目,要求采集大气的压力.温度.湿度.PM25.位置等数据并上传到指定的后台服务器.但有时候因为没有条件或因为各种原因不能联网,则采用本地保存的方式,本地保存我们决定使用SD卡来实现.除此外,为了实现显式需求,还需要配套一些东西来实现饮食的需求,如实时时钟记录,上传联网方式的选择等. 2.硬件设计 本项目涉及到的硬件并不复杂,我们对其中几个实用比较多的电路做一个说明.首先说一下串口通

OneNET麒麟座应用开发之九:与SD卡通讯并保存数据

由于需要记录的数据量比较大,而且有些时候,有的用户不方便实时上传数据,所以要求使用SD卡存储数据然后人工收取上传.为此我们选择了一种通用的SD卡读写器. 1.读卡器简介 该读卡器整合 SD 卡规范和 FAT 文件格式规范,只要通过本模块规定的通讯协议就可以把数据存储在 SD 卡中的文件中.该读卡器连接方便采用串口通讯方式,如下图: 该读卡器摸块通讯协议比较简单,本模块的通讯协议分为命令发送和命令的应答两部分,其中命令格式由4个部分组成:命令识别码(0x55 0xAA),命令号,字节数(参数的个数

Java开发之I/O读取文件实例详解

在java开发或者android开发中,读取文件是不可避免的,以下对java开发中读取文件做了归纳和详解: 1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. */ public static void readFileByBytes(String fileName) { File file = new File(fileN

iOS开发之Socket通信实战--Request请求数据包编码模块

实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncSocket来进行长连接连接和传输数据,该第三方地 址:https://github.com/robbiehanson/CocoaAsyncSocket,读者可以自行google或者baidu搜索 这个库的用法,网上有很多资料,而且用法不难. 在一些对Socket通信使用需求不是很高的应用中,比如需要

(56)Linux驱动开发之二

内核基础 1.linux内核主要是由进程调度.内存管理.虚拟文件系统(字符设备驱动和块设备驱动).网络接口(网络设备驱动)和进程通信5个子系统组成的. 1)进程调度控制系统中的多个进程对CPU的访问,使得多个进程能在CPU中"微观串行,宏观并行"地执行. 2)内存管理的主要作用就是控制多个进程安全的共享主内存区域,当CPU提供内存管理单元时,linux内存管理完成为每个进程进行虚拟内存到物理内存的转换.一般而言,linux的每一个进程享有4GB的内存空间.0~3GB为用户空间,3~4G

STM32L476应用开发之二:模拟量数据采集

采集模拟量数据在一台一起中是必不可少的功能.在本次实验中我们要采集的模拟量值主要包括氧气传感器的输出以及压力变送器的输出. 1硬件设计 我们需要采集数据对精度有一定的要求,而STM32L476自带ADC为12位的,所以我们采用独立的ADC芯片来完成这一工作.由于使用经验的关系,我们选择了AD7705芯片. AD7705为完整16位.低成本.Σ-Δ型ADC,适合直流和低频交流测量应用.其具有低功耗(3 V时最大值为1 mW)特性,因而可用于环路供电.电池供电或本地供电的应用中.片内可编程增益放大器

嵌入式驱动开发之spi---spi串口通信调试

一. 概念 SPI是 Serial Peripheral Interface(串型外部接口)的缩写.SPI接口有4根PIN脚,分别是:          * SPICLK     : 用于传输数据的同步时钟          * SPIMISO    : 用于主模式下的输入,或从模式下的输出信号线          * SPIMOSI    : 用于主模式下的输出,或从模式下的输入信号线          * PSS        : 用于从设备的片选信号,低有效 SPI 通信两端各自扮演主设备

yii2-basic后台管理功能开发之二:创建CRUD增删改查

昨天实现了后台模板的嵌套,今天我们可以试着创建CRUD模型啦 刚开始的应该都是“套用”,不再打算细说,只把关键的地方指出来. CRUD即数据库增删改查操作.可以理解为yii2为我们做了一个组件,来实现基本的增删改查视图和操作. 1.创建数据库表 2.用gii生成model模型 3.用gii生成CRUD 需要注意的是CRUD生成的控制器的namespace,要和当前所在目录保持一致.否组路由会报错,找不到该页面等信息.

DJI SDK iOS 开发之二:搭建基本的开发环境

本文想介绍搭建基本的DJI SDK iOS下的开发环境,不过DJI官方已经给出了很详细的运行其demo的教程,网址如下: https://dev.dji.com/cn/guide 我这里总结一下搭建一个新的工程的步骤: Step 1:注册一个app 这里的识别码和app密钥很重要.DJI在这里做了限制. 对于iOS开发来说,识别码就是工程的bundle identifier.密钥则使用SDK在运行时对程序进行注册. Step 2:建立工程 Step 3:导入DJISDK.Framework 这个