:::
PM2.5空污監測器實作

關於PM2.5二代目傳感器的語法

discuss pic 2016-08-06 20:08:01
上傳資料時好像前幾筆資料,T的值都是空氣良好(0.00),而溫溼度的值則是正常,
傳感器的孔塞入異物,監測網頁也是要等更新幾輪後才會出現紫色,
不知各位使用二代目的先進是否也有此"累格"現象?

研習時測試10秒上傳一次,開機後差不多一分鐘後才有正常數值,
回來改成30分鐘上傳一次,則是3~4個小時後才有正常數值,
若是常常自動RESET(聽到繼電器搭搭塔的聲音就是了),一天下來報表裡就會一堆0.00

研究鄭老師的程式碼時,看到傳感器在取值時Z是從0~6,跑7個循環
感覺跟上面的"累格"似乎有點關聯,
亂改測試一下好像正常了,修改如下:
updateSensor(T);
delay(updateInterval);   
這兩行搬到while迴圈外,loop()之內,另外T變數改放到前幾行宣告,不然編譯時會出現錯誤訊息

修改後的程式碼供各位先進參考:
void loop() {
  
 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 )
      {
 
        float vo=(incomeByte[1]*256.0+incomeByte[2])/1024.0*5.00;
   
       T = vo*700;
   
   //     updateSensor(T);
   //     delay(updateInterval);   // 設定傳送時間間隔  
      }
      else{
        z=0;
        Serial.flush();
        data='/0';
        for(int m=0;m<7;m++){
          incomeByte[m]=0;
          }
      }
      z=0;
    }
  }
          updateSensor(T);
          delay(updateInterval);   // 設定傳送時間間隔  
}
discuss pic 2016-08-07 00:35:54
太棒了!感謝宇男老師的分享,大家測試看看,我星期一測試完後,再跟大家報告
discuss pic 2016-08-09 01:28:27
改完了,幫忙測試看看
雲端→Arduino程式→1050722→LED4_Buzzer_DHT22_ESP8266_Relay_air2_sample_0809

修改或新增的功能有:
1. 每兩秒鐘加總平均一次感測值,並顯示在LED上。
2. 感測反應正常,不遲鈍:放異物進入感測孔,會隨即出現藍燈並蜂鳴器告警,移開後兩到三秒即解除告警,回復正常燈號。
3. Relay2驅動的設備運作時間,可由設定 Relay2Interval 變數來控制,預設20分鐘。

再次感謝宇男老師的協助~~

