当前位置: 首页 > news >正文

D01粉尘传感器详解(STM32)

目录

一、介绍

二、传感器原理

1.原理图

2.引脚描述

三、程序设计

main.c文件

usart3.c文件

usart3.h文件

四、实验效果 

五、资料获取

项目分享


一、介绍

   D01粉尘传感器利用光学照射的原理,通过光路与电路的转换,测量出检测范围内的灰尘浓度,可灵敏检测直径为1μm以上灰尘颗粒物,直接应用单片机进行UART 通信。产品体积小、精度高、功耗低、测量范围宽、响应时间短、应用方便快捷。

以下是D01粉尘传感器的参数:

型号

D01

工作电压

 5V±5%

工作电流

15mA

检测种类

PM0.3~PM10

工作温度

-25~75

输出方式

UART

物理接口

ZH1.5mm-4P插座

哔哩哔哩视频链接:

D01粉尘传感器(STM32)

(资料分享见文末) 

二、传感器原理

1.原理图

2.引脚描述

 

三、程序设计

1.使用STM32F103C8T6读取DC01粉尘传感器采集的PM2.5数据,通过串口发送至电脑

2.将读取得到信息数据同时在OLED上显示

D01_TX

PB11

D01_RX

PB10

OLED_SCL

PB6

OLED_SDA

PB7

串口

串口1

main.c文件

#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "usart3.h"/*****************辰哥单片机设计******************STM32* 项目			:   D01粉尘传感器实验                     * 版本			:   V1.0* 日期			:   2025.7.28* MCU			:	STM32F103C8T6* 接口			:	参看usart3.h		 * BILIBILI    	:	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥 **********************BEGIN***********************/int value;
u8 buff[30];
int PM25_Value = 0;int main(void)
{ SystemInit();//配置系统时钟为72M	delay_init(72);LED_Init();LED_On();USART1_Config();USART3_Config();OLED_Init();printf("Start \n");delay_ms(1000);//显示“粉尘浓度:”OLED_ShowChinese(0,0,0,16,1);OLED_ShowChinese(16,0,1,16,1);OLED_ShowChinese(32,0,2,16,1);OLED_ShowChinese(48,0,3,16,1);OLED_ShowChar(64,0,':',16,1);while (1){LED_Toggle();Get_PM2_5();            //读取PM2.5if(PM25_Value>999)PM25_Value=999;sprintf((char*)buff,"%dug/m3  ",PM25_Value);
//		printf("粉尘浓度: %dug/m3\r\n",PM25_Value);OLED_ShowString(40,30,buff,16,1);delay_ms(500);}
}

usart3.c文件

#include "usart3.h"	
#include <stdbool.h>/*****************辰哥单片机设计******************STM32* 项目			:	D01粉尘传感器实验                     * 版本			:   V1.0* 日期			:   2025.7.28* MCU			:	STM32F103C8T6* 接口			:	串口3						* BILIBILI	    :	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥 **********************BEGIN***********************/unsigned char Usart3RecBuf[USART3_RXBUFF_SIZE];//串口2接收数据缓存
unsigned int  Rx3Counter = 0;   //串口2收到数据标志位
bool rev_start  = 0;     //接收开始标志
bool rev_stop   = 0;     //接收停止标志
u8 pmBuf[5];               //pm2.5数据缓存数组
#define  RATIO  1.0		   //校准系数,选择范围0.1~1.0 (传感器一般不需要校准,选择1.0即可)void USART3_Config(void){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);	//使能USART3,GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	//使能GPIOB时钟//USART3_TX   GPIOB.10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.10//USART3_RX	  GPIOB.11初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11  //Usart3 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;		//子优先级4NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = 9600;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式USART_Init(USART3, &USART_InitStructure); //初始化串口3USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(USART3, ENABLE);                    //使能串口3 }void USART3_IRQHandler(void)                	//串口3中断服务程序
{uint8_t Res;if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res = USART_ReceiveData(USART3);//接收模块的数据if ((Res == 0XA5)&&(rev_stop==0))  //如果收到0xA5,便开始接收{rev_start = 1;}if (rev_start == 1)  //标志位为1,开始接收{Usart3RecBuf[Rx3Counter] = Res;  //字符存到数组中Rx3Counter ++;if (Rx3Counter >= 4) 	         //一帧数据接收完成{rev_start = 0;rev_stop  = 1;Rx3Counter = 0;}}}if(USART_GetFlagStatus(USART3,USART_FLAG_ORE) == SET){USART_ClearFlag(USART3,USART_FLAG_ORE);}USART_ClearITPendingBit(USART3, USART_IT_RXNE);
} void Get_PM2_5(void)  //获取PM2.5值
{char i = 0;Rx3Counter = 0;if(rev_stop == 1)              //串口数据接收完成{for(i = 0; i < 4; i++){pmBuf[i] = Usart3RecBuf[i];}/* 校验数据是否接收正确,校验方法:判断前面3个字节累加和取低7位是否和最后第4个字节相等 */if(((pmBuf[0]+pmBuf[1]+pmBuf[2])&0x7F) == pmBuf[3])  {PM25_Value = (unsigned int)((pmBuf[1]*128) + pmBuf[2]) * RATIO;   //计算PM2.5(ug/m3) = (pmBuf[1]*128) + pmBuf[2] ;}rev_stop = 0;}
}

