PM2.5 激光粉尘传感器之DSL-08(DS-08)

news2025/2/22 21:05:13

一款产品里用到粉尘检测,最后在淘宝上找一到了一款,攀藤型号是:PMS9003 还有一款外形类似型号是DSL-08。看了资料是可以通用的。

传感器的产品资料放在百度网盘里

链接:https://pan.baidu.com/s/1oNCwO7n9oEdzju91cF99xg?pwd=1234 
提取码:1234

芯片:STM32F103C8T6

粉尘传感器:DSL-08

    通电后,粉尘传感器是一直发送32个字节的数据过来,所以我们只要解析出这个数据,对应PDF文档资料换算就可以了。在使用过程中发现单片机对DSL-08传感器发送各种命令都无效。

 过程如下:

一、设置串口3为接收端,利用USART3的DMA空闲不定长收发。

新建两个文档:PMS.C  PMS.H

PMS.C文档

/*
PM2.5驱动文件
型号:DSL-08 
日期:2023.9.18
*/

#include "string.h"
#include "stdio.h"
#include "usart.h"

#include "PMS/PMS.H"

用户自定义变量//
struct PM_Data PM;											//定义一个PM的结构体变量

uint8_t TX3CMD[9]={0XAA,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XBB};			//发送命令包
uint8_t RX3Buffer[BufferSize]={0};			//串口接收缓存
uint8_t RX3Len = 0;											//串口接收数据长度

/*****************************************************************
* 名    称: SendCMD()
* 功    能: 串口3发送1个字节
* 入口参数: t  发送的字节
* 出口参数: 无
*****************************************************************/
void  SendCMD(uint8_t t)
{
	HAL_UART_Transmit(&huart3, &t, 1, 0xffff);
}

/*****************************************************************
* 名    称: WriteCMD
* 功    能: 发送控制命令
* 入口参数: 根据资料,发送相应命令
* 出口参数: 无
* 说明:将命令写入后,生成校验和,DMA发送
* PM2.5模块默认是一直发送数据的,可以不必操作命令也能使用。
	根据资料测试命令无效,不受控制。
*****************************************************************/
void WriteCMD(uint8_t Command)
{
	uint16_t CRCTemp = 0;
	
	CRCTemp=TX3CMD[0]+Command+(uint8_t)TX3CMD[8];	//生成校验和
	
	TX3CMD[6]= CRCTemp>>8;
	TX3CMD[7]= CRCTemp;						//第6 7位为校验和位,将数据拆分

	HAL_UART_Transmit_DMA(&huart3, TX3CMD,sizeof(TX3CMD));	//DMA发送
	
//验证
//	for(uint8_t i=0;i<9;i++)
//	{
//		printf("%d :%0X  ",i,TX3CMD[i]); 
//	}
//	printf("\r\n");
}
/*****************************************************************
* 名    称: 
* 功    能: 将数据显示出来
* 入口参数: 
* 出口参数: 无
*****************************************************************/
void PrintfData(void)
{
	if(RX3Len==32)
	{
		printf("长度:%d\r\n",RX3Len);
		for(uint8_t i=0;i<RX3Len;i++)
		{
//			printf("RX3Buffer[%d]=%0X\r\n",i,RX3Buffer[i]);
			printf("%d: %0X  ",i+1,RX3Buffer[i]);
		}
//清0,进行下一轮读取
//		for(uint8_t i=0;i<RX3Len;i++)
//		{
//			RX3Buffer[i]=0;				//缓存数据清0
//		}
		
//		RX3Len=0;			//退出前清0
	}
}

/*****************************************************************
* 名    称: GetPMData
* 功    能: 将接收到的数据转换
* 入口参数: 无
* 出口参数: 无
* 说明:
* 
*****************************************************************/

