pm2.5空氣品質感測器製作研習

文章推薦指數: 80 %
投票人數:10人

夏普GP2Y1051AU0F PM2.5 附線 ... 程式庫提供的範例DHTtester ... starttime; // Arduino夏普GP2Y1051AU0F的串口讀取_源代碼_Weesky維天監製// 作者ID:Weesky ; . pm2.5空氣品質感測器製作研習 1.製作前的準備 關於空氣品質傳感器實作前的準備,需要先了解一些基本課程,並且要準備製作的材料與工具: 1.先備:Arduino基礎、ESP8266wifi模組基礎介紹、雲端資料夾下載資料(研習的短連結也是連到一樣的google雲端硬碟) 2.準備工具:小螺絲起子、剪刀、小尖嘴鉗、電鑽(實作研習場地提供) 3.材料:(以下實作研習皆會配發) NO. 項目 必要 1 變壓器9V0.8A5.5*2.1mm https://item.taobao.com/item.htm?spm=a1z09.2.0.0.45b32e8dmFL72I&id=547410078902&_u=p2f65kek22d0  1 2 夏普GP2Y1051AU0FPM2.5附線  https://item.taobao.com/item.htm?spm=a230r.1.14.21.187f4bb9aa0Y3j&id=563801882710&ns=1&abbucket=7#detail 1 3 蜂鳴器5VSOT塑封     1 4 USB轉ESP8266WIFI模組轉接板     5 麵包板400孔長8.5CM寬5.5CM   1 6 9V電池扣     7 ArduinoUNOR3開發板附傳輸線   1 8 單排針長17MM1*40PIN   1 9 2路繼電器模組   1 10 麵包板專用線140條盒裝   1 11 直流電源座5.5*2.1MM     12 40P彩色杜邦線母對母20CM   1 13 面包板電源模組     14 ESP8266WIFI無線模組   1 15 DHT22溫濕度傳感器   1 16 LED(5個紅綠黃藍白各1)   1 17 K&J雙層活動收納盒K-813     18 GP9v方形電池     19 10KOM電阻(色碼:棕黑橙)  1 以上部分必要材料也是可以自行調整增刪 PS:第一次5/13研習的老師回娘家,將會配發以上新增之材料,請老師多多運用。

詳見:4-15/13研習老師回娘家,拿好康~ pm2.5空氣品質感測器製作研習 2.空氣污染指標定義 PM2.5是什麼?(行政院環保署) 空氣中存在許多污染物,其中漂浮在空氣中類似灰塵的粒狀物稱為懸浮微粒(particulatematter,PM),PM粒徑大小有別,小於或等於2.5微米(μm)的粒子,就稱為PM2.5,通稱細懸浮微粒,單位以微克/立方公尺(μg/m3)表示之,它的直徑還不到人的頭髮絲粗細的1/28,非常微細可穿透肺部氣泡,並直接進入血管中隨著血液循環全身,故對人體及生態所造成之影響是不容忽視的。

粒徑(μm) 粒徑大小說明 <100 稱總懸浮微粒(TSP),約為海灘沙粒,可懸浮於空氣中。

<10 稱懸浮微粒(PM10),約為沙子直徑的1/10,容易通過鼻腔之鼻毛與彎道到達喉嚨 2.5~10 稱粗懸浮微粒(PM2.5-10),約頭髮直徑的1/8~1/20大小,可以被吸入並附著於人體的呼吸系統 <2.5 稱細懸浮微粒(PM2.5),約頭髮直徑的1/28,可穿透肺部氣泡,直接進入血管中隨著血液循環全身。

  空氣污染指標的定義(行政院環保署) 空氣污染指標為依據監測資料將當日空氣中懸浮微粒(PM10)(粒徑10微米以下之細微粒)、二氧化硫(SO2)、二氧化氮(NO2)、一氧化碳(CO)及臭氧(O3)濃度等數值,以其對人體健康的影響程度,分別換算出不同污染物之副指標值,再以當日各副指標之最大值為該測站當日之空氣污染指標值(PSI)。

污染物濃度與污染副指標值對照表 污染物 PM10 SO2 CO O3 NO2 統計方式 24小時 平均值 24小時 平均值 24小時內 最大8小時平均值 24小時內 最大小時值 24小時內 最大小時值 單位 μg/m3 ppb ppm ppb ppb PSI值   50 50 30 4.5 60 - 100 150 140 9 120 - 200 350 300 15 200 600 300 420 600 30 400 1200 400 500 800 40 500 1600 500 600 1000 50 600 2000 日PSI值與健康影響 空氣污染指標 (PSI) 0~50 51~100 101~199 200~299 >=300 對健康的影響 良好 普通 不良 非常不良 有害 Good Moderate Unhealthful VeryUnhealthful Hazardous 狀態色塊           人體健康影響 對一般民眾身體健康無影響。

對敏感族群健康無立即影響。

對敏感族群會有輕微症狀惡化的現象,如臭氧濃度在此範圍,眼鼻會略有刺激感。

對敏感族群會有明顯惡化的現象,降低其運動能力;一般大眾則視身體狀況,可能產生各種不同的症狀。