usart3.h文件

#ifndef __USART3_H
#define __USART3_H#include "stm32f10x.h"                  // Device header
#include "oled.h"
#include "usart.h"/*****************辰哥单片机设计******************STM32* 项目			:	D01粉尘传感器实验                     * 版本			:   V1.0* 日期			:   2025.7.28* MCU			:	STM32F103C8T6* 接口			:	参串口3						* BILIBILI  	:	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥 **********************BEGIN***********************/#define USART3_RXBUFF_SIZE   54 void USART3_Config(void);
uint8_t Usart3_GetRxFlag(void);
void Get_PM2_5(void);
extern int PM25_Value;#endif

四、实验效果 

五、资料获取

项目分享

http://www.dtcms.com/a/392475.html

相关文章:

  • 【小程序】微信小程序页面之间数据传递的五种方法
  • Taichi太极图形编程语言实践demo
  • [xboard]07-Makefile逐行分析1
  • 基于规则的专家系统对自然语言处理深层语义分析的影响与启示:历史演进、技术局限与未来融合路径
  • 鸿蒙分布式服务架构实战:从服务注册到远程调用的完整指南
  • PPT中设置和应用空白版式,和占位符干扰说再见
  • Elasticsearch 02
  • 283-基于Django的AppStore应用榜单数据可视化分析推荐系统
  • 星际漫游2025“∞无限”潮玩艺术周于顺德启幕,以东方符号重构潮流宇宙
  • Rust:重塑系统编程的未来,从安全到性能的技术革命
  • Vue 3 提供的 createElement 工具函数——h
  • 在开放系统互联参考模型(OSI)中,安全服务有哪些
  • 鸿蒙分布式文件操作实际开发案例
  • effect的参数和返回值
  • GAMIT 10.71 问题记录
  • 【愚公系列】《人工智能70年》032-机器翻译拆除语言樊篱(自然语言处理阔步前进)
  • 隐私与合规内建:Python医疗AI编程中的SBOM、依赖监测与威胁建模实践分析(下)
  • 基于C++11手撸前端Promise
  • C++学习笔记——内存管理
  • AI热点周报(09.14~09.20):Gemini集成到Chrome、Claude 强化记忆、Qwen3-Next快速落地,AI走向集成化,工程化?
  • 网络服务阶段——作业
  • OpenLayers地图交互 -- 章节三:选择交互详解
  • RocksDB:C++中的RAII锁应用解析
  • Linux920 RHEL 8 YUM配置;root密码;文件夹 磁盘分区 磁盘
  • yarn命令介绍(替代npm命令的JavaScript包管理工具)
  • MFC中开源布局库---ResizableLib
  • Scade 6 编译原理的参考实现 - LustreC
  • MFC List 控件详解:高效数据展示与管理
  • 从根到叶的二进制数之和(霍纳法则)
  • 隐私与合规内建:Python医疗AI编程中的SBOM、依赖监测与威胁建模实践分析(上)