#include <SoftwareSerial.h> #include <DHT.h> #define _rxpin 4 //接ESP8266 TX #define _txpin 5 //接ESP8266 RX #define RST 6 //接ESP8266 RST #define DHTPIN 7 //接DHT22資料傳輸 #define LED_G 8 //接綠燈 #define LED_Y 9 //接黃燈 #define LED_R 10 //接紅燈 #define LED_B 11 //接藍(紫)燈 #define Relay2 12 //Control Fan or Light #define Buzzer 13 //接蜂鳴器 #define DHTTYPE DHT22 // SENSOR TYPE - THE ADAFRUIT LIBRARY OFFERS SUPPORT FOR MORE MODELS DHT dht(DHTPIN, DHTTYPE); SoftwareSerial WiFiSerial( _rxpin, _txpin ); // ESP8266 RX, TX //*-- IoT Information String SSID = "TN-Computer-bridge"; //無線網路名稱 String PASS = "computer123"; //無線網路密碼 //String SSID = "修改自己的無線網路名稱"; //無線網路名稱 //String PASS = "修改自己的無線網路密碼"; //無線網路密碼 String schoolcode = "修改自己的學校代碼"; //學校代碼 int no = 0; //設備編號,可設定0~255,在監測網上可區別一校多個設備 String PMgps = "修改自己的學校經緯度"; //學校經緯度座標 //long updateInterval = 1800000; //傳送資料時間間隔,測試完請設定1800000(30分鐘) long updateInterval = 10000; //傳送資料時間間隔,測試用10000(10秒鐘) 時間太短亦會發生錯誤 long Relay2Interval = 1200000; //設定Relay2控制的設備運作時間長短,1200000(20分鐘) String IP = "pm25.tn.edu.tw"; //PM2.5網站網址 //sharp GP2Y1051 二代 start int incomeByte[7]; int data; int z=0; int sum, count; float average_pm2d5,sum_2s; unsigned long error, starttime, buzzerStart, updateStart, Relay2Start; void sendtoWiFi(String cmd) { Serial.print("SEND: "); Serial.println(cmd); WiFiSerial.println(cmd); } boolean connectWiFi() { WiFiSerial.println("AT+CWMODE=1"); Serial.println("Send AT+CWMODE=1"); delay(3000); String cmd="AT+CWJAP=\"" + SSID + "\",\"" + PASS + "\""; sendtoWiFi(cmd); Serial.println("Waiting for 15 second to connect network ....."); delay(15000); cmd = "AT+ CIPMUX=0"; sendtoWiFi( cmd ); if( WiFiSerial.find( "Error") ) { Serial.print( "RECEIVED: Error" ); return false; } } void updateSensor( float T) { digitalWrite(LED_G,LOW); digitalWrite(LED_Y,LOW); digitalWrite(LED_R,LOW); digitalWrite(LED_B,LOW); if(T>=0 && T<36) { digitalWrite(LED_G,HIGH); } else if(T>=36 && T<54) { digitalWrite(LED_Y,HIGH); } else if(T>=54 && T<71) { digitalWrite(LED_R,HIGH); } else if(T>=71 && T<200) { digitalWrite(LED_B,HIGH); } else { //T>=200 digitalWrite(LED_B,HIGH); digitalWrite(Relay2,LOW); digitalWrite(Buzzer,HIGH); Relay2Start=millis(); //設定Relay2運作開始時間 buzzerStart=millis(); //設定Buzzer告警開始時間 } if(abs(millis()-buzzerStart)>2000){ digitalWrite(Buzzer,LOW); } if(abs(millis()-Relay2Start)>Relay2Interval){ digitalWrite(Relay2,HIGH); } if(abs( millis() - updateStart) > updateInterval | updateStart == 0 ){ // 設定 ESP8266 作為 Client 端 String cmd = "AT+CIPSTART=\"TCP\",\"" + IP + "\",80"; sendtoWiFi(cmd); delay(500); if( WiFiSerial.find("Error") ) { Serial.print( "RECEIVED: Error\nExit1" ); return; } float h = dht.readHumidity(); float t = dht.readTemperature(); boolean sendOK = 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(500); if(WiFiSerial.find( ">" ) ) { Serial.print(">"); WiFiSerial.print(cmd); //送出pm2.5資料 if( WiFiSerial.find("OK") ){ //檢查WiFi模組是否正確傳出資料 sendOK = true; } Serial.print(cmd); updateStart = millis(); //重設上傳時間 } else { sendtoWiFi( "AT+CIPCLOSE" ); } if(sendOK) { Serial.println( "RECEIVED: OK" ); } else { Serial.println( "RECEIVED: Error\nExit2" ); // reset ESP8266 digitalWrite(RST,LOW); //need chang to HIGH if Relay use HIGH active delay(500); digitalWrite(RST,HIGH); //need chang to LOW if Relay use HIGH active } } } void setup() { Serial.begin(2400); dht.begin(); WiFiSerial.begin(9600); starttime = millis(); //設定Sharp感測器開始的擷取時間 updateStart = millis(); //設定第一次即上傳 sendtoWiFi("AT"); delay(1000); if(WiFiSerial.find("OK")) { Serial.println("RECEIVED: OK after AT Command\nData ready to sent!"); 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); } void loop(){ 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 ) { float vo=(incomeByte[1]*256.0+incomeByte[2])/1024.0*5.00; float pm = vo*700; sum_2s=sum_2s + pm; count++; if(abs(millis()-starttime)>2000){ average_pm2d5=(sum_2s/count)*1.00; updateSensor(average_pm2d5); Serial.print("PM2.5_Average = "); Serial.println(average_pm2d5,2); starttime=millis(); sum_2s=0; count=0; } } else{ z=0; Serial.flush(); data='/0'; for(int m=0;m<7;m++){ incomeByte[m]=0; } } z=0; } } }
discuss pic 2016-08-10 17:57:10
盛南老師三更半夜還在改程式,辛苦了

今天收到淘寶寄來的NODEMCU(ESP-12),就順便來測試一下老師的程式
很讚,PM2.5的偵測孔一塞入東西,馬上亮藍燈+鳴叫
搭配行動電源,戶外趴趴造也沒問題

