| 
 | 
 
感測器:PMS5003、DHT22、 
顯示 CD 
網路:ESP8266 
遇到的問題是如果不加入WIFI的code可以正常讀到溫溼度跟pm2.5的值,但加入wifi的code後變成只讀得到溫濕度的值,pms5003值都為零。 
以下是我的程式碼: 
想請問為何有這個問題 
 
--------------------------------- 
#include<PMS.h> 
#include<DHT.h> 
#define LEDR 12 
#define LEDG 11 
#define LEDB 10 
#define DHTPIN 8//溫溼度感測輸出腳位 
#define DHTTYPE DHT22 
DHT dht(DHTPIN, DHTTYPE); //初始化感測器 
int chk; 
float hum; 
float temp; 
int pm2; 
int pm1; 
 
//PM2.5感測器變數設定 
#include<SoftwareSerial.h> 
SoftwareSerial pmsSerial(2, 3); 
PMS pms(pmsSerial); 
PMS::DATA pmsData; 
int pms_read_PM1() 
{ 
  pms.read(pmsData); 
  return pmsData.PM_AE_UG_1_0; 
} 
 
int pms_read_PM2() 
{ 
  pms.read(pmsData); 
  return pmsData.PM_AE_UG_2_5; 
} 
 
int pms_read_PM10() 
{ 
  pms.read(pmsData); 
  return pmsData.PM_AE_UG_10_0; 
} 
//lCD腳位設定 
SoftwareSerial Serial1(4, 5);//RX=4,TX=5 LCD顯示 
 
//wifi設定 
SoftwareSerial esp8266(6,7);  
String apiKey = "2CMDSRUM73BWJB06";     // ""內輸入ThingSpeak的Write API Key 
String ssid = "TP-LINK_4AB994";       // ""內輸入wifi基地台的名稱 
String password = "";   // ""內輸入wifi基地台的密碼 
boolean DEBUG = true; 
 
//**********主程式************ 
void setup() { 
  Serial.begin(9600);//螢幕輸出 
  Serial1.begin(9600);//LCD 
  dht.begin(); 
  pmsSerial.begin(9600); 
//************ 
  pinMode(LEDR, OUTPUT); 
  pinMode(LEDG, OUTPUT); 
  pinMode(LEDB, OUTPUT); 
//************ 
  turnoff();//LED副程式 
//*******wifi 
  Serial.println("Arduino...OK"); 
  esp8266.begin(115200); 
  esp8266.write("AT+UART_DEF=9600,8,1,0,0\r\n"); 
  delay(1500); 
  esp8266.begin(9600); 
  Serial.println("ESP8266...OK"); 
  esp8266.println("AT+CWMODE=1");   // set esp8266 as client 
  showResponse(6000);   
  esp8266.println("AT+CWJAP=\""+ssid+"\",\""+password+"\""); 
  showResponse(10000);  //顯示並等待wifi完成連線 
} 
 
//**********迴圈************ 
void loop() { 
 
 
  hum = dht.readHumidity(); 
  temp = dht.readTemperature(); 
  pm2 = pms_read_PM2(); 
  pm1 = pms_read_PM1(); 
  
  //**thingSpeck 
thingSpeakWrite(temp, hum, pm2, pm1); 
  //**LED顯示begen 
  if (pm2 <= 35) 
  { turnoff(); 
    digitalWrite(LEDG, LOW); 
  } 
  else if (36 <= pm2 <= 53) 
  { turnoff(); 
    digitalWrite(LEDR, LOW); 
    digitalWrite(LEDG, LOW); 
  } 
  else if (54 <= pm2 <= 71) 
  { turnoff(); 
    digitalWrite(LEDR, LOW); 
  } 
  //紅 
  if ( pm2 > 70 ) 
  { turnoff(); 
    digitalWrite(LEDR, LOW); 
    digitalWrite(LEDB, LOW); 
  } 
  //**LED顯示end 
  lcdoutput(); 
  delay(5000); 
 
} 
 
 
//副程式區間 
//**PM2.5感測器 
//**關閉LED 
void turnoff() { 
  digitalWrite(LEDR, HIGH); 
  digitalWrite(LEDG, HIGH); 
  digitalWrite(LEDB, HIGH); 
} 
 
//**LCD螢幕輸出 
 
void lcdoutput() { 
 
  Serial1.println("page "); 
  lcdend(); 
  Serial1.print("temp.txt=\""); Serial1.print(temp); Serial1.print("\""); 
  lcdend(); 
  Serial1.print("hum.txt=\""); Serial1.print(hum); Serial1.print("\""); 
  lcdend(); 
  Serial1.print("pm_cf_25.txt=\""); Serial1.print(pm2); Serial1.print("\"");//PM2.5 
  lcdend(); 
  Serial1.print("pm_cf_10.txt=\""); Serial1.print(pm1); Serial1.print("\"");//PM1.0 
  lcdend(); 
} 
 
void lcdend() { 
  Serial1.write(0xff); Serial1.write(0xff); Serial1.write(0xff);//轉換資料格式 
} 
 
//**wifi輸出資料 
void showResponse(int waitTime){ 
    long t=millis(); 
    char c; 
    while (t+waitTime>millis()){ 
      if (esp8266.available()){ 
        c=esp8266.read(); 
        if (DEBUG) Serial.print(c); 
      } 
    }         
} 
 
boolean thingSpeakWrite(float value1, float value2,float value3,float value4){   //自己增加或減少要上傳的數據項目 
  String cmd = "AT+CIPSTART=\"TCP\",\""; 
  cmd += "184.106.153.149"; 
  cmd += "\",80"; 
  esp8266.println(cmd); 
  if (DEBUG) Serial.println(cmd); 
  if(esp8266.find("Error")){ 
    if (DEBUG) Serial.println("AT+CIPSTART error"); 
    return false; 
  } 
 
  String getStr = "GET /update?api_key="; 
  getStr += apiKey; 
 
  getStr +="&field1="; 
  getStr += String(value1); 
  getStr +="&field2="; 
  getStr += String(value2); 
  getStr +="&field3="; 
  getStr += String(value3); 
  getStr +="&field4="; 
  getStr += String(value4); 
  // getStr +="&field3=";                             //自己增加或減少要上傳的數據項目 
  // getStr += String(value3); 
  // ... 
  getStr += "\r\n\r\n"; 
 
  cmd = "AT+CIPSEND="; 
  cmd += String(getStr.length()); 
  esp8266.println(cmd); 
  if (DEBUG)  Serial.println(cmd); 
  delay(100); 
  esp8266.print(getStr); 
  if (DEBUG)  Serial.print(getStr); 
  else{ 
    esp8266.println("AT+CIPCLOSE"); 
    if (DEBUG)   Serial.println("AT+CIPCLOSE"); 
    return false; 
    } 
  return true; 
} 
 |   
 
 
 
 |