LoginSignup
2
5

More than 5 years have passed since last update.

M5stackで気圧測定

Last updated at Posted at 2019-01-31

概要

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

デバイス

使用したのは、こちら

IMG_1027.jpg

スイッチサイエンスにて購入しました。Arduino用ライブラリも公開されていて、購入ページからダウンロードできます。
購入ページ
このセンサーはGroveケーブルにて簡単にM5stackに接続できます。
こんな感じ
IMG_1029.jpg

実行結果

これを利用して作ったのがこちら
IMG_1022.jpg

白は気圧、緑色は温度です。階段を上り下りすると、気圧の変化がわかります。

プログラム

#include "Omron2SMPB02E.h"
#include <M5Stack.h>


Omron2SMPB02E prs;
#define WIDTH 320//横サイズ
#define HEIGHT 240//縦サイズ
#define GRAPH_X 25 //グラフ描画領域X座標
#define GRAPH_Y 50 //グラフ描画領域Y座標
#define GRAPH_SPACE 2
#define GRAPH_W WIDTH - GRAPH_X - GRAPH_SPACE
#define GRAPH_H HEIGHT - GRAPH_Y - GRAPH_SPACE
//絶対圧の下限と上限を設定
#define GRAPH_A_MAX 103000
#define GRAPH_A_MIN 101000
// 温度の下限と上限を設定
#define GRAPH_B_MAX 40
#define GRAPH_B_MIN 0


/* 色の定義 */
#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;

// グラフ開始ポイントを設定 
uint16_t graphStartPos[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 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);
  //範囲選定用に1回読み込む
  float tmp = prs.read_temp();
  float pressure = prs.read_pressure();
  Graph_A_Max = (uint32_t)pressure + 1000;
  Graph_A_Min = (uint32_t)pressure - 1000;

  Graph_B_Max = (uint32_t)tmp + 10;
  Graph_B_Min = (uint32_t)tmp - 10;


}


 // 何回読んだかのカウント

 uint16_t count =1;
void loop()
{
  //気圧と温度を読み込む
  float tmp = prs.read_temp();
  float pressure = prs.read_pressure();
  Serial.println(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_SPACE, GRAPH_H - GRAPH_SPACE, 0);//グラフ領域をいったんクリアする

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

  delay(100);
}

2
5
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5