ひとりでできるもん!(M5 Atom単体で温度測定)
の続きデース。
まずソースをお掃除
前回、ちょうど手元にあったENV-II環境センサを使って温度計を作りました。前回の記事の時点ではかなりやっつけ仕事だったのですが、もうちょっとだけ手直ししてそこそこ見れるようにしたソースがこちらです
だいぶすっきり(∩´∀`)∩☆
とりあえず差を見てみる
これに、M5 Atomさん内蔵のMPU6886の読み出しを追加して、両方の値を表示できるようにしたのがこちら!
こちらを実行すると、シリアルモニタで両者の測定温度差をしらべられます。
SHT30(こちらは外付けのセンサで、たぶんより正確)な値は16度そこそこなのに、内蔵のMPU6886は30度オーバーと、この1月後半のファッキンコールドなのにまるで夏な気温を示しています。
ArduinoIDEのツールー>シリアルプロッタで、データをリアルタイムでグラフ化してみましょう。
結果はこんなかんじ。
緑がSMT30、青が内臓MPU6886。センサを手で握って体温で温めた山なりのカーブが出ていますが、どっちにしろエライ差ですね><
おそらく、センサだけでなくいろいろな機能(CPUとか)がまとめてワンチップになっているMPUのため、自分自身で発熱している熱を測定しちゃっているのではないかなーと言う気がします。人間も気温を計ろうとして温度計握りしめてたら体温出ちゃいますもんねえ。
差が分かったので
なので、また夏ごろだと変わってきちゃいそうですが、真冬の今のところだいたい12~15度の差が出ているようなので、おおざっぱに平均値の13.5度をマイナス方向にオフセットしてLEDに表示するようにしてみました。
//MPU6886の温度センサ測定値のオフセット温度
#define OFFSET -13.5
↑で設定できますが、defineの値は差そのままなので、マイナスを付けるのをわすれないでくださいネ。
さて、ここまでできたら、単体で測定できるようにちょちょいと書き換えてみます。
できあがりソース
#include "M5Atom.h"
#include <Wire.h>
//#define ENV2_ON
#ifdef ENV2_ON
/**** ENV2 Unit 使用時 */
#include "Adafruit_Sensor.h"
#include <Adafruit_BMP280.h>
#include "SHT3X.h"
SHT3X sht30;
Adafruit_BMP280 bme;
float tmp = 0.0;
float hum = 0.0;
float pressure = 0.0;
#endif
#define WHITE 0x707070
#define GREEN 0xf00000
#define RED 0x00f000
#define BLUE 0x0000f0
#define YELLOW 0xf0f000
#define BLACK 0x0
bool IMU6886Flag = false;
float MPUtemp = 0;
//MPU6886の温度センサ測定値のオフセット温度
#define OFFSET -13.5
void setup()
{
M5.begin(true, false, true);
Wire.begin();
delay(50);
#ifdef ENV2_ON
Serial.println(F("ENV Unit(SHT30 and BMP280) test..."));
while (!bme.begin(0x76)){
Serial.println("Could not find a valid BMP280 sensor, check wiring!");
M5.dis.drawpix(24, 0x00f000); //Red
}
#endif
//MPU6886
if (M5.IMU.Init() != 0)
IMU6886Flag = false;
else
IMU6886Flag = true;
M5.dis.drawpix(0, 0xf00000);
}
void TempDisp(float ttt){
int range;
long cc; // color
if(ttt>-20){
range=-2;
cc = WHITE;
}
if(ttt>-10){
range=-1;
cc = WHITE;
}
if(ttt>0){
range=0;
cc = WHITE;
}
if(ttt>10){
range=1;
cc = BLUE;
}
if(ttt>20){
range=2;
cc = GREEN;
}
if(ttt>30){
range=3;
cc = YELLOW;
}
if(ttt>40){
range=4;
cc = RED;
}
float tt = ttt - range*10;
float tmp2 = (int)(tt*10) / 10.0; //小数点2位以下切り捨て
int tmp3 = (int)tmp2; // 整数値
int tmp4 = (int)((tmp2 - (float)tmp3)*10.0); //小数点以下(1桁)
int i;
// tt0~10
for(i=0;i<11;i++){
if(i<tmp3) M5.dis.drawpix(i, cc);
else M5.dis.drawpix(i, BLACK);
}
//10の位
for(i=10;i<15;i++) M5.dis.drawpix(i, BLACK);
if(range>=0){
M5.dis.drawpix(9+range, WHITE);
}else{
M5.dis.drawpix(14+range, BLUE);
}
for(i=0;i<tmp4;i++){
M5.dis.drawpix(i+15, cc);
}
for(i=tmp4;i<11;i++) M5.dis.drawpix(i+15, BLACK);
}
void loop()
{
//MPU6886
if (IMU6886Flag == true){
M5.IMU.getTempData(&MPUtemp);
//Serial.printf("MPU Temp : %.2f C \r\n", MPUtemp);
}
#ifdef ENV2_ON
pressure = bme.readPressure();
if(sht30.get()==0){
tmp = sht30.cTemp;
hum = sht30.humidity;
}
//Serial.printf("SHT30 Temp: %2.2f*C \r\n", tmp);
//Serial.printf("SHT30 Temp: %2.2f*C Humedad: %0.2f%% Pressure: %0.2fPa\r\n", tmp, hum, pressure);
// Serial.printf("MPU:%.2f,SHT30:%.2f\r\n", MPUtemp,tmp);
#endif
Serial.printf("MPU:%.2f,+OFFSET:%.2f\r\n", MPUtemp,MPUtemp+OFFSET);
//LEDプロット。関数内ですべて処理
TempDisp(MPUtemp + OFFSET);
if (M5.Btn.wasPressed())
{
// ボタンが押された時の動作
}
delay(1000);
M5.update();
}
長くてすみません><
過去のSHT30用の部分はifdefでカットしています。ENV2ユニットを使いたい時は上の方にある
//#define ENV2_ON
のあたまの // を削れば使える仕組みです。
そんなことしないでおけばもっとコンパクトなソースになりますが、まあ、いまんところはこれで。
じゃ、SHT30センサーを引っこ抜いて動作させてみましょう~♪
動作させてみる
むーん。室温19度の時に22.2度ぐらいを示しています。3度違うのは困っちゃいます(´・ω・)(・ω・`)ネー。(これでも13.5度引いてるんですよ!><)
試しに手近にあった冷たい板(電源の入っていないノートパソコンという名のヒートシンク)の上において数分ほおっておくと
19.3度、と、いちおうは正しそうな値を示すようになりました。(これを期待値のねつ造といいます(๑´ڡ`๑)てへぺロ)
百葉箱でも作らないと本当のところはわかりませんが、いちおう、外気温に近いヒートシンクにはりつけておいたら、それっぽい値が出る(んじゃないかな?)的なラフな温度計には、これでなったんじゃないかなーと言うところで、今回はこのぐらいで勘弁してやろうとおもいます(えらそうw)
ちなみに
↑このフラットな状態になるのは10分ぐらいほおっておいたところです(赤色の線は単に13.5を引いた値なので単純な平行線です)
手でぎゅっと握りしめて加温しつづけると
このような具合。このグラフ全体の横幅は500秒なので、だいたい400秒、6.6分ぐらいで(この温度差なら)値が安定する模様~。
あまり急な温度変化には対応できなさそうですねー。
いまはこれで「まあいいや」運用にしますが、本来なら、温度を調整できる環境でもつくって(そういう電子工作もたのしいかも?)、気温ごとの実測値との差をきっちり取って、変換テーブルでもつくったらよいかもですね~。夏休みまで覚えてたら自由研究でやるかも?(きっと忘れるw)
よろしければサポートお願いします!いただいたサポートはクリエイターとしての活動費にさせていただきます!感謝!,,Ծ‸Ծ,,