久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7143|回復: 2
打印 上一主題 下一主題
收起左側

基于夏普DN7C3CA002及arduino UNO的PM2.5監測裝置

[復制鏈接]
跳轉到指定樓層
樓主
DN7C3CA001是夏普新發布的PM2.5傳感器,次傳感器能夠切割濾除粒徑大于2.5微米的粒子通過光傳感器元件,從而真正實現對粒徑小于等于2.5微米的顆粒物的監測,具體介紹請參考。


圖1. 粒徑切割原理圖


拿到手的型號是DN7C3CA002改進版。根據傳感器手冊中的接線方法可以發現,除了物理排線線序相反以及需要接風扇的供電電路外,其它引腳接線方法與GP2Y1010AU0F相同。


圖2. 接線原理圖


DN7C3CA002與GP2Y1010AU0F的脈沖采樣參數和采樣時長都是一樣的,猜測兩者采用的是類似的光學器件。


圖3. 采樣脈沖



圖4. 采樣時間


傳感器采用電壓輸出方式,手冊中給出了輸出電壓與PM2.5質量濃度之間的關系:


圖5. 輸出電壓與質量濃度關系


其中Vo是輸出電壓(電壓單位都是mV),Vs是基準電壓,Vs基準電壓的獲取有兩種方式,一種方式是從傳感器的序列號中讀出,由于我拿到的這顆傳感器無序列號,所以只有采用第二種方式,通過不接風扇電源將傳感器垂直放置幾分鐘后讀出的輸出電壓。

同時傳感器需要對Vs基準電壓進行溫度補償,修正參考值同樣除了可以從傳感器序列號中讀出外也可以通過測量得到。


圖6. 溫度修正曲線


在-10~40℃約6mV/℃,40~60℃約1.5mV/℃。測量拿到的這顆傳感器的Vs基準電壓非常低,遠遠達不到圖6中兩條曲線的電壓值,不知道是電路問題還是傳感器自身的問題。

為了能夠根據實時溫度修正Vs基準電壓,使用sht10獲取溫度和濕度數據。同時使用lcd1602作為顯示輸出,基于Arduino UNO組成主控電路。


圖7. 裝置運行



圖8. 內部結構