void GetPMData(void)
{
	if(RX3Buffer[0]!=0X42&&RX3Buffer[1]!=0X4D)
	{
		RX3Len=0;
	}
	else if(RX3Len>31)
	{
		uint16_t H_valueTemp;
		H_valueTemp=0;
		PM.PM1 = ((H_valueTemp|RX3Buffer[4]) << 8) | RX3Buffer[5];		//PM1.0浓度
		H_valueTemp=0;
		PM.PM2 = ((H_valueTemp|RX3Buffer[6]) << 8) | RX3Buffer[7];		//PM2.5浓度
		H_valueTemp=0;
		PM.PM10 = ((H_valueTemp|RX3Buffer[8]) << 8) | RX3Buffer[9];		//PM10浓度
		
		//0.1升空气中的颗粒物数量
		H_valueTemp=0;
		PM.Dust_03um = ((H_valueTemp|RX3Buffer[16]) << 8) | RX3Buffer[17];		//0.3um
		H_valueTemp=0;
		PM.Dust_05um = ((H_valueTemp|RX3Buffer[18]) << 8) | RX3Buffer[19];		//0.5um
		H_valueTemp=0;
		PM.Dust_1um = ((H_valueTemp|RX3Buffer[20]) << 8) | RX3Buffer[21];			//1um
		H_valueTemp=0;
		PM.Dust_2um = ((H_valueTemp|RX3Buffer[22]) << 8) | RX3Buffer[23];			//2.5um
		H_valueTemp=0;
		PM.Dust_5um = ((H_valueTemp|RX3Buffer[24]) << 8) | RX3Buffer[25];			//5um
		H_valueTemp=0;
		PM.Dust_10um = ((H_valueTemp|RX3Buffer[26]) << 8) | RX3Buffer[27];		//10um

//		printf("\r\nPM浓度:\r\n");
//		printf("PM1.0=%dug/m3  ",PM.PM1);
//		printf("PM2.5=%dug/m3  ",PM.PM2);
//		printf("PM10=%dug/m3 ",PM.PM10);
//		printf("\r\n0.1升空气中的颗粒物:\r\n");
//		printf("0.3um=%d个 0.5um=%d个 1.0um=%d个 2.5um=%d个 5um=%d个 10um=%d个\r\n",PM.Dust_03um,PM.Dust_05um,PM.Dust_1um,PM.Dust_2um,PM.Dust_5um,PM.Dust_10um);

	}
}


PMS.H

/*! 
*  \file hmi_driver.h
*  \brief DS-08 PM2.5激光传感器
*  \version 1.0
*  \date 2023.9.18
*  \copyright 攀藤科技,小米专用
*/

#ifndef _PMS_
#define _PMS_


#include "main.h"


#define BufferSize  64  //缓存宽度最小64


//#define CMD_HEAD 0XAA      //帧头
//#define CMD_TAIL 0XBB      //帧尾

//#define SEND_DATA(P) SendCMD(P)          //发送一个字节
//#define BEGIN_CMD() TX_8(0XAA)            //帧头
//#define END_CMD() TX_8(0XBB)       				//帧尾

//PM2.5相关函数
//数据结构体
struct PM_Data{						
			uint16_t PM1;							//标准下PM1.0浓度
			uint16_t PM2;						//标准下PM2.5浓度
			uint16_t PM10;					//标准下PM10浓度
			uint16_t Dust_03um;			//0.1升空气中0.3um颗粒个数
			uint16_t Dust_05um;			//0.1升空气中0.5um颗粒个数
			uint16_t Dust_1um;			//0.1升空气中1um颗粒个数
			uint16_t Dust_2um;			//0.1升空气中2.5um颗粒个数
			uint16_t Dust_5um;			//0.1升空气中5um颗粒个数
			uint16_t Dust_10um;			//0.1升空气中10um颗粒个数
			uint16_t CheckCRC;
};

extern struct PM_Data PM;									//定义一个PM的结构体变量
extern uint8_t RX3Buffer[BufferSize];			//串口接收缓存
extern uint8_t RX3Len;											//串口接收数据长度

/函数/
void  SendCMD(uint8_t t);
void InitDustSensor(void);
//void ReadDustSensor(void);
void AutoRun(void);
void WriteCMD(uint8_t Command);
void PrintfData(void);
void GetPMData(void);

#endif

 在main.c中加入头文件
//激光粉尘传感器
#include "PMS/PMS.H"

初始化中加入,开启不定长接收

///PM2.5传感器/
//外设:USART3//
	HAL_UARTEx_ReceiveToIdle_DMA(&huart3,RX3Buffer,BufferSize);  //开启空闲中断并调用DMA,数据存入RXBuffer 
//	HAL_UART_Receive_DMA(&huart2,RXBuffer,BUFFER_SIZE);//开启一次接收
	__HAL_UART_ENABLE_IT(&huart3, UART_IT_ERR);//使能串口错误中断

