電子ペーパー天気予報実験セットのプログラムの作り方

image
2018.8.24更新
電子ペーパー天気予報実験セットで、電子ペーパーを制御するプログラムの作り方のご紹介です。

実験セットは↓こちら↓で購入いただけます

epdexpset04

●サンプルプログラム
Arduinoの開発環境でプログラムでします。Arduino開発環境のセットアアップ方法はこちら

 

サンプルプログラムはこちらです↓。
 最新版 2018.8.24 epdhello.zip (文字を描画できるようになりました。描画が高速になりました)
  2018.2.26版 epdhello20180226.zip  (16色,フルカラーBMPも読み込めるようになりました)
  2017.12.14版 epdhello20171214.zip

 

zipを展開してできたepdhelloフォルダを、arduinoフォルダに入れてください。
epdhelloの中のsdフォルダの中身を、SDカードにコピーしてください。SDカードの中に、bmpファイルとfontフォルダができていればOKです。SDカードは、電子ペーパー実験セット基板のSDカードスロットに挿してから、USBをパソコンとつないで下さい。(2018.8.24追記)

 

Arduinoの開発環境で、epdhello.inoを開くとサンプルプログラムのファイルが全て読み込まれます。この中で、Epdクラスが、電子ペーパーを制御するクラスとなっています。このクラスのヘッダファイルepd.hをご覧いただくと、どんな機能があるかわかります。


●BMPデータを電子ペーパーに表示する仕組み

BMPファイルの画像データは電子ペーパーに直接データを転送するのではなく、画像メモリーに1画面分のデータを保存してから、画像メモリーの内容を電子ペーパーに送る仕組みになっています。電子ペーパーは一回のデータ転送では薄くしか表示されません。しっかりと濃い表示にするためには、同じ画像データを繰り返し5,6回送る必要があります。SDカードはデータの読み込みが速くないため、一旦画像メモリーに読み込んで、画像メモリーから必要な回数電子ペーパーにデータを送信します。
電子ペーパーの画像データはモノクロデータでも60kBytesになり、ESP-WROOM-02の内蔵メモリーでは足りません。このため画像メモリーは、マイコンに1Mbit SRAMを外付けしてあります。

これらのことから、クラスの機能には、画像メモリーに対する操作と、電子ペーパーに対する操作、その他設定の操作の3つから成っています。

●基本的な使い方
BMPを電子ペーパーに表示するためには最低限以下の3つを記述します。

  1. epd.begin(); //初期化
  2. epd.loadBmp( BMPファイル名 ); //画像の読み込み
  3. epd.show(); //表示
1はsetupの中で実行します。loopの中でloadBmp()でbmp画像をメモリーに読み込んで、show()で表示します。

 

文字を電子ペーパーに表示するためには、以下のようになります。
  1. epd.fill(WHITE);     //画像メモリを白でクリア
  2. epd.textPos( 100 , 200 ); //文字の位置 x:100,y:200
  3. epd.textMag( 3 , 4 );   //文字サイズ 幅3倍,縦4倍
  4. epd.println( “テストABC” );
  5. epd.show();       //表示

●リファレンス

epdクラスで用意してある機能をご紹介します。
・初期化

Epd.begin()

初期化を行います。setupの中で1回実行してください。制御回路のリセットとSDカードのマウントを行っています。SDカードがマウントできないとfalseを返します。

Epd.makeFontDB();

 フォントデータに高速にアクセスするためのDBファイルを生成します。ファイルはSDカードのfontフォルダに作られます。プログラムでフォントファイルを変更した時に、setupの中で実行してください。

 

・画像メモリーに対する操作

Epd.loadBmp( String fileName )

画像メモリーへ指定したファイル名のBMPを読み込みます。横800ピクセル縦600ピクセル専用です。モノクロbmpの他、16色、256色、フルカラーbmpに対応しています。カラー画像の場合、白黒に2値化して読み込みます。読み込み速度が遅いので、データサイズの小さいモノクロBMPを推奨します。bmpが読み込めないとfalseを返します。