程序代碼在arduino IDE 0023上通過: pmkit.rar (1.47 KB, 下載次數: 9) ,需要sht1x庫的支持。
  1. #include
  2. #include

  3. #define LCD_led 9
  4. #define clockPin A0
  5. #define dataPin  A1
  6. #define DUSTOUTpin A2         //read dust value from this pin
  7. #define DUSTLEDpin A3       //control dust led through this pin

  8. LiquidCrystal lcd(2, 4, 5, 6, 7, 8);
  9. SHT1x sht1x(dataPin, clockPin);

  10. const int delayTime=280;
  11. const int delayTime2=40;
  12. const float offTime=9680;

  13. float temp_c=0.0;
  14. float humidity=0.0;
  15. double dustVal=0.0;
  16. double voteChange = 5000.0 /1024.0;   //mV
  17. #define FREEPMVALUE 3
  18. #define FREEPMTEMP 31.0
  19. #define BASERATIO40 6   //mV
  20. #define BASERATIO60 1.5   //mV
  21. #define PMFIX 0 // 25 ug/m3
  22. #define PMRATIO 0.6
  23. #define DOBASEFIX false

  24. #define NSAMPLES 100
  25. uint8_t sampleCount = 0;
  26. int sampleSumPm = 0;
  27. int dustLevel=0;

  28. //moving average filter
  29. #define NULLVALUE -1.0
  30. #define MOVINGAVERAGECOUT 10
  31. double pm2_5[MOVINGAVERAGECOUT];
  32. uint8_t arrNewPoint = 0;

  33. static void initFilterArray()
  34. {
  35.   for(int i=0;i<movingaveragecout;i++)
  36.   {
  37.     pm2_5[i]=NULLVALUE;
  38.   }
  39. }

  40. int readPM(){
  41.   // ledPower is any digital pin on the arduino connected to Pin 3 on the sensor
  42.   digitalWrite(DUSTLEDpin,LOW);// power on the LED
  43.   delayMicroseconds(delayTime);
  44.   int Val = analogRead(DUSTOUTpin); // read the dust value via pin 5 on the sensor
  45.   delayMicroseconds(delayTime2);
  46.   digitalWrite(DUSTLEDpin,HIGH); // turn the LED off
  47.   delayMicroseconds(offTime);  
  48.   return Val;
  49. }

  50. void setup() {
  51.   pinMode(LCD_led, OUTPUT);
  52.   digitalWrite(LCD_led, HIGH);

  53.   pinMode(DUSTLEDpin,OUTPUT);
  54.   digitalWrite(DUSTLEDpin,HIGH);// turn the LED off

  55.   initFilterArray();

  56.   lcd.begin(16, 2);

  57.   lcd.print("System Warming!");
  58.   //Serial.begin(9600);
  59.   delay(5000);
  60.   lcd.clear();
  61.   lcd.setCursor(0, 0);
  62.   lcd.print("PM2.5:");
  63.   lcd.setCursor(11, 0);
  64.   lcd.print("ug/m3");

  65.   lcd.setCursor(5, 1);
  66.   lcd.print("C");
  67.   lcd.setCursor(15, 1);
  68.   lcd.print("%");
  69. }

  70. void loop() {
  71.   dustLevel =readPM();
  72.   sampleCount++;
  73.   sampleSumPm = sampleSumPm + dustLevel;
  74.   if(sampleCount==NSAMPLES)
  75.   {
  76.     showTempHumiData();

  77.     getPMdata(sampleSumPm / sampleCount);

  78.     sampleCount=0;
  79.     sampleSumPm=0;
  80.   }
  81. }

  82. void getPMdata(int avgPm) {
  83.   double dustVolt = avgPm * voteChange;  //mV

  84.   if(DOBASEFIX)
  85.   {
  86.     double baseVot = FREEPMVALUE * voteChange; //mV
  87.     double baseChg = 0.0;
  88.     if(temp_c <= 40.0 && temp_c>= -10.0)
  89.     {
  90.       baseChg=BASERATIO40;
  91.     }
  92.     else if(temp_c > 40.0 && temp_c <= 60.0)
  93.     {
  94.       baseChg=BASERATIO60;
  95.     }
  96.     baseVot=baseVot + baseChg*(temp_c - FREEPMTEMP);
  97.     dustVolt=dustVolt-baseVot;
  98.     if(dustVolt<0)
  99.     {
  100.       dustVolt=0;
  101.     }
  102.   }

  103.   dustVal = dustVolt * PMRATIO;
  104.   dustVal = dustVal + PMFIX;

  105.   // moving average
  106.   getMovingAverage(pm2_5,&dustVal);

  107.   lcd.setCursor(6, 0);
  108.   lcd.print("     ");
  109.   lcd.setCursor(6, 0);
  110.   lcd.print(dustVal,0);
  111. }

  112. void showTempHumiData() {
  113.   temp_c = sht1x.readTemperatureC();
  114.   humidity = sht1x.readHumidity();

  115.   lcd.setCursor(0, 1);
  116.   lcd.print("     ");
  117.   lcd.setCursor(0, 1);
  118.   lcd.print(temp_c,1);

  119.   lcd.setCursor(12, 1);
  120.   lcd.print("   ");
  121.   lcd.setCursor(12, 1);
  122.   lcd.print(humidity,0);
  123. }

  124. static float getAverage(double vals[])
  125. {
  126.   double sum=0.0;
  127.   uint8_t cout=0;
  128.   for(int i=0;i<movingaveragecout;i++)
  129.   {
  130.     if(vals[i] != NULLVALUE)
  131.     {
  132.       sum=sum+vals[i];
  133.       cout++;
  134.     }
  135.   }
  136.   if(cout>0)
  137.   {
  138.     return sum/cout;
  139.   }
  140.   else
  141.   {
  142.     return 0.0;
  143.   }
  144. }

  145. static void getMovingAverage(double pms[],double* pm)
  146. {
  147.   pms[arrNewPoint] = *pm;

  148.   arrNewPoint++;
  149.   if(arrNewPoint>=MOVINGAVERAGECOUT)
  150.   {
  151.     arrNewPoint=0;
  152.   }
  153.   *pm=getAverage(pms);
  154. }

復制代碼

儀器未經標定,應用還需謹慎!
</movingaveragecout;i++)
</movingaveragecout;i++)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:111876 發表于 2016-6-17 10:22 | 只看該作者
  這個代碼無法用!
回復

使用道具 舉報

板凳
ID:119421 發表于 2017-4-12 13:56 | 只看該作者
感謝分享,不知道有沒有proteus的仿真
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99re在线播放 | 国产精品久久久久久久久久久久久 | 在线观看免费av片 | 国产成人精品免高潮在线观看 | 国产一区二 | 久久九九网站 | 在线观看中文视频 | 久久av网站 | 欧美一区2区三区3区公司 | 天天干夜夜拍 | 男女啪啪高潮无遮挡免费动态 | 欧美老妇交乱视频 | www.天堂av.com | 国产成人一区二区三区 | 农村妇女毛片精品久久久 | 久久精品免费一区二区 | 中文字幕91| 自拍视频国产 | 在线观看av不卡 | 91精品导航| 欧美色性| 国产欧美一级二级三级在线视频 | 欧美一级免费看 | 国产精品成人久久久久 | 91国内在线观看 | 国产一二区视频 | 国产一区二区三区四区五区加勒比 | www97影院| 免费看大片bbbb欧美 | 亚洲一区二区在线免费观看 | 国产精品免费观看视频 | 久久久一区二区 | 亚洲精品1区 | 五月网婷婷 | 国产a爽一区二区久久久 | 久久亚洲一区二区 | 黄色在线免费观看 | 亚洲视频在线观看一区二区三区 | 久久久久久综合 | 久久久久久久久久久丰满 | 午夜精品久久久久久 |