加入中断回调函数

/**
  * 函数功能: 串口空闲中断DMA回调函数
  * 输入参数: huart为串口号,Size为空闲接收数据位数  
  * 返 回 值: 无
  * 说    明:STM32CubeMX中 RX的DMA Mode设置成
  */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{

	 if(huart->Instance == USART3)
	 {
	//			printf("进入空闲中断,串口3\r\n");
			HAL_UART_AbortReceive(&huart3); //该函数有两个功能,先关闭DMA接收,但DMA能发送,置位RX Ready状态,忽略了错误标志和IT标志处理,比HAL_UART_DMAStop好
			RX3Len=Size;
			HAL_UARTEx_ReceiveToIdle_DMA(&huart3, RX3Buffer, BufferSize);//开启DMA空闲接收,将接收的数据存入RX3Buffer,数据长度 BufferSize
	 }
	
}

while循环中只要调用GetPMData()函数就可以了,记得加个延时,不然可能会卡死

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1029275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PX4 通过 Vision 实现 Position、Altitude 和 Offboard 模式

本文通过 VINS-Fusion 的里程计信息为 PX4 提供视觉信息&#xff0c;从而达到 视觉定高和定点 的目的 主要工作为创建一个将 vins 里程计信息发布给 Mavros 的 /mavros/vision_pose/pose 话题 首先创建一个工作空间 mkdir -p ~/catkin_ws/src/vision_to_mavros/src/ cd ~/ca…

使用Java将PPT、PPTX和PDF转换为图片

从Office到图片—使用Java实现文件格式转换 PDF转图片1. 万事第一步2. 撸代码 PPT/PPTX转图片1. 万事第一步2. 撸代码验收一下 最近小雨遇到了一个需求&#xff0c;需要在前端小程序中嵌入展示Office文件的功能。然而&#xff0c;前端使用开源组件进行在线预览会导致性能消耗较…

PostgreSQL设置主键为自增

1、创建自增序列 CREATE SEQUENCE table_name_id_seq START 1; 2、设置字段默认值 字段默认值中设置 nextval(table_name_id_seq) 3、常用查询 -- 查询所有序列 select * from information_schema.sequences where sequence_schema public; -- 查询自增序列的当前值 select cu…

【分布式计算】七、同步 synchronization 重难点

两个协议&#xff1a; 1、NTP&#xff08;Network Time Protocal)–>广泛使用    机器周期向时间服务器获取准确时间   2、没有协议名称 − > -> −>没有广泛使用    时间服务器周期扫描所有机器&#xff0c;计算时间平均值&#xff1b;导致时间服务器负载…

Mac使用sz/rz

从使用体验上说,sz/rz要比scp要好得多.但Mac上使用这两个命令需要进行相应配置. sz&#xff1a;将选定的文件发送&#xff08;send&#xff09;到本地机器 rz&#xff1a;运行该命令会弹出一个文件选择窗口&#xff0c;从本地选择文件上传到Linux服务器 下载安装lrzsz brew i…

小红书“不误正夜”指南丨2023夜间营销数据报告

对于当代年轻人来说&#xff0c;白天的 8 小时需要献给工作、学习和社交&#xff0c;夜晚时光才真正属于自己。“下班后开始新的一天”&#xff0c;越来越多人开始认同这个概念&#xff0c;告别“报复性熬夜”&#xff0c;重新掌握晚间生活的方向盘&#xff0c;多样化的生活方式…

芯片核数造假,华为不装了,网友直呼这一波赚翻了!

首先说一下之前以为华为是青岛新恩制作的芯片&#xff0c;但是在最新的一个消息中发现&#xff0c;麒麟芯片其实是华为子公司自主研发生产的。 2个重量级消息&#xff0c;华为突破芯片封锁后&#xff0c;美国科技界惊出一身冷汗&#xff01; 华为麒麟9000s是中芯国际做的吗&…

Linux-Nginx安装

一、Nginx下载 官网下载地址&#xff1a; https://nginx.org/en/download.html 国内镜像地址&#xff1a; https://mirrors.huaweicloud.com/nginx 二、Nginx安装 1. 将下载的Nginx安装包上传到Linux服务器指定安装盘符下&#xff0c;解压zip包 tar -zxvf nginx-1.23.3.ta…

使用亚马逊云服务器在 G4 实例上运行 Android 应用程序

