我們將下表之PMS3003 空氣懸浮粒子感測器測試程式攥寫好之後,編譯完成再上傳到Ameba 開發板。
(表2)PMS3003 空氣懸浮粒子感測器測試程式 ...
110年百萬創客擂台競賽創客精神國內消息Maker新知勞動部勞動力發展署[北基宜花金馬分署]物聯網創客基地[桃竹苗分署]衣啟飛翔創客基地[中彰投分署]TCN創客基地[雲嘉南分署]南方創客基地[高屏澎東分署]創客小棧[高屏澎東分署]澎湖創客基地教育部FABTRUKC3D列印校園巡迴推廣自造卡車巡迴地圖國際消息自造專訪專題創客時代:自造台灣的未來前進校園!研發發聲器、親手做玩具這些創客們為孩童做的事從啟蒙到行動政府整合軟硬體資源,助臺灣創客站上產業創新的浪尖洪堯泰X黃宸謙對談創客與創客推手應「魚幫水、水幫魚」,共同活絡創客生態系歐敏銓創辦「MakerPRO」媒體社群平台 推動Maker社群新經濟從美國車庫到亞洲「自造者空間」創客翻轉傳統製造業,動手改變社會課本上沒教的事,都在她的創客教室 顏椀君不教創客技能,而是讓師生一同冒險、闖出無限可能性前華碩工程師創「微光計畫」讓科技成為指引視障者的燈塔「空氣盒子」匯聚公民、企業與政府之力打造全球最密集的微型空氣品質監測網打破運動輪椅的高價門檻——TooWheels開源計畫讓身障者就地取材,DIY媲美專業性能的運動輪椅環保生活自己造【Maker動手做】懶人救星—遠端監控的自動盆栽電子元件BANG不見:可分解元件和你一起環保愛地球!跟自然學環保,把果皮變成包裝袋!3D食物環保計畫,好吃好玩又好看!Maker用咖啡渣做咖啡杯,香味加倍還能減少浪費最完整塑膠回收指南,跟環保創客一起將廢塑改頭換面!廢紙大改造,環保蔡倫就是你!外帶珍奶怎麼裝?用葫蘆當杯子吧!12歲創客打造微塑膠檢測機,用行動表達對海洋的愛2018MakerFaireTaipei2018台中創客嘉年華2018AI桃園新創嘉年華物聯網創客基地專訪南方創客基地專訪法國Fab14系列報導Maker×生醫科技X醫護-智慧醫療旋風席捲全台骨科界的福音「超彈性骨」來了!3D印「仿生眼」來了!重見天日還會遠嗎?全台首座3D示範場域,南科「印」出創新醫材導入3D列印在肋骨骨折手術,降低手術風險生醫與maker手牽手,3D技術導入提高治療成功率3D列印懶人包人工智慧專題【人臉辨識專題】人臉辨識技術發展剖析科技X醫護-智慧醫療旋風席捲全台【人工智慧】地震來了!真的假的?讓人工智慧ConvNetQuake幫忙偵測地震吧!【人工智慧】當人工智慧現世,人類會面臨到哪些問題呢?【人工智慧】結合機械手臂與AI,讓機械手臂能識別物體、自動卸貨法國土魯斯FabLabFestival2017FabLabFestival2017,歐洲產業巨頭取經maker精神歐洲最大FablabFestival2017在法國土魯斯,4大創新FAB14在法國,專訪主辦單位ArtilectFabLab創辦人NicolasLassabe美國創新中心AIC在AIC努力找創新 你的認真會被世界看到身處松菸的靈感光點——美國創新中心高師大自造者基地FabLab-NKNU–高師大自造者基地FabLab-NKNU,從培育maker師資角度,設計出一個適合培訓、延展的體系。
Maker教育星系上自轉公轉的大樹行星基地——高師大自造者基地FabLab-NKNU被自造者行星與衛星圍繞運行的恆星基地——FabLab–NKNU高師大自造者基地專欄作者林允涵:自造筆記【自造筆記材料篇】聖誕節必備:各式LED燈條比較【自造筆記】第一次做床架【自造筆記番外篇】RocklerChallenge系列介紹【自造筆記】寵物餐桌DIY【自造筆記】基礎木工技術入門:木榫水泥蚊香座【自造筆記番外篇】DIY族的追劇清單平衡板DIY鉸鏈超基本介紹江宗諭自造風力自行車手機充電器千萬片里程碑!Arduino推出UNOMini限量典藏版學校巴士大改裝:移動的自造空間、自助餐車、科學實驗室!讓原力保護您的鑰匙——自造星際大戰壁掛式鑰匙扣Arduino教育套件,提供豐富線上學習教材在邊緣實現感測與智慧——NiclaSenseME用樹梅派,自造Marvel影集的AI語音助理如何藉由專題任務增進學生參與?Arduino「#包容」計劃助科技社群創造正面榜樣葉人瑋:車庫文化優雅劍術對決,不為判決爭紅臉刀匠天地:隱身車庫的「九號公坑工作坊」呀!胴!!竹劍的構造、回收與再生——如何拿舊長竹劍做一把短劍道竹劍Makervs.Backer,從挫折到堅持——與InnovArt執行長兼共同創辦人周威成對談(下篇)Makervs.Backer,從創作到創業——與InnovArt執行長兼共同創辦人周威成對談(上篇)小宅裡的刀匠,教你怎麼用磨除法做刀今年萬聖節,DIY做超炫鐮刀,當個maker道具師中秋烤肉,留一點鋁箔紙下來做RFID屏蔽卡套擺脫剪不斷理還亂的音源線——用故障藍牙耳機接收器做成DIY藍牙耳機(下)曹永忠:智慧家庭徐啟文:瘋紙趣【摺紙錄影】發票小貓咪【摺紙錄影】給你一個讚【摺紙錄影】SR-71黑鳥偵察機【摺紙錄影】黑貓中隊隊徽【摺紙錄影】三葉旋翼版阿帕契直升機【摺紙錄影】美F-104星式戰機【摺紙錄影】摩托車【摺紙錄影】無敵鐵金剛大魔神頭部聖誕老人——錄影示範 智慧機器人網–智慧機器人網機器人創客小子蔡昇恩,程式打底AI滿分超級安東尼改造挑戰,機甲人形師林益成初改大成功!旋翼太危險?高中生把無人機葉片BANG不見沒背景也行!林益成靠著熱忱成機甲人形師高手用8萬多塊樂高,重現迷你蘋果總部超巨大Enter鍵,讓你用電腦時更紓壓!《魔神英雄傳》龍神丸驚現!竟能靈活揮舞登龍劍用瓦楞紙做錘矛!童心大叔還原《鋼彈:鐵血的孤兒》武器想道歉?先自備記者會神器吧!──【MFT2018】側記《BrickJournal積木世界》群眾觀點CROWDWATCH物理好好玩X物理雙月刊水壓力握力器與浮沉子救生員自製彈簧秤力矩平衡與重心蒸汽動力噴泉磁鐵磁極檢測—磁鐵指南針、電磁鞦韆與直流馬達水平拋射與自由落體SCHOOLOFMAKER資源學習資源專區3D列印初階(flash)3D列印進階(flash)數位機具設備空間地圖好書推薦3小時讀通基礎機械設計拼湊夢想:貧民區高中生逆襲麻省理工學院菁英手工的藝術FAB:MIT教授教你如何製作所有東西全世界在瘋什麼自造者運動?好站連結活動資訊vMaker活動總覽活動預報作品開發板/Arduino我也想做做看互動式螢光棒!!可以使用悠遊卡的九尾保險箱下一站幸福(mind圖控)[MIND]圖控—LCD顯示(表情符號)[Mind]圖控—車距控制(PID閉迴路)[Mind]圖控—遙控車(手機藍牙遙控)把笨蛋家電變成智慧家電【MIND】圖控—PWM伺服機+手機控制【mind】圖控—走黑線電腦/Computers下一站幸福(mind圖控)雲端物聯●藍芽音箱[MIND]圖控—LCD顯示(表情符號)[Mind]圖控—車距控制(PID閉迴路)[Mind]圖控—遙控車(手機藍牙遙控)把笨蛋家電變成智慧家電【MIND】圖控—PWM伺服機+手機控制【mind】圖控—走黑線【mind】圖控—LED點燈行動裝置/Mobile黑客松創意製作:Mr.Bu穿戴式手環WAVE開源智慧手環CurveCam自由曲面相機模組衝吧!爆走兄弟MiniPlan自造格鬥機器人MiniPlan自造格鬥機器人Diy手機App遙控車MCS雲端服務感測資料蒐集與遠端控制【mind】圖控—LED點燈機器人/Robotics可以使用悠遊卡的九尾保險箱下一站幸福(mind圖控)[MIND]圖控—LCD顯示(表情符號)[Mind]圖控—車距控制(PID閉迴路)[Mind]圖控—遙控車(手機藍牙遙控)【MIND】圖控—PWM伺服機+手機控制【mind】圖控—走黑線【mind】圖控—LED點燈【創客花絮】R2D2機器人3D列印/3DprintingMetal3Dprintingcapability下一站幸福(mind圖控)moai趣味彈珠檯[MIND]圖控—LCD顯示(表情符號)[Mind]圖控—車距控制(PID閉迴路)[Mind]圖控—遙控車(手機藍牙遙控)【MIND】圖控—PWM伺服機+手機控制【mind】圖控—走黑線【mind】圖控—LED點燈針織/Knitting紙藝/Papercraft裁縫/Sewing使用雷射雕刻機對皮革進行雕刻2016WorkerXMaker穿戴裝置服飾設計工作營衣啟飛翔創客基地【八月份課程表】出爐囉!2016時尚機能美學再造_運動塑身服飾設計工作營LEDs我也想做做看互動式螢光棒!!下一站幸福(mind圖控)[MIND]圖控—LCD顯示(表情符號)[Mind]圖控—車距控制(PID閉迴路)[Mind]圖控—遙控車(手機藍牙遙控)【MIND】圖控—PWM伺服機+手機控制【mind】圖控—走黑線【mind】圖控—LED點燈玩轉雷射之透過生活“玩”藝術工具/Tools【創客基地】手作雕刻趣「南台灣木作X創客人才培育計畫」原木生活X手作大展:木作小車「南台灣木作X創客人才培育計畫」原木生活X手作大展:木馬「南台灣木作X創客人才培育計畫」從0開始學木工:自己的木作自己做-手工筷玩轉雷射之透過生活“玩”藝術雷射切割DIY富有想象力的齿轮玩具雷射切割木材之jeep車雷射雕刻小玩意之DIY童話般的鋼琴吉他世界雷射雕刻之雕刻彩蛋木工/Woodworkingmoai趣味彈珠檯個性砧板DIY做一雙自己的木屐吧【南台灣木作X創客人才培育計畫】活動紀錄影片_獨木舟製作【南台灣木作X創客人才培育計畫】活動紀錄影片_與三位木工職人一同享受手作的樂趣【南台灣木作x創客人才培育計畫】木作創客人才成果發表記者會【南台灣木作x創客人才培育計畫】活動紀錄影片【創客基地】手作雕刻趣「南台灣木作X創客人才培育計畫」原木生活X手作大展:城市系列設計/Design我也想做做看互動式螢光棒!!可以使用悠遊卡的九尾保險箱moai趣味彈珠檯[Mind]圖控—遙控車(手機藍牙遙控)【MIND】圖控—PWM伺服機+手機控制【mind】圖控—走黑線【mind】圖控—LED點燈創意木時鐘Arduino製作【自動販賣機】食物/FoodArduino製作【自動販賣機】原來蘋果也可以這樣做工藝品!太好玩了!飲料機X彈珠台撞出新滋味南方創客基地X小農蔬食餐桌樂高/LEGO小玩意/Gadgets我也想做做看互動式螢光棒!!可以使用悠遊卡的九尾保險箱何樂而為手作皮革零錢包雲端物聯●藍芽音箱moai趣味彈珠檯[MIND]圖控—LCD顯示(表情符號)[Mind]圖控—車距控制(PID閉迴路)[Mind]圖控—遙控車(手機藍牙遙控)【自造筆記】LED記事萬年曆其他/Other我也想做做看互動式螢光棒!!華偉實業贊助!倫敦大學學院(UCL)束帶裝置藝術作品下一站幸福(mind圖控)[MIND]圖控—LCD顯示(表情符號)[Mind]圖控—車距控制(PID閉迴路)[Mind]圖控—遙控車(手機藍牙遙控)【MIND】圖控—PWM伺服機+手機控制【mind】圖控—走黑線【mind】圖控—LED點燈行事曆創客常用機具教學影片
專欄曹永忠:智慧家庭最新消息
PM2.5空氣感測器(電路設計上)
曹永忠
|74月,2016at10:40
0
Like0智慧家庭:PM2.5空氣感測器(電路設計上篇)
本篇是接續上兩篇文章『智慧家庭:PM2.5空氣感測器(硬體組裝上/下篇)』,主要是教大家如何組立空氣粒子感測裝置電子電路組裝。
我們已經介紹過空氣粒子感測裝置的開發板安裝、空氣懸浮粒子感測器安裝,麵包板安裝、溫溼度模組安裝、RTC時鐘模組安裝等等,本篇將介紹空氣懸浮粒子感測器、LCD 2004顯示模組等電路安裝,並進行第一階段的整合測試。
安裝偵測空氣懸浮粒子感測器
第一步,我們安裝攀藤科技(Plantower)(註1)的PMS3003空氣懸浮粒子感測器,其感測器上有8個接腳,分別如下:
pin1,供電輸入接腳,要輸入5V電壓的電力。
pin2,接地接腳,接上0V。
pin3,設定輸入接腳,接收到0時感測器處於待備狀態(減少感測器的耗電),接收到1則為運作狀態。
pin4,串列埠接收接腳(Rx),邏輯準位3V。
pin5,串列埠輸出接腳(x),邏輯準位3V。
pin6,重置、重新開機輸入接腳,接收到3V則重新開機。
pin7,還沒用到。
pin8,還沒用到。
PMS3003粉塵感測器硬體連接方式如所示,讀者可以看到PMS3003粉塵感測器接腳如下:
(圖1)PMS3003G3PM2.5粉塵感測器接腳圖。
資料出處:資料出處:https://www.dfrobot.com/wiki/index.php?title=PM2.5_laser_dust_sensor_SKU:SEN0177
了解接腳後,將PMS3003與Ameba連接,如下圖所示進行電路連接。
(圖2)安裝偵測空氣懸浮粒子感測器
有些讀者仍需要了解如何將正確腳位接在阿米巴開發板上,所以作者增加下表之接腳圖,讓讀者更加了解。
(表1)空氣懸浮粒子感測器接腳圖
我們將下表之PMS3003空氣懸浮粒子感測器測試程式攥寫好之後,編譯完成再上傳到Ameba開發板。
(表2)PMS3003空氣懸浮粒子感測器測試程式
PMS3003空氣懸浮粒子感測器測試程式(PMS3003AirQualityV2)
/*
Thisexampledemonstratehowtoreadpm2.5valueonPMS3003airconditionsensor
PMS3003pinmapisasfollow:
PIN1 :VCC,connectto5V
PIN2 :GND
PIN3 :SET,0:Standbymode,1:operatingmode
PIN4 :RXD:SerialRX
PIN5 :TXD:SerialTX
PIN6 :RESET
PIN7 :NC
PIN8 :NC
Inthisexample,weonlyuseSerialtogetPM2.5value.
Thecircuit:
*RXisdigitalpin0(connecttoTXofPMS3003)
*TXisdigitalpin1(connecttoRXofPMS3003)
*/
#include
SoftwareSerialmySerial(0,1);//RX,TX
#definepmsDataLen32
uint8_tbuf[pmsDataLen];
intidx=0;
intpm25=0;
voidsetup(){
Serial.begin(9600);
mySerial.begin(9600);//PMS3003UARThasbaudrate9600
}
voidloop(){//runoverandover
idx=0;
memset(buf,0,pmsDataLen);
while(mySerial.available()){
buf[idx++]=mySerial.read();
}
//checkifdataheaderiscorrect
if(buf[0]==0x42&&buf[1]==0x4d){
pm25=(buf[12]<<8)|buf[13];
Serial.print(“pm2.5:“);
Serial.print(pm25);
Serial.println(”ug/m3″);
}
}
uint8_tcheckValue(uint8_t*thebuf,uint8_tleng)
{
uint8_treceiveflag=1;
uint16_treceiveSum=0;
uint8_ti=0;
for(i=0;i //ArduinoIDE內建
//LCDI2CLibrary,從這裡可以下載:
//https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
#include
#include
SoftwareSerialmySerial(0,1);//RX,TX
#definepmsDataLen32
uint8_tbuf[pmsDataLen];
intidx=0;
intpm25=0;
uint16_tPM01Value=0; //definePM1.0valueoftheairdetectormodule
uint16_tPM2_5Value=0; //definePM2.5valueoftheairdetectormodule
uint16_tPM10Value=0; //definePM10valueoftheairdetectormodule
LiquidCrystal_I2Clcd(0x27,2,1,0,4,5,6,7,3,POSITIVE); //設定LCDI2C位址
voidsetup(){
Serial.begin(9600);
mySerial.begin(9600);//PMS3003UARThasbaudrate9600
lcd.begin(16,2); //初始化LCD,一行16的字元,共2行,預設開啟背光
lcd.backlight();//開啟背光
ShowMac();
}
voidloop(){//runoverandover
idx=0;
memset(buf,0,pmsDataLen);
while(mySerial.available()){
buf[idx++]=mySerial.read();
}
//checkifdataheaderiscorrect
if(buf[0]==0x42&&buf[1]==0x4d){
pm25=(buf[12]<<8)|buf[13];
Serial.print(“pm2.5:“);
Serial.print(pm25);
Serial.println(”ug/m3″);
ShowPM(pm25);
}
/*
intcheckSum=checkValue(buf,pmsDataLen);
if(pmsDataLen&&checkSum)
{
PM01Value=transmitPM01(buf);
PM2_5Value=transmitPM2_5(buf);
PM10Value=transmitPM10(buf);
}
staticunsignedlongOledTimer=millis();
if(millis()–OledTimer>=1000)
{
OledTimer=millis();
Serial.print(“PM1.0:“);
Serial.print(PM01Value);
Serial.println(” ug/m3″);
Serial.print(“PM2.5:“);
Serial.print(PM2_5Value);
Serial.println(” ug/m3″);
Serial.print(“PM10: “);//sendPM1.0datatobluetooth
Serial.print(PM10Value);
Serial.println(“ug/m3″);
}
*/
}
uint8_tcheckValue(uint8_t*thebuf,uint8_tleng)
{
uint8_treceiveflag=1;
uint16_treceiveSum=0;
uint8_ti=0;
for(i=0;i
#include
#include
#include //ArduinoIDE內建
//LCDI2CLibrary,從這裡可以下載:
//https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
#include
#include
#include
uint8_tMacData[6];
SoftwareSerialmySerial(0,1);//RX,TX
charssid[]=“TSAO”; //yournetworkSSID(name)
charpass[]=“TSAO1234″; //yournetworkpassword
intkeyIndex=0; //yournetworkkeyIndexnumber(neededonlyforWEP)
chargps_lat[]=“23.954710″; //device’sgpslatitude清心福全(中正店)510彰化縣員林市中正路254號
chargps_lon[]=“120.574482″;//device’sgpslongitude清心福全(中正店)510彰化縣員林市中正路254號
charserver[]=“gpssensor.ddns.net”;//theMQTTserverofLASS
#defineMAX_CLIENT_ID_LEN10
#defineMAX_TOPIC_LEN 50
charclientId[MAX_CLIENT_ID_LEN];
charoutTopic[MAX_TOPIC_LEN];
WiFiClientwifiClient;
PubSubClientclient(wifiClient);
intstatus=WL_IDLE_STATUS;
WiFiUDPUdp;
constcharntpServer[]=“pool.ntp.org”;
constlongtimeZoneOffset=28800L;
constintNTP_PACKET_SIZE=48;//NTPtimestampisinthefirst48bytesofthemessage
constbytenptSendPacket[NTP_PACKET_SIZE]={
0xE3,0x00,0x06,0xEC,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x31,0x4E,0x31,0x34,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
bytentpRecvBuffer[NTP_PACKET_SIZE];
#defineLEAP_YEAR(Y) (((1970+Y)>0)&&!((1970+Y)%4)&&(((1970+Y)0)||!((1970+Y)%400)))
static constuint8_tmonthDays[]={31,28,31,30,31,30,31,31,30,31,30,31};//APIstartsmonthsfrom1,thisarraystartsfrom0
uint32_tepochSystem=0;//timestampofsystembootup
#definepmsDataLen32
uint8_tbuf[pmsDataLen];
intidx=0;
intpm25=0;
uint16_tPM01Value=0; //definePM1.0valueoftheairdetectormodule
uint16_tPM2_5Value=0; //definePM2.5valueoftheairdetectormodule
uint16_tPM10Value=0; //definePM10valueoftheairdetectormodule
intNDPyear,NDPmonth,NDPday,NDPhour,NDPminute,NDPsecond;
unsignedlongepoch ;
LiquidCrystal_I2Clcd(0x27,2,1,0,4,5,6,7,3,POSITIVE); //設定LCDI2C位址
StringMacAddress;
IPAddressMeip;
IPAddressMesubnet;
IPAddressMegateway;
voidsetup(){
Serial.begin(9600);
mySerial.begin(9600);//PMS3003UARThasbaudrate9600
lcd.begin(20,4); //初始化LCD,一行20的字元,共4行,預設開啟背光
lcd.backlight();//開啟背光
WiFi.status();
MacAddress=GetWifiMac();
ShowMac();
initializeWiFi();
retrieveNtpTime();
ShowDateTime();
ShowInternetStatus();
//initializeMQTT();
}
voidloop(){//runoverandover
idx=0;
memset(buf,0,pmsDataLen);
while(mySerial.available())
{
buf[idx++]=mySerial.read();
}
//checkifdataheaderiscorrect
if(buf[0]==0x42&&buf[1]==0x4d)
{
pm25=(buf[12]<<8)|buf[13];
Serial.print(“pm2.5:“);
Serial.print(pm25);
Serial.println(”ug/m3″);
ShowPM(pm25);
}
/*
intcheckSum=checkValue(buf,pmsDataLen);
if(pmsDataLen&&checkSum)
{
PM01Value=transmitPM01(buf);
PM2_5Value=transmitPM2_5(buf);
PM10Value=transmitPM10(buf);
}
staticunsignedlongOledTimer=millis();
if(millis()–OledTimer>=1000)
{
OledTimer=millis();
Serial.print(“PM1.0:“);
Serial.print(PM01Value);
Serial.println(” ug/m3″);
Serial.print(“PM2.5:“);
Serial.print(PM2_5Value);
Serial.println(” ug/m3″);
Serial.print(“PM10: “);//sendPM1.0datatobluetooth
Serial.print(PM10Value);
Serial.println(“ug/m3″);
}
*/
}
uint8_tcheckValue(uint8_t*thebuf,uint8_tleng)
{
uint8_treceiveflag=1;
uint16_treceiveSum=0;
uint8_ti=0;
for(i=0;i=0&&number<16)
{
ttt=String(“0″)+String(number,HEX);
}
else
{
ttt=String(number,HEX);
}
returnttt;
}
String print2digits(intnumber){
Stringttt;
if(number>=0&&number<10)
{
ttt=String(“0″)+String(number);
}
else
{
ttt=String(number);
}
returnttt;
}
String print4digits(intnumber){
Stringttt;
ttt=String(number);
returnttt;
}
voidcallback(char*topic,byte*payload,unsignedintlength){
Serial.print(“Messagearrived[“);
Serial.print(topic);
Serial.print(“]“);
for(inti=0;i*day){
break;
}else{
tempDay+=(LEAP_YEAR(*year)?366:365);
}
}
tempDay=*day–tempDay;//thedaysleftinayear
for((*month)=0;(*month)<12;(*month)++){
if((*month)==1){
if(LEAP_YEAR(*year)){
if(tempDay–29<0){
break;
}else{
tempDay-=29;
}
}else{
if(tempDay–28<0){
break;
}else{
tempDay-=28;
}
}
}else{
if(tempDay–monthDays[(*month)]<0){
break;
}else{
tempDay-=monthDays[(*month)];
}
}
}
(*month)++;
*day=tempDay+2;//oneforbase1,oneforcurrentday
}
voidreconnectMQTT(){
//Loopuntilwe’rereconnected
charpayload[300];
unsignedlongepoch=epochSystem+millis()/1000;
getCurrentTime(epoch,&NDPyear,&NDPmonth,&NDPday,&NDPhour,&NDPminute,&NDPsecond);
while(!client.connected()){
Serial.print(“AttemptingMQTTconnection…”);
//Attempttoconnect
if(client.connect(clientId)){
Serial.println(“connected”);
sprintf(payload,“|ver_format=3|fmt_opt=1|app=Pm25Ameba|ver_app=0.0.1|device_id=%s|tick=%d|date=%4d-d-d|time=d:d:d|device=Ameba|s_d0=%d|gps_lat=%s|gps_lon=%s|gps_fix=1|gps_num=9|gps_alt=2″,
clientId,
millis(),
NDPyear,NDPmonth,NDPday,
NDPhour,NDPminute,NDPsecond,
pm25,
gps_lat,gps_lon
);
//Onceconnected,publishanannouncement…
client.publish(outTopic,payload);
}else{
Serial.print(“failed,rc=”);
Serial.print(client.state());
Serial.println(”tryagainin5seconds”);
//Wait5secondsbeforeretrying
delay(5000);
}
}
}
voidretrievePM25Value(){
intidx;
boolhasPm25Value=false;
inttimeout=200;
while(!hasPm25Value){
idx=0;
memset(buf,0,pmsDataLen);
while(mySerial.available()){
buf[idx++]=mySerial.read();
}
if(buf[0]==0x42&&buf[1]==0x4d){
pm25=(buf[12]<<8)|buf[13];
Serial.print(“pm2.5:“);
Serial.print(pm25);
Serial.println(”ug/m3″);
hasPm25Value=true;
}
timeout–;
if(timeout<0){
Serial.println(“failtogetpm2.5data”);
break;
}
}
}
voidinitializeWiFi(){
while(status!=WL_CONNECTED){
Serial.print(“AttemptingtoconnecttoSSID:“);
Serial.println(ssid);
//ConnecttoWPA/WPA2network.ChangethislineifusingopenorWEPnetwork:
// status=WiFi.begin(ssid,pass);
status=WiFi.begin(ssid);
//wait10secondsforconnection:
delay(10000);
}
//localporttolistenforUDPpackets
Udp.begin(2390);
}
voidinitializeMQTT(){
bytemac[6];
WiFi.macAddress(mac);
memset(clientId,0,MAX_CLIENT_ID_LEN);
sprintf(clientId,“FT1_0XX”,mac[4],mac[5]);
sprintf(outTopic,“LASS/Test/Pm25Ameba/%s”,clientId);
Serial.print(“MQTTclientid:”);
Serial.println(clientId);
Serial.print(“MQTTtopic:”);
Serial.println(outTopic);
client.setServer(server,1883);
client.setCallback(callback);
}
voidprintWifiData()
{
//printyourWiFishield’sIPaddress:
Meip=WiFi.localIP();
Serial.print(“IPAddress:“);
Serial.println(Meip);
//printyourMACaddress:
bytemac[6];
WiFi.macAddress(mac);
Serial.print(“MACaddress:“);
Serial.print(mac[5],HEX);
Serial.print(“:”);
Serial.print(mac[4],HEX);
Serial.print(“:”);
Serial.print(mac[3],HEX);
Serial.print(“:”);
Serial.print(mac[2],HEX);
Serial.print(“:”);
Serial.print(mac[1],HEX);
Serial.print(“:”);
Serial.println(mac[0],HEX);
//printyoursubnetmask:
Mesubnet=WiFi.subnetMask();
Serial.print(“NetMask:“);
Serial.println(Mesubnet);
//printyourgatewayaddress:
Megateway=WiFi.gatewayIP();
Serial.print(“Gateway:“);
Serial.println(Megateway);
}
資料下載區:https://github.com/brucetsao/makerdiwo/tree/master/201604/PMS3003AirQualityV21
上述程式執行後,可以見到下圖之PMS3003空氣懸浮粒子感測器測試程式三畫面結果,也可以顯示裝置的MAC位址於LCD2004顯示模組上。
(圖6)PMS3003空氣懸浮粒子感測器測試程式三畫面結果
資訊整合顯示資訊
我們可以讀到MAC位址來當作裝置ID,並且能夠將空氣懸浮粒子感測器的資訊讀取出來,我們要將這兩個整合。
我們將下表之PMS3003空氣懸浮粒子感測器測試程式四攥寫好之後,編譯完成後上傳到Ameba開發板。
(表6)PMS3003空氣懸浮粒子感測器測試程式四
PMS3003空氣懸浮粒子感測器測試程式四(PMS3003AirQualityV41)
/*
Thisexampledemonstratehowtoreadpm2.5valueonPMS3003airconditionsensor
PMS3003pinmapisasfollow:
PIN1 :VCC,connectto5V
PIN2 :GND
PIN3 :SET,0:Standbymode,1:operatingmode
PIN4 :RXD:SerialRX
PIN5 :TXD:SerialTX
PIN6 :RESET
PIN7 :NC
PIN8 :NC
Inthisexample,weonlyuseSerialtogetPM2.5value.
Thecircuit:
*RXisdigitalpin0(connecttoTXofPMS3003)
*TXisdigitalpin1(connecttoRXofPMS3003)
*/
#include
#include //ArduinoIDE內建
//LCDI2CLibrary,從這裡可以下載:
//https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
#defineturnonHIGH
#defineturnoffLOW
#defineParticleSensorLed7
#defineInternetLed6
#defineAccessLed5
#include
#include
#include
uint8_tMacData[6];
SoftwareSerialmySerial(0,1);//RX,TX
#definepmsDataLen32
uint8_tbuf[pmsDataLen];
intidx=0;
intpm25=0;
uint16_tPM01Value=0; //definePM1.0valueoftheairdetectormodule
uint16_tPM2_5Value=0; //definePM2.5valueoftheairdetectormodule
uint16_tPM10Value=0; //definePM10valueoftheairdetectormodule
LiquidCrystal_I2Clcd(0x27,2,1,0,4,5,6,7,3,POSITIVE); //設定LCDI2C位址
StringMacAddress;
voidsetup(){
Serial.begin(9600);
mySerial.begin(9600);//PMS3003UARThasbaudrate9600
lcd.begin(20,4); //初始化LCD,一行16的字元,共2行,預設開啟背光
lcd.backlight();//開啟背光
WiFi.status();
MacAddress=GetWifiMac();
ShowMac();
}
voidloop(){//runoverandover
idx=0;
memset(buf,0,pmsDataLen);
while(mySerial.available()){
buf[idx++]=mySerial.read();
}
//checkifdataheaderiscorrect
if(buf[0]==0x42&&buf[1]==0x4d){
pm25=(buf[12]<<8)|buf[13];
Serial.print(“pm2.5:“);
Serial.print(pm25);
Serial.println(”ug/m3″);
ShowPM(pm25);
}
/*
intcheckSum=checkValue(buf,pmsDataLen);
if(pmsDataLen&&checkSum)
{
PM01Value=transmitPM01(buf);
PM2_5Value=transmitPM2_5(buf);
PM10Value=transmitPM10(buf);
}
staticunsignedlongOledTimer=millis();
if(millis()–OledTimer>=1000)
{
OledTimer=millis();
Serial.print(“PM1.0:“);
Serial.print(PM01Value);
Serial.println(” ug/m3″);
Serial.print(“PM2.5:“);
Serial.print(PM2_5Value);
Serial.println(” ug/m3″);
Serial.print(“PM10: “);//sendPM1.0datatobluetooth
Serial.print(PM10Value);
Serial.println(“ug/m3″);
}
*/
}
uint8_tcheckValue(uint8_t*thebuf,uint8_tleng)
{
uint8_treceiveflag=1;
uint16_treceiveSum=0;
uint8_ti=0;
for(i=0;i=0&&number<16)
{
ttt=String(“0″)+String(number,HEX);
}
else
{
ttt=String(number,HEX);
}
returnttt;
}
String print2digits(intnumber){
Stringttt;
if(number>=0&&number<10)
{
ttt=String(“0″)+String(number);
}
else
{
ttt=String(number);
}
returnttt;
}
String print4digits(intnumber){
Stringttt;
ttt=String(number);
returnttt;
}
參考資料來源:Grove-TemperatureandHumiditySensor
資料下載區:https://github.com/brucetsao/makerdiwo/tree/master/201604/PMS3003AirQualityV41
上述程式執行後,可以見到下圖之PMS3003空氣懸浮粒子感測器測試程式四畫面結果,也可以輕易讀到懸浮粒子的濃度了。
(圖7)PMS3003空氣懸浮粒子感測器測試程式四畫面結果
本文為『PM2.5空氣感測器』系列第四篇:電路設計上篇,主要介紹空氣懸浮粒子感測器、LCD2004顯示模組等電路安裝,並且一步一步教導讀者如何攥寫軟體來啟動這些元件,逐一完成PM2.5空氣感測器的電路安裝。
後續筆者還會繼續發表『PM2.5空氣感測器』系列的文章,讓我們在未來可以創造出更優質、智慧化的家庭。
註1:北京攀藤科技有限公司是一家專注於空氣品質感測器研發、生產與銷售的高科技企業,作為行業領跑者,公司通過不斷創新和品質追求,已與國內外多家知名企業建立了良好的戰略合作夥伴關係。
參考資料:
曹永忠.(2016).智慧家庭:PM2.5空氣感測器(感測器篇). Retrievedfromhttps://vmaker.tw/project/view/695
曹永忠,許智誠,&蔡英德.(2015a).Ameba空气粒子感测装置设计与开发(MQTT篇):UsingAmebatoDevelopaPM2.5MonitoringDevicetoMQTT(初版ed.).台湾、彰化:渥瑪數位有限公司.
曹永忠,許智誠,&蔡英德.(2015b).Ameba空氣粒子感測裝置設計與開發(MQTT篇)):UsingAmebatoDevelopaPM2.5MonitoringDevicetoMQTT(初版ed.).台湾、彰化:渥瑪數位有限公司.
分享到社群
曹永忠曹永忠(Yung-ChungTsao),目前為自由作家暨專業Maker,專研於軟體工程、軟體開發與設計、物件導向程式設計,商品攝影及人像攝影。
長期投入創客運動、資訊系統設計與開發、企業應用系統開發、軟體工程、新產品開發管理、商品及人像攝影等領域,並持續發表作品及相關專業著作。
Email:[email protected]
LineID:dr.brucetsao
作者網站:https://www.cs.pu.edu.tw/~yctsao/
臉書社群(Arduino.Taiwan):https://www.facebook.com/groups/Arduino.Taiwan/
Github網站:https://github.com/brucetsao/
Youtube:https://www.youtube.com/channel/UCcYG2yY_u0m1aotcA4hrRgQ
PreviousPost
南區FabTruck3D列印校園巡迴推廣:105年度第八站玉井工商
NextPost
自造CNC
RelatedPosts
3D列印
【INPLUS好文分享】捷克大學團...
vMaker編輯部
1120
Maker資源
2017/7/31-8/6活動預...
vMaker編輯部
1702
0
空間專訪
創做1号店募資成功!植物風自造空間...
vMaker編輯部
2791
0
FACEBOOK粉絲頁
熱門文章
【科技向善專題】以實際社會價值為目...
vMaker編輯部
504
澎創播下愛的手作種子,在西嶼曬書學...
澎湖創客基地
355
讓原力保護您的鑰匙——自造星際大戰...
江宗諭
300
【自造筆記材料篇】聖誕節必備:各式...
林允涵
297
閱讀更多
最新活動
【vMaker】創客創業加速器媒合...
vMaker編輯部
151
【物聯網創客基地】線上主題講座工...
北分署物聯網創客基地
43
【臺中創客基地】創客技能工作坊-輔...
TCNmakerspace
35
【臺中創客基地】創客技能工作坊-輔...
TCNmakerspace
25
閱讀更多