Arduino入門で2進数LED付き温度計を作ってみた


# はじめに

手軽な電子工作アイテムとして、ArduinoとRaspberry Piが有名です。
両方購入してはみたのですが、何を作るかというアイデアが電子工作としては重要だと思いました。

入門からハードル上げすぎてもしょうがないので、手軽に温度計を作ろうと思いましたが、普通に温度を見れるようにするだけだと面白くないので、ちょっと捻って２進数をLEDを使って表してみたら人間に優しいヒューマンリーダブルかなと思いました（笑）
（もちろん冗談ですが、筆者がLinuxサーバのデバイスドライバを開発しててビット演算ばかりやっていたという経歴があったとしても１０進数の方がいいです（笑））

というわけで、温度センサー使ってLEDを沢山光らせるくらいなら、Arduinoで十分なので、安価なArduino UNOを使って作ってみました。

# 必要なもの

Arduino UNO
ブレッドボード
LED８個
抵抗125オーム位の８個
温度センサー
リード線１２本
USBケーブル

# 電子工作部分

## 全体像

リード線を使って、UNOとブレッドボードを接続します。
ブレッドボードには、温度センサーとLEDを刺します。
温度センサーはパット見がトランジスタみたいな奴です（笑）

![全体像.jpg](https://qiita-image-store.s3.amazonaws.com/0/82184/6cce19d6-507d-472d-5162-31601f1e67ac.jpeg)

リード線とLEDの間に抵抗を入れていますが、これが無いとLEDがすぐに焼き切れるそうです、怖いので試していませんが（笑）

今回のLEDは定格20mAなので、2.5V÷0.02＝125で抵抗は125Ωくらいがちょうど良さそうです。2.5VというのはArduinoの出力電圧５Vから、LEDの順電圧VFの2.5Vを引いた数値です。

実際に刺さってる抵抗は色々なモノを使用していますが、抵抗を強くすると暗くなって抵抗を弱くすると明るくなることを試したくて、色々刺さってます。

## Arduino本体

左上の四角いシルバー部分にはUSBが刺さっています。
上のデジタルポートには、LEDへの配線を接続。
下のアナログポートには、温度センサーへの配線を接続

![ArduinoUNOアップ.jpg](https://qiita-image-store.s3.amazonaws.com/0/82184/fdf02f5f-893c-794b-c301-4e05dda047bf.jpeg)

## ブレッドボード側

![LEDアップ.jpg](https://qiita-image-store.s3.amazonaws.com/0/82184/d12f5373-8c2c-cd40-9c65-ded1d4d4aedf.jpeg)

LEDの＋側には抵抗が挟まってます。
右端のトランジスタみたいなのが、温度センサーです。
LEDのマイナス側は全部つながっているので、一本になって本体に戻っていきます。

# プログラム部分

無限ループで温度センサーの値を取得して、2進数に変換したあとに8個のLEDの点灯を制御しています。
プログラムを書いたらコンパイルして本体に書き込むのですが、IDEのボタンをポチポチ押すだけでいいので超簡単ですね。

```
#define	LM35_IN 0
#define	BITS_DIGIT 8

#define	LED_BIT8 2
#define LED_BIT7 3
#define LED_BIT6 4
#define LED_BIT5 5
#define LED_BIT4 6
#define LED_BIT3 7
#define LED_BIT2 8
#define LED_BIT1 9

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

/* 10進数-->2進数変換関数 */
void ChangeFunc(
unsigned long int DecimalNumber, /* 10進数[in] */
char* BinaryString) /* 2進数文字列化[out] */
{
  int i,k;

  for(i = 0, k = BITS_DIGIT - 1; k >= 0; i++, k--)
  {
    if((DecimalNumber >> i) & 1)BinaryString[k] = '1';
    else BinaryString[k] = '0';
  }
  BinaryString[i] = '\0';
}

void loop()
{
  int i;
  int  temp_in; /* 温度の生データ */
  float temp; /* 摂氏に変換後の温度 */
  char BinaryString[BITS_DIGIT + 1]; /* 2進数文字列化 */
  
  /* 温度読み取り */
  temp_in = analogRead(LM35_IN);
  
  /* 読み取りデータ演算 */
  temp = (float)(temp_in) * (float)(0.0048) * (float)100;
  temp = floor(temp);
   /* 10進数-->2進数変換関数コール */ 
  ChangeFunc(
  temp, /* 10進数[in] */
  BinaryString); /* 2進数文字列化[out] */
  
  /* シリアルポートに文字列を出力 */
  Serial.print(temp, DEC);
  Serial.print("\n");
  Serial.print(BinaryString);
  Serial.print("\n");
  
  /* LED点灯処理 */
  for(i = 0; i < BITS_DIGIT; i++)
  {
    if(BinaryString[i] == '0')
    {
      digitalWrite(i+2, LOW);
    }else{
      digitalWrite(i+2, HIGH);
    }
  }
  delay(1000);
}
```

# デバック機能

温度センサーから取得した値と、2進数に変換した値は、1秒おきにシリアルポートに出力もしているので、シリアルモニターで確認できます。

## Arduinoの繋がっているシリアルポートを選択

![シリアルポート選択.png](https://qiita-image-store.s3.amazonaws.com/0/82184/80ecc5f5-e87c-d88d-e2b7-611f3b48a7b9.png)

## シリアルモニタを起動

![シリアルモニタ起動.png](https://qiita-image-store.s3.amazonaws.com/0/82184/e8ad6b7b-953f-150f-da67-14fc23617649.png)

## シリアルモニタの表示

こんな感じでセンサーから貰った十進数と2進数変換後の文字列を確認できます。

![コンソール０１.png](https://qiita-image-store.s3.amazonaws.com/0/82184/5a78dab3-35b2-c903-781a-ad2441b92178.png)

センサーを指で摘んでみると、こんな感じで温度がどんどん上がっていくのがリアルタイムで確認できます。

![コンソール０２.png](https://qiita-image-store.s3.amazonaws.com/0/82184/84a53c68-9a8c-df4b-4bcf-e814f59f08cc.png)

30度だとかなりの低体温ですが、指の先なのでしょうがないですね（笑）

# 最後に

今回入門的な電子工作をやってみましたが、USBを刺している間はずっと動いているので、LEDが温度に合わせてピコピコ光ったり消えたりして面白いです。

昔は電子工作といえば、ハンダ付けが付き物で、筆者も半田付けは好きなのでよくやっていました。
元々町の小さな電器屋さんであらゆる家電の修理や工事などの仕事をしていたのですが、ハンダ付けはそれなりに苦労するので、ブレッドボードに刺すだけでいいのは楽ちんでいいですね。

次の電子工作のアイデアが思いついたら、また何か作ってみたいと思います。