toyoshiの日記

株式会社トクイテンを有名にするための日記です

obnizで二酸化炭素濃度センサーMH-Z19Bの値を読み取る

obnizで二酸化炭素濃度センサーMH-Z19Bの値を読み取りました。MH-Z19BはUARTでの接続に対応しているのでそれを使います。

f:id:toyoshi:20200314113006p:plain

準備

  • MH-Z19BのRxをobnizの1番ピンに、Txを0番ピンに接続する
  • MH-Z19BのVinとGNDを5VとGNDに接続する。今回のコードでは、それぞれobnizの10番ピン、11番ピンに繋ぐ

コード

<html lang="ja">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css">
</head>
<body>
<h3 id="bploading" style="text-align:center;">ロード中...</h3>
<div id="OBNIZ_OUTPUT"></div><br/>

  <script src="https://unpkg.com/obniz@latest/obniz.js" crossorigin="anonymous"></script>
  <script src="https://unpkg.com/obniz-parts-kits@0.15.1/ui/index.js" crossorigin="anonymous"></script>


<script>
  $("#bploading").text("実行中");
  (async function(){
  var obniz, uart;
  
  
  obniz = new Obniz('XXXX-XXXX');
  await obniz.connectWait();
  obniz.io10.output(true);
  obniz.io11.output(false);
  uart = obniz.getFreeUart();
  uart.start({rx: 0, tx: 1, baud:9600}); //uartに接続
  while (true) {
    obniz.display.clear();
    obniz.display.print("CO2:" + read_co2_concentration(uart) + "ppm");
    await ObnizUI.Util.wait(2000);
  }
    
  function read_co2_concentration(uart){
    uart.send([0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79]); //MH-Z19Bの読み出しコマンド
    if(uart.isDataExists()) {
      var data = uart.readBytes();
      //console.log(data);
      if(data[0] == 255){
        return data[2] * 255 + data[3];
      }
    }
    return 0;
  }
  
})();
</script>
</body>
</html>

課題

値がちゃんとしてない時があります。チェックサムが用意されているのでそれを使えば異常値の場合を弾けるかもしれません