search
LoginSignup
2
Help us understand the problem. What are the problem?

posted at

updated at

ArduinoでOLEDを動かす(u8g2libライブラリを使用)

概要

Arduinoでu8g2libライブラリを使用してOLEDに文字列を表示する。
関数を整理したサイトが見つからなかったので、調べた内容を整理。
※u8g2libライブラリ以外の関数でも便利なものがあれば合わせて記載
※動作確認が取れたものを随時追加中

実行環境

MCU:Arduino nano v3.0(HiLetgo製互換品)
OLED:Vivan-Star I2C 0.96インチOLED(SSD1315使用)

参考サイト

https://lang-ship.com/blog/work/grove-beginner-kit-08-oled/
https://jumbleat.com/2016/09/07/how_to_use_u8glib_part_3/

サイズ別フォント一覧

配線

省略

基本のプログラム

u8g2libはSSD1315をサポートしていないが、SSD1306用のライブラリを使用することで以降に記載する関数が使えることを当方の環境で確認済み。
画面描画の流れとしては、バッファと呼ばれる領域に表示したい内容を入力していき、sendBuffer()でそれまでに入力した内容で画面を更新、となる。

#include <U8g2lib.h>

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);

void setup(void) {
  u8g2.begin();          // OLEDの初期化
  u8g2.setFlipMode(0);   // 画面の向きを設定、数字を変えると向きが変わる
}

void loop(void) {
  u8g2.clearBuffer();                    // バッファのクリア
  u8g2.setFont(u8g2_font_ncenB08_tr);    // フォント設定
  u8g2.drawStr(0, 10, "Hello World!");   // バッファに文字列を格納
  u8g2.drawLine(0, 16, 128, 64);         // バッファに直線の情報を格納
  u8g2.sendBuffer();                     // バッファの内容で画面を更新
  delay(1000);
}

関数一覧

※クラス名を上記プログラムと同じく「u8g2」に設定したと想定

初期設定

インスタンス生成

構文
オブジェクトの型名 u8g2(引数);

オブジェクトの型名と引数はスケッチ例 → U8g2 → full_buffer → HelloWorld等で動作確認しつつ実行環境にあったものを選ぶ。

初期化

構文
u8g2.begin();

画面の向きを設定

構文
u8g2.setFlipMode(画面の向きを表す数字);

引数のデフォルトは0で、1に変更すると180°回転する。

文字列

フォントを設定

構文
u8g2.setFont(フォント名);

u8g2libで使用できるフォントはGithubの下記リンク先。
https://github.com/olikraus/u8g2/wiki/fntlistall#7-pixel-height
※文字の大きさでカテゴリ分けされている

文字列を表示

構文
u8g2.drawStr(x座標, y座標, 文字列);

指定した座標の位置に文字列を表示する。
原点は画面左上なので、左端から右に何ピクセル、上端から下に何ピクセル、という形で指定。
文字列の左下の座標を指定するので、文字の高さを見越して座標を指定する。
例えば (0, 0, "Hello World") と指定すると文字が画面からはみ出すことになるので何も表示されない。

また返り値で文字列の幅を取得できる。
※実際は(文字列の幅+1文字分の幅)が返ってくる
数字+単位という表示をしたいが数字の桁数が変わることがある、というときに便利。

byte a = 0;
a = u8g2.drawStr(0, 10, "Hello"); //"Hello"をバッファに格納すると同時に文字幅をaに代入
u8g2.drawStr(a, 10, " World");     //取得した幅の分だけ右に移動した座標で"World"を表示

数値を文字列に変換(標準ライブラリ)

構文
dtostrf(数値, 全体の長さ, 小数点以下の表示数, 文字列変数);

数値を文字列に変換して文字列変数に代入する関数。
sprintfでも数字を文字列に変換することはできるが、Arduinoでは小数(float型、dobble型)をsprintfで変換するとエラーになるので、その解決のために作られたと思われる関数。
センサの値や計算結果を表示するときに便利

例)
a = 3.1415;
char str[10];
dtostrf(a, 4, 2, str);

str ⇒ 3.14 ※頭に0はつかない

文字列の幅を取得

構文
byte 変数 = u8g2.getStrWidth(文字列変数);

文字列の幅を調べる。文字列のセンタリングや右寄せ・右詰めに便利。

センタリングの例
char str[20] = {"Hello World"};
byte x = u8g2.getStrWidth(str);
u8g2.drawStr(64-(x/2), 10, str);

解説)
画面の幅が128ピクセルであれば、中心のx座標は64。
64から文字列の幅の半分を引くと、センタリングしたときの文字列の左側の座標が算出できる。
右寄せは(128-x)となる。

図形

drawLine

構文
u8g2.drawLine(始点のx座標, 始点のy座標, 終点のx座標, 終点のy座標);

直線を描画する
始点と終点を引数に代入して使用

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2
Help us understand the problem. What are the problem?