极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 35465|回复: 6

基于夏普DN7C3JA001的PM2.5检测仪

[复制链接]
发表于 2014-11-6 23:44:14 | 显示全部楼层 |阅读模式
本帖最后由 cometsky 于 2014-11-7 13:56 编辑

先露个脸


在那群密密麻麻的线后面还藏着一个LM35的温度传感器,主要用来计算DN7C3的温度补偿。
线路图就不画了,连线很简单,和前代GP2Y1010是完全一样的,这货基本上就一外壳包着GP2Y1010外加风扇,价格可是x4了。

测试的串口屏幕

左边的一列是analogRead()后的换算电压(还取了1000次平均),那叫一个飘。中间是减掉基准参考电压后,第三列是PM2.5

PDF附上:

说说经验:
1 这东西几乎完全是模拟器件,至少接口是,Vo电压差不多有10mV左右的漂移,上图中最后一列是PM2.5读数(单位手误了),前半部分是走到楼梯间测的,后半部分是室内测的(有空气净化器)。
2 打开风扇会让读数稳定些,应该是大灰尘都按惯性走了旁边的通道,没有进入传感器,为了防止电机对电源的干扰,电机的供电单独设置。
3 外壳上QRCode里面的参考电压就是一个摆设,我在较洁净的室内实测电压低于参考电压将近130mV,应该是LED串联的电阻阻值略高(153欧),并且加上面包板上各个插针的接触电阻导致LED亮度不够,另外所有器件的电源都从Arduino板上取,会稍微的拉低电压。
4 温度漂移要考虑,参考电压是在25度下的读数,每摄氏度有6mV的漂移。相当于3.6ug的颗粒物。
5 模拟口不同针脚连续读取好像有干扰(不确定),反正代码里读DN7C3和LM35分开了200us。
6 analogRead()函数执行大概需要100us多一点,但是采样的延时应该没有那么多(有一种说法是可以设置ADCH连续采样,间隔是26us),前后的时间应该是开关ADC的耗时,我感觉应该在60-80us后是读数时点。所以arduino的delayMicroseconds我取值220。
7 除非能有校准的手段,否则这东西就是一准玩具。我准备去美帝使馆附近校准。
8 脉冲必须按时发出,无论你读取与否,间断的脉冲会导致错误读数。
9 通过USB传进来的电压必须准确,我用山寨充电宝当电源,结果Arduino的5v针脚就变成5.2v了。

