概要
M5stackに超高性能な絶対圧および温度センサーをつなげて、気圧と温度を測りグラフ表示します(続き)。
デバイス
前回に引き続き、使用したのはこちら
販売しているSHOPが増えていますね。
テックシェア
購入ページ
スイッチサイエンス
購入ページ
実行結果
白は気圧、緑色は温度です。今回は気圧のレンジを狭めたので、手の上げ下げだけで気圧が微妙に変化しています。白いグラフの凸凹は手の上げ下げでついてます。
また、前回温度のグラフが荒く表示される不具合あったので、修正しました。
グラフのレンジについては、自動で調整できるようにしたいと思います。
プログラム
# 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);
}