對敏感族群除了不適症狀顯著惡化並造成某些疾病提早開始;減低正常人的運動能力。

pm2.5空氣品質感測器製作研習 3.電路實作 本次實作電路的順序為 1.四 LED空氣汙染等級顯示 2.警告蜂鳴器 3.DTH22溫溼度感應器 4.ESP8266WiFi 模組 5.二路繼電器 6.Sharp空污傳感器(GP2Y1051二代) 7.裝入外殼,設備固定   pm2.5空氣品質感測器製作研習 3-1四LED空氣汙染等級顯示   將4個LED綠、黃、紅、藍(代表紫)接上麵包板,利用ArduinoDigital接腳8、9、10、11,來控制燈號明滅,代表教育部空汙旗的四個顏色標示。

  麵包板需先將電源接上,由Arduino的3.3v及5v,分別接到麵包板上下的紅色標示區域,GND也分別各拉一條到藍色標示區域,如此電路若需要電源或接地,只要接到旁邊即可。

需要材料:   Arduinouno開發版*1   小麵包版*1   長杜邦線*4   短杜邦線 *4   LED(綠、黃、紅、藍) *4   麵包板跳線灰色*3   麵包板跳線藍色*1   (通常麵包板跳線同一長度顏色相同,在這次材料中灰色跳2格,藍色跳5格) LED沒串接電阻容易燒壞,請自行加裝一個220OM的電阻,可直接用電阻取代藍色跳線。

參考資料: Arduino第一課:LED串流電阻的學問 pm2.5空氣品質感測器製作研習 3-2警告蜂鳴器   汙染嚴重,感測值>200ug/m3 時,發出警告蜂鳴聲,利用ArduinoDigital接腳13 來控制蜂鳴器發聲。

  蜂鳴器接在13腳位,也會有特別效果,在插電或一些動作時,13腳位預設接到Arduino板上的LED,會有一些操作提示燈號,因此接了蜂鳴器就會發出一些提示聲。

