「Arduino Nano + BH1750FVI」の続き。
上ではシリアル・モニターに結果を出力するスケッチのサンプルをもらってきて試しただけだ。
使えそうなのでスタンド・アローンで使うために表示用の液晶をつけることにした。
BH1750FVIは照度センサーのモジュール、SSD1306は今回追加するモノクロOLED、U8g2はその表示ライブラリだ。
BH1750FVIの読み込み処理はライブラリ化されていないのでスケッチ内に書かれている。
センサーの使い方に関しては簡単だし上の記事でほとんど済んでいるので書かない。
ここは、表示がらみの覚書きがメインになる。
U8g2はもう幾度も使った気でいたが、Nokia5110 LCDで使っただけで、あとはHX1230の動作テストに一瞬使っただけだった。
いろんな液晶に対応しているので使い込んだ気がしていただけだった。
このライブラリのいい点はフォントが多いこと。
特にサイズの大きいプロポーショナル・フォントは見た目がいいので好みだ。
フォントリスト:https://github.com/olikraus/u8g2/wiki/fntlistall
リファレンス:https://github.com/olikraus/u8g2/wiki/u8g2reference
基本的には、サンプルを書き込めばそのまま表示確認できるが、今回使った関数だけ書き出しておく。
プロポーショナルなフォントを使ったので、表示位置を合わせるときに文字の長さが必要になる。
上のReferenceは、そのためのgetStrWidthを探し出すために参照した程度。
1 |
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, 5, 4, U8X8_PIN_NONE); |
使う液晶の種類に合わせてたくさん並んでいる中から使うものをコメントアウトする。
当初は
1 |
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, SCL, SDA, U8X8_PIN_NONE); |
を使っていたが、BH1750FVIをつないだら何も表示されなくなって、上にしたら動いた。
HWはハードウェア、SWはソフトウェアでI2Cを実装するという意味らしいが、5, 4と指定する時点でHWだよなあと漠然と後で思った程度の理解。
使ったのは以下の関数だ。
1 2 3 4 5 6 |
u8g2.begin();//u8g2という名前でクラスの宣言をする。 u8g2.clearBuffer();//内部メモリを消去する。 u8g2.setFont(u8g2_font_ncenB10_tr);//使うフォントを決める。 u8g2.drawStr(0,15,"Ambient Light");//内部メモリの0,15の位置に文字データを書き込む。 u8g2.drawStr(128-u8g2.getStrWidth("Intensity"),30,"Intensity");//右詰めで表示する。 u8g2.sendBuffer();//内部メモリのデータを液晶へ表示する。 |
drawStrだけが動作確認に使ったのサンプル・スケッチには無かった関数なので、右詰めのやり方だけ少し書く。
getStrWidth(“Intensity”)で、実際の表示文字の長さを得る。
液晶の幅である128から長さの値を引いた位置から文字を書けば右に寄せて書かれる。
上のIntensityと46 luxはこの方法で右いっぱいに表示させている。
センサーも液晶も同じI2C用のピンに接続してあるが、特にぶつかる様子もなく問題なく動作している。
というか、BH1750FVIのアドレスは0x23とサンプルに書いてあってそのまま使っているが、SSD1306の方はライブラリ化されていてアドレス指定すら勝手に行われている。
こういうのがArduinoって何か嫌な感じがするが、うまくいってるからまあいいやとなる。
うまくいかないと、いったい内部でどうなってんのか、原因探しが容易ではない。
下の写真は、ライトで照らして動作確認しているところ。
「Arduino Nano + BH1750FVI + SSD1306 with U8g2 をケースに入れてみる。」
Tweet