macsbug

Just another WordPress.com site

Environmental Sensor (環境センサー)

leave a comment »

温度、湿度、気圧 センサーに 「埃センサー」を加えた、環境センサーを作る。        2015.12.19

埃センサーは、DSM501A を使用。
結果は OLEDに表示し、ThingSpeak へデーターを送信しグラフ表示しました。


 

PM10 と PM2.5 ( ThingSpeak )


準備:
_ 温度、湿度、気圧 センサー:BME280
_ 埃センサー:PPD42NS 又は DSM501A
_ Dust sensor investigation:埃センサーの解説。
_ ESP8266+BME280+IR LED+Air Con+ThigSpeak:ThingSpeak の解説。
_ ESP8266+BME280+OLED+BOX:BME280 の解説。

配線:埃センサー
_ DSM501A ( P1 OUT:RED     ) — ESP8266 GPIO_13: Pin 13
_ DSM501A ( P2 OUT:YELLO ) — ESP8266 GPIO_14: Pin 14


メモ:
WiFi環境の無い所では、ThingSpeakへは送信せず、OLEDの表示のみになります。
埃センサーの空気の流れは、ファンを使用していません。要検討事項です。
スケッチの、SSID,PASSWORD,THINGSPEAK API は、各自の値を入力してください。
スケッチの、BME280 offset(温度、湿度、気圧)は、各自の値を入力してください。
スケッチ setup中の if ( wifi // 0 )は、if ( wifi < 0 ) に置き換えてください。
_ 理由:なぜか、WordPress 書き込み時にリストがずれる為です)
スケッチの、eror action: は、異常な値を処理する為ですが、理由が不明の為、課題です。


参考:
Dreams Passion Digital World:Arduino Dust Sensor with ESP8266
particle Sensor:Model PPD42NS
netatmo:ウエザーステーション(温度、湿度、空気の質、CO2、サウンドメーター)
mental munition factory:Measure air pollution in your home or backyard with a DustDuino


感想:
埃の単位である PM値の理解不足や不慣れな為に、PM値の ug/m3 が分かり難い。
埃の具合が数値で表現されるので、現状の把握と理解が進むと思います。
PM2.5のcountの表示が正しいかどうか不明の為、もう一台製作して比較してみたいと思います。


スケッチ:

// ESP8266 + BME280 + DSM501A + OLED              // 2015.10.29 macsbug
// http://www.shadowandy.net/2015/06/arduino-dust-sensor-with-esp8266.htm
// http://www.sca-shinyei.com/pdf/PPD42NS.pdf
// DSM501A : RIGHT=1=GND      (ORANGE) => GND     // Dust Sensor
//                 2=P2 OUT   (YELLOW) => GPIO_14 // ESP8266_14
//                 3=5VDC     (WHITE)  => 5V
//                 4=P1 OUT   (RED)    => GPIO_13 // ESP8266_13
//                 5=T1 INPUT (BLACK)
// I2C BMP280, I2C OLED : SDA=GPIO_0,SCL=GPIO_2 : Temp,Humi,pres
//------------------------------------------------//--------------------
#include <ESP8266WiFi.h>                          // ESP WiFi
#include <Wire.h>                                 // 
#include <BME280_MOD_1022.h>                      // BME280
#include <Adafruit_GFX.h>                         // OLED
#include <ESP_Adafruit_SSD1306.h>                 // OLED 
#define OLED_RESET 4                              // OLED 
Adafruit_SSD1306 display(OLED_RESET);             // OLED            
extern "C" {
  #include "user_interface.h"
} 
// ESP8266 Initialize ----------------------------//--------------------
const char ssid[] = "xxxx";                       // your ssid
const char pass[] = "xxxx";                       // your password
const char thingSpeakAddress[] = "api.thingspeak.com";
const char thingSpeakAPIKey[] = "xxxx";           // your ThingSpeakAPI
// Dust Sensor Initialize ------------------------//--------------------
#define P2 0                                      // PM2.5
#define P1 1                                      // PM10
int pin[] = {13, 14};                             // P1,P2
unsigned long starttime;                          //
unsigned long sampletime_ms = 30000;              // 30sec
unsigned long tn[2];                              // trigger on
unsigned long tf[2];                              // trigger off
unsigned long p[] = {0, 0};                       // lowpulseoccupancy
float rt[] = {0, 0};                              // Ratio
float ct[] = {0, 0};                              // Count
boolean v[] = {HIGH, HIGH};                       // Value
boolean t[] = {false, false};                     // trigger
// WiFi count  -----------------------------------//--------------------
int  wifi = 32;                                   // wifi count
// BME280 offset ---------------------------------//--------------------
long e = -5.66;                                   // Temp
long h = +11.75;                                  // Humidity
long r = +4.88;                                   // Pressure