需要材料:   蜂鳴器(有源) *1   短杜邦線 *1   麵包板跳線黃色*1   測試程式:buzzer_test.ino、pitches.h (兩檔案須放在同一資料夾) buzzer_test.ino #include"pitches.h" //notesinthemelody: intmelody[]={ NOTE_C5,NOTE_D5,NOTE_E5,NOTE_F5,NOTE_G5,NOTE_A5,NOTE_B5,NOTE_C6}; intduration=500;//500miliseconds voidsetup(){ } voidloop(){ for(intthisNote=0;thisNote<8;thisNote++){ //在pin13上輸出聲音,每個音階響0.5秒 tone(13,melody[thisNote],duration); //間隔一段時間後再播放下一個音階 delay(1000); } //兩秒後重新播放 delay(2000); } pitches.h /************************************************* *PublicConstants *************************************************/ #defineNOTE_B031 #defineNOTE_C133 #defineNOTE_CS135 #defineNOTE_D137 #defineNOTE_DS139 #defineNOTE_E141 #defineNOTE_F144 #defineNOTE_FS146 #defineNOTE_G149 #defineNOTE_GS152 #defineNOTE_A155 #defineNOTE_AS158 #defineNOTE_B162 #defineNOTE_C265 #defineNOTE_CS269 #defineNOTE_D273 #defineNOTE_DS278 #defineNOTE_E282 #defineNOTE_F287 #defineNOTE_FS293 #defineNOTE_G298 #defineNOTE_GS2104 #defineNOTE_A2110 #defineNOTE_AS2117 #defineNOTE_B2123 #defineNOTE_C3131 #defineNOTE_CS3139 #defineNOTE_D3147 #defineNOTE_DS3156 #defineNOTE_E3165 #defineNOTE_F3175 #defineNOTE_FS3185 #defineNOTE_G3196 #defineNOTE_GS3208 #defineNOTE_A3220 #defineNOTE_AS3233 #defineNOTE_B3247 #defineNOTE_C4262 #defineNOTE_CS4277 #defineNOTE_D4294 #defineNOTE_DS4311 #defineNOTE_E4330 #defineNOTE_F4349 #defineNOTE_FS4370 #defineNOTE_G4392 #defineNOTE_GS4415 #defineNOTE_A4440 #defineNOTE_AS4466 #defineNOTE_B4494 #defineNOTE_C5523 #defineNOTE_CS5554 #defineNOTE_D5587 #defineNOTE_DS5622 #defineNOTE_E5659 #defineNOTE_F5698 #defineNOTE_FS5740 #defineNOTE_G5784 #defineNOTE_GS5831 #defineNOTE_A5880 #defineNOTE_AS5932 #defineNOTE_B5988 #defineNOTE_C61047 #defineNOTE_CS61109 #defineNOTE_D61175 #defineNOTE_DS61245 #defineNOTE_E61319 #defineNOTE_F61397 #defineNOTE_FS61480 #defineNOTE_G61568 #defineNOTE_GS61661 #defineNOTE_A61760 #defineNOTE_AS61865 #defineNOTE_B61976 #defineNOTE_C72093 #defineNOTE_CS72217 #defineNOTE_D72349 #defineNOTE_DS72489 #defineNOTE_E72637 #defineNOTE_F72794 #defineNOTE_FS72960 #defineNOTE_G73136 #defineNOTE_GS73322 #defineNOTE_A73520 #defineNOTE_AS73729 #defineNOTE_B73951 #defineNOTE_C84186 #defineNOTE_CS84435 #defineNOTE_D84699 #defineNOTE_DS84978 若檔案下載正確,開啟buzzer_test.ino時,畫面如下 pm2.5空氣品質感測器製作研習 3-3DTH22溫溼度感應器    DHT22為相當優秀溫度、濕度的感測器,很多智慧家電皆有它的蹤跡,價格還算便宜...   連接DHT22需在其第1、2腳位,串接一電阻(1kOM),第1腳接5v,第2腳接ArduinoDigital7,第4腳接地 需要材料:   DHT22溫濕度傳感器*1   10kOM電阻*1    麵包板跳線橘色*1    麵包板跳線紅色*1(需修剪長度)   DHT22的程式庫需另外下載,請在ArduinoIDE程式的[草稿碼]→[匯入程式庫]→[管理程式庫...] 搜尋DHT22,[選擇版本]點選最新版本,按 [安裝] 測試程式:   [檔案]→[範例]→[DHTsensorlibrary]→[DHTtester]   修改程式: #defineDHTPIN7//研習使用ArduinoDigital7,請修改為7   程式庫提供的範例DHTtester //ExampletestingsketchforvariousDHThumidity/temperaturesensors //Writtenbyladyada,publicdomain #include"DHT.h" #defineDHTPIN7//研習使用ArduinoDigital7,請修改為7 //Uncommentwhatevertypeyou'reusing! //#defineDHTTYPEDHT11//DHT11 #defineDHTTYPEDHT22//DHT22(AM2302),AM2321 //#defineDHTTYPEDHT21//DHT21(AM2301) //Connectpin1(ontheleft)ofthesensorto+5V //NOTE:Ifusingaboardwith3.3VlogiclikeanArduinoDueconnectpin1 //to3.3Vinsteadof5V! //Connectpin2ofthesensortowhateveryourDHTPINis //Connectpin4(ontheright)ofthesensortoGROUND //Connecta10Kresistorfrompin2(data)topin1(power)ofthesensor //InitializeDHTsensor. //Notethatolderversionsofthislibrarytookanoptionalthirdparameterto //tweakthetimingsforfasterprocessors.Thisparameterisnolongerneeded //asthecurrentDHTreadingalgorithmadjustsitselftoworkonfasterprocs. DHTdht(DHTPIN,DHTTYPE); voidsetup(){ Serial.begin(9600); Serial.println("DHTxxtest!"); dht.begin(); } voidloop(){ //Waitafewsecondsbetweenmeasurements. delay(2000); //Readingtemperatureorhumiditytakesabout250milliseconds! //Sensorreadingsmayalsobeupto2seconds'old'(itsaveryslowsensor) floath=dht.readHumidity(); //ReadtemperatureasCelsius(thedefault) floatt=dht.readTemperature(); //ReadtemperatureasFahrenheit(isFahrenheit=true) floatf=dht.readTemperature(true); //Checkifanyreadsfailedandexitearly(totryagain). if(isnan(h)||isnan(t)||isnan(f)){ Serial.println("FailedtoreadfromDHTsensor!"); return; } //ComputeheatindexinFahrenheit(thedefault) floathif=dht.computeHeatIndex(f,h); //ComputeheatindexinCelsius(isFahreheit=false) floathic=dht.computeHeatIndex(t,h,false); Serial.print("Humidity:"); Serial.print(h); Serial.print("%\t"); Serial.print("Temperature:"); Serial.print(t); Serial.print("*C"); Serial.print(f); Serial.print("*F\t"); Serial.print("Heatindex:"); Serial.print(hic); Serial.print("*C"); Serial.print(hif); Serial.println("*F"); }   pm2.5空氣品質感測器製作研習 3-4ESP8266WiFi模組   ESP8266 WiFi模組,可以說是一個超優質的發明,帶領Maker進入IOT世界,甚至可以代替Arduino當作主要控制器使用,今天我們將它當作Arduino與無線網路連接的介面。

  以下列出ESP8266的一些重點事項: 1.接線要小心   網路上的說明圖片或電路圖皆是8266的正面喔!但接腳在反面,接線要特別注意!! 2. 無法直接插上麵包板   麵包板的凹洞連通設計,不適合esp8266的接腳直插,需要使用轉接板 小狐狸事務所:ESP8266轉接板 3.降版燒錄,需外接足夠電源   目前ESP8266單純當作WiFi使用時,大多會重新燒錄降版韌體。

