芯查查logo
  • 数据服务
    1. 新产品
    2. 物料选型
    3. 查替代
    4. 丝印反查
    5. 查品牌
    6. PCN/PDN
    7. 查方案
    8. 查代理
    9. 数据合作
  • SaaS/方案
      SaaS产品
    1. 供应链波动监控
    2. 半导体产业链地图
    3. BOM管理
    4. 解决方案
    5. 汽车电子
    6. 政府机构
    7. 数据API
  • 商城
  • 行业资讯
    1. 资讯
    2. 直播
  • 论坛社区
    1. 论坛
    2. 学习
    3. 测评中心
    4. 活动中心
    5. 积分商城
  • 查一下
  • 开通会员
基于STM32+TFT屏幕读取PM5003T颗粒物传感器
原创 精华 发布时间:2023/05/24 21:20
版块:
开源项目
简介:利用STM32F103ZE芯片,TFT液晶屏显示读取PM5003T颗粒物传感器的数据。

1:PM5003T颗粒物传感器产品介绍:

PMS5003T 是一款可以同时监测空气中颗粒物浓度及温湿度的二合一传感器。其中颗粒物浓度的监测基于激光散射原理,可连续采集并计算单位体积内空气中不 同粒径的悬浮颗粒物个数,即颗粒物浓度分布,进而换算成为质量浓度。传感器同时内嵌瑞士生产的温湿度一体检测芯片。颗粒物浓度数值及温度、湿度合并以通用数字接口形式输出。本传感器可嵌入各种与空气质量监测和改善相关的仪器设备,为其提供及时准确的环境参数。

工作原理:

本传感器采用激光散射原理。即令激光照射在空气中的悬浮颗粒物上产生散射, 同时在某一特定角度收集散射光,得到散射光强随时间变化的曲线。进而微处理 器利用基于米氏(MIE)理论的算法,得出颗粒物的等效粒径及单位体积内不同 粒径的颗粒物数量。

2:硬件接口定义:

输出结果:

1. 主要输出为单位体积内各浓度颗粒物质量以及个数,其中颗粒物个数的单位 体积为 0.1 升,质量浓度单位为:微克/立方米。

2. 输出分为主动输出和被动输出两种状态。传感器上电后默认状态为主动输出, 即传感器主动向主机发送串行数据,时间间隔为 200~800ms,空气中颗粒物 浓度越高,时间间隔越短。主动输出又分为两种模式:平稳模式和快速模式。 在空气中颗粒物浓度变化较小时,传感器输出为平稳模式,即每三次输出同样的一组数值,实际数据更新周期约为 2s。当空气中颗粒物浓度变化较大时, 传感器输出自动切换为快速模式,每次输出都是新的数值,实际数据更新周 期为 200~800ms。

3. 温湿度输出:输出吸入传感器内部的采样空气温度及湿度。

典型电路连接方式:

电路设计应注意:


1. PMS5003T 需要 5V 供电,这是因为风机需要 5V 驱动。但其他数据通讯和控 制管脚均需要 3.3V 作为高电平。因此与之连接通讯的主板 MCU 应为 3.3V 供 电。如果主板 MCU 为 5V 供电,则在通讯线(RXD、TXD)和控制线(SET、 RESET)上应当加入电平转换芯片或电路。

2. SET 和 RESET 内部有上拉电阻,如果不使用,则应悬空。

3. PIN7 和 PIN8 为程序内部调试用,应用电路中应使其悬空。

4. 应用休眠功能时应注意:休眠时风扇停止工作,而风扇重新启动需要至少 30秒的稳定时间,因此为获得准确的数据,休眠唤醒后传感器工作时间不应低于 30秒。

3:软件代码:

使用串口1,波特率:9600bps 检验位:无 停止位:1位

3.1串口1配置方式:

串口通讯配置步骤:

串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();

串口复位:USART_DeInit(); 这一步不是必须的

GPIO端口模式设置:GPIO_Init();

串口参数初始化:USART_Init();

开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)

     NVIC_Init();

     USART_ITConfig();

⑥使能串口:USART_Cmd();

⑦编写中断处理函数:USARTx_IRQHandler();

⑧串口数据收发:

void USART_SendData();//发送数据到串口,DR

uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据

⑨串口传输状态获取:

FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);

void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);

void uart_init(u32 bound)

{

//GPIO端口设置

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟

//USART1_TX   GPIOA.9

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

//USART1_RX   GPIOA.10初始化

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

//Usart1 NVIC 配置

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //子优先级3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

//USART 初始化设置

USART_InitStructure.USART_BaudRate = bound;//串口波特率

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(USART1, &USART_InitStructure); //初始化串口1

 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断

 USART_Cmd(USART1, ENABLE);                    //使能串口1

}

