マイコンの醍醐味といえば、各種センサーを扱うこと。PCではできないことが数千円のマイコンと数百円から買えるセンサーを組み合わせることでできてしまいます。
いろいろなセンサーを試してみたのですが、マイコンにまったく興味を持たない人はセンサーにもほぼ興味を持つことはありません。しかし、そんななかで、誰もが食いつくのが、「非接触温度センサー(NCIR Unit)」です。子供はもちろん、料理好きな大人もきっと興味を持つでしょう。台所でも大活躍です!
IoTブームで脚光を浴びつつあるマイコンの中でも、ディスプレイとバッテリーを標準で搭載していることで人気を集めているM5StickCで試してみました。
いかがでしょうか? この動画では冷たい飲み物の温度を測っています。後半では氷を追加しており、温度が下がっているのがわかると思います。
ちなみに、M5StcikCのディスプレイに出ている、「Ambi」は環境温度、「Obj」が対象物の温度です。このセンサーは2種の温度を同時に測ることができるんですね。便利。
プログラムはさほど難しくありません。
まずは「Adafruit-MLX90614-Library」というライブラリを読み込み。あとは、サンプルを見ながら、表示のためのコードを追加するだけです。
以下にコードを掲載しておきます。コメントとともに余計なものも入ってますが、試行錯誤の履歴ということで。あと、右ボタンを押したらスリープにするコードを入れてます。これは左ボタンで電源を切るのが長押しになるのが面倒なので付けたのですが、バッテリー消費を押さえる意味ではあまり効果がなかったので、無視してください。バッテリー残量の目安も表示しています。
Library
CODE
#include <m5stickc.h>
#include <wire.h>
#include <adafruit_mlx90614.h>
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
void setup() {
setCpuFrequencyMhz(10); //クロック下げる
Wire.begin();
//Wire.begin(32,33);// begin(i2c_sda_pin ,i2c_scl_pin) G,V,32白SDA,33黄SCL
Serial.begin(115200);
M5.begin();
M5.Axp.ScreenBreath(9); // 画面の輝度を少し下げる ---- (7 - 15)
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(1);
//M5.Lcd.clear(BLACK); //M5Stackにはあるが、M5StickCにはない
M5.Lcd.fillScreen(BLACK); //clear
mlx.begin(); //MLX9614
M5.Lcd.setCursor(0, 0); //120, 100
M5.Lcd.print("NCIR MLX90614");
M5.Lcd.setTextSize(2);
M5.Lcd.setCursor(0, 30); //120, 100
M5.Lcd.print("Ambi:");
M5.Lcd.setCursor(0, 90); //120, 100
M5.Lcd.print("Obj :");
}
uint16_t result;
float temperature;
void loop() {
M5.update();
//MLX
float amb = mlx.readAmbientTempC();
float obj = mlx.readObjectTempC();
double vbat = M5.Axp.GetVbatData() * 1.1 / 1000; // バッテリー電圧を取得 ----D
M5.Lcd.fillRect(0, 50, 80, 20, BLACK);
M5.Lcd.fillRect(0, 110, 80, 20, BLACK);
M5.Lcd.setTextSize(2);
if (amb < 1000) {
M5.Lcd.setCursor(0, 50);
M5.Lcd.print(amb);
M5.Lcd.setCursor(0, 110);
M5.Lcd.print(obj);
} else {
//つないでないとおかしな値が出るので
M5.Lcd.setCursor(0, 50);
M5.Lcd.print("*****");
M5.Lcd.setCursor(0, 110);
M5.Lcd.print("*****");
}
M5.Lcd.fillRect(0, 150, 80, 10, BLACK);
M5.Lcd.setTextSize(1);
M5.Lcd.setCursor(0, 150);
M5.Lcd.printf("vbat: %4.2fV", vbat);
// 右ボタンを現在ms以上押しているか?
if ( M5.BtnB.pressedFor(1000) ) {
//Serial.println("BtnB.pressedFor(1000) == TRUE");
M5.Axp.DeepSleep(); //microsecond
}
esp_sleep_pd_config( ESP_PD_DOMAIN_RTC_PERIPH
, ESP_PD_OPTION_AUTO);
esp_sleep_enable_timer_wakeup(1000000); //500000
esp_light_sleep_start();
}
非接触センサー自体はAmazonになかったので、スイッチサイエンスのリンクを。
M5Stack用非接触温度センサユニット
千石電商にもありました。
普通に買ったら高価な非接触温度センサーも、マイコンと組み合わせれば3000円台で実現できますよ、っていう記事にしたかったんですが、単体の非接触温度センサーも1000円台から買えるんですね。しらなかった!
(追記 2022/03/16)
コードがちゃんと表示されてなかったので、修正しました。


コメント