Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 866|回復: 4

製作空氣盒子遇到pms5003加入wifi程式碼後無值

[複製鏈接]
發表於 2019-11-13 18:28:43 | 顯示全部樓層 |閱讀模式
感測器: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;
}
發表於 2019-11-14 13:46:28 | 顯示全部樓層
SoftwareSerial  一次只能接收一個 PORT
用兩個 PORT (含)以上
就必須用 listen 切換
esp8266.listen() ;
XXXX
Serial1.listen();
XXXX
所以如果沒處理好, 很容易掉資料
解決方式
1. 用 SoftwareSerial, 要讀資料時記得用 listen 切換
https://www.arduino.cc/en/Tutorial/TwoPortReceive

2. 改用 AltSoftSerial 取代 SoftwareSerial
https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html

3. 改用 MEGA 之類的硬體 SERIAL


 樓主| 發表於 2019-11-14 19:32:39 | 顯示全部樓層
本帖最後由 shawn0503wang 於 2019-11-14 20:18 編輯

我想請問是step部分中esp8266.println都改成 esp8266.listena嗎
發表於 2019-11-14 19:48:30 來自手機 | 顯示全部樓層
不是。連結就有範例可參考
 樓主| 發表於 2019-11-14 20:18:26 | 顯示全部樓層
本帖最後由 shawn0503wang 於 2019-11-14 21:49 編輯

我看範例只有loop裡的改
但我loop沒有esp8266.
我esp8266使用AltSoftSeriall esp8266()一樣pm5003給出是有值單
看wifi有成功連線 但我thingspeak那邊沒收到
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2020-7-12 02:21 , Processed in 0.125423 second(s), 6 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表