M5stack으로 기압 측정(계속)

개요



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);
}

좋은 웹페이지 즐겨찾기