原本想再加顆IR LED透過紅外線遙控冷氣,讓它自動開冷氣,不過代誌不是憨郎所想的架尼簡單,冷氣的紅外線遠比電視音響的紅外線複雜許多,殘念了

discuss pic 2016-08-11 10:41:23
請問宇男老師,為什麼你的dht 1,2腳為什麼不像南老師串上一個電阻?
是否有教學文,感覺你的元件又更少了,小弟也想自己組一個試試看,謝謝。

discuss pic 2016-08-11 16:35:04
李老師好,電阻是有加的,怕發熱影響溫度偵測值所以擺在DHT22後面
上圖所用的NODEMCU,它的功能就等於[USB to 8266轉接板]+[UNO板]+[ESP8266]
所以減少了很多的接線,而且成本也便宜,淘寶一塊人民幣20元不到,CP值爆高
只是接腳數沒有像UNO那麼多,不過也夠用了

我買過2種不同版本的NODEMCU,差別只在於USB驅動不同(大片的是用CH340,小片的是用CP2012)
大片的會塞滿麵包板,不好再插杜邦線,不建議使用

ESP8266有十幾種型號,
NODEMCU上面內嵌的是ESP-12,有8個可用接腳
這次研習使用的ESP-01,有兩個可用接腳,
大家手邊能玩的只有ESP-01,使用教學晚點再補上

discuss pic 2017-12-20 15:40:12

搜尋

