先日Aliexpressから安価な非接触赤外線温度センサーGY-906を購入した。送料込み約500円。
写真中央にある円柱のモジュールがそれである。Arduinoから使おうと使えるライブラリを調べてみると、AdafruitのMLX90614用ライブラリが使えるらしい。
https://github.com/adafruit/Adafruit-MLX90614-Library
通信はI2C通信でアドレスは0x5A。すんなり動くと思いきや、読み取る値は1037.55固定。色々な掲示板の情報を調べて試してみると、I2Cのクロック周波数を変えると動く事が分かった。50000にすると動く様だ。
しかし、単体であればWire.beginの際に周波数を指定すれば良いが、読み取った値をOLEDディスプレイに表示させようとすると途端にOLEDは動くがセンサーの方が動かなくなる。
最終的に、Adafruitのライブラリのソースコード Adafruit_MLX90614.cpp のI2C通信部分の前後で動的に周波数を調整する事で、OLEDもセンサーも動く様になった。通信の前後にsetClockで調整を入れている。
uint16_t Adafruit_MLX90614::read16(uint8_t a) {
uint16_t ret;
Wire.setClock(50000);
Wire.beginTransmission(_addr); // start transmission to device
Wire.write(a); // sends register address to read from
Wire.endTransmission(false); // end transmission
Wire.requestFrom(_addr, (size_t)3); // send data n-bytes read
ret = Wire.read(); // receive DATA
ret |= Wire.read() << 8; // receive DATA
uint8_t pec = Wire.read();
Wire.setClock(100000);
return ret;
}
This post is also available in: 英語