酒と薔薇の日々(その2)

好きなことだけ求めて生きるアスペ気味のINTJ人

OLED 1513でバッファを使った文字&画像の表示

2024年05月02日 18時23分35秒 | マイコン(ESP32・Arduino等)


【1315の説明】
https://wiki.seeedstudio.com/Grove-OLED-Display-0.96-SSD1315/

Grove - OLEDディスプレイ 0.96インチ(SSD1315)
Grove-OLEDディスプレイ0.96インチ(SSD1315)は、Grove I2Cインターフェースを備えたモノクロ(白)128×64ピクセルのパッシブディスプレイマトリックスモジュールです。

新しいSSD1315チップのおかげで、3.3Vで動作するため、高価なDC-DC昇圧回路が不要になりました。また、オンボードのレベルシフト回路により、新しいGrove-OLEDディスプレイ0.96インチは3.3Vおよび5Vプラットフォームで動作します。つまり、ArduinoのOLEDディスプレイやRaspberry PiのOLEDディスプレイなどとして簡単に使用できます。
特徴
3.3V/5V対応
変更可能なI2Cアドレス
低消費電力
モノクロ(白) 128×64 ピクセル
高コントラスト、高輝度
広い動作温度範囲:-40°C~+85°C
--------------
①文字だけなら「<U8x8lib.h>」ライブラリでバッファなし表示はOK
②あれこれやった結果、1315でグラフィックを使うには「U8g2lib」ライブラリ&描画バッファが必要なことがわかった。
 (②のサンプルソースはずっと下の方)

上記①②いずれも1306モードを流用して使ってる。
※U8x8libはU8g2libに含まれています。
全貌を理解するまで時間がかかり申した。

参考サイト様
https://lang-ship.com/blog/work/grove-beginner-kit-08-oled/
https://qiita.com/CoTechWorks/items/3b6ada2d0b5951b2e33c

ちなみに1306では「u8g2.firstPage()とu8g2.nextPage() 」を使ってグラフィックを描画してるみたいです。
DOWhileの間に描画命令を記述します。
u8g2.firstPage(); ← 描画開始
do {
  :
 描画命令
  :
} while (u8g2.nextPage()); 
こんな感じ。
でも、今回の1513では関係ないです。

①①①①①①①①①①①①①①①①①①①①①
① 文字だけ楽に書く U8x8ライブラリ ①
①①①①①①①①①①①①①①①①①①①①①

//====setup例======
#include <Arduino.h>
#include <U8x8lib.h>
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);
void setup(void) {
u8x8.begin();
u8x8.setFlipMode(1); // 上下反転モード
u8x8.setFont(u8x8_font_chroma48medium8_r);
}

//====事例 文字表示&上書き======
void loop(void) {
u8x8.setCursor(0, 0);     // 最下段は(0,7)
u8x8.print("Hello World!"); delay(3000);
u8x8.print("xxxxxxxxxxxx"); delay(3000);
u8x8.print("yyyyyyyyyy"); delay(3000);
u8x8.print("zzzzzzzzz"); delay(5000);
}
1行目で書き終えた次の位置からxxx・・が書かれて、改行なしにyyy・・,zzzが上書きされる。書き込む際には下側にあった文字は消去され重ね描きにはならない。

u8x8.setCursor(0, 0);
u8x8.print("Hello World!"); delay(3000);
u8x8.setCursor(0, 0);
u8x8.print("zzzz"); delay(5000);
結果は「zzzzoWorld!」が表示される

====事例 位置指定での文字表示======
u8x8.clearDisplay();   画面を全て消去する
u8x8.clearLine(3);    0..で始まる指定の行を消去する

void loop(void) {
u8x8.clearDisplay();
u8x8.setCursor(0, 0);
u8x8.print("Hello World!"); delay(3000);
u8x8.clearLine(0);

u8x8.setCursor(0, 3);
u8x8.print("HLine 3"); delay(3000);
u8x8.clearLine(3);
delay(5000);
}
====事例 フォントサイズ======
16*16 4倍角の文字
u8x8.setFont(u8x8_font_px437wyse700a_2x2_r);  // 太文字
u8x8.drawString(0, 0, "ABC defg");

u8x8.setFont(u8x8_font_px437wyse700b_2x2_r);  // 細文字
u8x8.drawString(0, 2, "ABC defg");
delay(2000);

u8x8.setFont(u8x8_font_inb33_3x6_n); 縦横15mm程度のフォント

====事例 反転文字======
結果はzzzzが通常文字で続けて[o world!]が反転で表示される

u8x8.setCursor(0, 0);
u8x8.setInverseFont(1); // 反転文字
u8x8.print("Hello World!"); delay(3000);

u8x8.setCursor(0, 0);
u8x8.setInverseFont(0); // 正常文字
u8x8.print("zzzz"); delay(5000);

====事例 書式付き文字表示======
 Escape文字、改行コード、.print / .println文
u8x8.clearDisplay();
u8x8.print("print \\n\n"); delay(500);
u8x8.println("println"); delay(500);
u8x8.println("done"); delay(1500);

