8pinoで赤外線距離センサーの値をLCDに表示


[前回](http://qiita.com/snumano/items/b8c83a30ab6aa83e3ae4)につづいて、センサーの値をI2Cで出力します。

# 必要なもの
* [8pino](http://8pino.cc/)
* [LCD](https://www.switch-science.com/catalog/1405/)
* ブレッドボード
* ジャンパー線
* [赤外線距離センサー](http://akizukidenshi.com/catalog/g/gI-02551/)
* [ピンヘッダ](http://akizukidenshi.com/catalog/g/gC-00167/)

# 環境
* [arduino IDE 1.6.3 with Adafruit Boards](https://learn.adafruit.com/adafruit-arduino-ide-setup/arduino-1-dot-6-x-ide)
* ライブラリ
	* [TinyWireM](https://github.com/adafruit/TinyWireM) I2C通信用ライブラリ


# 事前準備
1. [こちら](https://learn.adafruit.com/adafruit-arduino-ide-setup/arduino-1-dot-6-x-ide)を参考に、arduino IDE 1.6.3 with Adafruit Boardsをinstallします。
2. 上記のライブラリを.zipとして保存しておきます。
3. arduino IDE 1.6.3 with Adafruit Boardsを起動し、[スケッチ]-[Include 
![arduino_library.png](https://qiita-image-store.s3.amazonaws.com/0/4779/ee433403-054d-61a2-893e-7cf0c2205e1f.png "arduino_library.png")

4. 8pinoにピンヘッダをハンダ付けする。8pinoをブレッドボードに挿せるようにするためです。
![8pino.png](https://qiita-image-store.s3.amazonaws.com/0/4779/491ea5fb-f623-00ab-280d-787e7451371e.png "8pino.png")

# 回路
8pinoの部分をATTiny85で表現しています。(回路図を描くFritzingに8pinoのアイコンがないので)
![赤外線距離センサー_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/4779/bf195e05-2338-c7b2-0d33-1bb8621fee49.png "赤外線距離センサー_ブレッドボード.png")


# スケッチ
```
#include <TinyWireM.h>

#define I2Cadr 0x3e  // 固定
byte contrast = 35;  // コントラスト(0～63)
int ledPin = 1;


void setup() {
  pinMode(ledPin, OUTPUT); 
  TinyWireM.begin();
  lcd_cmd(0b00111000); // function set
  lcd_cmd(0b00111001); // function set
  lcd_cmd(0b00000100); // EntryModeSet
  lcd_cmd(0b00010100); // interval osc
  lcd_cmd(0b01110000 | (contrast & 0xF)); // contrast Low
  lcd_cmd(0b01011100 | ((contrast >> 4) & 0x3)); // contast High/icon/power
  lcd_cmd(0b01101100); // follower control
  delay(200);
  lcd_cmd(0b00111000); // function set
  lcd_cmd(0b00001100); // Display On
  lcd_cmd(0b00000001); // Clear Display
  delay(2);
}
 
void loop() {
  int val=0;
  int distance;
  
  lcd_cmd(0b00000001); // Clear Display
  val = analogRead(2);
  distance = (6762/(val-9))-4;

  lcd_setCursor(0, 0);
  lcd_printStr("raw:");
  lcd_printInt(val);

  lcd_setCursor(0, 1);
  char text[]="ｷｮﾘ:";
  utf_del_uni(text);
  lcd_printStr(text);
  lcd_printInt(distance);
  delay(1000);
}
 
void lcd_cmd(byte x) {
  TinyWireM.beginTransmission(I2Cadr);
  TinyWireM.write(0b00000000); // CO = 0,RS = 0
  TinyWireM.write(x);
  TinyWireM.endTransmission();
}
 
void lcd_contdata(byte x) {
  TinyWireM.write(0b11000000); // CO = 1, RS = 1
  TinyWireM.write(x);
}
 
void lcd_lastdata(byte x) {
  TinyWireM.write(0b01000000); // CO = 0, RS = 1
  TinyWireM.write(x);
}
 
// 文字の表示
void lcd_printStr(const char *s) {
  TinyWireM.beginTransmission(I2Cadr);
  while (*s) {
    if (*(s + 1)) {
      lcd_contdata(*s);
    } else {
      lcd_lastdata(*s);
    }
    s++;
  }
  TinyWireM.endTransmission();
}
 
// 表示位置の指定
void lcd_setCursor(byte x, byte y) {
  lcd_cmd(0x80 | (y * 0x40 + x));
}

void lcd_printInt(int num){
  char int2str[10];
  sprintf(int2str,"%d",num);
  lcd_printStr(int2str);	
}

void utf_del_uni(char *s){
    byte i=0;
    byte j=0;
    while(s[i]!='\0'){
        if((byte)s[i]==0xEF){
            if((byte)s[i+1]==0xBE) s[i+2] += 0x40;
            i+=2;
        }
        s[j]=s[i];
        i++;
        j++;
    }
    s[j]='\0';
}
```

# 動作
[vine](https://vine.co/v/eZWltYlvlxY)に保存しました。

# まとめ
* 前回に引き続き、8pinoとI2Cを使って、センサーの値をLCDに出力しました。
* LCDで表現が豊かになったので、ちょっとしたゲームも作ってみたくなっています。


# 参考
http://www.geocities.jp/zattouka/GarageHouse/micon/Arduino/DMSU/DMSU.htm
http://denshi.blog.jp/arduino/%E8%B7%9D%E9%9B%A2%E8%A8%88%E6%B8%AC