极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 28364|回复: 7

攀藤G5霾表

[复制链接]
发表于 2016-1-14 20:04:29 | 显示全部楼层 |阅读模式
本帖最后由 johnsonzzd 于 2016-1-14 20:08 编辑

淘宝微创联合买的传感器,花俩小时做一个PM2.5表,检测一下空气净化器的能力。霾表在液晶显示的同时向PC机发送数据。PC可以长时间监控并对数据进行处理。




程序展示了对16进制通讯协议进行处理的一种常用方法。


  1. #include <AltSoftSerial.h>
  2. #include <LiquidCrystal_I2C.h>

  3. //软串口,Uno开发板:Tx-D9、Rx-D8。Rx接传感器的Tx。
  4. AltSoftSerial altSerial;

  5. //YWrobot I2C 1602液晶屏
  6. LiquidCrystal_I2C lcd(0x27, 16, 2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

  7. //攀藤G5的数据格式
  8. struct _panteng {
  9.         unsigned char len[2];
  10.         unsigned char pm1_cf1[2];
  11.         unsigned char pm2_5_cf1[2];
  12.         unsigned char pm10_0_cf1[2];
  13.         unsigned char pm1_0[2];
  14.         unsigned char pm2_5[2];
  15.         unsigned char pm10_0[2];
  16.         unsigned char d[20];
  17. } panteng;

  18. void setup()
  19. {
  20.         lcd.init();                      // initialize the lcd
  21.         lcd.backlight();

  22.         Serial.begin(115200);        //USB串口向PC发送数据
  23.         altSerial.begin(9600);        //软串口连接传感器
  24. }

  25. void loop()
  26. {
  27.         unsigned char c;
  28.         char str[100];
  29.         static int state = 0;
  30.         static int count = 0;
  31.         static int time=0;
  32.         int pm1_0, pm2_5, pm10_0;        //PM1.0、PM2.5、PM10
  33.         int i;

  34.         if (altSerial.available()) {
  35.                 c = altSerial.read();
  36.                 switch (state) {
  37.                 case 0:
  38.                         if (0x42 == c)
  39.                                 state = 1;
  40.                         break;
  41.                 case 1:
  42.                         if (0x4d == c) {
  43.                                 state = 2;
  44.                                 count = 0;
  45.                                 //Serial.println(' ');
  46.                         }
  47.                         break;
  48.                 case 2:
  49.                         ((unsigned char *) &panteng)[count++] = c;
  50.                         sprintf(str, "%02X ", c);
  51.                         //Serial.print(str);
  52.                         if (count > 28) {
  53.                                 state = 0;
  54.                                 pm1_0 = panteng.pm1_0[0] * 256 + panteng.pm1_0[1];
  55.                                 pm2_5 = panteng.pm2_5[0] * 256 + panteng.pm2_5[1];
  56.                                 pm10_0 = panteng.pm10_0[0] * 256 + panteng.pm10_0[1];

  57.                                 sprintf(str, "%d\t%d\t%d\t%d", time++,pm1_0, pm2_5, pm10_0);
  58.                                 Serial.println(str);

  59.                                 snprintf(str,16, "PM2.5=%d    ", pm2_5);
  60.                                 //lcd.clear();
  61.                                 for (i = 0; i < strlen(str); i++) {
  62.                                         lcd.setCursor(i, 0);
  63.                                         lcd.print(&str[i]);
  64.                                 }
  65.                         }
  66.                         break;
  67.                 default:
  68.                         break;
  69.                 }
  70.         }
  71. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2016-1-14 21:15:52 | 显示全部楼层
先前也查询了,测试的,你这个使用的是激光测试的模块吗
回复 支持 反对

使用道具 举报

发表于 2016-1-15 08:04:12 | 显示全部楼层
AltSoftSerial.h  与IDE自带的  SoftwareSerial.h有什么区别吗?

回复 支持 反对

使用道具 举报

发表于 2016-3-22 12:08:58 | 显示全部楼层
有个地方不太明白,攀藤G5的数据是多久更新一次?是他自己更新,不是通过命令读取?
回复 支持 反对

使用道具 举报

发表于 2016-3-22 15:23:39 | 显示全部楼层
你都不断给pc发数据了,为啥不直接用usb转串口,pc采集呢?
回复 支持 反对

使用道具 举报

发表于 2016-3-30 10:43:39 | 显示全部楼层
请教下楼主:这个1602的二个数据口分别接到arduino的哪二个口呢?谢谢!
回复 支持 反对

使用道具 举报

发表于 2016-3-30 20:47:18 | 显示全部楼层
请教楼主
pm1_0 = panteng.pm1_0[0] * 256 + panteng.pm1_0[1];
                                pm2_5 = panteng.pm2_5[0] * 256 + panteng.pm2_5[1];
                                pm10_0 = panteng.pm10_0[0] * 256 + panteng.pm10_0[1];

                                sprintf(str, "%d\t%d\t%d\t%d", time++,pm1_0, pm2_5, pm10_0);
                                Serial.println(str);

                                snprintf(str,16, "PM2.5=%d    ", pm2_5);
看到读取了pm1.0,pm2.5,pm10,三个数据,但最后只显示了pm2.5,那是不是也可以只读区2.5的数据呢
回复 支持 反对

使用道具 举报

发表于 2016-4-22 13:01:10 | 显示全部楼层
需要用校验位吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 23:45 , Processed in 0.044987 second(s), 27 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表