目前購買的8266,內建的韌體預設BaudRate(鮑率)115200,降版改用9600會較穩定(聽說),所以需要將ESP8266重新燒錄降版的韌體,網路上大多使用USBtoTTL轉接器,之前5/13研習也是,但燒錄需要外接足夠電流源,接線又很複雜,一有錯誤皆無法完成,甚至燒壞8266晶片。

  另有老師測試,用115200來跑也都滿正常的!哈哈!那就真不知道5/13研習大家都在忙甚麼了?!不過,還是有備無患!特別找到更好的工具,USBto8266轉接器,燒錄直上,不需外接電源!另外再幫大家銲接一個燒錄模式切換開關!這樣的組合只有在這裡研習才拿得到的喔~~   USBto8266轉接器外觀   燒錄方式請見ESP8266講義:      1-1ESP8266燒錄說明      1-2用USBto8266轉接板燒錄(降版)   4.接法   ESP8266的資料傳輸,一般都是使用軟體模擬序列埠(SoftwareSerial)來連接,將ArduinoDigital4、5模擬成序列埠的RX與TX,將ESP8266的TX(藍線)接4(RX)、RX(黃線)接5(TX),這樣用軟體Serial就可以與ESP8266溝通。

再來需接3.3v(紅線、橘線),接地(黑線) 需要材料:   ESP8266WiFi模組*1   長杜邦線*5 ESP8266接腳定義如下:(網路上的說明圖片或電路圖皆是8266的正面喔!但接腳卻在反面,接線要特別注意!!)   請以電路圖相同顏色的線來接,方便記憶與除錯!! pm2.5空氣品質感測器製作研習 3-5二路繼電器   由二路繼電器接收ArduinoDigital接腳6(紫線) 來控制重置ESP8266,接腳12(棕線)來控制電器(排風扇、警示燈、空氣清淨機),   二路繼電器需接5v(紅線)與接地(黑線),執行控制8266的部分是將relay1的C埠(綠線)接地,NO埠(灰線)接8266的RST腳。

需要材料:   二路繼電器*1   長杜邦線*6 繼電器的三個接腳說明:   NC:NormalClose常閉接點,繼電器未啟動時NC與C接點是通的,啟動後變成不通(開路)。

  C:Common共同接點   NO:NormalOpen常開接點,繼電器未啟動時NC與C接點是不通的,啟動後是接通的(閉路)。

  pm2.5空氣品質感測器製作研習 3-6Sharp空污傳感器(GP2Y1051二代)   最後一個元件接Sharp空污傳感器(GP2Y1051二代),因為Arduino上傳程式時,若有接著傳感器,上傳會失敗,所以最後再來裝。

  資料線(黃)接ArduinoDigital0接腳,5v(紅線)和接地(黑線)直接接到麵包板上,這樣就可以了。

需要材料:    SharpGP2Y1051傳感器*1(含3pin排線紅黑黃)   杜邦頭壓接請參考DanielLiu  pm2.5空氣品質感測器製作研習 3-7裝入外殼,設備固定   本次研習後,希望能夠方便學校固定設備回傳資料,故準備一硬質塑膠盒(K&J雙層活動收納盒K-813),在研習現場直接安置所有零件設備,請老師盡量在研習中完成。

放置到外殼中 標示打孔的位置 用手電鑽打孔結果,Sharp空污感測器、DHT22感測器要拉到盒子外面,以熱熔膠固定。

安裝好將Sharp空污傳感器、DHT22溫濕度感應器拉出外殼,並且用熱熔膠固定,如下圖 pm2.5空氣品質感測器製作研習 4.程式編撰上傳   呼~接線終於完成,雖然辛苦,可是一定收穫滿滿,最後就是將程式寫入Arduino就OK囉!當然也已經幫大家寫好範本可以直接匯入,不過還是需要小改一下,加油。

pm2.5空氣品質感測器製作研習 4-1修改sample程式   一開始從網路搜尋而來,修改了很多次幾乎內容全改,本來想把一些版權宣告刪掉因為怕太亂,不過秉持自由軟體開源精神,就都先保留囉!若有哪些程試片段版權是別人的,也麻煩告知喔! 程式路徑與檔名為:   雲端→空污感測實務課程→Arduino程式→1050722→LED4_Buzzer_DHT22_ESP8266_Relay_air2_sample     請將以下資訊修改完,才能上傳Arduino,這樣回傳的資料才不會大家都一樣。

1.修改自己學校的無線網路名稱、密碼:例如名稱jljhs-dlink-1密碼jljhs123    雙斜線//內容後是註解,可保留中心電腦教室測試的無線網路名稱密碼,在前面加雙斜線註解掉就好。

