フォト
2018年11月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
無料ブログはココログ

arduino

2018年11月15日 (木)

豊四季Tiny BASIC for Arduino STM32で日本語フォント利用対応中(2)

前回からの修正、全角文字列を表示できるコマンドを追加しました。

表示している様子

01

プログラム

02

10 'OLED日本語表示デモ
20 @(0)=8,10,12,14,16,20,24
30 S="吾輩は猫である。名前はまだ無い。どこで生れたかとんと見当がつかぬ。"
40 L=LEN(S)
50 FOR J=0 TO 6
60 SETKANJI @(J):CLS 1:KANJI 0,0,STR$(S):WAIT 500
70 NEXT J
80 GOTO 50

KANJIコマンドで指定した座標に文字列を描画します。
  KANJI x,y,"文字列"
  KANJI x,y,STR$(文字列を格納した変数)

SETKANJIコマンドは、フォントサイズ等の設定を行います。

これで、簡単に全角文字列を描画出来るようになりました。
前回と同じことやってますが、プログラムがかなり短く出来ます。

OLED版では、CONSOLEコマンドにてプログラム編集画面をシリアルターミナルに
切り替えることが出来ます。
この場合でも、OLEDディスプレイへのグラフィック描画を行うことが出来ます。

2018年11月 7日 (水)

豊四季Tiny BASIC for Arduino STM32で日本語フォント利用対応中

先日作成した「Arduino用SJIS漢字フォントライブラリ SDカード版」を
豊四季Tiny BASIC for Arduino STM32に組み込んで日本語表示対応を試みています。