3.2 数据接收函数:

void USART1_IRQHandler(void)                 //串口1中断服务程序

{

u8 Res;

#if SYSTEM_SUPPORT_OS   //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.

OSIntEnter();    

#endif

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)

 {

   Res =USART_ReceiveData(USART1); //读取接收到的数据

   

   if(u8UART3RecvStatus == 0)  

   {

   if(Res== 0x42)

   {

    USART_RX_STA = 0 ;

    USART_RX_BUF[USART_RX_STA] = Res ;

     u8UART3RecvStatus = 1;

   }  

  }

  else if(u8UART3RecvStatus == 1)  

  {

      if(Res== 0x4D)

   {

    u8UART3RecvStatus = 2  ;

    USART_RX_STA ++ ;

    USART_RX_BUF[USART_RX_STA] = Res ;

   }

   else

    u8UART3RecvStatus = 0  ;

  }

  else if (u8UART3RecvStatus == 2)

 {

     USART_RX_STA ++ ;

    USART_RX_BUF[USART_RX_STA] = Res ;

    if(USART_RX_STA >= 31)

    {

     USART_RX_STA = 0 ;      

     memcpy(Deal_USART_RX_BUF,&USART_RX_BUF[0],32);

     u8UART3RecvStatus = 0 ;

     DealData();

    }    

 }

}

3.3数据处理函数

void DealData(void)  

{

 uPm25 = Deal_USART_RX_BUF[12];

 uPm25 = (uPm25<<8)+Deal_USART_RX_BUF[13];

 uPm100 = Deal_USART_RX_BUF[14];

 uPm100 = (uPm100<<8)+Deal_USART_RX_BUF[15];

 

 uTemputer = Deal_USART_RX_BUF[24];

 uTemputer = (uTemputer<<8)+Deal_USART_RX_BUF[25];

 uHumidity = Deal_USART_RX_BUF[26];

 uHumidity = (uHumidity<<8)+Deal_USART_RX_BUF[27];  

}

由于模块使用PMS5003T 主动式传输协议,只需要在串口中断中接收固定的长度的数据进行函数处理即可。当前保证起始符一致在进入数据接收函数,并将USART_RX_BUF[LENG]拷贝到Deal_USART_RX_BUF[LENG]中进行数据处理。

但是这样存在弊端,当单片机未处理完接收到的数据时,此时又有数据发过来时,单片机是不进行处理的,防止数组溢出。对系统要求不高的可以使用该办法进行处理。

4:实物图片:

工程附件
PMS5003T颗粒物传感器中文说明书V2.2 .pdf
基于STM32+TFT屏幕读取PM5003T颗粒物传感器.doc
基于STM32+TFT屏幕读取PM5003T颗粒物传感器.rar
STM单片机
2023/05/24 21:20
  • 举报
😁😂😃😄😅😆😉😊😋😌😍😏😒😓😔😖😘😚😜😝😞😠😡😢😣😤😥😨😩😪😫😭😰😱😲😳😵😷😸😹😺😻😼😽😾😿🙀🙅🙆🙇🙈🙉🙊🙋🙌🙍🙎🙏✂✅✈✉✊✋✌✏✒✔✖✨✳✴❄❇❌❎❓❔❕❗❤➕➖➗➡➰🚀🚃🚄🚅🚇🚉🚌🚏🚑🚒🚓🚕🚗🚙🚚🚢🚤🚥🚧🚨🚩🚪🚫🚬🚭🚲🚶🚹🚺🚻🚼🚽🚾🛀Ⓜ🅰🅱🅾🅿🆎🆑🆒🆓🆔🆕
@好友

全部评论

加载中
游客登录通知
已选择 0 人
自定义圈子
移动
发布帖子
发布动态
发布问答
发布者
聪聪哥哥
最新帖子
LDO串联或并联二极管有什么用?电路保护与特殊应用解析缝纫机伺服0.3秒启停稳如磐石:三招驯服“针位漂移”顽疾伺服电机过载预警:从电流纹波揪出轴承暗伤的猎杀方案芯片丝印反查求助树莓派pico 2测评 - 串口
热门版块
查看更多
电子元器件
麦博大学堂
问型号
问技术
问行情
维修技术
汽车电子工程师论坛
工业电子专区
新手入门指南
单片机/MCU论坛

856

收藏

分享

微信扫码
分享给好友

评论