前回、温度センサから室温を読み込んでシリアルモニターに表示するスケッチを作成、実行しました。 今回は読み込んだデータを7セグメントLEDに表示する方法を学習、実行します。まずは7セグメントLEDに数字を表示するスケッチの学習です |
回路図作成ソフト「BSCH3V」で作図。
図面右部分のパーツ「2桁7セグLED」はBSCH3V」用の部品作成ソフト「LCo」を使って自分で作成しました。
「Arduino」と「2桁7セグLED」の接続ピンの番号が順番通りにはなっていませんのでご注意です。
使用した「2桁7セグLED」
画像の部品はアノードコモンですが、使用したのはカソードコモンの部品で、外観は全く同じです。
回路図通りに「Arduino」と「2桁7セグLED」を結線しましたが、まるでスパゲティ状態ですね。
Arduino IDE のスケッチで、こちらの記事がお手本です // // 2桁の7セグメントLEDでカウントアップするスケッチ // int _cnt = 0; // int _number = 0; // boolean _flg = false; void setup(){ Serial.begin(9600); for (int i=2; i<=8; i++){ //2~8番ピン デジタル出力へセット pinMode(i,OUTPUT); } pinMode(13,OUTPUT); // カソードコモンピン pinMode(11,OUTPUT); // カソードコモンピン } boolean Num_Array[10][7]={ //LEDレイアウトを定義 {1,1,1,1,0,1,1}, //0 {0,0,1,1,0,0,0}, //1 {1,1,0,1,1,0,1}, //2 {0,1,1,1,1,0,1}, //3 {0,0,1,1,1,1,0}, //4 {0,1,1,0,1,1,1}, //5 {1,1,1,0,1,1,1}, //6 {0,0,1,1,0,1,1}, //7 {1,1,1,1,1,1,1}, //8 {0,1,1,1,1,1,1} //9 }; void NumPrint(int Number){ //LED表示関数を定義 for (int w=0; w<=7; w++){ digitalWrite(w+2,-Num_Array[Number][w]); } } int NumParse(int Number,int s){ //2桁をそれぞれの桁で分解する関数 if(s == 1){ return Number % 10; //10で割ったあまり = 一桁目の値 } else if(s == 2){ return Number / 10; //10で割った値を整数にする = 二桁目の値 } return 0; } void loop(){ if(_number >= 100){ _number = 0; } //flg変数をtrue / falseを切り替えることで11番13番ピンの出力を交互に切り替える if(_flg){ digitalWrite(11,LOW); digitalWrite(13,HIGH); _flg = false; NumPrint(NumParse(_number,1)); //1桁目の表示 } else{ digitalWrite(11,HIGH); digitalWrite(13,LOW); _flg = true; NumPrint(NumParse(_number,2)); //2桁目の表示 } //100まで行ったら表示する数値(_number)を1つ足す(実質delayの10×100で1秒に1カウント) if(_cnt >= 100){ _number++; _cnt = 0; Serial.print("NUMBER:"); Serial.println(_number); } _cnt++; delay(10); } |
桁を分ける関数を参考にさせて頂き、たいへん勉強になりました。
そのまま関数を使っても、3桁目が動くと2桁目がおかしくなりました。
非常に面白い動きになりましたが、実用にはちょっと改良しなければならず、悩んだ末に、
else if ( s == 2 ){
return ( number / 10 ) % 10;
として、問題解決しました。
という、報告です。
ありがとうございました。