void setup() {                                    //
  //Serial.begin(115200);                         //
  // OLED setup ----------------------------------//--------------------
  Wire.begin(0,2);                                // I2C SDA,SCL OLED
  display.begin(SSD1306_SWITCHCAPVCC, 0x78>>1);   // I2C ADDRESS=78
  display.clearDisplay();                         // Clear the buffer. 
  display.setTextSize(1);                         // font size 1
  display.setTextColor(WHITE);                    //
  // WiFi connection check -----------------------//--------------------
  display.print("Mac ");                          //
  display.print(WiFi.macAddress());               // Mac address disp
  display.println("Connecting to ");              //
  display.println(ssid);display.display();        // ssid disp
  WiFi.begin(ssid, pass);                         //
  while ( WiFi.status() != WL_CONNECTED){         // WiFi Status check
   delay(500); wifi--;                            //
   display.print(WiFi.status());display.display();// WiFi Status disp
   if ( wifi // 0 ){ display.print("fail");       // WiFi fail
    display.display(); goto p;                    // WiFi fail
   }                                              // WiFi fail
  } display.println("ok");                        // WiFi ok
  display.print("IP: ");                          //
  display.println(WiFi.localIP());                // IP address disp
p:delay(500);                                     //
  // BME280 setup --------------------------------//--------------------
  BME280.readCompensationParams();                // read NVM parameters
  BME280.writeOversamplingTemperature(os1x);      // 1x over sampling
  BME280.writeOversamplingHumidity(os1x);         // 1x over sampling
  BME280.writeOversamplingPressure(os1x);         // 1x over sampling
  // DSM501A Dust sensor setup -------------------//--------------------
  pinMode(pin[P2],INPUT); pinMode(pin[P1],INPUT); // Listen designated PIN
  starttime = millis();                           // Fetching current time
  ESP.wdtEnable(WDTO_8S);                         // Enabling Watchdog
  display.println("Dust sensor Reading");         //
  display.println("Please wait 30sec");           //
  display.display();                              //
}
 
