制作靈感來源于一個叫做 urban feeds 的項目。儀器能夠采集: - 溫度
- 濕度
- CO2濃度
- O3濃度
- 光照強(qiáng)度
- 人流量
- 大于1微米空氣懸浮粒子
- 大于2.5微米空氣懸浮粒子
- 日期時間
- 位置信息
采用SD卡存儲數(shù)據(jù),鋰電池供電,外觀如圖:
0906156x6kjv4j9f46mxnk.jpg (177.88 KB, 下載次數(shù): 146)
下載附件
2016-4-10 01:49 上傳
全部配件包括: - 密封盒 1個 115×90×55
100825sgoccon99s15o9bs.jpg (17.52 KB, 下載次數(shù): 165)
下載附件
2016-4-10 01:49 上傳
- arduino UNO核心板 1塊
101210kh8e8801hphm4sg4.jpg (26.94 KB, 下載次數(shù): 152)
下載附件
2016-4-10 01:49 上傳
- SD卡模塊1個及SD卡1張(容量不限,但由于FAT16文件分區(qū)格式的限制單個分區(qū)應(yīng)小于2G)
1018301jpo1dz2um1mscwq.jpg (13.66 KB, 下載次數(shù): 140)
下載附件
2016-4-10 01:49 上傳
101830z86562wkpyn6n868.jpg (11.2 KB, 下載次數(shù): 146)
下載附件
2016-4-10 01:49 上傳
234337bta4qvlq0n0bt2v3.jpg (17.55 KB, 下載次數(shù): 160)
下載附件
2016-4-10 01:49 上傳
- SHT10溫濕度傳感器 1個
103412pew2sepawahgeiha.jpg (16.85 KB, 下載次數(shù): 159)
下載附件
2016-4-10 01:49 上傳
- BH1750FVI光照傳感器 1個
103746v6gghil6pipnnidd.jpg (23.67 KB, 下載次數(shù): 159)
下載附件
2016-4-10 01:49 上傳
- MG811二氧化碳(CO2)傳感器(無需底板) 1個
112926xjusus7pesjpuyyw.jpg (3.78 KB, 下載次數(shù): 152)
下載附件
2016-4-10 01:49 上傳
- MQ131臭氧(O3)傳感器(無需底板) 1個
1129269kr39k893cq9r3py.jpg (3.12 KB, 下載次數(shù): 130)
下載附件
2016-4-10 01:49 上傳
- 七星座 2個
112926akcqznpichivzcaz.jpg (11.39 KB, 下載次數(shù): 155)
下載附件
2016-4-10 01:49 上傳
- DSM501A粉塵傳感器 1個
113216o71ocpncwusco768.jpg (18.56 KB, 下載次數(shù): 140)
下載附件
2016-4-10 01:49 上傳
- SIRF II GPS模塊 1個
115051ir121fwrzmr1riwu.jpg (17.44 KB, 下載次數(shù): 160)
下載附件
2016-4-10 01:49 上傳
- HC-SR501 人體紅外感應(yīng)模塊 1個
115052f4gfjdkfzsff0r4f.jpg (17.2 KB, 下載次數(shù): 148)
下載附件
2016-4-10 01:49 上傳
- 0.5A 單鋰電池充電、升壓板(保護(hù)+充電+升壓+充電指示) 1塊
1155312wacmzmypxbaagcc.jpg (25.42 KB, 下載次數(shù): 175)
下載附件
2016-4-10 01:49 上傳
- 606168P 聚合物鋰電池 3.7V 2800mAH 1塊
115101bg7jwj1dyrub27jz.jpg (15.17 KB, 下載次數(shù): 145)
下載附件
2016-4-10 01:49 上傳
- CA3140 阻抗變換 1個
- 二極管1N4007 1個
- 3mm 發(fā)光二極管LED 綠(顏色隨意) 1個
- 電容 10nF(104貼片) 1個
- 電阻 220 1個、10K(104貼片) 1個、22K 1個、10K 2個、1K 1個
- 雙面洞洞板 2×8cm 1塊
- 單排針 間距2.54mm 高11mm和高17mm 若干
- 彩色杜邦線建議最短20cm 若干
- KN3-3 撥動開關(guān)(六腳) 1個
- M3螺母 若干
- 6+12 M3銅柱子 若干
- M3螺絲 包括10mm和6mm(非必需) 若干
- M3空心銅柱(非必需) 若干
電路部分:
- SD卡接法請參考:arduino學(xué)習(xí)筆記18 - SD卡讀寫實驗
- SHT10 data腳接D8,clock腳接D9
- BH1750FVI 是I2C協(xié)議,參見:arduino學(xué)習(xí)筆記27 - DS1307 RTC時鐘芯片與DS18B20數(shù)字溫度傳感器實驗中DS1307 與UNO板的接法
- MG811二氧化碳傳感器阻抗變換電路如圖,接A3:
221719q1k6rkzf1njb7us4.jpg (27.3 KB, 下載次數(shù): 149)
下載附件
2016-4-10 01:49 上傳
222025koch7ak6f9ohzrao.jpg (6.35 KB, 下載次數(shù): 141)
下載附件
2016-4-10 01:49 上傳
- MQ131臭氧傳感器輔助電路如圖,接A2:
222404jtax48fflwfbna3l.jpg (18.59 KB, 下載次數(shù): 146)
下載附件
2016-4-10 01:49 上傳
- DSM501A粉塵傳感器接線如圖,接輸出1接D7,輸出2接D6:
223009kwhxnpfpwh4fmcrm.jpg (36.38 KB, 下載次數(shù): 146)
下載附件
2016-4-10 01:49 上傳
- SIRF II GPS模塊TX接D0,RX接D1
- HC-SR501 人體紅外感應(yīng)模塊輸出接A1
- 發(fā)光二極管串聯(lián)220歐姆電阻接在電源地和D2之間
- 鋰電池充電、升壓板與鋰電池接法按板子說明連接
- 六角撥動開關(guān)一組控制儀器電源開關(guān),一組控制鋰電池充電開關(guān),兩組控制狀態(tài)互斥如示意圖:
224748jzwzhgkwwfh4nerr.jpg (6.02 KB, 下載次數(shù): 161)
下載附件
2016-4-10 01:49 上傳
- 電源供電從鋰電池充電、升壓板升壓輸出端+5v經(jīng)撥動開關(guān)儀器電源一組連接到UNO Vin腳;電池充電從UNO +5v輸出經(jīng)撥動開關(guān)儀器充電一組接到鋰電池充電、升壓板充電輸入端
- 從鋰電池充電、升壓板充電輸入端引出線到A0并為A0設(shè)置10K下拉電阻
- 所有傳感器(除SD卡、溫濕度)的+5v輸入接UNO Vin腳,SD卡和溫濕度傳感器接UNO +5v輸出腳;所有傳感器的GND和鋰電池充電、升壓板的充電輸入、+5V升壓輸出的GND接UNO GND腳
儀器組裝:
233947f7sysdc6x7so86ff.jpg (37.62 KB, 下載次數(shù): 162)
下載附件
2016-4-10 01:49 上傳
233949ralr2hypjr0uql0n.jpg (35.71 KB, 下載次數(shù): 163)
下載附件
2016-4-10 01:49 上傳
233949y3ipvv3gmpigs0pr.jpg (31.95 KB, 下載次數(shù): 148)
下載附件
2016-4-10 01:49 上傳
DSM501A粉塵傳感器 需垂直安裝
儀器內(nèi)部:
2348473fuvjfiwi47nrwje.jpg (37.42 KB, 下載次數(shù): 170)
下載附件
2016-4-10 01:49 上傳
235020v933rlf4gh6xx6xg.jpg (62.51 KB, 下載次數(shù): 133)
下載附件
2016-4-10 01:49 上傳
程序代碼:
- //davidce 20111211
- // Include
- #include
- #include
- #include
- // Digital pin
- // SHT1x
- #define ShtDataPin 8 //data
- #define ShtClockPin 9 //clock
- SHT1x sht1x(ShtDataPin, ShtClockPin);
- // system light
- #define systemLightPin 2
- //DSM501A DUST
- #define DSMPin2_5 6
- #define DSMPin1_0 7
- //SD card
- File myFile;
- #define SD_CSPin 10
- char filename[] = "result.txt";
- String order= "";
- //GPS
- #define rxPin 0 // RX PIN
- #define txPin 1 // TX TX
- // Analog pin
- const int powerInPin = A0; // check power state for the bettery charge
- const int infrRayPin = A1; //infrared ray
- const int o3Pin = A2; //MQ131
- const int co2Pin = A3; //MQ811
- // Variable
- boolean inCharge = false; //bettery charging mark
- const unsigned long warmTime = 60000; //system warmming 60000 ms
- const unsigned long scanTime = 0; //get data fre scanTime = scanTime + flashTime
- const unsigned long flashTime = 250;
- unsigned long previousMillis = 0; //前一次判斷時間點
- unsigned long partMillis=0; //到溢出時計算的時間
- const unsigned long sectev = 30; // 時間間隔(秒)
- const unsigned long interval = 30000; // 時間間隔(毫秒) = sectev * 1000
- const unsigned long mintev = 30000000; // 時間間隔(微秒) =interval * 1000
- //BH1750 IIC Mode
- const int BH1750address = 0x23; //setting i2c address
- byte buff[2];
- //GPS
- int byteGPS = -1;
- char linea[300] = "";
- char comandoGPR[7] = "$GPRMC";
- int cont=0;
- int bien=0;
- int conta=0;
- int indices[13];
- void setup() {
- if(!SD.begin(SD_CSPin))
- {
- return;
- }
- // read the value from the power
- int powerValue = analogRead(powerInPin); // variable to store the value coming from the power
- if(powerValue>1000)
- {
- inCharge=true;
- Serial.begin(4800); //port speed for GPS
- }
- else
- {
- //check if the log file exists and add name of items to the new file
- if (!SD.exists(filename))
- {
- myFile = SD.open(filename, FILE_WRITE);
- if (myFile)
- {
- myFile.print("date_UTC");
- myFile.print(9,BYTE);
- myFile.print("time_UTC");
- myFile.print(9,BYTE);
- myFile.print("lat");
- myFile.print(9,BYTE);
- myFile.print("lon");
- myFile.print(9,BYTE);
- myFile.print("temp_C");
- myFile.print(9,BYTE);
- myFile.print("hum_PER");
- myFile.print(9,BYTE);
- myFile.print("pcs_1");
- myFile.print(9,BYTE);
- myFile.print("pcs_2_5");
- myFile.print(9,BYTE);
- myFile.print("peop_tra");
- myFile.print(9,BYTE);
- myFile.print("O3");
- myFile.print(9,BYTE);
- myFile.print("CO2");
- myFile.print(9,BYTE);
- myFile.println("light_lx");
- myFile.close();
- }
- }
- for (int i=0;i<300;i++)
- { // Initialize a buffer for received data
- linea[i]=' ';
- }
- pinMode(systemLightPin, OUTPUT);
- pinMode(DSMPin2_5, INPUT);
- pinMode(DSMPin1_0, INPUT);
- pinMode(rxPin, INPUT);
- pinMode(txPin, OUTPUT);
- Wire.begin();
- Serial.begin(4800); //port speed for transform
- digitalWrite(systemLightPin, HIGH);
- delay(warmTime);
- }
- }
- void loop(){
- if(!inCharge) // work state
- {
- float temp_c =sht1x.readTemperatureC();
- float humidity = sht1x.readHumidity();
- unsigned long currentMillis;
- boolean goloop=true;
- partMillis=0;
- unsigned long duration1_0=0;
- unsigned long duration2_5=0;
- long temp1_0=0;
- long temp2_5=0;
- unsigned long rayMark=0; //人流量計數(shù)
- double rayFreq = 0.0; //人流量頻率
- while(goloop) //loop
- {
- currentMillis = micros();
- if(currentMillis<previousmillis)
- {
- partMillis = 4294967295 - previousMillis +1;
- previousMillis = 0;
- }
- if(currentMillis - previousMillis - partMillis < mintev)
- {
- //1.0
- if(temp1_0==0)
- {
- temp1_0=-1;
- temp1_0=pulseIn(DSMPin1_0, LOW);
- }
- if(temp1_0>0)
- {
- duration1_0 =duration1_0 + temp1_0;
- temp1_0=0;
- }
- //2.5
- if(temp2_5==0)
- {
- temp2_5=-1;
- temp2_5=pulseIn(DSMPin2_5, LOW);
- }
- if(temp2_5>0)
- {
- duration2_5 =duration2_5 + temp2_5;
- temp2_5=0;
- }
- }
- else
- {
- goloop=false;
- previousMillis=currentMillis;
- }
- //human transform
- int rayState = analogRead(infrRayPin);
- if(rayState>500)
- {
- rayMark = rayMark + 1;
- }
- }
- double per =double(duration1_0)/double(interval);// had multiply 1000
- int pcs1_0 = -1;
- pcs1_0 = per * 50.0;
- per =double(duration2_5)/double(interval);// had multiply 1000
- int pcs2_5 = -1;
- pcs2_5 = per * 50.0;
- rayFreq = double(rayMark) /double(sectev);
- // light
- uint16_t lightval=0;
- BH1750_Init(BH1750address);
- delay(200);
- if(2==BH1750_Read(BH1750address))
- {
- lightval=((buff[0]<<8)|buff[1])/1.2;
- }
- //MQ131
- int O3v=analogRead(o3Pin);
- float O3ppb=float(O3v) * 0.0049; //not realy value
- float O3mg_m3 = O3ppb * 48 / 22.4 / 1000; //need ajaust
- //MG811
- int CO2v=analogRead(co2Pin);
- float CO2ppb=float(CO2v) * 0.0049; //not realy value
-
- //GPS
- String datestr = ""; //date UTC (ddmmyy)
- String timestr = ""; //time UTC (hhmmss.sss)
- String latstr = ""; //Latitude (ddmm.mmmm)
- String lonstr = ""; //Longitude (dddmm.mmmm)
- boolean isGPSOK = false;
- bien=0;
- while(bien!=6)
- {
- byteGPS=Serial.read();
- if(byteGPS == -1)
- {
- delay(100);
- }
- else
- {
- linea[conta]=byteGPS; // If there is serial port data, it is put in the buffer
- conta++;
- if(byteGPS==13)
- {
- cont=0;
- bien=0;
- for (int i=1;i<7;i++)
- { // Verifies if the received command starts with $GPRMC
- if (linea[i]==comandoGPR[i-1])
- {
- bien++;
- }
- }
- if(bien==6) // If yes, continue and process the data
- {
- for (int i=0;i<300;i++)
- {
- if (linea[i]==',')
- { // check for the position of the "," separator
- indices[cont]=i;
- cont++;
- }
- if (linea[i]=='*')
- { // ... and the "*"
- indices[12]=i;
- cont++;
- }
- }
- String dataString;
- int outindex;
- outindex=1;
- for (int j=indices[outindex];j<(indices[outindex+1]-1);j++)
- {
- if(linea[j+1]=='A')
- {
- isGPSOK = true;
- }
- }
- outindex=8; //Date UTC (ddmmyy)
- dataString="";
- for (int j=indices[outindex];j<(indices[outindex+1]-1);j++)
- {
- dataString = dataString + linea[j+1];
- }
- datestr=dataString;
- outindex=0; //time UTC (hhmmss.sss)
- dataString="";
- for (int j=indices[outindex];j<(indices[outindex+1]-1);j++)
- {
- dataString = dataString + linea[j+1];
- }
- timestr=dataString;
- outindex=2; //Latitude (ddmm.mmmm)
- dataString="";
- for (int j=indices[outindex];j<(indices[outindex+1]-1);j++)
- {
- dataString = dataString + linea[j+1];
- }
- latstr=dataString;
- outindex=4; //Longitude (dddmm.mmmm)
- dataString="";
- for (int j=indices[outindex];j<(indices[outindex+1]-1);j++)
- {
- dataString = dataString + linea[j+1];
- }
- lonstr=dataString;
- }
- // Reset the buffer
- conta=0;
- for (int i=0;i<300;i++)
- {
- linea[i]=' ';
- }
- }
- }
- }
- //output result
- Serial.print(datestr);
- Serial.print(9,BYTE);
- Serial.print(timestr);
- Serial.print(9,BYTE);
- Serial.print(latstr);
- Serial.print(9,BYTE);
- Serial.print(lonstr);
- Serial.print(9,BYTE);
- Serial.print(temp_c);
- Serial.print(9,BYTE);
- Serial.print(humidity);
- Serial.print(9,BYTE);
- Serial.print(pcs1_0);
- Serial.print(9,BYTE);
- Serial.print(pcs2_5);
- Serial.print(9,BYTE);
- Serial.print(rayFreq);
- Serial.print(9,BYTE);
- Serial.print(O3ppb);
- Serial.print(9,BYTE);
- Serial.print(CO2ppb);
- Serial.print(9,BYTE);
- Serial.println(lightval,DEC);
- //writer the result to SD card
- myFile = SD.open(filename, FILE_WRITE);
- if (myFile)
- {
- // to sd file
- myFile.print(datestr);
- myFile.print(9,BYTE);
- myFile.print(timestr);
- myFile.print(9,BYTE);
- myFile.print(latstr);
- myFile.print(9,BYTE);
- myFile.print(lonstr);
- myFile.print(9,BYTE);
- myFile.print(temp_c);
- myFile.print(9,BYTE);
- myFile.print(humidity);
- myFile.print(9,BYTE);
- myFile.print(pcs1_0);
- myFile.print(9,BYTE);
- myFile.print(pcs2_5);
- myFile.print(9,BYTE);
- myFile.print(rayFreq);
- myFile.print(9,BYTE);
- myFile.print(O3ppb);
- myFile.print(9,BYTE);
- myFile.print(CO2ppb);
- myFile.print(9,BYTE);
- myFile.println(lightval,DEC);
- myFile.close();
- //flash the light
- if(isGPSOK)
- {
- digitalWrite(systemLightPin, HIGH);
- delay(flashTime);
- digitalWrite(systemLightPin, LOW);
- }
- else
- {
- digitalWrite(systemLightPin, LOW);
- delay(flashTime);
- digitalWrite(systemLightPin, HIGH);
- }
- }
- delay(scanTime);
- }
- else //bettery charging and data translation
- {
- while(Serial.available() > 0)
- {
- int incomingByte = Serial.read();
- if(incomingByte==10) //order end
- {
- if(order == "list")
- {
- myFile = SD.open(filename);
- if (myFile)
- {
- while (myFile.available())
- {
- Serial.write(myFile.read());
- }
- myFile.close();
- }
- else
- {
- Serial.println("open file failure.");
- }
- }
- else if(order.length()>0)
- {
- Serial.println("The available command is:");
- Serial.println("list");
- }
- //reset order
- order="";
- }
- else
- {
- if(incomingByte!=13)
- {
- order = order + char(incomingByte);
- }
- }
- }
- }
- }
- int BH1750_Read(int address)
- {
- int i=0;
- Wire.beginTransmission(address);
- Wire.requestFrom(address, 2);
- while(Wire.available())
- {
- buff[i] = Wire.receive(); // receive one byte
- i++;
- }
- Wire.endTransmission();
- return i;
- }
- void BH1750_Init(int address)
- {
- Wire.beginTransmission(address);
- Wire.send(0x10);//1lx reolution 120ms
- Wire.endTransmission();
- }
復(fù)制代碼
代碼說明:- 傳感器需要預(yù)熱時間,在變量warmTime 中設(shè)置,這里設(shè)置為60秒
- 儀器根據(jù)inCharge 變量判斷系統(tǒng)處于采集狀態(tài)或充電狀態(tài),在采集狀態(tài)時如插上usb可通過arduino IDE的串口監(jiān)視實現(xiàn)數(shù)據(jù)顯示;儀器通過arduino的usb口充電,在充電的同時可通過arduino IDE的串口監(jiān)視實現(xiàn)交互,如輸入list命令可列出SD卡存儲的數(shù)據(jù)
- DSM501A灰塵傳感器有兩路輸出分別對應(yīng)不同的灰塵粒徑檢出量,檢測到灰塵是在輸出口產(chǎn)生時間不等的低脈沖,通過計算30秒內(nèi)的低脈沖率和對于關(guān)系得到灰塵粒子量(請參考DSM501A datasheet),程序中通過micros()函數(shù)提供計時,micros()每70分鐘左右會歸零,通過 4294967295 - previousMillis +1 得出歸零前的計數(shù)加到歸零后的計數(shù)上實現(xiàn)連續(xù)計數(shù)
- 程序通過pulseIn()返回低脈沖時間,雖然pulseIn()函數(shù)可以設(shè)置超時(默認(rèn)1秒)但并不產(chǎn)生中斷,代碼中通過輪詢pulseIn()的返回變量的值判讀pulseIn()是否完成讀取
- 人體紅外線模塊的脈沖電平是3.3v,通過模擬讀取時設(shè)置讀數(shù)大于500為有輸出
- 當(dāng)GPS模塊可靠定位時系統(tǒng)狀態(tài)燈常滅,采集數(shù)據(jù)時亮250ms;GPS不可靠定位時系統(tǒng)狀態(tài)燈常亮,采集數(shù)據(jù)時滅250ms,GPS上集成電池,定位可靠與非都有日期時間輸出(UTC時間,中國時區(qū) +8小時)
- BH1750光照傳感器在太陽光直接照射的情況下有可能爆表(輸出為0),建議避免強(qiáng)光直射
關(guān)于傳感器標(biāo)定:
每個傳感器在出廠后的性能是不同的,在實際的應(yīng)用中需要進(jìn)行標(biāo)定。儀器中需要標(biāo)定的傳感器是MG811二氧化碳、MQ131臭氧和DSM501A灰塵傳感器,其它的傳感器是數(shù)字輸出,在出廠前經(jīng)過標(biāo)定。標(biāo)定方法參考:
- MG811二氧化碳標(biāo)定可參考: 中的方法,另外二氧化碳是溫室氣體,特性穩(wěn)定,所以在全球很長時間都是均勻分布在同一水平,全球二氧化碳實時濃度見,可以參考此網(wǎng)站上的值作為標(biāo)定濃度之一,同時呼吁大家節(jié)能減排,減少溫室氣體排放
- MQ131臭氧傳感器標(biāo)定需要在標(biāo)準(zhǔn)條件50ppb濃度臭氧下進(jìn)行,請參考datasheet中說明
- DSM501A灰塵傳感器標(biāo)定也可參考datasheet中的說明,需要注意的是DSM501A灰塵傳感器測量粒子濃度與PM2.5、PM10和TSP(PM100)的檢測原理和概念不同,不可混淆,只可做參考
在儀器中以上傳感器均未做標(biāo)定,MQ131、MG811的輸出值為對應(yīng)的電壓值
數(shù)據(jù)采集與展示:
固定采集:
- 溫濕度曲線:
120117cpgpfvhclpe5f2vv.jpg (58.34 KB, 下載次數(shù): 157)
下載附件
2016-4-10 01:49 上傳
- 灰塵粒子曲線:
1201204x666l169zbbgm6m.jpg (75.42 KB, 下載次數(shù): 120)
下載附件
2016-4-10 01:49 上傳
- 氣體濃度曲線:
120122iwymj7nui33gigjh.jpg (73.85 KB, 下載次數(shù): 159)
下載附件
2016-4-10 01:49 上傳
移動采集:
- 采集路線:
121042ojob70006b02bblo.jpg (49.23 KB, 下載次數(shù): 151)
下載附件
2016-4-10 01:49 上傳
- 溫度分布:
1210434xl1e71lllzck67y.jpg (45.24 KB, 下載次數(shù): 140)
下載附件
2016-4-10 01:49 上傳
- 濕度分布:
121044ormuq2am5mi7mxqm.jpg (45.04 KB, 下載次數(shù): 142)
下載附件
2016-4-10 01:49 上傳
- CO2分布:
121045qckcwhcjrqcncgwh.jpg (45.12 KB, 下載次數(shù): 146)
下載附件
2016-4-10 01:49 上傳
- 1微米以上粒子:
121046a5qtw31q1d3xx2by.jpg (45.17 KB, 下載次數(shù): 153)
下載附件
2016-4-10 01:49 上傳
圖中紅色代表高值,藍(lán)色代表低值。
下一步工作:
MQ系列傳感器輔助電路類似,儀器只需更換傳感器探頭和標(biāo)定可實現(xiàn)其它氣體測量
由于MQ131和MG811屬于加熱型傳感器耗電量大,2800mAh的鋰電池只能連續(xù)工作3.5小時左右,同時二氧化碳和臭氧氣體不適合移動觀測,下一步打算將兩種氣體傳感器設(shè)置在固定監(jiān)測儀器上,在留出的面板位置上安裝1602液晶顯示,儀器同時實現(xiàn)便攜式GPS功能。
致謝:
儀器在制作過程中得到論壇和Arduino 與 ADK 熱心網(wǎng)友的大力幫助,他們早出晚歸,談天論地,不分主題,有問必答,暢所欲言,謝謝大家!!
風(fēng)塵檢測傳感器相關(guān)代碼:
- while(goloop) //loop
- {
- currentMillis = micros();
- if(currentMillis<previousmillis)
- {
- partMillis = 4294967295 - previousMillis +1;
- previousMillis = 0;
- }
- if(currentMillis - previousMillis - partMillis < mintev)
- {
- //1.0
- if(temp1_0==0)
- {
- temp1_0=-1;
- temp1_0=pulseIn(DSMPin1_0, LOW);
- }
- if(temp1_0>0)
- {
- duration1_0 =duration1_0 + temp1_0;
- temp1_0=0;
- }
- //2.5
- if(temp2_5==0)
- {
- temp2_5=-1;
- temp2_5=pulseIn(DSMPin2_5, LOW);
- }
- if(temp2_5>0)
- {
- duration2_5 =duration2_5 + temp2_5;
- temp2_5=0;
- }
- }
- else
- {
- goloop=false;
- previousMillis=currentMillis;
- }
- }
- double per =double(duration1_0)/double(interval);// had multiply 1000
- int pcs1_0 = -1;
- pcs1_0 = per * 50.0;
- per =double(duration2_5)/double(interval);// had multiply 1000
- int pcs2_5 = -1;
- pcs2_5 = per * 50.0;
復(fù)制代碼
|