本文へスキップ

TEL. 029-227-3061


〒310-0803 茨城県水戸市城南1-5-11

各種センサ付設置型CO2測定器

こんにちは。ユードムガジェット研究所隊員KZです。

業務でセンサ工作に勤しんでいる日々をお伝えしていきたいと思います。

第1回となる今回は、PM2.5付設置型CO2測定器を作製しました。

元は、2007年の毎日新聞社が主催で横浜の日本新聞博物館で行われた「MOTTAINAI(もったいない)へ〜キャンペーン報道の力〜」

に展示した設置型CO2測定器(CO2のみ)を倉庫から見つけました。

これに温湿度センサ、気圧センサ、微粒子計測センサを組み込みます。その様子を書いてきます。

まず、CPUを変えました。元はPIC16F876でした。

これを最近使ってるPSoC5lpにします。手元にあったCY8CKIT-059(以下代替CPU)を使います。

元のPICを外し(ICソケット)、基板の空いてるスペースに代替CPUをのせて半田付けします。

CO2センサおよび表示基板の配線を代替CPUに変更します。

設置型のエアフィルタとDCファンを外し、小さいLCDをパネルのLEDの下に両面テープで貼り付けます。

LCDからのケーブルは設置型の空気取り入れ口からケース内部に引き込みます。

これもコネクタでCPUに接続します。

微粒子計測センサ(SPS-30)を空気取り入れ口付近に両面テープで固定して信号線をCPUに繋ぎます。

微粒子計測センサはUARTで接続します。

次にソフトの作成です。

下記のソースは今回新たに作成したPM2.5測定部です。PSoC Creator4.2で作成しました。

for(i=0;i<4;i++) //PM2.5
{
  PBUFF[i]=pm_BUFF[qq];
  if(PBUFF[i]==125)
  {
    PBUFF[i]=pm_BUFF[qq+1];
    if(PBUFF[i]==94)
    {
      PBUFF[i]=126;
      qq=qq+2;
    }
    if(PBUFF[i]==93)
    {
        PBUFF[i]=125;
        qq=qq+2;
    }
    if(PBUFF[i]==49)
    {
        PBUFF[i]=17;
        qq=qq+2;
    }
    if(PBUFF[i]==51)
    {
      PBUFF[i]=19;
      qq=qq+2;
    }
  }
  else
  {
    qq=qq+1;
  }
}
tempU32 = (uint32)PBUFF[0]*16777216+(uint32)PBUFF[1]*65536+(uint32)PBUFF[2]*256+(uint32)PBUFF[3];
pm25 = *(float*)&tempU32;
CyDelayUs(100u);

これで、動かしてみます。

こんな感じになりました。

次は温湿度センサ、気圧センサの取り付けおよびesp8266でサーバへデータを送ります。

まず、温湿度センサを取り付けます。

温湿度センサは、Sensirion社のSHT31-Dを使ったAdafruit社の

モジュールを使用します。

基板の端に7ピンのピンソケットを半田付けします。

インターフェースはI2Cでマイコンと接続します。

続いて気圧センサを取り付けます。気圧センサは昔に使用した秋月のLPS331APモジュールを使います。

これは、前のCPUが刺さっていたICソケットの端に刺します。

インターフェースはSPIとI2Cがありますが、ここはI2Cを選びマイコンとつなぎます。

これで、必要なセンサは取り付けました。

ケースの中はこんな感じ。

次に温湿度、気圧を読み取るソフトをPSoC Creatorで作ります。

温度、湿度を読み込む部分

void TH_Read(void)
  slvaddr = TH_ADDR; //SHT31 slave adrress

  buffer[0] = 0x2C;
  buffer[1] = 0x06;
  lnth = 2;
  I2Cdev_Write((uint8*)buffer);
  CyDelay(15u);
  buffer[0] = 0x00;
  lnth = 6;
  I2Cdev_Read((uint8*)buffer);
  CyDelayUs(10u);
  temp = -45.0 + 175.0 * ((float)(I2CRcvData[0] * 256 + I2CRcvData[1]) / 65535.0);
  humi = 100.0 * ((float)(I2CRcvData[3] * 256 + I2CRcvData[4]) / 65535.0);

  CyDelayUs(100u);
  sprintf(tp,"%2.1f",temp);
  CyDelayUs(20u);
  sprintf(hm,"%3.1f",humi);
}

気圧を読み込む部分

void PRESSURE(void)
{
  CyDelayUs(10u);
  LCD_Cmd(0xCF);
  LCD_Data(0xE8);
  CyDelayUs(20u);

  slvaddr=PRSS_ADDR;
  lnth=1;
  prbuf[0]=0x28;
  I2Cdev_Read((uint8*)prbuf);
  p1=I2CRcvData[0];
  prbuf[0]=0x29;
  I2Cdev_Read((uint8*)prbuf);
  p2=I2CRcvData[0];
  prbuf[0]=0x2A;
  I2Cdev_Read((uint8*)prbuf);
  p3=I2CRcvData[0];
  press=((float)p3 * 65536.0 + (float)p2 * 256.0 + (float)p1) / 4096.0;

  CyDelayUs(30u);
  sprintf(prpr,"%4.1f",press);
  CyDelayUs(50u);
  LCD_Cmd(0xC6);
  LCD_Puts(prpr);
  CyDelayUs(20u);
  LCD_Cmd(0xCF);
  LCD_Data(0x20);
}

続いてクラウドサービスは、データを送るだけでグラフを描いてくれるAmbientにします。

クラウドにデータを送るESP-WROOM-02は、マイクロテクニカで以前購入したVer.1のものを使います。

これを両面テープでケースの内側に貼り付けて、Ambientまでデータが行くか実験しました。

ケースはアルミである為、普通はケースの内側には置かないのですが、元々40mm角のDC FANの穴が 空いており、その付近であれば通信できるかなと思った訳です。

結果は、無事に通信できました。

これで、完成です。

Ambientの画面はこのようになります。

と思っていましたが、1日から数日経つと動きが固まってしまいます。

やはり、ESP-WROOM-02は金属ケースの外に置くのが正解のようです。

測定器の上にプラスチックケースを両面テープで固定して、その中に秋月で購入したESP-WROOM-02を置いてみました。

これで、完成です。