RISC-V MCU中文社区

【分享】 GD32VF103串口读取PM2.5传感器

发表于 GD32VF103 MCU 2021-04-01 10:03:06
0
2988
2

传感器: 攀藤PMS5003;

硬件连接:

VCC  -- 5V

GND -- GND

TX  -- PB11(RX2) 

RX -- PB10(TX2)

基本流程

1. 串口2连接传感器。查阅手册得知,该传感器为5V供电(根据手册,风机为5V供电),串口为3.3V电平,可以直接使用GD32VF103的任何一个串口进行通讯。为了保险起见,此处选择USART2,使用PB10、PB11,这两个IO是5V容忍的。串口速率 9600 8 N 1

2. 串口获取32字节数据,存入buffer中

3.根据手册计算checksum,若传输正常,则计算PM2.5浓度。以CF=1 PM2.5浓度为例,根据手册,第8号字节为数据高8位,第9号字节为数据低8位,故计算结果为(buffer[8] << 8) + buffer[9]


其他说明:

1. 早期传感器RX口没有任何作用,近期的传感器RX口可以接收一些指令,如进行主被动传输控制等,如不需要可以不连接。DEMO程序中并未实现相关控制逻辑。

2. 传感器包括两个控制引脚,SET用于使传感器进入低功耗模式,RESET用于模块复位,均为低电平有效。本实验并未使用这两个控制引脚,如需要减少电力消耗,延长传感器寿命,可以定期使传感器进入休眠状态。具体使用参考传感器手册。

3. 以上代码适用于型号包括但不仅限于G1(PMS1003),G3(PMS3003),G5(PMS5003),数据定义与下图中数据定义相同的型号可以使用。


硬件连接图:



程序清单(部分):

void init_USART2(); // 参考上一篇 【分享】 GD32VF103串口收发实验(中断方式) ,将其中的中断处理部分去除
int plantower(){
  uint8_t buffer[32];  // 初始化接收缓存
  int buffer_offset = 0;
  while(1){ // 循环读取串口数据
    if(usart_flag_get(USART2,USART_FLAG_RBNE)==SET){ // 根据文档定义,取得以0x42,0x4d开头的32字节数据
      uint8_t serial_recv = usart_data_receive(USART2);
      if(buffer_offset == 1 && serial_recv != 0x4d){
        buffer_offset = 0;
      }
    if(buffer_offset==0 && serial_recv != 0x42) {
      continue;
    }else{
      buffer[buffer_offset] = serial_recv;
      ++buffer_offset;
    }
  }
    if(buffer_offset > 31) {break;}
}
// 计算checksum并与checksum字段比较,确保传输无误
  int checksum = 0;
  for(int i=0;i<30;++i){
    checksum += (int)buffer[i];
  }
  if (checksum != (buffer[30] << 8) + buffer[31]){
    return 0;
  }
// 计算PM2.5 和 PM10(未使用)
  int pm2_5 = (buffer[8] << 8) + buffer[9];
  int pm10 = (buffer[10] << 8) + buffer[11];
  return pm2_5;
}

int main(void) {
  init_USART2(); // 初始化串口
  int pm2_5 = plantower(); // 获取传感器数据
  printf("pm2_5=%drn",pm2_5);
  return 0;
}


数据格式:


喜欢2
用户评论
Flagplus

Flagplus 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板