M5stackで気圧測定（続き）

#概要
　M5stackに超高性能な絶対圧および温度センサーをつなげて、気圧と温度を測りグラフ表示します（続き）。

#デバイス
前回に引き続き、使用したのはこちら

![IMG_1027.jpg](https://qiita-image-store.s3.amazonaws.com/0/350425/35c1da9b-3e12-1898-d174-9a7bae5821e9.jpeg)

販売しているSHOPが増えていますね。
テックシェア
[購入ページ](https://www.physical-computing.jp/product/1672)
スイッチサイエンス
[購入ページ](https://www.switch-science.com/catalog/5329/)

#実行結果
前回のプログラムを書き直しました。
![IMG_1060_S.jpg](https://qiita-image-store.s3.amazonaws.com/0/350425/048d9e0d-d97e-3256-dabe-f2f347e429c0.jpeg)


白は気圧、緑色は温度です。今回は気圧のレンジを狭めたので、手の上げ下げだけで気圧が微妙に変化しています。白いグラフの凸凹は手の上げ下げでついてます。

また、前回温度のグラフが荒く表示される不具合あったので、修正しました。

グラフのレンジについては、自動で調整できるようにしたいと思います。


#プログラム
```C++
#include "Omron2SMPB02E.h"
#include <M5Stack.h>


Omron2SMPB02E prs;
#define WIDTH 320//横サイズ
#define HEIGHT 240//縦サイズ
#define GRAPH_X 25 //グラフ描画領域X座標
#define GRAPH_Y 20 //グラフ描画領域Y座標
#define GRAPH_SPACE 2 //外枠の分
#define GRAPH_W WIDTH - GRAPH_X
#define GRAPH_H (HEIGHT - GRAPH_Y - GRAPH_SPACE)/2-1


#define TEMP_RANGE 500
#define PURESSURE_RANGE 200

/* 色の定義 */
#define RED     0xf800
#define REDd        0xf800
#define GREEN       0x07e0
#define BLUE        0x001f
#define BLACK       0x0000
#define WHITE       0xffff
#define GRAY        0x8c51
#define YELLOW      0xFFE0
#define CYAN        0x07FF
#define PURPLR      0xF81F

uint16_t GraphBuff_A[int(GRAPH_W)] = {0};
uint16_t GraphBuff_B[int(GRAPH_W)] = {0};

//　グラフの最大値と最小値を変数にする
uint32_t Graph_A_Max;
uint32_t Graph_A_Min;

uint32_t Graph_B_Max;
uint32_t Graph_B_Min;

// グラフA開始ポイントを設定 
uint16_t graphStartPosA[2] = {
  GRAPH_X + 1,
  HEIGHT - GRAPH_SPACE
};

// グラフB開始ポイントを設定
uint16_t graphStartPosB[2] = {
  GRAPH_X + 1,
  GRAPH_Y + 1 + int(GRAPH_H)
};

/* 描画用バッファ領域をずらす*/
void slideBuff(uint16_t buff[], uint16_t size){
  for(int i = size - 1; i > 0; i--) buff[i] = buff[i - 1];
}

/* テキスト描画 */
void drawText(uint32_t x, uint32_t y, String text, uint32_t color , uint8_t size){
  M5.Lcd.setTextColor(color);
  M5.Lcd.setTextSize(size);
  M5.Lcd.setCursor(x, y);
  M5.Lcd.print(text);
}

/*グラフ描画 */
void updateGraph(uint16_t graphStartPos[] ,uint16_t color,uint16_t *GraphBuff,uint16_t count){
  for(int i = 0; i < count; i++){
    M5.Lcd.drawPixel(graphStartPos[0] + i, graphStartPos[1] - *GraphBuff++, color);
  }
}



void setup()
{
  prs.begin();
  Serial.begin(9600);
   M5.begin();
  prs.set_mode(MODE_NORMAL);
  delay(300);
  //範囲選定用に１回読み込む
  float tmp = prs.read_temp();
  float pressure = prs.read_pressure();
  Graph_A_Max = (uint32_t)pressure + PURESSURE_RANGE;
  Graph_A_Min = (uint32_t)pressure - PURESSURE_RANGE;
  
  Graph_B_Max = (uint32_t)(tmp*100) + TEMP_RANGE;
  Graph_B_Min = (uint32_t)(tmp*100) - TEMP_RANGE;
  

}

 // 何回読んだかのカウント
uint16_t count =1;

void loop()
{
  //気圧と温度を読み込む
  float tmp = prs.read_temp();
  float pressure = prs.read_pressure();

  M5.Lcd.fillRect(0, 0, 120, 20, BLACK);//文字領域クリア
 //気圧と温度を表示する
 drawText(0, 0, "pressure: " + String(pressure), WHITE, 1);
 drawText(0, 10, "TEMP: " + String(tmp),GREEN, 1);

 M5.Lcd.fillRect(GRAPH_X + 1, GRAPH_Y + 1, GRAPH_W, GRAPH_H, 0);//グラフA領域をいったんクリアする
 M5.Lcd.fillRect(GRAPH_X + 1, GRAPH_Y + 2 + GRAPH_H, GRAPH_W, GRAPH_H, 0);//グラフB領域をいったんクリアする

 //気圧を描画する
  slideBuff(GraphBuff_A, sizeof(GraphBuff_A) / 2); 
  GraphBuff_A[0] = map(pressure, Graph_A_Min, Graph_A_Max, 0, GRAPH_H - 2);
  updateGraph(graphStartPosA,WHITE,GraphBuff_A,count);
 //温度を描画する
  slideBuff(GraphBuff_B, sizeof(GraphBuff_B) / 2); 
  GraphBuff_B[0] = map((tmp*100), Graph_B_Min, Graph_B_Max, 0, GRAPH_H - 2 );
  updateGraph(graphStartPosB,GREEN,GraphBuff_B,count);
  if(count >= GRAPH_W){
    count = GRAPH_W;
  }
  else {
    count ++;
  }

  delay(100);
}

```