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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7176|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

基于夏普DN7C3CA002及arduino UNO的PM2.5監(jiān)測裝置

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:113207 發(fā)表于 2016-4-11 01:41 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
DN7C3CA001是夏普新發(fā)布的PM2.5傳感器,次傳感器能夠切割濾除粒徑大于2.5微米的粒子通過光傳感器元件,從而真正實現(xiàn)對粒徑小于等于2.5微米的顆粒物的監(jiān)測,具體介紹請參考。


圖1. 粒徑切割原理圖


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


圖2. 接線原理圖


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


圖3. 采樣脈沖



圖4. 采樣時間


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


圖5. 輸出電壓與質(zhì)量濃度關(guān)系


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

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


圖6. 溫度修正曲線


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

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


圖7. 裝置運行



圖8. 內(nèi)部結(jié)構(gòu)


程序代碼在arduino IDE 0023上通過: pmkit.rar (1.47 KB, 下載次數(shù): 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. }

復(fù)制代碼

儀器未經(jīng)標(biāo)定,應(yīng)用還需謹(jǐn)慎!
</movingaveragecout;i++)
</movingaveragecout;i++)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 天天插天天射天天干 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 成人不卡 | 亚洲不卡在线观看 | 日韩一区二区三区在线观看视频 | 精品成人佐山爱一区二区 | 黄网址在线观看 | 午夜成人在线视频 | 国产精品国产亚洲精品看不卡15 | 99tv| 日韩成人免费在线视频 | 九九色综合 | 91精品国产91久久久久久吃药 | 久久精品国产久精国产 | 色婷婷综合成人av | 一区二区三区av | 色综合色综合色综合 | 欧洲妇女成人淫片aaa视频 | 97伦理电影 | 天天欧美| 日韩亚洲一区二区 | 亚洲欧美高清 | www.久| 狠狠热视频| 免费色网址 | 欧美a免费| 男女爱爱福利视频 | 成人精品视频在线观看 | 欧美一级欧美三级在线观看 | 亚洲精品久久久久久久久久吃药 | 久国产视频 | 日韩亚洲一区二区 | www.久久| a级片网站 | 99久久精品国产一区二区三区 | 欧美一区二区三区久久精品视 | 色婷婷久久久久swag精品 | 激情网站在线观看 | 精品国产乱码久久久久久果冻传媒 | 97国产精品| 欧美日韩成人一区二区 |