Epd.loadBmp( String fileName , int x , int y ) 2018.2.26追加

画像メモリーの指定した座標(x,y)に、指定したファイル名のBMPを読み込みます。bmpが読み込めないとfalseを返します。モノクロbmpの他、16色、256色、フルカラーbmpに対応しています。読み込み速度が遅いので、データサイズの小さいモノクロBMPを推奨します。

Epd.pset( int x , int y , char color )2018.2.26追加

画像メモリーの指定した位置(x,y)のピクセルの色を変更します。colorは BLACK か WHITE のどちらかのみを指定します。

Epd.fill( int color )

画像メモリーを指定した色で塗りつぶし(指定した色でクリア)ます。colorは BLACK か WHITE のどちらかのみを指定します。

Epd.print( “abc” )2018.8.24追加

画像メモリーに指定した文字列を描画します。arduinoのprintと同じ使い方です。

Epd.println( “abc” ) 2018.8.24追加

画像メモリーに指定した文字列を描画します。文字の終わりで改行します。arduinoのprintinと同じ使い方です。・電子ペーパーに対する操作

Epd.show()

画像メモリーのデータを電子ペーパーに出力し表示します。

Epd.white()

電子ペーパー全体を白で塗りつぶします。画像メモリーには影響しません。

Epd.black()

電子ペーパー全体を黒で塗りつぶします。画像メモリーには影響しません。

Epd.reflesh()

同じ画像を繰り返し表示したり、長期間表示していると、過去に表示した画像が薄く残ってしまいます。この症状を軽減するためのリフレッシュ表示を行います。この動作が終わるまで数分かかります。

・設定に関する操作

Epd.textColor( color ) 2018.8.24追加

 printとprintlnで描画するテキストの色を指定します。colorは BLACK か WHITE のどちらかのみを指定します。

 

Epd.textPos(int x , int y) 2018.8.24追加

 printとprintlnで描画するテキストの位置を指定します。x,yは文字の左上の座標です。

 

Epd.textMag(int xMag , int yMag) 2018.8.24追加

 printとprintlnで描画するテキストの倍率を指定します。xMag,yMagは、元のフォントを横、縦の何倍となります。

Epd.setDrawingTimes(int n)

電子ペーパーに繰り返し何回データを送るか設定します。デフォルトは6回です。多くするほど、鮮明に表示されます。時間に余裕がある場合は10回程度がおすすめです。

Epd.autoPowerOff( bool f ) boolはtrue(自動) か false(手動) です。

電子ペーパーの電源ON,OFF制御を自動で行うか指定します。trueの場合、show()が実行されている時だけ電子ペーパーの電源がONし、電子ペーパーへのデータ転送が終わるとOFFします。falseの場合は、ONのままになります。短時間に何度も描画を繰り返すと、電子ペーパーの電源をOFFしたときに過去の画像が残像として現れてしまいます。そのような場合にはfalseにして、電源を切らないようにします。

Epd.powerOn()

電子ペーパーの電源を入れます。ONしなくても、show()を実行すると自動でONします。

Epd.powerOff()

電子ペーパーの電源を切ります。

●注意点

ESP-WROOM-02(ESP8266)をプログラムする際の注意点です。だいたい0.5秒くらいに1回

ESP.wdtFeed();

を入れてください。ESP-WROOM-02はウォッチドッグタイマーが動作していて1秒くらいに1回、ESP.wdtFeed()を行わないと、CPUが暴走していると判断しリセットがかかってしまいます。delay()の場合は大丈夫なのですが、for文で長い時間ループの処理をしているなど、プログラムがCPUを長時間占有してしまうとリセットしてしまうので、適当なところで、ESP.wdtFeed() を入れてくださいね。

実験セットは↓こちら↓で購入いただけます

epdexpset04

関連リンク

コメント