錯誤訊息
未知: Array and string offset access syntax with curly braces is deprecated 在檔案中的第 /include/functions.encoding.php 列 40
未知: Array and string offset access syntax with curly braces is deprecated 在檔案中的第 /include/functions.encoding.php 列 40
未知: Array and string offset access syntax with curly braces is deprecated 在檔案中的第 /include/functions.encoding.php 列 73
通知: Undefined index: theme_kind 在檔案中的第 /modules/tad_discuss/header.php 列 8
未知: Function get_magic_quotes_gpc() is deprecated 在檔案中的第 /class/libraries/vendor/xoops/xmf/src/Request.php 列 119
未知: Function get_magic_quotes_gpc() is deprecated 在檔案中的第 /class/libraries/vendor/xoops/xmf/src/Request.php 列 119
通知: Undefined index: op 在檔案中的第 /modules/tad_discuss/function.php 列 57
通知: Undefined index: op 在檔案中的第 /modules/tad_discuss/function.php 列 63
通知: Undefined index: op 在檔案中的第 /modules/tad_discuss/function.php 列 57
通知: Undefined index: op 在檔案中的第 /modules/tad_discuss/function.php 列 63
通知: Undefined index: op 在檔案中的第 /modules/tad_discuss/function.php 列 57
通知: Undefined index: op 在檔案中的第 /modules/tad_discuss/function.php 列 63
通知: Undefined index: op 在檔案中的第 /modules/tad_discuss/function.php 列 57
通知: Undefined index: op 在檔案中的第 /modules/tad_discuss/function.php 列 63
通知: Undefined index: op 在檔案中的第 /modules/tad_discuss/function.php 列 57
通知: Undefined index: op 在檔案中的第 /modules/tad_discuss/function.php 列 63
通知: Undefined index: op 在檔案中的第 /modules/tad_discuss/function.php 列 57
通知: Undefined index: op 在檔案中的第 /modules/tad_discuss/function.php 列 63
通知: Undefined index: op 在檔案中的第 /modules/tad_discuss/function.php 列 57
通知: Undefined index: op 在檔案中的第 /modules/tad_discuss/function.php 列 63
通知: Undefined index: bootstrap 在檔案中的第 /modules/tadtools/preloads/core.php 列 68
已棄用
資料庫語法
0.000069 - SET SQL_BIG_SELECTS = 1
0.000631 - SELECT * FROM config WHERE (`conf_modid` = '0' AND `conf_catid` = '1') ORDER BY conf_order ASC
0.000254 - SELECT sess_data, sess_ip FROM session WHERE sess_id = '6ijni6k4ok40itiav520v95h04'
0.000278 - SELECT * FROM modules WHERE dirname = 'tad_discuss'
0.000483 - SELECT COUNT(*) FROM group_permission WHERE (`gperm_modid` = '1' AND (`gperm_groupid` = '3') AND `gperm_name` = 'module_read' AND `gperm_itemid` = '13')
0.000372 - SELECT * FROM config WHERE (`conf_modid` = '13') ORDER BY conf_order ASC
0.000463 - SELECT * FROM config WHERE (`conf_modid` = '0' AND `conf_catid` = '5') ORDER BY conf_order ASC
0.000225 - SELECT COUNT(*) FROM banner
0.000152 - SELECT * FROM banner LIMIT 1, 1
0.005573 - UPDATE banner SET impmade = 1277785 WHERE bid = 2
0.000467 - SELECT * FROM config WHERE (`conf_modid` = '0' AND `conf_catid` = '3') ORDER BY conf_order ASC
0.001234 - SELECT DISTINCT gperm_itemid FROM group_permission WHERE gperm_name = 'block_read' AND gperm_modid = 1 AND gperm_groupid IN (3)
0.000931 - SELECT b.* FROM newblocks b, block_module_link m WHERE m.block_id=b.bid AND b.isactive=1 AND b.visible=1 AND m.module_id IN (0,13) AND b.bid IN (1,2,3,4,5,6,7,8,9,10,11,18,15,16,20,19,58,60,61,73,72,74,71,76,75,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,111,109,110,112,113,114,115,116,117,118,119,120,121,122,123) ORDER BY b.weight, m.block_id
0.000620 - SELECT f.*, s.tpl_source FROM tplfile f LEFT JOIN tplsource s ON s.tpl_id=f.tpl_id WHERE (`tpl_tplset` = 'default' AND `tpl_file` = 'system_block_search.tpl') ORDER BY tpl_refid
0.000408 - SELECT * FROM modules WHERE dirname = 'tadtools'
0.000363 - SELECT * FROM config WHERE (`conf_modid` = '4') ORDER BY conf_order ASC
0.000361 - select * from tad_discuss where DiscussID='32'
0.000358 - SELECT COUNT(*) FROM group_permission WHERE (`gperm_modid` = '13' AND (`gperm_groupid` = '3') AND `gperm_name` = 'forum_read' AND `gperm_itemid` = '1')
0.003124 - update tad_discuss set `Counter`=`Counter`+1 where `DiscussID`='32'
0.000288 - select * from `tad_discuss_board` where `BoardID` = '1'
0.000509 - select * from tad_discuss where DiscussID='32' or ReDiscussID='32' order by ReDiscussID , DiscussDate
0.000418 - select * from tad_discuss where DiscussID='32' or ReDiscussID='32' order by ReDiscussID , DiscussDate LIMIT 0, 20
0.000321 - SELECT * FROM users WHERE uid = '12'
0.000253 - SELECT * FROM smiles
0.000374 - select * from `tad_discuss_files_center` where `col_name`='DiscussID' and `col_sn`='32' order by sort
0.000267 - SELECT * FROM users WHERE uid = '2'
0.000256 - select * from `tad_discuss_files_center` where `col_name`='DiscussID' and `col_sn`='33' order by sort
0.000224 - select * from `tad_discuss_files_center` where `col_name`='DiscussID' and `col_sn`='43' order by sort
0.000216 - select * from `tad_discuss_files_center` where `col_name`='DiscussID' and `col_sn`='45' order by sort
0.000209 - SELECT * FROM users WHERE uid = '4'
0.000223 - select * from `tad_discuss_files_center` where `col_name`='DiscussID' and `col_sn`='46' order by sort
0.000213 - select * from `tad_discuss_files_center` where `col_name`='DiscussID' and `col_sn`='47' order by sort
0.000217 - SELECT * FROM users WHERE uid = '74'
0.000280 - select * from `tad_discuss_files_center` where `col_name`='DiscussID' and `col_sn`='80' order by sort
0.000351 - SELECT COUNT(*) FROM group_permission WHERE (`gperm_modid` = '13' AND (`gperm_groupid` = '3') AND `gperm_name` = 'forum_post' AND `gperm_itemid` = '1')
0.000293 - select `tt_theme`,`tt_use_bootstrap`,`tt_bootstrap_color`,`tt_theme_kind` from `tadtools_setup` where `tt_theme`='school2015'
0.000622 - SELECT f.*, s.tpl_source FROM tplfile f LEFT JOIN tplsource s ON s.tpl_id=f.tpl_id WHERE (`tpl_tplset` = 'default' AND `tpl_file` = 'tad_discuss_discuss.tpl') ORDER BY tpl_refid
0.000505 - SELECT f.*, s.tpl_source FROM tplfile f LEFT JOIN tplsource s ON s.tpl_id=f.tpl_id WHERE (`tpl_tplset` = 'default' AND `tpl_file` = 'tad_discuss_bootstrap.tpl') ORDER BY tpl_refid
0.000399 - SELECT f.*, s.tpl_source FROM tplfile f LEFT JOIN tplsource s ON s.tpl_id=f.tpl_id WHERE (`tpl_tplset` = 'default' AND `tpl_file` = 'system_notification_select.tpl') ORDER BY tpl_refid
0.000293 - SELECT * FROM modules WHERE dirname = 'tad_themes'
0.000291 - SELECT * FROM config WHERE (`conf_modid` = '3') ORDER BY conf_order ASC
0.000180 - select `tt_bootstrap_color` from tadtools_setup where `tt_theme`='school2015'
0.000350 - select * from tad_themes where `theme_name`='school2015'
0.000388 - select conf_value from config where conf_title ='_MD_AM_DEBUGMODE'
0.000369 - select * from tad_themes_blocks where `theme_id`='7'
0.000275 - select mid from modules where dirname='tad_themes'
0.000484 - desc `tad_themes_data_center` `sort`
0.000168 - select `col_sn`,`data_name`,`data_sort`, `data_value` from `tad_themes_data_center` where `mid`= '3' and `col_name`='theme_id' and `col_sn`='7' order by `sort` , `data_sort`
0.000214 - select conf_value from config where conf_name ='allow_register'
0.000349 - select `mid`, `name`, `dirname` from modules where isactive='1' and hasmain='1' and weight!=0 order by weight
0.000177 - SELECT * FROM modules WHERE dirname = 'tad_blocks'
0.000201 - select conf_value from config where conf_title ='_MD_AM_DEBUGMODE'
0.000227 - select count(*) from priv_msgs where `to_userid` ='0' and `read_msg`=0 group by `to_userid`
0.000398 - select `menuid`, `itemname`, `itemurl`, `target`, `icon`, `link_cate_name`, `link_cate_sn`, `read_group` from tad_themes_menu where of_level='0' and status='1' order by position
0.000253 - select `menuid`, `itemname`, `itemurl`, `target`, `icon`, `link_cate_name`, `link_cate_sn`, `read_group` from tad_themes_menu where of_level='11' and status='1' order by position
0.000264 - select `menuid`, `itemname`, `itemurl`, `target`, `icon`, `link_cate_name`, `link_cate_sn`, `read_group` from tad_themes_menu where of_level='14' and status='1' order by position
0.000181 - select `menuid`, `itemname`, `itemurl`, `target`, `icon`, `link_cate_name`, `link_cate_sn`, `read_group` from tad_themes_menu where of_level='15' and status='1' order by position
0.000227 - select `menuid`, `itemname`, `itemurl`, `target`, `icon`, `link_cate_name`, `link_cate_sn`, `read_group` from tad_themes_menu where of_level='17' and status='1' order by position
0.000213 - select `menuid`, `itemname`, `itemurl`, `target`, `icon`, `link_cate_name`, `link_cate_sn`, `read_group` from tad_themes_menu where of_level='16' and status='1' order by position
0.000158 - select `menuid`, `itemname`, `itemurl`, `target`, `icon`, `link_cate_name`, `link_cate_sn`, `read_group` from tad_themes_menu where of_level='18' and status='1' order by position
0.000446 - select a.* from tad_themes_files_center as a left join tad_themes as b on a.col_sn=b.theme_id where a.`col_name`='slide' and b.`theme_name`='school2015'
0.000257 - SELECT * FROM modules WHERE dirname = 'tad_login'
0.000430 - SELECT * FROM config WHERE (`conf_modid` = '14') ORDER BY conf_order ASC
總計: 63
區塊
搜尋: 沒有快取
總計: 1
額外資訊
包含檔案: 216 檔案
使用記憶體: 7188416 bytes
計時
XOOPS 使用 0.144 秒來載入。
XOOPS Boot 使用 0.028 秒來載入。
Module init 使用 0.010 秒來載入。
XOOPS output init 使用 0.035 秒來載入。
Module display 使用 0.033 秒來載入。
Page rendering 使用 0.036 秒來載入。