7segduinoを使ってみる
Make Tokyo Meeting 07にて、スイッチサイエンスさんのブースで7segduinoを購入しました。
これはなかなか簡単で便利。いいですね。
ライブラリーに注意
組み立てはとても簡単でした。
早速なにか表示するものを作りたくなりますが、まずは温度・湿度計の製作を。
温度センサーは昔からいろいろありますが、湿度センサーは簡単に使える安価なものは最近になって入手しやすくなってきたような雰囲気。とりあえず温度・湿度が計測できるDHT22を使ってみました。計測データはデジタルでシリアル接続。これを読むためのプログラムを自作する必要がありますが難しくはありませんし、いろいろ作られているようです。このセンサーは読み取ったデータがそのまま温度(単位℃)、湿度(単位%)のデータになっていて、いろいろ計算する必要が無いので便利です。
早速作ってみましたが…1セグメントだけ点灯しない。壊れたか…
確認したところ、7segduino用のライブラリー(というか厳密にはサンプル)の違いによるものでした。
どうやら7segduinoにはいくつかのバージョンがあるらしく、7セグメントディスプレイとATMegaとを接続するピン配置が異なっているようです。このため接続されているピンに合わせてプログラムを書かないと正しく表示されません。
検索すると7segduinoのWebページは以下があります。
http://web.me.com/kuwatay/morecat_lab./7segduino.html
http://morecatlab.akiba.coocan.jp/lab/index.php/aruino/7segduino/
スイッチサイエンスで発売されているものは後者のものなので、サンプル等は後者のサイトから入手すれば間違いないでしょう。
※追記:http://web.mac.comは過去にAppleが提供していたWebページ公開サービスのアドレスですが、現在はサービスが終了しています。
輝度調整機能を
ということで簡単に温度・湿度計ができました。
が、これでは7segduinoのWebページに載っているものと同じものを作っているだけです。
ということで、温度・湿度を表示するときにフェードイン/フェードアウトするようにしました。
このためにはライブラリに機能を追加します。
まずはヘッダ内のクラス定義に、LEDを点灯させるまでの待ち時間を保持する変数(_ledOnDelay)と、輝度をセットする関数(setBrightness)を追加しておきます。
class Sseg { (中略) uint16_t _ledOnDelay; void setBrightness(int n); };
次にcppファイル。
まずコンストラクタ関数に、_ledOnDelayの初期化を追加しておきます。
そして実際の表示をする関数(update)に、LEDを点灯させる際に_ledOnDelayだけ待ってから点灯させるよう変更します。
そして、輝度を設定するsetBrightness関数を追加します。輝度は0〜100の間で指定します(100が最も明るい)。
// 4 digit Sseg::Sseg(uint8_t a,uint8_t b,uint8_t c,uint8_t d, uint8_t e,uint8_t f,uint8_t g,uint8_t dp, uint8_t d1,uint8_t d2,uint8_t d3,uint8_t d4) { (中略) _ledOnDelay = 0; } (他の桁も同様に初期化を追加) … bool Sseg::update(void) { unsigned long t = micros(); static bool ledOn; bool sync = false; if((t - _lastUpdateTime) > _updateInterval){ _lastUpdateTime = t; turnOff(); updateSeg(); ledOn = false; sync = (_dig == (_numOfDigs-1)); } if(!ledOn && ((t - _lastUpdateTime) >= _ledOnDelay)){ turnOn(); ledOn = true; } return sync; } void Sseg::setBrightness(int n) { if(n <= 0) { _ledOnDelay = _updateInterval; } else if (n >= 100) { _ledOnDelay = 0; } else { _ledOnDelay = (unsigned long)_updateInterval - ((unsigned long)_updateInterval * (unsigned long)n) / 100; } }
実際に動作している動画です。
ちょっと速くてわかりにくいかもしれませんが、表示がフェードイン/フェードアウトしています。
ちなみに、さらにAquesTalk Picoを接続し、温度・湿度をしゃべるようにしています。