(現時点の修正案は下記のリンク先にまとめています。
  ttbasic_arduino_stm32のプロジェクトのissues#58にまとめています^^)

日本語表示が出来れば、簡単なアドベンチャーゲームが作成出来ると思います。


日本語表示表示の雰囲気は次のような感じです。

OLED版の表示デモ


プログラムソース

10 'OLED日本語表示デモ
20 @(0)=8,10,12,14,16,20,24
30 S="吾輩は猫である。名前はまだ無い。どこで生れたかとんと見当がつかぬ。"
40 L=LEN(S)
50 FOR J=0 TO 6
60 Z=@(J):X0=0:X=X0:Y=0
70 CLS 1
80 FOR I=1 TO L
90 R=KFONT(MEM,ASC(S,I),Z)
100 BITMAP X,Y,MEM,0,Z,Z,1
110 IF (X+Z*2+1)>(GW-1) X=0:Y=Y+Z ELSE X=X+Z+1
120 IF Y+Z>GH-1 I=L
130 NEXT I
140 WAIT 500
150 NEXT J
160 GOTO 160

プログラムはKFONT関数で1文字ずつフォントデータを取得して表示しています。
フォントをSDカードから逐次参照して表示しているため、表示は遅いです。

表示専用のKANJIコマンドを追加予定です。
これを使えばもう少しプログラムが短くなり、表示も早くなると思います。

OLEDの他に、NTSC画面、TFT画面にも表示出来ます。


NTSCビデオ出力画面での表示デモ

プログラムソース

5 CONSOLE 0
10 CLS
20 S="日本語表示にほんご"
30 L=LEN(S):X0=0:X=X0:Y=30:@(0)=8,10,12,14,16,20,24
35 FOR J=0 TO 6
40 FOR I=1 TO L
50 R=KFONT(MEM,ASC(S,I),@(J))
60 BITMAP X,Y,MEM,0,@(J)/R,@(J),1
70 X=X+@(J)/R+0
80 NEXT I
90 X=X0:Y=Y+@(J)+10
100 NEXT J
110 GOTO 110

プログラムの日本語入力は、NTSC、OLED、TFT画面では入力出来ないため、
シリアル接続したTeraTermにて行います。

01


TFT版ではカラー表示に対応しています。

Dscn8965

2018年10月30日 (火)

Arduino用SJIS漢字フォントライブラリ SDカード版を作成しました

以前作成した Arduino用のUTF-8版の漢字フォントライブラリ SDカード版をベースにして
シフトJIS版の漢字フォントライブラリ SDカード版を作成しました。

指定したシフトJISコードに対応する漢字フォントデータを取得するAPIを提供します。
漢字フォントは8、10、12、14、16、20、24ドットのサイズの利用が可能です。
フォントデータはSDカード上に配置して利用します。

公開ページ
・Arduino用SJIS漢字フォントライブラリ SDカード版
  https://github.com/Tamakichi/Arduino-SJISKanjiFont-Library-SD

ライブラリの利用にはSDカードが必要となります。

02_2

02

ライブラリに添付しているサンプルプログラム

// SJIS版フォントライブラリ利用サンプル
// 作成 2018/10/27  by Tamakichi
//

#include "SDSfonts.h"

// ビットパターン表示
// d: 8ビットパターンデータ
//
void bitdisp(uint8_t d) {
  for (uint8_t i=0; i<8;i++) {
    if (d & 0x80>>i) 
      Serial.print("#");
    else
      Serial.print(".");
  }
}

//
// フォントデータの表示
// buf(in) : フォント格納アドレス
//
void fontdisp2(uint8_t* buf) {
  uint8_t bn= SDSfonts.getRowLength();                // 1行当たりのバイト数取得
  Serial.print(SDSfonts.getWidth(),DEC);             // フォントの幅の取得
  Serial.print("x");      
  Serial.print(SDSfonts.getHeight(),DEC);            // フォントの高さの取得
  Serial.print(" ");      
  Serial.println((uint16_t)SDSfonts.getCode(), HEX); // 直前し処理したフォントのコード表示

  for (uint8_t i = 0; i < SDSfonts.getLength(); i += bn ) {
      for (uint8_t j = 0; j < bn; j++) {
        bitdisp(buf[i+j]);
      }
      Serial.println("");
  }
  Serial.println("");
} 

//
// 指定した文字列を指定したサイズで表示する
// pSJIS(in) SJIS文字列
// sz(in)    フォントサイズ(8,10,12,14,16,20,24)
//
void fontDump(char* pSJIS, uint8_t sz) {
  uint8_t buf[MAXFONTLEN]; // フォントデータ格納アドレス(最大24x24/8 = 72バイト)

  SDSfonts.open();                                   // フォントのオープン
  SDSfonts.setFontSize(sz);                          // フォントサイズの設定
  while ( pSJIS = SDSfonts.getFontData(buf, pSJIS) ) // フォントの取得
    fontdisp2(buf);                                 // フォントパターンの表示
  SDSfonts.close();                                  // フォントのクローズ
}

void setup() {
  Serial.begin(115200);                   // シリアル通信の初期化
  SDSfonts.init(10);                        // フォント管理の初期化
  Serial.println(F("sdfonts liblary"));
  char str[] = {0x7a,0x7b,0x7c,0x7d,0x7e,0xa2,0xb1,0xb2,0xb3,0};// z{|}~「アイウ
  fontDump(str,14);
  fontDump("\x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8",16);//あいうえお
  fontDump("\x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8",20);//あいうえお
  fontDump("\x8d\xe9\x8B\xCA\x81\x99\x82\xB3\x82\xA2\x82\xBD\x82\xDC", 24); // 埼玉☆さいたま
}

void loop() {
}

実行結果

01


このライブラリは豊四季Tiny BASIC for Arduino STM32に組み込むために作成しました。
TFT、NTSC、OLED画面に日本語文字列を表示したいと思っています。
BASICにてアドベンチャーゲーム的なものが作れないかなぁっと。

Arduino IDEでは、文字列にUTF-8を利用しているため、
このシフトJIS版でのフォントデータの扱いはちょっと面倒です。
通常は、UTF-8版を使った方が良いでしょう。

2018年9月26日 (水)

豊四季Tiny BASIC for Arduino STM32 での単音演奏

豊四季Tiny BASIC for Arduino STM32 のV0.86で追加した、
PLAYコマンドで「ハレ晴レユカイ」を演奏してみました。

Dscn8878

演奏の様子


MML文で使用ているデータは「主体性の無いページ」さん公開が公開しているものを利用しました。
・主体性の無いページ(http://astr.me.land.to/
    MML(http://astr.me.land.to/tool/mabi/)
     ハレ晴レユカイ!(http://astr.me.land.to/tool/mabi/mml/hareyukai.htm)


この曲はアニメ 「涼宮ハルヒの憂鬱」のエンディング曲です。
勝手に使わせて頂き申し訳ないので、宣伝を入れておきます。
(バナーをクリックすると、各サイトにジャンプします)

Banner_sp_haruhi

Fanclub

Banner_kyoani_haruhi

Banner_kyoani_haruhimov

MML文はマビノギMMLに対応しています(ただし同時に1音しか出せません)。
MML文中の頭に"?"を付けると音を出す都度MML文を表示するようにしました。

01


豊四季Tiny BASIC for Arduino STM32では、NTSC、OLED、TFT等色々とサポートしていますが、
今回は最小構成+圧電スピーカーのシリアルコンソール画面の構成を使っています。

Serialconsole

MML文の音の大きさ指定のV(ボリューム)命令は、PWMのパルス幅の大きさで簡易的に対応しました。
引数の0~15のうち、0~5くらいは強弱が聞いて分かるのですが、
6~15は違いが判りません。まあ、おまけ機能的なものということで勘弁して下さい。


ちなみに、V0.86では、シリアルコンソール画面上で全角文字(シフトJIS)に対応しました。

02

2018年9月18日 (火)

レーザーカッター初体験

先日、SNSにてお招き頂いたイベントに参加いたしました。
イベントの内容的には、「レーザーカッターで自作ポケコンのケースを作ろう」みたいな感じです。

お世話になった会場は、FabLab品川(ファブラボ品川)さんです。

Dscn8781

ファブラボ品川さんの公式サイト
https://fablab-shinagawa.org/

非会員、一見さんにもかかわらず、FabLab品川の濱中さんは
とても丁寧に解説・対応して頂きました。ありがとうございました。
イベントの製作よりも、現在のレーザーカッターや3Dプリンターの動向について色々と教えて
頂いたことの方が大きな収穫でした。

庶民に手が届く2、3万円の3Dプリンタの実用性には懐疑的だったのですが、
製作した実物(ボルトとナットがきっちと噛み合う)を見て、ホビーレベルでは
十分であることが分かりました。
しかも、ツールも進化していて、かなりお手軽にモデリング出来るこも教えて頂きました。

話を戻して、今回のイベントで作成したケースは
Maker fare Tokyo 2018にて「備中絡繰製造所」さんが展示されていた真ん中の作品です。

Dscn8552

製作の様子をお伝えしたかったのですが、
製作と会話に夢中になり過ぎて、写真と取り忘れてしまいまました^^;
カット後の下の写真しか撮れませんでした。

レーザーカッターで2mmのアクリル板を切断した直後の様子

(保護シートを貼ったままカットしています)

Dscn8784

当初、CAD等で図面を描くのかとおもいきや、illustratorでお絵かき、
プリンターと同じような印刷感覚でパソコンからカットの指示をレーザーカッターに出力します。
こんな、簡単にカット出来るとは思ってもいませんでした。

以前、秋葉原のDMM Makeを見学したことがあるのですが、
その時はレーザーカッター、3Dプリンタも見学したのですが、
「敷居が高すぎ」感が強く、敬遠してしまいました。
今回のイベント参加で、「「敷居の高さ」が解消しました。
3Dプリンター、やってみたくなり購入を検討中です。

自宅に帰った後の組み立て位置等の確認の様子

Dscn8785

これから、組み立てます。
大変、有意義な時間でした。


追記

仮組みしました。いい感じです。

Dscn8790

追記 2018/09/19

完成しました。

Dscn8808

裏はこんな感じです。

Dscn8811

中はこんな感じで、モジュール間をコネクタ形式で脱着出来るようにしています。

Dscn8802








2018年9月17日 (月)

豊四季Tiny BASIC for Arduino STM32 を更新しました

豊四季Tiny BASIC for Arduino STM32 をV0.86に更新しました。

注意:豊四季Tiny BASICのオリジナル版開発は私ではなく、鈴木氏です
オリジナル版 https://github.com/vintagechips/ttbasic_arduino
私は、オリジナル版からSTM32対応と機能拡張をしています。

V0.86の主な追加機能
・音楽演奏機能:PLAYコマンドの追加(MMLはマビノギMMLの文法をまねています)
・シリアルコンソール画面での全角文字対応(シフトJIS)
・TFT画面でのテキスト表示速度の改善(描画速度2倍、スクロール速度10倍)

V0.86からはプロジェクト管理サイトを
・Tamakichi/ttbasic_arduino_stm32
  https://github.com/Tamakichi/ttbasic_arduino_stm32

に変更しました。

01
マニュアル類は整備中です。AsciiDocを使ってリニューアル中です。
定数・コマンド関連のリファレンスマニュアル
https://tamakichi.github.io/ttbasic_arduino_stm32/manual.html

豊四季Tiny BASIC for Arduino STM32 コンパイル環境の構築
https://tamakichi.github.io/ttbasic_arduino_stm32/install.html


今回の修正ですが、
TFT(ILI9341)のフォント描画処理において、LI9341のウィンドウ機能とSTM32の
DMA転送の組合わせ技の効果が絶大で、いい感じに高速化出来ました。
DMA転送処理はオーバーヘッドが大きく、一回当たりのデータ送信量が少ないと、
効果で出ません。

通常、16ビットカラーで1文字(横6x縦8ドットx2バイト =  96バイト)を描画するにおいて、
1ライン目、2ライン目 ... 8ライン目とTFTへの転送アドレスは離散しており、
12バイト単位で8回発生します。オーバーヘッドの大きい、DMA転送において
これは効率が悪いです。

ところが、ウィンドウ機能を使って横6x縦8ドットの領域をウィンドウとして指定すると、
このウィンドウ内のドットは連続したシーケンシャルなデータ(連続したアドレス)とし
扱うことができます。

96バイトバイトを1回のDMA転送で行うことができます。
オーバヘッドが大きい処理が1回で済みます。
これは効果絶大でした。

また、TFT画面のスクロール処理や画面全体の再描画も
ウィンドウ機能を使うことで、DMA転送の一回当たりのデータ送信量を増やし、
DMA転送の回数を減らすことでオーバヘッドの大きい処理回数を減らすことで、
スクロール処理は10倍程度早くなりました。

このテクニックは、DMAを使わなくてもSPIのAPI呼び出し回数の削減にもなるので、
Arduino Unoでの高速化が期待できそうです。

2018年9月 9日 (日)

Arduino IDE + Arduino STM32のスケッチ書き込みで「 アクセスが拒否されました。」のエラー

中古のデスクトップパソコンを購入し、Arduino 関連の開発環境を構築、
Arduino STM32パッケージして、スケッチを書き込もうとすると

  「 アクセスが拒否されました。」
のエラーが発生してスケッチの書き込めないというトラブルが発生しました。

Ide

いつもやっているBlue PillボードへのUSB経由の書き込みなのですが、
うまくいきません。

環境設定で、書き込み時にの詳細を表示するようにして再度やってみると、

maple_upload.bat COM4 2 1EAF:0003 C:\Users\Owner\AppData\Local\Temp\arduino_build_639405/ttbasic.ino.bin

書き込みを行うツールの maple_upload.bat が怪しいようです。
バッチファイルの中を見ると、

   前略
java -jar maple_loader.jar %1 %2 %3 %4 %5 %6 %7 %8 %9
   後略

javaが必要のようです。
Arduino STM32パッケージは、Arduino IDEに含まれているJava環境を利用していないようで
す。

そういえば、この対処は以前もやった気がします。
インストーラやZIP解答のArduino IDEであれば、インストールしたフォルダ内の
Javaにパスを通すことで、対処できるのですが、
今回利用しているArduino IDEはWindowsアプリ版のため、
Arduinoのインストールフォルダが隠し属性かつセキュリティ設定で開けず、
添付のJavaを利用することができません。

とりあえず、今回はJavaを別途インストールすることで対処しました。
対処後、き込みがちゃんと出来るようになりました。

02

|





2018年8月20日 (月)

Arduino STM32のUSB HIDインタフェースの新しいブートローダー (2)

記事「Arduino STM32のUSB HIDインタフェースの新しいブートローダー」を書いた時点では
Arduino IDEのメニューにてHIDブートローダ経由書き込み指定が出来なかったのですが、
先日の更新後のArduino STM32パッケージをインストールして確認したところ、
メニューに組み込まれていました。

そこで、実際にHID経由でのスケッチ書き込みを試してみました。

09_2


試してみたボード
  ・Blue Pillボード(写真 左)
  ・Bkack Pillボード(写真 中)
  ・RobotDym Blue Pill互換ボード(写真 右)

  Dscn8723

まずはHID用のブートローダを書き込む必要があります。
HID用ブートローダは、本来は下記のサイトが公式サイトになるのですが、
rogerclarkmelbourne/STM32_HID_Bootloader
まだ、Blue Pill用のものしか置いていないようです。若干古い可能性があります。

当面は、オリジナル版開発者の下記のサイトから入手した方が良さそうです。
https://github.com/Serasidis/STM32_HID_Bootloader

ダウンロードして解凍します。
HIDブートローダは、
  STM32_HID_Bootloader\bootloader_F1\bootloader_only_binaries\の中のファイルを利用します。

  ・Blue Pillボード、RobotDym Blue Pill互換ボード
    hid_generic_pc13.bin を利用
  ・Bkack Pillボード
    hid_generic_pb12.bin を利用

ST-Linkを使ってHIDブートローダを書き込みます。

  Dscn8724

ツールは、ST-LINK Utilityを使いました。   

  14

  HIDブートローダのファイルをロードして書き込みます。
  15


  書き込み後、パソコンにUSB経由で接続します。 
  この時、ボードマイコン(ここではBlue Pill)のBOOT1を1に設定してから、
  パソコンに接続します。  LEDが激しく点滅します。
  (この手順が分からす、なかなか書込み出来ませんでた。試行錯誤のため、
    手順としては間違っている可能性があります。)


  Dscn8725

  つなげると、パソコン(Windows 10)でSTM32F HID Bootlooader が認識されました。
  10

デバイスを調べてみると、次のような感じで登録されています。

11

試しに、Lチカスケッチを書き込んでみます。

17

問題無く書き込めました。
マイコンボードのBOOT1を0側にして、リセットボタンを押します。
これで、書き込んだスケッチが実行されます。

再度スケッチを書き込むには、 マイコンボードのUSB接続を抜き、
BOOT1を1にして、パソコンに接続します。
なぜか、USBの接続を一旦抜いてからでないとダメでした。
このあたりは、ちょっと面倒です。
もしたら、手順として間違っている可能性があるため、もう少し試してみます。

HIDブートローダのメリットとしては、
ブートローダが8Kバイトから4Kバイトに小さくなり、利用出来るフラッシュメモリの領域が
4kバイト増えた点と、ドライバーのインストールが不要な点です。

手順(もし、今回のやり方が正しいとすれば)的には、HIDブートローダ経由は、
BOOTピンの設定変更とボートの抜き差しがちょっと面倒です。

USBはCDC(シリアル通信)としても使うので、
HIDブートローダを有効にするために、BOOT1の設定が必要みたいです。

現時点では、HIDブートローダの書込みはWindowsしか対応していないようです。

関連記事
Arduino STM32のUSB HIDインタフェースの新しいブートローダー

2018年8月19日 (日)

TV出力ライブラリ更新を豊四季Tiny BASIC for Arduino STM32に適用する

先日、修正したArduino STM32用のTV出力ライブラリ
豊四季Tiny BASIC for Arduino STM32に適用し、コマンドにてNTSC信号の
横位置と縦位置を補正出来るようにしました。

以前入手した3.5インチのTFT LCDモジュール(下記の製品)を使った場合、 
  Podofo 3.5" TFT LCD Display RGB LCD Display Module Kit
  01

デフォルトでは、表示画像の上部が欠けてしまい、どうすることも出来ませんでした。

Dscn8698

Dscn8701

修正ライブラリを組み込み、コマンドにて補正出来るようにしました。
  コマンド
    CONFIG 0,垂直同期補正,横位置補正, 縦位置補正


補正後の画面

Dscn8705

補正した値は、SAVECONFIG コマンドにて内部フラッシュメモリに保存することで
再起動しても状態を保ちます。

補正の様子

ついでに、以前試したブラウン管テレビでの補正も試してみました。

補正前は、左側が欠けてしまっていました。

Dscn8709

補正して、ちょうどよいポジションで表示出来るようになりました。

Dscn8716

ブラウン管テレビでの表示は、次のような感じです。
試したのは、パナソニック 2001年製造の14インチのテレビです。


文字等の表示は、綺麗とは言えませんが、実用的レベルです。
思っていたよりも、まともに表示出来ています。
久しぶりにブラウン管テレビで映像を見ましたが、これはこれで良いですね。

この更新分は、もう少しテストを行ってから公開したいと思います。

2018年8月17日 (金)

温湿度センサモジュールAM2320を使ってみる

以前、秋月電子で購入した温湿度センサモジュールAM2320、
改めて仕様等を理解した上で利用してみました。

温湿度センサ モジュール AM2320
02

実際の製品はこんな感じです。

01

端子は左から(VCC、SDA、GND、SCL)となります。

3.1V~5.5Vに対応、I2C またはシングルバス(1-wireライク)に対応
I2C対応のため、以前使ったDHT11よりも使いやすいです。

今回はI2Cインタフェースで使ってみました。

仕様関連

・測定できる情報
    湿度  符号付16ビット  単位 摂氏(℃ )
    温度  符号付16ビット  相対湿度 単位 %

    モジュールから取得する生データは、実際の値に10をかけた値です。
    ですので、小数第一位の単位まで測定できます。

・コマンド
  Photo

・レジスタ
  Photo_2

使い方
   湿度・温度を読み取るだけであれば、
   ファンクションコード0x03(レジスタからの読み込み)の利用だけとなりますが、
   読み取る前にウェイク・アップさせる必要があります。

   手順
    1) スレーブアドレスを送って、モジュールをウェイク・アップさせます
       800μsec 以上待ちが必要、3msec以内に次の要求を送信ですが、
       Arduinoの実行側ででは、待ちは不要でも動作しました。

      補足
         スレーブアドレスを送信した場合、一般的なプロトコルとしては
         スレーブアドレスに該当するスレーブデバイスはACKを返します。
         ところが、このデバイスはスリープ状態のためか、ACKを返せないため
         I2Cバス的には、”該当するデバイス無し”となり、NAKが帰ってきます。

         ウェイク・アップでは、NAKが帰ってきた場合に、デバイス不在として判断せず、
         それ以降のデータ送信のNAKで
”該当するデバイス無し”を判断する必要があります。

    2) ファンクションコード0x03(レジスタからの読み取り)コマンドとその引数を送信する
       次の3バイトを送信します
          0x03(レジスタからの読み取り)
          読み取り開始レジスタ番号(1バイト)
          読み込みデータ数(1バイト)

    3)モジュールからのデータを読み取ります
       読み取りデータは、次の表のように
       指定したデータの他に先頭に2バイト、末尾に2バイトのデータが付加されます。
       4バイト余分にデータを取得する必要があります。
      
       Photo_3

実際にArduino Unoでサンプルスケッチを作成して、動作確認してみました。

  Dscn8695

  結線
   センサー端子    Arduino Uno
    1: VCC               5V
    2: SDA               A4(SDA)
    3: GND               GND
    4: SCL               A5(SCL)

    I2C接続ではプルアップ抵抗が必要ですが、Wireライブラリではマイコン内部にて
    プルアップが行われるためこの構成では不要となります。

1秒間隔でデータを読み取って表示します。
センサーモジュールのウェイク・アップさせるのがミソです。

スケッチ

//
// 湿温度センサー AM2320 I2C接続サンプル
//

#include <Wire.h>
#define DEV_ADR 0x5c  // AM2320スレーブアドレス

uint8_t data[8];

void setup() {
  Wire.begin();            
  Serial.begin(115200);
}

void loop() {
  // AM2320センサーのウェイクアップ
  Wire.beginTransmission(DEV_ADR);
  Wire.endTransmission();

  // 湿度・温度データ取得要求
  Wire.beginTransmission(DEV_ADR);
  Wire.write(0x03);         // レジスタ読み取りコマンド
  Wire.write(0x00);         // 読み取り開始レジスタ番号
  Wire.write(0x04);         // 読み取りデータ数    
  Wire.endTransmission();

  // データの取得
  Wire.requestFrom(DEV_ADR,8); 
  if (Wire.available() >= 8) {
    for (uint8_t i=0; i<8; i++) {
      data[i] = Wire.read();
    }
    
    float rh = ((float)(data[2]*256+data[3]))/10; // 湿度
    float tp = ((float)(data[4]*256+data[5]))/10; // 温度
    
    // 湿度・温度の表示
    Serial.print("T=");
    Serial.print(tp);
    Serial.print("c");
    Serial.print(" H=");
    Serial.print(rh);
    Serial.println("%");
  }
  delay(1000);
}

実行結果

   03

部屋にある室温計と比較すると、まあまあの精度の値が読めています。

折角なので、豊四季タイニーBASIC for Arduino機能拡張版(+ VFD MW25616L対応)
でも試してみました。
使うハードウェア写真の構成のまま、スケッチを書き換えて利用しました。

BASICのプログラム

10 'AM2320
20 CLS
30 A=$5C
40 B=MEM
50 POKE B,$03,$00,$04
60 W=I2CW(A,B,0,B,0)
70 R=I2CR(A,B,3,B+3,8)
80 IF R ?"ERROR":GOTO 60
90 H=PEEK(B+5)*256+PEEK(B+6)
100 T=PEEK(B+7)*256+PEEK(B+8)
110 ?"湿度 ";DMP$(H,1);"% ";
120 ?"温度 ";DMP$(T,1);"℃"
130 WAIT 1000
140 GOTO 60

実際のプログラム

04

実行結果

05

BASICでも問題なく動作しました。
I2Cを使う際の事前にPOKEコマンドでメモリーに値をセットするのが
若干使い勝手が悪いです。
I2CW、I2CRコマンドの引数に直接送信するデータを記述する形式の方が
使いやすかもしれません。ちょっと検討してみます。

より以前の記事一覧