2.修改自己的學校代碼 3.修改設備編號(若同校有兩個以上的老師參加研習,自行決定用哪個編號0~255) 4.修改自己學校的GPS,參考以下文件,或參考「用GoogleMap取得GPS座標」教學影片。

  雲端→台南市國中小基本資料.doc   完整程式碼: #include #include #define_rxpin4//接ESP8266TX #define_txpin5//接ESP8266RX #defineRST6//接ESP8266RST #defineDHTPIN7//接DHT22資料傳輸 #defineLED_G8//接綠燈 #defineLED_Y9//接黃燈 #defineLED_R10//接紅燈 #defineLED_B11//接藍(紫)燈 #defineRelay212//ControlFanorLight #defineBuzzer13//接蜂鳴器 #defineDHTTYPEDHT22//SENSORTYPE-THEADAFRUITLIBRARYOFFERSSUPPORTFORMOREMODELS DHTdht(DHTPIN,DHTTYPE); SoftwareSerialWiFiSerial(_rxpin,_txpin);//ESP8266RX,TX //*--IoTInformation StringSSID="TN-Computer-bridge";//無線網路名稱 StringPASS="computer123";//無線網路密碼 //StringSSID="修改自己的無線網路名稱";//無線網路名稱 //StringPASS="修改自己的無線網路密碼";//無線網路密碼 Stringschoolcode="修改自己的學校代碼";//學校代碼 intno=0;//設備編號,可設定0~255,在監測網上可區別一校多個設備 StringPMgps="修改自己的學校經緯度座標";//學校經緯度座標 //longupdateInterval=1800000;//傳送資料時間間隔,測試完請設定1800000(30分鐘) longupdateInterval=10000;//傳送資料時間間隔,測試用10000(10秒鐘)時間太短亦會發生錯誤 StringIP="pm25.tn.edu.tw";//PM2.5網站網址 //sharpGP2Y1051二代start intincomeByte[7]; intdata; intz=0; intsum,sount; unsignedlongerror,starttime; //Arduino夏普GP2Y1051AU0F的串口讀取_源代碼_Weesky維天監製 //作者ID:Weesky;... //2014年11月23日 //v1.0基礎版本,成功讀取數值,並且算出PM2.5濃度。

//v1.1改進了算法,這樣看起來數值高了些。

對於愛好者操作更容易了。

//請不要在採樣週期裡面添加延遲delay這樣的。

不然串口寄存器只有64Byte,很可能被塞滿。

//修改者:ng344 //增加溫濕度感測、2-way-relay、ESP8266、LED警示 voidsetup() { Serial.begin(2400); dht.begin(); WiFiSerial.begin(9600); starttime=millis();//設定Sharp感測器開始的擷取時間 sendtoWiFi("AT"); delay(1000); if(WiFiSerial.find("OK")) { Serial.println("RECEIVED:OKafterATCommand\nDatareadytosent!"); connectWiFi(); } else{ Serial.println("fale"); } pinMode(LED_G,OUTPUT); pinMode(LED_Y,OUTPUT); pinMode(LED_R,OUTPUT); pinMode(LED_B,OUTPUT); pinMode(RST,OUTPUT); pinMode(Relay2,OUTPUT); pinMode(Buzzer,OUTPUT); digitalWrite(LED_G,LOW); digitalWrite(LED_Y,LOW); digitalWrite(LED_R,LOW); digitalWrite(LED_B,LOW); digitalWrite(RST,HIGH); digitalWrite(Relay2,HIGH); } voidloop(){ while(Serial.available()>0){ data=Serial.read(); if(data==170){ z=0; incomeByte[z]=data; } else{ z++; incomeByte[z]=data; } if(z==6) { sum=incomeByte[1]+incomeByte[2]+incomeByte[3]+incomeByte[4]; if(incomeByte[5]==sum&&incomeByte[6]==255) { /*Serial.print("DataOK!|"); for(intk=0;k<7;k++) { Serial.print(incomeByte[k]);//列印出接收到Sharp的資料 Serial.print("|"); } */ //Serial.print("Vo="); floatvo=(incomeByte[1]*256.0+incomeByte[2])/1024.0*5.00; //Serial.print(vo,3); //Serial.print("v|"); floatT=vo*700; //這裡我修改過咯,2014年11月23日,v1.1 //普通Arduinio玩家也可以算出濃度啦! //當然更精準的還需要自行標定哦:) //Serial.print("PM2.5="); //Serial.print(T,2); //Serial.print("ug/m3"); //Serial.println(); updateSensor(T); delay(updateInterval);//設定傳送時間間隔 } else{ z=0; Serial.flush(); data='/0'; for(intm=0;m<7;m++){ incomeByte[m]=0; } } z=0; } } } voidupdateSensor(floatT) { digitalWrite(LED_G,HIGH); digitalWrite(LED_Y,HIGH); digitalWrite(LED_R,HIGH); digitalWrite(LED_B,HIGH); delay(2000); digitalWrite(LED_G,LOW); digitalWrite(LED_Y,LOW); digitalWrite(LED_R,LOW); digitalWrite(LED_B,LOW); delay(1000); if(T>=0&&T<36){ digitalWrite(LED_G,HIGH); } elseif(T>=36&&T<54){ digitalWrite(LED_Y,HIGH); } elseif(T>=54&&T<71){ digitalWrite(LED_R,HIGH); } elseif(T>=71&&T<200){ digitalWrite(LED_B,HIGH); } elseif(T>=200){ digitalWrite(LED_B,HIGH); digitalWrite(Relay2,LOW); delay(1000); tone(Buzzer,500); delay(1000); tone(Buzzer,1000); delay(1000); noTone(Buzzer);} else{digitalWrite(Relay2,HIGH); delay(1000); } //noTone(Buzzer);} //設定ESP8266作為Client端 Stringcmd="AT+CIPSTART=\"TCP\",\""+IP+"\",80"; sendtoWiFi(cmd); delay(1000); if(WiFiSerial.find("Error")) { Serial.print("RECEIVED:Error\nExit1"); return; } floath=dht.readHumidity(); floatt=dht.readTemperature(); booleansendOK=false; cmd="GET/xoops/api.php?schoolcode="+schoolcode+"&no="+no+"&pm25="+T+"&t="+t+"&h="+h+"&gps="+PMgps+"\r\n"; sendtoWiFi("AT+CIPSEND="+(String)cmd.length()); delay(5000); if(WiFiSerial.find(">")) { Serial.print(">"); WiFiSerial.print(cmd);//送出pm2.5資料 if(WiFiSerial.find("OK")){//檢查WiFi模組是否正確傳出資料 sendOK=true; } Serial.print(cmd); } else { sendtoWiFi("AT+CIPCLOSE"); } if(sendOK) { Serial.println("RECEIVED:OK"); } else { Serial.println("RECEIVED:Error\nExit2"); //resetESP8266 digitalWrite(RST,LOW);//needchangtoHIGHifRelayuseHIGHactive delay(1000); digitalWrite(RST,HIGH);//needchangtoLOWifRelayuseHIGHactive } } voidsendtoWiFi(Stringcmd) { Serial.print("SEND:"); Serial.println(cmd); WiFiSerial.println(cmd); } booleanconnectWiFi() { WiFiSerial.println("AT+CWMODE=1"); Serial.println("SendAT+CWMODE=1"); delay(3000); intcount=0; Stringcmd="AT+CWJAP=\""+SSID+"\",\""+PASS+"\""; sendtoWiFi(cmd); Serial.println("Waitingfor15secondtoconnectnetwork....."); delay(15000); /* if(WiFiSerial.find("OK")) { Serial.println("RECEIVED:OK"); returntrue; } else { Serial.println("RECEIVED:Unknown"); returnfalse; } */ cmd="AT+CIPMUX=0"; sendtoWiFi(cmd); if(WiFiSerial.find("Error")) { Serial.print("RECEIVED:Error"); returnfalse; } }   pm2.5空氣品質感測器製作研習 4-2上傳Arduino     Sample程式修改完,就是上傳囉!不過之前也有提醒到,SharpGP2Y1051的傳感器,有時必須先拔除紅黑線(電源),這樣才能正常上傳程式。

