さのかずやブログ

北海道遠軽町からやって参りました、さのかずやと申します

Arduinoでアノードコモンの7セグメントLEDを2つ光らせる





久しぶりのFab

リハビリに、Fabとはいえないレベルの電子工作から



温湿度計をつくりたい

学校(IAMAS)の生活環境の湿度が低すぎるので、まず温湿度計をつくって、湿度を観察しようと思いました。
IoTの時代、もっと簡単に測る手法はクソほどありますが、せっかくなので自分で作ろうかと。



7セグメントLEDとは

7つセグメントしてるLED。

f:id:sanokazuya0306:20151229221347j:plain:w350
これ。秋月電子で1コ40円で買える。やっす!

akizukidenshi.com



ちなみにセグメントしてないLEDはマトリクスLEDという。もう1年以上前にそれをいじった。

sanokazuya0306.hatenablog.com



接続

deviceplus.jp
ここを大いに参考にさせていただいた。


f:id:sanokazuya0306:20151229223848p:plain:w350
(※引用:http://deviceplus.jp/hobby/entry008/

接続はぜんぶこの2コつなぐ画像のまま。


ただこれはカソードコモンの7セグメントLEDを使っている。秋月で買ったものはアノードコモン。ひらたく言うと逆向きに電器を流さなきゃいけない。のでソースコードをちょっといじる。



ソースコードの変更

変更点は

  • LEDレイアウト定義の0,1を逆に(各セグメントのオン/オフ指定を逆にする)
  • 11ピン、13ピンのHIGH、LOWを逆に(桁配置を逆にする)

の2つ。

//
// 2桁の7セグメントLEDを光らせるプログラム
//
int _cnt = 0; //
int _number = 0; //
boolean _flg = false;

void setup(){
  Serial.begin(9600);

  //2~8番ピン デジタル出力へセット
  for (int i=2; i<=8; i++){
    pinMode(i,OUTPUT);
  }
  pinMode(13,OUTPUT);
  pinMode(11,OUTPUT);
}

//LEDレイアウトを定義
boolean Num_Array[10][7]={
  {0,0,0,0,0,0,1}, //0
  {1,0,0,1,1,1,1}, //1
  {0,0,1,0,0,1,0}, //2
  {0,0,0,0,1,1,0}, //3
  {1,0,0,1,1,0,0}, //4
  {0,1,0,0,1,0,0}, //5
  {0,1,0,0,0,0,0}, //6
  {0,0,0,1,1,0,1}, //7
  {0,0,0,0,0,0,0}, //8
  {0,0,0,0,1,0,0} //9
};

//LED表示関数を定義
void NumPrint(int Number){
  for (int w=0; w<=7; w++){
    digitalWrite(w+2,-Num_Array[Number][w]);
  }
}

//2桁をそれぞれの桁で分解する関数
int NumParse(int Number,int s){
  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,HIGH);
    digitalWrite(13,LOW);
    _flg = false;
    NumPrint(NumParse(_number,1)); //1桁目の表示
  }
  else{
    digitalWrite(11,LOW);
    digitalWrite(13,HIGH);
    _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);
}


これで光るはず。



ESP8266を使った後は

ちなみにぼくは

warning: espcomm_sync failed
error: espcomm_open failed

というエラーが出てしまったのだが、これは単にマイコンボード設定がESP8266用になっていただけだった。Arduino Uno用に直したらすぐ通った。初心者ミス。





Qiitaとはてなブログ

どうでもいいけど、Qiitaはなぜかあまり好きになれない。
iframe使えないからとかじゃないけど…心理的にパーソナルスペースかパブリックスペースかの違いだろうか。
どっちも便利なとこ不便なとこいっぱいあるけど、ぼくが書くようなすげー初心者向けの記事ははてなブログの方が適している気がする。

今回のはてなブログソースコード表示はこちらを参考にさせて頂きました。

yu-ya4.hatenablog.com



次回は

温度・湿度を同時に測るアイツを使うぞー



今日の一曲

80kidz / Gone (feat. KenKen)

視聴だといきなりサビから入っちゃうけど、イントロでKenKenのベース聴きまくっていきなりキレッキレなシンセが入ってくるのマジ痺れる



関連記事