初歩の電子工作とデジカメの日記

電子工作備忘録とデジカメで撮影した写真のブログです。

Arduino備忘録 13 (2桁7セグLEDでカウントアップ)

2016-08-04 10:30:16 | Arduino Uno
前回、温度センサから室温を読み込んでシリアルモニターに表示するスケッチを作成、実行しました。
今回は読み込んだデータを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);
}


2桁7セグLEDでカウントアップ

最新の画像もっと見る

1 コメント

コメント日が  古い順  |   新しい順
桁分けの関数 (わはかた)
2020-02-08 16:54:35
Arduinoで3桁の7SegLEDを74HC595シフトレジスタを1個使って動かしてみました。
桁を分ける関数を参考にさせて頂き、たいへん勉強になりました。
そのまま関数を使っても、3桁目が動くと2桁目がおかしくなりました。
非常に面白い動きになりましたが、実用にはちょっと改良しなければならず、悩んだ末に、
else if ( s == 2 ){
return ( number / 10 ) % 10;
として、問題解決しました。
という、報告です。
ありがとうございました。
返信する

コメントを投稿