上傳完畢後由兩個地方觀察運作狀況: 1.序列埠輸出監控視窗,BaudRate(鮑率)需調成2400 2. 到pm2.5監測網站,看有無上傳資料 http://pm25.tn.edu.tw/ pm2.5空氣品質感測器製作研習 4-3回校安裝步驟 1.找一台電腦安裝ArduinoIDE開發環境程式 2.下載DHT22的程式庫!!(上傳程式才不會出現錯誤:DHT.h:Nosuchfileordirectory)    [草稿碼]→[匯入程式庫]→[管理程式庫...]→搜尋DHT22→點選最新版本→點安裝 3.修改Sample程式中的WiFi連線SSID(無線網路名稱)及密碼,以及傳送時間間隔改成1800000,網站才不會一下子就灌爆。

>@< 4.7/22老師用第二代sharp傳感器,上傳程式若一直停在上傳中,先拔除Sharp傳感器的紅黑線再上傳。

※若有甚麼問題,請在討論區發問,大家一起討論學習喔! ※ 架設參考:感謝安定國小張智傑老師提供 pm2.5空氣品質感測器製作研習 5.備註 pm2.5空氣品質感測器製作研習 5-1ESP8266燒錄救星(必看) 本次研習提供新的燒錄ESP8266方式,請見以下講義。

  燒錄方式請見ESP8266講義:      1-1ESP8266燒錄說明      1-2用USBto8266轉接板燒錄(降版) pm2.5空氣品質感測器製作研習 5-2修改電路1_改成較穩定的電路 原電路圖:(使用降壓板,除非外接電源,否則傳送會不穩) 改良電路圖: pm2.5空氣品質感測器製作研習 5-3修改電路2_增加DHT22溫濕度感測 需要材料:   DHT22溫濕度感測器*1   10kOM電阻*1   長杜邦線 *1 (資料傳輸黃線)   麵包板跳線*1 (電源紅線) ps:DHT22電源接地先不接!再下一步驟會跟LED燈一起接。

  DHT22的程式庫需另外下載安裝,請在ArduinoIDE程式的[草稿碼]→[匯入程式庫]→[管理程式庫...] 搜尋DHT22,[選擇版本]點選最新版本,按 [安裝] 測試程式 修改程式: #defineDHTPIN7//研習使用ArduinoDigital7,請修改為7   程式庫提供的範例DHTtester //ExampletestingsketchforvariousDHThumidity/temperaturesensors //Writtenbyladyada,publicdomain #include"DHT.h" #defineDHTPIN7//研習使用ArduinoDigital7,請修改為7 //Uncommentwhatevertypeyou'reusing! //#defineDHTTYPEDHT11//DHT11 #defineDHTTYPEDHT22//DHT22(AM2302),AM2321 //#defineDHTTYPEDHT21//DHT21(AM2301) //Connectpin1(ontheleft)ofthesensorto+5V //NOTE:Ifusingaboardwith3.3VlogiclikeanArduinoDueconnectpin1 //to3.3Vinsteadof5V! //Connectpin2ofthesensortowhateveryourDHTPINis //Connectpin4(ontheright)ofthesensortoGROUND //Connecta10Kresistorfrompin2(data)topin1(power)ofthesensor //InitializeDHTsensor. //Notethatolderversionsofthislibrarytookanoptionalthirdparameterto //tweakthetimingsforfasterprocessors.Thisparameterisnolongerneeded //asthecurrentDHTreadingalgorithmadjustsitselftoworkonfasterprocs. DHTdht(DHTPIN,DHTTYPE); voidsetup(){ Serial.begin(9600); Serial.println("DHTxxtest!"); dht.begin(); } voidloop(){ //Waitafewsecondsbetweenmeasurements. delay(2000); //Readingtemperatureorhumiditytakesabout250milliseconds! //Sensorreadingsmayalsobeupto2seconds'old'(itsaveryslowsensor) floath=dht.readHumidity(); //ReadtemperatureasCelsius(thedefault) floatt=dht.readTemperature(); //ReadtemperatureasFahrenheit(isFahrenheit=true) floatf=dht.readTemperature(true); //Checkifanyreadsfailedandexitearly(totryagain). if(isnan(h)||isnan(t)||isnan(f)){ Serial.println("FailedtoreadfromDHTsensor!"); return; } //ComputeheatindexinFahrenheit(thedefault) floathif=dht.computeHeatIndex(f,h); //ComputeheatindexinCelsius(isFahreheit=false) floathic=dht.computeHeatIndex(t,h,false); Serial.print("Humidity:"); Serial.print(h); Serial.print("%\t"); Serial.print("Temperature:"); Serial.print(t); Serial.print("*C"); Serial.print(f); Serial.print("*F\t"); Serial.print("Heatindex:"); Serial.print(hic); Serial.print("*C"); Serial.print(hif); Serial.println("*F"); }   pm2.5空氣品質感測器製作研習 5-4修改電路3_加裝4個LED標示燈   為了電路圖顯示清楚,圖上各元件的位置有所移動,但僅修改一條接線,其他線路不變。