随着 Android 应用程序和游戏变得越来越丰富&#xff0c;其中有些甚至比 PC 上的软件更易于使用和娱乐&#xff0c;因此许多人希望能够在云上运行 Android 游戏或应用程序&#xff0c;而在 EC2 实例上运行 Android 的解决方案可以让开发人员更轻松地测试和运行 Android 应用程序…

京东商品详情数据采集接口

使用京东商品详情接口的具体流程如下&#xff1a; 注册账号并登录。填写应用相关信息&#xff0c;包括应用名称、应用描述、应用回调地址等&#xff0c;然后提交申请。审核通过后&#xff0c;进入应用管理页面&#xff0c;点击“应用信息”&#xff0c;获取应用Key和应用Secre…

Kubernetes(k8s)上搭建一主两从的mysql8集群

Kubernetes上搭建一主两从的mysql8集群 环境准备搭建nfs服务器安装NFS暴露nfs目录开启nfs服务器 安装MySQL集群创建命名空间创建MySQL密码的Secret安装MySQL主节点创建pv和pvc主节点的配置文件部署mysql主节点 安装第一个MySQL Slave节点创建pv和pvc第一个从节点配置文件部署my…

Python实现Redis缓存MySQL数据并支持数据同步

简介 本文讲讲如何用Redis做MySQL的读缓存&#xff0c;提升数据库访问性能。 MySQL是一种很常用的关系型数据库&#xff0c;用于持久化数据&#xff0c;并存放在磁盘上。但如果有大数据量的读写&#xff0c;靠MySQL单点就会捉襟见肘&#xff0c;尽管可以在MySQL本身做优化&am…

【Python大纲】S0 系列博文大纲

系列博文大纲 Python 环境建议系列博文相关书籍系列博文大纲阶段进展 Python 环境建议 “工欲善其事、必先利其器”&#xff0c;“三分手艺、七分家伙”&#xff0c;选择一个好用的开发环境对于编程而言至关重要。博主不过多赘述&#xff0c;提出的建议是&#xff1a;Anaconda…

Invalid prop: custom validator check failed for prop “percentage

在使用element 进度条时出现如下报错&#xff1a; Invalid prop: custom validator check failed for prop “percentage 这是因为percentage的取值范围为0-100 检查下自己的值是否超出这个范围了

eclipse svn插件安装

1.进入eclipse的help->Eclipse Marketplace,如下图所示&#xff1a; 2.输入“svn”,再按回车&#xff0c;如下图&#xff1a; 3.这我选择的是 Subversive,点击后面的“install”按钮&#xff0c;如下图 Eclipse 下连接 SVN 库有两种插件 —— Subclipse 与 Subversive &…

想要精通算法和SQL的成长之路 - 预测赢家

想要精通算法和SQL的成长之路 - 预测赢家 前言一. 预测赢家二. 石子游戏&#xff08;预测赢家的进阶版&#xff09;2.1 博弈论 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 预测赢家 原题链接 主要思路&#xff1a; 我们定义dp[i][j]&#xff1a;在区间 [i, j] 之间先…

QT 6.5下载安装及配置教程

一、下载 今天打算换一个QT安装版本,去官网看了一眼发现变成了在线安装。 本来官方下载的就慢,现在更是雪上加霜,现在给大家推荐几种下载方式。 1、国内镜像 中国科学技术大学&#xff1a;http://mirrors.ustc.edu.cn/qtproject/ 清华大学&#xff1a;https://mirrors.tuna.ts…

基于强化学习的节能路由(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

员工电脑怎么监控(怎样远程监控员工电脑)

随着科技的发展&#xff0c;企业对于员工电脑的监控已经成为了企业管理的重要手段。通过监控员工电脑&#xff0c;企业可以更好地管理员工的工作效率、保护企业数据安全以及维护企业的正常运营。本文将详细介绍如何监控公司员工电脑的方法和步骤。 监控员工电脑的目的 提高工作…

Selenium-介绍下其他骚操作

Chrome DevTools 简介 Chrome DevTools 是一组直接内置在基于 Chromium 的浏览器&#xff08;如 Chrome、Opera 和 Microsoft Edge&#xff09;中的工具&#xff0c;用于帮助开发人员调试和研究网站。 借助 Chrome DevTools&#xff0c;开发人员可以更深入地访问网站&#xf…