void loop() {
  // dust reading loop ---------------------------//---------------------
  v[P2] = digitalRead(pin[P2]); v[P1] = digitalRead(pin[P1]); 
  if (v[P2] == LOW  && t[P2] == false){ t[P2]=true;tn[P2]=micros();}
  if (v[P2] == HIGH && t[P2] == true) {tf[P2]=micros();
      p[P2] += (tf[P2] - tn[P2]); t[P2] = false;
  }
  if (v[P1] == LOW  && t[P1] == false){ t[P1]=true;tn[P1]=micros();}
  if (v[P1] == HIGH && t[P1] == true) {tf[P1]=micros();
      p[P1] += (tf[P1] - tn[P1]); t[P1] = false;
  } 
  ESP.wdtFeed();                                   // Reset the WatchDog
  // dust reading loop ----------------------------//--------------------
  // Dust Sensor Read, BME280 Read, OLED Display, ThingSpeak connection
  if ((millis() - starttime) > sampletime_ms){     // Check time sample
    // Dust sensor calcurate ----------------------//--------------------
    rt[P2] = p[P2] / (sampletime_ms * 10.0);
    ct[P2] =1.1*pow(rt[P2],3)-3.8*pow(rt[P2],2)+520*rt[P2]+0.62;
    rt[P1] = p[P1] / (sampletime_ms * 10.0);
    ct[P1] =1.1*pow(rt[P1],3)-3.8*pow(rt[P1],2)+520*rt[P1]+0.62;
    ct[P2] -= ct[P1];   
    ESP.wdtFeed(); // Reset the WatchDog           // mass calculation  
    float cr[] = {0, 0};                           // concentration
    double pi = 3.14159;                           //
    double density = 1.65 * pow(10, 12);           //
    double K = 3531.5;                             //
    ESP.wdtFeed(); // Reset the WatchDog           //
    double r10 = 2.6 * pow(10, -6);                // PM10
    double vol10 = (4 / 3) * pi * pow(r10, 3);     // PM10
    double mass10 = density * vol10;               // PM10
    cr[P1] = (ct[P1]) * K * mass10;                // PM10   
    ESP.wdtFeed(); // Reset the WatchDog           //
    double r25 = 0.44 * pow(10, -6);               // PM2.5
    double vol25 = (4 / 3) * pi * pow(r25, 3);     // PM2.5
    double mass25 = density * vol25;               // PM2.5
    cr[P2] = (ct[P2]) * K * mass25;                // PM2.5
    ESP.wdtFeed(); // Reset the WatchDog           // mass calculation      
    // BME280 Reading -----------------------------//--------------------
    BME280.writeMode(smForced);  delay(50);        // goes back to sleep
    while (BME280.isMeasuring()){delay(50);}       //
    BME280.readMeasurements();                     // read out the data
    String temp=String(BME280.getTemperature()+e); // Temp
    String humi=String(BME280.getHumidity()+h);    // Humidity
    String pres=String(BME280.getPressure()+r);    // Pressure
    // OLED Display output ------------------------//--------------------
    display.clearDisplay();                        // Display Clear
    display.setCursor(96,0);display.println ("C"); //
    display.setCursor(96,8);display.println ("%"); //
    display.setCursor(96,16);display.println("hpa");
    display.setCursor(96,32);display.println("ug/m3");
    display.setCursor(96,40);display.println("count");
    display.setCursor(96,48);display.println("ug/m3");
    display.setCursor(96,56);display.println("count");
    display.setCursor(0,0);                        //
    display.println(temp);                         //
    display.println(humi);                         //
    display.println(pres);                         //
    display.println("");                           //
    display.print("PM10  ");display.println(cr[P1]);
    display.print("PM10  ");display.println(ct[P1]);
    display.print("PM2.5 ");display.println(cr[P2]);
    display.print("PM2.5 ");display.println(ct[P2]);
    display.display();                             //
    // eror action : ThingSpeak pass --------------//--------------------
    if ( cr[P1] > 10000 ){ goto p1 ;}              // pm10 ug/m3 over flow
    if ( ct[P1] > 10000 ){ goto p1 ;}              // pm10 count over flow
    if ( cr[P2] >  1000 ){ goto p1 ;}              // pm25 ug/m3 over flow
    if ( ct[P2] > 10000 ){ goto p1 ;}              // pm25 count over flow
    if ( wifi < 0 )      { goto p1 ;}             // wifi fail    
    // ThingSpeak connection ----------------------//--------------------
    connectWiFi();                                 //
    updateThingSpeak(                              // data to ThingSpeak
        "1=" + temp + "&2=" + humi + "&3=" + pres  // 1:temp,2:humi,3:pres
     + "&4=" + String(cr[P1], DEC)                 // 4:pm10 ug/m3
     + "&5=" + String(ct[P1], DEC)                 // 5:pm10 count
     + "&6=" + String(cr[P2], DEC)                 // 6:pm25 ug/m3
     + "&7=" + String(ct[P2], DEC)                 // 7:pm25 count
    );                                             //
    // dust sensor reset --------------------------//--------------------
p1: delay(300000UL);                               // 5 min delay
    p[P2] = 0; p[P1] = 0; starttime = millis();    // Reset next sampling
    ESP.wdtFeed();                                 // Reset the WatchDog
  }                                                //
}                                                  //
 
void connectWiFi() {                               //
  if (WiFi.status() == WL_CONNECTED){return;}      //
  WiFi.begin(ssid, pass);                          //
  while(WiFi.status() != WL_CONNECTED){delay(500);}//
}                                                  //
 
void updateThingSpeak(String data){                //
  WiFiClient client;                               //
  if (!client.connect(thingSpeakAddress,80)){return;}
  client.print(F("GET /update?key="));             //
  client.print(thingSpeakAPIKey);                  //
  client.print(F("&"));                            //
  client.print(data);                              // Sensor Data
  client.print(F(" HTTP/1.1\r\nHost: api.thingspeak.com\r\n\r\n"));
  client.println();                                //
}                                                  //


Written by macsbug

12月 19, 2015 @ 1:58 pm

カテゴリー: ESP8266

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。