記事

Raspberry PiにI2CインターフェースのLCDモジュールを接続する(3)モニタのデザイン2

Timerを使う

 今回は、0.5秒間隔にセンサからの温度を読み取ったり、読み取った温度をLCDモジュールに表示するためのきっかけを作るためのタイマの処理を追加します。このプログラムは、500msごとにLEDを点滅しているサンプル・プログラムBlinkyをもとに作成しました。
 最初に、プログラムで利用するDispatcherTimer型のディスパッチ・タイマをtimerの名で定義します。

タイマを作り利用できるようにする

  private DispatcherTimer timer;


 次の処理でこのtimerのインスタンスを作り、timerを利用できるようにします。

     timer = new DispatcherTimer();


 この2行の命令は、次に示すように1行に記述することもできます。

     DispatcherTimer timer = new DispatcherTimer();

 ここで使用しているDispatcherTimerは「DispatcherTimer」と入力し、インターネットで検索すると、MicrosoftのDeveloper NetworkのページにDispatcherTimerクラスの項目で詳しい説明があります。

タイマの間隔を設定する
 タイマの間隔は1ms単位で設定できます。その設定を次のように行います。タイマのプロパティIntervalに次のようにして500msの値を設定します。
 Visual Studioを利用すると、次に示すようなIntelliSense(インテリセンス)と呼ばれる入力支援システムが用意されています。
 DispatcherTimerクラスから作成したtimerを入力し次にピリオドを入力すると、次に続いて記述するプロパティ、メソッド、イベントの主な候補が表示されます。マウスや矢印キーで該当する候補を選択し、TABキーで入力することができます。入力する予定の項目が選択されている場合は、TABキーを押して候補を入力します。

        

 次に、=Tと入力するとTimeSpanが候補としてあげられるので、TimSpanを選択して次に進みます。ピリオドを入力すると、次に示すようにFromMillsecondsが候補の中で選択されています。そのまま選択するのでTABキーで候補を入力します。

 次に説明に従い、括弧の中にタイマの間隔の設定値500(500ms)を入力します。

 以上でtimer.Intervalの設定を終えます。

タイマによって呼び出されるプログラムの設定
 タイマが設定された時間を経過するとイベントを発生します。このイベントが発生したときに呼び出せるプログラムをイベントTickの設定で行います。timer.Tickを入力しこのタイマのイベントよって呼び出されるプログラムを設定するために、

       +=


を入力します。この+=の演算子はイベントの処理に利用されたときはインクリメントではなく、イベントによって呼び出されるメソッド(プログラム)が設定されます。
 この場合、次に示すように呼び出すメソッド名もTimer_Tick名で設定されています。

 TABキーを押して、指定されたTimer_Tick; を入力すると、次に示すように呼び出されるメソッド(プログラム)Timer_Tickの骨格も用意されます。
プログラムの中に書き込まれた「throw new NotImplementedException();」の代わりに、タイマによって呼び出されたときに処理される内容を記述します。

 ここでは、Timer_Tickにはイベントごとに整数のカウンタcntをカウントアップします。

    cnt = cnt + 1;


 カウンタcntの値をToStringメソッドで文字列に変換し、textBlockに表示するためにtextBlock.Textへ代入します。

textBlock.Text = cnt.ToString();

タイマのスタート
 以上でタイマの設定、イベントの処理のプログラムが完了しました。後はタイマを開始すればよいだけです。
 タイマの開始はStartメソッドで行います。
 ここでは、MainPage()の最後に、

    timer.Start();


と記述して完成です。次にMainPage.xml.csの様子を示します。


 デバッグを開始すると、Raspberry Piのモニタの表示は次のようになります。


 MainPage()の先頭から順番に命令を実行していきます。MainPage()の処理を終え設定されたウィンドウが表示されると、次のような初期ウィンドウがモニタに表示されます。

 まだ、タイマのイベント処理が行われていないので、testBlockの表示はinitialmsgになっています。
 ステップ動作を続けると、タイマのイベントの処理も行われ、initialmsgの表示がカウンタcntの値になります。

 Timer_Tick()関数の入り口に設定しておいたブレークポイントを外すと、カウンタは0.5秒間隔でカウントアップされ値を大きくしています。

 タイマを利用して定期的に処理を行うことができるようになりました。メッセージも表示できるようになりました。
 次回から、I2Cのデバイスの処理について確認していきます。

プログラムの情報の入手先
 C#、Windows10 を利用したプログラムの記述のための資料はMicrosoft Developer Networkに用意されています。+=はインクリメントが一般的ですが、C#の +=演算子の説明のページの後半で、次のようなイベントの指定についての記述がありました。 


     https://msdn.microsoft.com/ja-jp/library/sa7629ew.aspx


 「加算代入演算子 += を使用して、イベントに対する応答として呼び出されるメソッドを指定できます。これらのメソッドをイベント ハンドラーと呼びます。 このような += 演算子の使用は、イベントのサブスクライブと呼ばれます。 詳細については、「方法 : イベント サブスクリプションとサブスクリプションの解除 (C# プログラミング ガイド)」を参照してください。 および デリゲート (C# プログラミング ガイド) を参照してください。」

 次回は、このDeveloper NetworkでI2cDevice classの内容を確認しながらプログラムを追加していきます。

(2016/9/19 V1.0)

<神崎康宏>

連載メニュー Raspberry PiにI2CインターフェースのLCDモジュールを接続する

(1) Raspberry Pi 3 model Bで新規のプロジェクトを作成しスタート画面を表示する

(2) モニタにメッセージを表示する

(3) モニタのデザインにタイマを追加

(4) I2cDeviceクラスと非同期処理

(5) I2cDeviceの作成

(6) バス・リピータを使用

(7) 温度の表示

(8) プログラムの配置

(9) バックグラウンド動作