需要材料:   LED燈 (綠、黃、紅、藍各1個) * 4    麵包板跳線 綠線(短)*2    麵包板跳線 黃線(短)*2   麵包板跳線 紅線(最短)*4    麵包板跳線 紅線(中)*2    麵包板跳線 灰線(中)*1     麵包板跳線 白線(中)*1  接線修改:   請將由繼電器IN1接腳接出的紫線,原本接到Arduino8接腳,改到6接腳,因為想要四個LED在Arduino的接線連在一起。

  若不安裝LED燈,也要修改此接線,因為Sample程式有修改,不然就自行修改程式。

修改前 修改後 pm2.5空氣品質感測器製作研習 5-5修改新程式,上傳Arduino 程式路徑與檔名為: 雲端→空污感測實務課程→Arduino程式→1050513→LED4_Buzzer_DHT22_ESP8266_Relay_air1_sample 需修改程式內容如下紅色框框:   新增設備編號欄位!若學校有2位以上的老師參加本研習,自行協調上傳的編號(0-255),以利辨識。

  回校安裝務必再看一下 3-3 回校安裝步驟,以免出錯   最後付上forSharpGP2Y1010新程式: #include #include #define_rxpin4//接ESP8266TX #define_txpin5//接ESP8266RX #defineRST6//接ESP8266RST #defineDHTPIN7//接DHT22資料傳輸 #defineLED_G8//接綠燈 #defineLED_Y9//接黃燈 #defineLED_R10//接紅燈 #defineLED_B11//接藍(紫)燈 #defineRelay212//ControlFanorLight #defineBuzzer13//接蜂鳴器 #defineDHTTYPEDHT22//SENSORTYPE-THEADAFRUITLIBRARYOFFERSSUPPORTFORMOREMODELS DHTdht(DHTPIN,DHTTYPE); SoftwareSerialWiFiSerial(_rxpin,_txpin);//ESP8266RX,TX //*--IoTInformation //StringSSID="TN-Computer-bridge";//無線網路名稱 //StringPASS="computer123";//無線網路密碼 StringSSID="修改自己的無線網路名稱";//無線網路名稱 StringPASS="修改自己的無線網路密碼";//無線網路密碼 Stringschoolcode="修改自己的學校代碼";//學校代碼 intno=0;//設備編號,可設定0~255,在監測網上可區別一校多個設備 StringPMgps="修改自己的學校經緯度座標";//學校經緯度座標 longupdateInterval=1800000;//傳送資料時間間隔,測試完請設定1800000(30分鐘) //longupdateInterval=10000;//傳送資料時間間隔,測試用10000(10秒鐘)時間太短亦會發生錯誤 StringIP="pm25.tn.edu.tw";//PM2.5網站網址 //sharpstart intmeasurePin=0;//連接空氣品質傳感器toArduinoA0pin intledPower=2;//Connect3leddriverpinsofdustsensortoArduinoD2 intsamplingTime=280; intdeltaTime=40; intsleepTime=9680; floatvoMeasured=0; floatcalcVoltage=0; floatdustDensity=0; //sharpend voidsetup(){ Serial.begin(9600);//MONITOR dht.begin();//DHT22 WiFiSerial.begin(9600);//ESP8266 sendtoWiFi("AT"); delay(1000); if(WiFiSerial.find("OK")) { Serial.println("RECEIVED:OKafterATCommand\nDatareadytosent!"); connectWiFi(); } pinMode(ledPower,OUTPUT);//sharp pinMode(RST,OUTPUT); pinMode(LED_G,OUTPUT); pinMode(LED_Y,OUTPUT); pinMode(LED_R,OUTPUT); pinMode(LED_B,OUTPUT); pinMode(Relay2,OUTPUT); pinMode(Buzzer,OUTPUT); digitalWrite(RST,HIGH);//CHANGETOLOWIFHIGHACTIVE digitalWrite(LED_G,LOW); digitalWrite(LED_Y,LOW); digitalWrite(LED_R,LOW); digitalWrite(LED_B,LOW); digitalWrite(Relay2,HIGH); } voidloop(){ digitalWrite(ledPower,LOW);//powerontheLED delayMicroseconds(samplingTime); voMeasured=analogRead(measurePin);//readthedustvalue delayMicroseconds(deltaTime); digitalWrite(ledPower,HIGH);//turntheLEDoff delayMicroseconds(sleepTime); //0-5Vmappedto0-1023integervalues //recovervoltage calcVoltage=voMeasured*(5.0/1024.0); //lineareqautiontakenfromhttp://www.howmuchsnow.com/arduino/airquality/ //ChrisNafis(c)2012 if(calcVoltage<0.583){ dustDensity=0; } else{ dustDensity=6*calcVoltage/35-0.1; } Serial.print("RawSignalValue(0-1023):"); Serial.print(voMeasured); Serial.print("-Voltage:"); Serial.print(calcVoltage); Serial.print("-DustDensity:"); Serial.print(dustDensity*1000);//這裡將數值呈現改成較常用的單位(ug/m3) Serial.println("ug/m3"); floatT=dustDensity*1000; updateSensor(T); delay(updateInterval);//設定傳送時間間隔 } voidupdateSensor(floatT) { digitalWrite(LED_G,HIGH); digitalWrite(LED_Y,HIGH); digitalWrite(LED_R,HIGH); digitalWrite(LED_B,HIGH); delay(2000); digitalWrite(LED_G,LOW); digitalWrite(LED_Y,LOW); digitalWrite(LED_R,LOW); digitalWrite(LED_B,LOW); delay(1000); if(T>=0&&T<36){ digitalWrite(LED_G,HIGH); } elseif(T>=36&&T<54){ digitalWrite(LED_Y,HIGH); } elseif(T>=54&&T<71){ digitalWrite(LED_R,HIGH); } elseif(T>=71&&T<200){ digitalWrite(LED_B,HIGH); } elseif(T>200){ digitalWrite(LED_B,HIGH); digitalWrite(Relay2,LOW); delay(1000); tone(Buzzer,500); delay(1000); tone(Buzzer,1000); delay(1000); noTone(Buzzer);} else{digitalWrite(Relay2,HIGH); delay(1000);} //noTone(Buzzer);} //設定ESP8266作為Client端 Stringcmd="AT+CIPSTART=\"TCP\",\""+IP+"\",80"; sendtoWiFi(cmd); delay(1000); if(WiFiSerial.find("Error")) { Serial.print("RECEIVED:Error\nExit1"); return; } floath=dht.readHumidity(); floatt=dht.readTemperature(); booleansendOK=false; cmd="GET/xoops/api.php?schoolcode="+schoolcode+"&no="+no+"&pm25="+T+"&t="+t+"&h="+h+"&gps="+PMgps+"\r\n"; sendtoWiFi("AT+CIPSEND="+(String)cmd.length()); delay(5000); if(WiFiSerial.find(">")) { Serial.print(">"); WiFiSerial.print(cmd);//送出pm2.5資料 if(WiFiSerial.find("OK")){//檢查WiFi模組是否正確傳出資料 sendOK=true; } Serial.print(cmd); } else { sendtoWiFi("AT+CIPCLOSE"); } if(sendOK) { Serial.println("RECEIVED:OK"); } else { Serial.println("RECEIVED:Error\nExit2"); //resetESP8266 digitalWrite(RST,LOW);//needchangtoHIGHifRelayuseHIGHactive delay(1000); digitalWrite(RST,HIGH);//needchangtoLOWifRelayuseHIGHactive } } voidsendtoWiFi(Stringcmd) { Serial.print("SEND:"); Serial.println(cmd); WiFiSerial.println(cmd); } booleanconnectWiFi() { WiFiSerial.println("AT+CWMODE=1"); Serial.println("SendAT+CWMODE=1"); delay(3000); intcount=0; Stringcmd="AT+CWJAP=\""+SSID+"\",\""+PASS+"\""; sendtoWiFi(cmd); Serial.println("Waitingfor15secondtoconnectnetwork....."); delay(15000); /* if(WiFiSerial.find("OK")) { Serial.println("RECEIVED:OK"); returntrue; } else { Serial.println("RECEIVED:Unknown"); returnfalse; } */ cmd="AT+CIPMUX=0"; sendtoWiFi(cmd); if(WiFiSerial.find("Error")) { Serial.print("RECEIVED:Error"); returnfalse; } }  



請為這篇文章評分?