====事例 数字の表示 ======
数字を表示する。桁合わせはせず長くなれば後ろへ伸びていく
for(int i = 0; i < 200; i++ )
{
u8x8.setCursor(0, 2);
u8x8.print(i); // Arduino Print function
delay(10);
}

====事例 0サプレス数値表示======
 先頭に0を埋めた数値を表示する
for(int i = 0; i < 100; i++ )
{
u8x8.drawString(0, 2, u8x8_u16toa(i, 5)); // U8g2 Build-In functions
delay(10);
}

====キー入力用関数======
OK/Cancelを選択させる4行の表示 OKは反転文字となる
u8x8.userInterfaceMessage("You selected the", "Cancel", "Button", " Ok ");

====事例 天候マークを描画する ======
u8x8.clearDisplay();
u8x8.drawString(0, 2, "Weather");
u8x8.setFont(u8x8_font_open_iconic_weather_4x4);
for(int c = 0; c < 6; c++ )
{
u8x8.drawGlyph(0, 4, '@'+c);
delay(300);
}
delay(5000);

※参考
https://github.com/olikraus/u8g2/wiki/fntgrpiconic

②②②②②②②②②②②②②②②②②②②
② バッファ利用のグラフィック描画 ②
②②②②②②②②②②②②②②②②②②②
/*
HiroCom777さんのサイトを参考にさせていただきました
  https://hirocom777.hatenadiary.org/entry/2020/11/14/233211

円やら矩形を描くサンプル
 2024/5/2  

*/
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* clock=*/SCL, /* data=*/SDA, /* reset=*/U8X8_PIN_NONE); // High speed I2C

void setup() {
u8g2.begin();
u8g2.setFlipMode(0);
u8g2.setFont(u8g2_font_ncenB08_tr); // フォントを選ぶ

u8g2.clearBuffer(); // バッファクリア
u8g2.setCursor(0, 15); // dot単位で左上が(0,0)で、文字非dリシタの座標を指定する
u8g2.print("Hello 1513 !");
u8g2.sendBuffer(); // バッファ表示
delay(3000);
}

void loop() {
for (int i = 0; i <= 7; i++) {
u8g2.clearBuffer(); // clear the internal memory
if (i == 0) { //線を描く
u8g2.drawLine(20, 5, 120, 50);
} else if (i == 1) { //四角形を描く
u8g2.drawFrame(50, 7, 42, 55);
} else if (i == 2) { //四角形を描く(塗りつぶし)
u8g2.drawBox(30, 2, 25, 50);
} else if (i == 3) { //円を描く
u8g2.drawCircle(50, 30, 30, U8G2_DRAW_ALL);
} else if (i == 4) { //三角形を描く(塗りつぶし)
u8g2.drawTriangle(20, 5, 27, 50, 120, 25);
} else if (i == 5) { //四角形を描く(角丸)
u8g2.drawRFrame(3, 7, 110, 25, 3);
} else if (i == 6) { //四角形を描く(角丸、塗りつぶし)
u8g2.drawRBox(3, 7, 100, 50, 5);
} else if (i == 7) { //楕円を描く
u8g2.drawEllipse(20, 25, 15, 10, U8G2_DRAW_ALL);
}
u8g2.sendBuffer();
delay(1000);
}
}



ロボカー講座のチラシを配りに行脚

2024年05月02日 18時23分35秒 | ボランティア


昨日子ども科学館へ行った際・・休館だとっ
GW真っ最中だろう??
昨日は、新入会のKndさんの面接が18時からなのでそれに先立って出かけたのだが・・・
本日リベンジ
明日からGW後半戦なので今日中に配布をしておかないとイカン

朝9時半からビョーインへ。バセドー値は健常値に下がっており、少し脈拍は多いものの薬も4週分各日1錠に下がった。
やれやれですわ。


新緑が綺麗です。
病院帰りの電車を延長し、紙屋町方面まで足を伸ばし子ども科学館へ向かう。
気持ちよく50部ほど置いてもらえることに。ありがたい。
往復2時間近くはかかってますな。


ゲートパークでは鶏唐イベントなどをやっていた。昨日は松本由美子がいたな。
一旦帰宅して今度は車でヌマジ交通館へ
ここも気持ちよく受け取ってもらえた。
いずれも広島文化財団の施設だしね。ありがとうございます。

帰りにコーナンへ凹材を買いに行くも発見に至らず。
ジュンテンドーにありました。
1本790円だが、30*30*1820で、10mmほど鉋掛けが必要
24mmは置いてなかったのが残念です。
コメリとかカインズは24mmだったんだけどな。
ま、電動カンナだから良しとしよう。

昨日の閉館のおかげを食らって友人宅へ行く時間が3時間ほど遅れてしまった。
別組織だが同じようなギョ~カイだったので、過去の共通するボヤキで大いに盛り上がる。
先日分解したベット天板のスポンジ+布を再生して使うそうです。
これも引き取ってもらえてありがたい話であります。



昨日の雨+スカ連発と違って天気も最高。まさに五月晴れ
忙しいが良い1日でした。

それにしてもプロが育てるとサクランボが毎年鈴なり。すごいっす。