上代码:(大概10s之后才有读数,这是稳定期,每秒的读数是和前10秒的平均值,否则跳跃太大)
  1. // My QRcode: 1491800B82 1.23 **** 24.9
  2. // 14918 is produce at 2014-09-18 (WTF!)
  3. // 1.23 is reference voltage
  4. // 24.9 is temperature of reference voltage

  5. #include <LiquidCrystal.h>

  6. //  LCD_VSS pin to ground
  7. //  LCD_VDD pin to 5V
  8. //  LCD_VO  pin to ground with 10K resistor
  9. int LCD_RS = 6;
  10. //  LCD_RW pin to ground
  11. int LCD_E  = 7;
  12. int LCD_D4 = 8;
  13. int LCD_D5 = 9;
  14. int LCD_D6 = 10;
  15. int LCD_D7 = 11;
  16. //  LCD_A   pin to 5V
  17. //  LCD_K   pin to ground
  18. LiquidCrystal lcd(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);

  19. int count = 0;
  20. float valueP = 0; // reading of DN7C3
  21. float valueT = 0; // reading of LM35
  22. float averageP = 0;
  23. float averageT = 0;
  24. float historyP = 0;
  25. unsigned long timer = 0;

  26. unsigned long A = 0;
  27. unsigned long B = 0;

  28. void setup() {
  29.     pinMode(A5, INPUT); // DN7C3 Vo Pin
  30.     pinMode(A2, INPUT); // LM35 input
  31.     pinMode(4, OUTPUT);
  32.     digitalWrite(4, HIGH);
  33.    
  34.     lcd.begin(16, 2);
  35.     lcd.print("Sharp DN7C3");
  36.    
  37.     Serial.begin(115200);
  38.     Serial.println("Sharp DN7C3 PM2.5 Sensor");
  39.    
  40.     for(int i = 0; i < 1000; i++) {
  41.         delayMicroseconds(9680);
  42.         digitalWrite(4, LOW);
  43.         delayMicroseconds(320);
  44.         digitalWrite(4, HIGH);
  45.     }
  46.     timer = micros();
  47. }

  48. void loop() {
  49.     if ((micros() - timer) >= 10000) {  // per 10ms
  50.         timer = micros();
  51.         
  52.         digitalWrite(4, LOW);    // turn on led
  53.         A = micros();            // measure pulse begin time
  54.         delayMicroseconds(230);  // Arduino ADC need about 100us
  55.         valueP = analogRead(A5); // PM2.5 reading
  56.         B = micros();            // measure pulse end time
  57.         digitalWrite(4, HIGH);   // turn off led
  58.         
  59.         delayMicroseconds(200);  // wait to read Temperature
  60.         valueT = analogRead(A2); // Temperature reading
  61.         
  62.         count++;
  63.         averageP = (averageP * (count - 1) + valueP * (5000.0 / 1024.0)) / count;
  64.         averageT = (averageT * (count - 1) + valueT * (5000.0 / 1024.0)) / count;
  65.         
  66.         if (count >= 100) { // 100 times average, 1 second
  67.             float temp = averageT / 10; // get Temperature
  68.             float diffrent = averageP - (1100 + (temp-24.9)*6); // 1100 is ture reference voltage base on my circuits
  69.             float pm25ug = diffrent * 0.6;
  70.             
  71.             if (historyP == 0) {
  72.                 historyP = pm25ug;
  73.             }
  74.             else {
  75.                 historyP = (historyP * 9 + pm25ug) / 10;
  76.             }
  77.             
  78.             // post to Serial
  79.             Serial.print("T: ");
  80.             Serial.print(temp, 2);
  81.             Serial.print(" C\tV: ");
  82.             Serial.print(averageP, 2);
  83.             Serial.print(" mV\t P: ");
  84.             Serial.print(pm25ug, 2);
  85.             Serial.print(" ug/m3\t avgP: ");
  86.             Serial.print(historyP, 2);
  87.             Serial.print(" ug/m3\t Pulse: ");
  88.             Serial.println(B - A);
  89.             
  90.             // show on 1602
  91.             lcd.clear();
  92.             lcd.setCursor(0,0);
  93.             lcd.print("PM25: ");
  94.             lcd.print(historyP); // averaged
  95.             lcd.setCursor(14,0);
  96.             lcd.print("ug");
  97.             lcd.setCursor(0,1);
  98.             lcd.print("Temp: ");
  99.             lcd.print(temp);
  100.             lcd.setCursor(15,1);
  101.             lcd.print("C");
  102.             
  103.             // clear for next time
  104.             count = 0;
  105.             valueP = 0;
  106.             valueT = 0;
  107.             averageP = 0;
  108.             averageT = 0;
  109.         }
  110.     }
  111. }
复制代码


本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2014-11-6 23:49:28 | 显示全部楼层
关于Arduino的ADC连续采样,有兴趣的可以看看这里:http://www.instructables.com/id/Arduino-Audio-Input/step6/Sampling-rate-of-40kHz/
回复 支持 反对

使用道具 举报

发表于 2014-11-8 08:00:25 | 显示全部楼层
非常感谢呀
回复 支持 反对

使用道具 举报

发表于 2014-12-4 11:06:22 | 显示全部楼层
cometsky 发表于 2014-11-6 23:49
关于Arduino的ADC连续采样,有兴趣的可以看看这里:http://www.instructables.com/id/Arduino-Audio-Input/ ...

嗨, 你好.
我對夏普這PM2.5檢測儀有興趣. 從Google搜尋找到這裡. 真是謝謝你的這些資料. 想請問你, 如果我要用 Raspberry Pi 而不是 Arduino是否可行?

先謝謝
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-5 22:23:08 | 显示全部楼层
Kenobi 发表于 2014-12-4 11:06
嗨, 你好.
我對夏普這PM2.5檢測儀有興趣. 從Google搜尋找到這裡. 真是謝謝你的這些資料. 想請問你, 如果 ...

树莓派没有内置的A/D转换,你需要另外接一个,其他的就是那个0.28ms的时间控制了,因为有外置A/D电路所以需要在程序中仔细计算延迟,另外Linux不是实时系统,延时可能会不准
回复 支持 反对

使用道具 举报

发表于 2016-5-23 20:53:35 | 显示全部楼层
如果我把这个与无人机相连 ,那与stm32相连的程序怎么写啊
回复 支持 反对

使用道具 举报

发表于 2017-2-6 09:58:43 | 显示全部楼层
版主可以提供電路圖嗎,對於DN7C3電阻始終有接線的疑慮!感激不盡~
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 05:33 , Processed in 0.051130 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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