LoginSignup
2
4

More than 5 years have passed since last update.

M5stackで気圧測定(続き)

Posted at

概要

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

デバイス

前回に引き続き、使用したのはこちら

IMG_1027.jpg

販売しているSHOPが増えていますね。
テックシェア
購入ページ
スイッチサイエンス
購入ページ

実行結果

前回のプログラムを書き直しました。
IMG_1060_S.jpg

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

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

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

プログラム

#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);
  //範囲選定用に1回読み込む
  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);
}

2
4
0

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
4