|
程式碼如下,想請教各位前輩,
(1).為何在數值呈現的時候電壓總是偏低,而PM2.5總是呈現負值呢?
(2).為何溫溼度跟PM2.5的數值無法同時偵測,而溫溼度總慢了幾秒?
(3).程式碼中該如何修改才能一併將PM2.5的數值上傳到thinkspeak 呢?
煩請前輩們幫忙解惑,感恩
#include
#include "DHT.h"
#define DEBUG
#define _ledpin 13
#define _rxpin 0
#define _txpin 1
SoftwareSerial debug( _rxpin, _txpin ); // RX, TX
#define _dhtpin 8
#define _dhttype DHT11
DHT dht11( _dhtpin, _dhttype );
uint8_t dhtbuf[2];
int measurePin = 0; //Connect dust sensor to Arduino A0 pin
int ledPower = 3; //Connect 3 led driver pins of dust sensor to Arduino D2
int samplingTime = 460;
int deltaTime = 40;
int sleepTime = 9500;
float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;
int mean_pm, mean_v0;
char pm[16];
char HT[7];
char pm_SD[22];
#define SSID "889"
#define PASS "sf000093"
#define IP "184.106.153.149" // ThingSpeak IP Address: 184.106.153.149
// 使用 GET 傳送資料的格式
// GET /update?key=[THINGSPEAK_KEY]&field1=[data 1]&filed2=[data 2]...;
String GET = "GET /update?key=UR0WZRMIAUXQVUBI";
void setup() {
Serial.begin(9600);
debug.begin(9600);
sendDebug("AT");
delay(5000);
if(Serial.find("OK"))
{
debug.println("RECEIVED: OK\nData ready to sent!");
connectWiFi();
}
dht11.begin();
pinMode( _ledpin, OUTPUT );
digitalWrite( _ledpin, LOW );
}
void loop() {
float h = dht11.readHumidity();
float tt = dht11.readTemperature();
// 確認取回的溫溼度數據可用
if( isnan(dhtbuf[0]) || isnan(dhtbuf[1]) )
{
debug.println( "Failed to read form DHT11" );
}
else
{
digitalWrite( _ledpin, HIGH );
char buf[3];
String HH, TT;
buf[0] = 0x30 + dhtbuf[1] / 10;
buf[1] = 0x30 + dhtbuf[1] % 10;
TT = (String(buf)).substring( 0, 2 );
buf[0] = 0x30 + dhtbuf[0] / 10;
buf[1] = 0x30 + dhtbuf[0] % 10;
HH = (String(buf)).substring( 0, 2 );
updateDHT11( TT, HH );
#ifdef DEBUG
debug.print("Humidity: ");
debug.print( HH );
debug.print(" %\t");
debug.print("Temperature: ");
debug.print( TT );
debug.println(" *C\t");
#endif
digitalWrite( _ledpin, LOW );
}
delay(2000); // 60 second
dustDensity = 0;
mean_v0=0;
float vs=140;
for (int i = 0; i <= 29; i++) {
digitalWrite(ledPower, LOW);
delayMicroseconds(samplingTime);
voMeasured = analogRead(measurePin);
delayMicroseconds(deltaTime);
digitalWrite(ledPower, HIGH);
delayMicroseconds(sleepTime);
calcVoltage = voMeasured * (5.0 / 1024.0);
mean_v0=mean_v0+voMeasured;
if (h>50) {
dustDensity = 0.6*(1-0.01467*(h-50))*(voMeasured-vs);
}
else {
dustDensity = 0.6*(voMeasured-vs);
}
Serial.print("Raw input voltage: ");
Serial.print(calcVoltage);
Serial.print(" Raw Signal Valued: ");
Serial.print(voMeasured);
Serial.print(" PM2.5: ");
Serial.println(dustDensity);
Serial.println(" ug/m3 ");
Serial.print("RH:");
Serial.print(h);
Serial.print("% ");
Serial.print("T:");
Serial.print(tt);
Serial.print("C ");
delay(2000);
};
}
void updateDHT11( String T, String H, String PM2.5)
{
// 設定 ESP8266 作為 Client 端
String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += IP;
cmd += "\",80";
sendDebug(cmd);
delay(2000);
if( Serial.find( "Error" ) )
{
debug.print( "RECEIVED: Error\nExit1" );
return;
}
cmd = GET + "&field1=" + T + "&field2=" + H "&field3=" + PM2.5 +"\r\n";
Serial.print( "AT+CIPSEND=" );
Serial.println( cmd.length() );
if(Serial.find( ">" ) )
{
debug.print(">");
debug.print(cmd);
Serial.print(cmd);
}
else
{
sendDebug( "AT+CIPCLOSE" );
}
if( Serial.find("OK") )
{
debug.println( "RECEIVED: OK" );
}
else
{
debug.println( "RECEIVED: Error\nExit2" );
}
}
void sendDebug(String cmd)
{
debug.print("SEND: ");
debug.println(cmd);
Serial.println(cmd);
}
boolean connectWiFi()
{
Serial.println("AT+CWMODE=1");
delay(2000);
String cmd="AT+CWJAP=\"";
cmd+=SSID;
cmd+="\",\"";
cmd+=PASS;
cmd+="\"";
sendDebug(cmd);
delay(5000);
if(Serial.find("OK"))
{
debug.println("RECEIVED: OK");
return true;
}
else
{
debug.println("RECEIVED: Error");
return false;
}
cmd = "AT+CIPMUX=0";
sendDebug( cmd );
if( Serial.find( "Error") )
{
debug.print( "RECEIVED: Error" );
return false;
}
} |
|