ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

arduinoコミュのI2CLiquidCrystalライブラリをクラス内で使う方法

  • mixiチェック
  • このエントリーをはてなブックマークに追加
こちらの http://n.mtng.org/ele/arduino/i2c.html を使わせてもらい、I2C液晶に表示する
サンプルHelloWorld.inoのLCD取扱い部をクラス側にもってきて使いたくて以下のようにしま
したが動きません。
ライブラリと型を混同しているような気もしていますが、これに近い書き方はできるもの
なのでしょうか、ご存知の方がいらしたら教えていただければありがたいです。

HelloWorld.ino

#include <I2CLiquidCrystal.h>
#include <Wire.h>
#include "DISP.h"
DISP d;
void setup() {
d.init();
}
void loop() {
d.display(millis()/1000);
}


DISP.h

#ifndef DISP_H_
#define DISP_H_
#include "arduino.h"
#include <I2CLiquidCrystal.h>
class DISP
{
public:
DISP(void);
void init(void);
void display(int);
private:
I2CLiquidCrystal lcd;
};

#endif


DISP.cpp

#include "Arduino.h"
#include "DISP.h"
#include <Wire.h>
#include <I2CLiquidCrystal.h>

DISP::DISP() {
I2CLiquidCrystal lcd(0x3c, (uint8_t)127);
}

void DISP::init() {
lcd.begin(16, 2);
lcd.print("hello, world!");
}

void DISP::display(int var) {
lcd.setCursor(0, 1);
lcd.print(var);
}

コメント(4)

まずどう動かないのか(コンパイルではねられるのか、コンパイルは通るんだけど期待通り動作しないのか)書いてくれるとわかりやすいかも。
コンストラクタの中でlcdを宣言しちゃってますがそうしたらそのlcdはメンバじゃなくてローカル変数になっちゃいますよね。
shigさんが書かれているとおり、初期化の間違いです。
DISPクラスのコンストラクタの中でローカルのlcdというインスタンスを作って初期化するだけになってます(たぶんコンパイラで最適化されるので実際には何もしない)。
クラスのメンバ変数の初期化には初期化リストを使います。

DISP::DISP() :lcd(0x3c, (uint8_t)127) {
}

これで動きます(確認済み)。
shigさま、jtakaoさま:

ご回答くださりありがとうございます。

ご指摘の通り、

> DISP::DISP() :lcd(0x3c, (uint8_t)127) {
> }

による方法で解決しました。

最初に提示したプログラムでは、コンパイルが通ることを優先して、コンストラ
クタで

> I2CLiquidCrystal lcd(0x3c, (uint8_t)127);

と書いてしまい、クラス内のメンバ変数には入らない状態になっていました。
もしご指摘がなかったら、クラスのポインタを使えばいいのかなと思ってコン
ストラクタ内でlcd = new lcd(0x3c, (uint8_t)127) ; などと見当違いの方向に進
みまだ悩んでいたと思います。

今回質問したのは、
https://github.com/CLCL/unixtime_7segclock
で作っております7セグ時計の7セグ部品の代替に使いたいと思い、クラスで
差し替えられるようにプログラム変更をしていた過程で問題に突き当たったの
でした。

これでプログラムの改良が進みます。ありがとうございました!
>>[3]
ちなみにポインタを使う方法も間違いというわけではありません。例えばDISP.h内で、

private:
I2CLiquidCrystal *lcd;

と、変数をポインタにしておいて、コンストラクタで

DISP::DISP() {
lcd = new I2CLiquidCrystal(0x3c,(uint8_t)127);
}

としても動きます。
(もちろんメソッド呼び出しは、例えば lcd->begin(16, 2); のように書き直す必要はありますが)

ただスケッチのサイズが若干大きくなってしまうので、あまり意味は無いと思いますが…

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

arduino 更新情報

arduinoのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。