読者です 読者をやめる 読者になる 読者になる

画像処理とか機械学習とか

画像処理や機械学習関連の事について気まぐれで書いていきます。歩行者検出関係が多いと思います。ハリネズミもたまに出現します。

ArduinoにLCDディスプレイを付けて文字を表示させる

温湿度センサーと一緒にAmazonで購入していたArduino用のディスプレイモジュールが届いたので使ってみました。

上の画像のような商品で、Arduinoに上から被せるようにつけるだけで使用可能です。
実際につけた画像がこちらです。
f:id:hiro2o2:20160410195119j:plain

一つ問題がありまして、今まではピンを刺すだけでArduinoと接続できたものが、このモジュールを使う場合はハンダ付けする必要があります。
今回は、ハンダ付けするのが面倒だったので、ピンを接触させて抜けないように固定しているだけです。

このLCDモジュールで使用するピン番号は以下の通りです。

Analog 0 :キー(select, up, right, down and left)
Digital 4 :DB4
Digital 5 :DB5
Digital 6 :DB6
Digital 7 :DB7
Digital 8 :RS (Data or Signal Display Selection)
Digital 9 :Enable

これ以外のピンがLCDモジュールの穴の開いている部分に割り当てられています。
その穴にジャンパワイヤのオス側を入れて抜けないように固定するか、ハンダ付けすれば使えると思います。

また、文字の出力にはライブラリを使うと簡単に表示することが出来ます。
実際に表示したものがこちらです。
f:id:hiro2o2:20160410201102j:plain

今回使用したDHT11のセンサから取得した値をLCDディスプレイモジュールに出力させるコードを以下に載せます。コメントが英語になっている部分はドキュメントのサンプルコードをそのまま使用しています。

#include <DHT.h>
#include <LiquidCrystal.h>

#define DHTPIN 2
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

float temp_c = 0;  // 摂氏値( ℃ )
int red_led = 12;
int blue_led = 13;
int sum = 0;
float value1 = 0;
int data = 0;

// LCD panelで使用するピン番号の選択
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5
#define BACKLIGHT 10

int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // read the value from the sensor 
 // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
 // we add approx 50 to those values and check to see if we are close
 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
 // For V1.1 us this threshold
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 250)  return btnUP; 
 if (adc_key_in < 450)  return btnDOWN; 
 if (adc_key_in < 650)  return btnLEFT; 
 if (adc_key_in < 850)  return btnSELECT;  

 return btnNONE;  // when all others fail, return this...
}

void setup(){
  Serial.begin(9600);  // シリアル通信速度
  pinMode ( red_led, OUTPUT);
  pinMode ( blue_led, OUTPUT);
  dht.begin();
 lcd.begin(16, 2);              // start the library

}

void loop(){

 lcd_key = read_LCD_buttons();  // read the buttons

 switch (lcd_key)               // depending on which button was pushed, we perform an action
 {
   case btnRIGHT:
     {
     break;
     }
   case btnLEFT:
     {
     break;
     }
   case btnUP:
     {
     analogWrite(BACKLIGHT, 255/4);
     break;
     }
   case btnDOWN:
     {
     break;
     }
   case btnSELECT:
     {
     break;
     }
     case btnNONE:
     {
  //バックライトを少し暗めに設定
     analogWrite(BACKLIGHT, 64/4); 
     break;
     }
 }
 
  // アナログピンから計測値を取得(0〜203)
  //センサーの値を50回読み取り平均化する
 sum = 0;
 for (int i = 0; i < 50; i++) {
 data = analogRead(1);
 sum = sum + data;
 delay(2);
 }
  value1 = sum / 50;
  
  // 入力値を摂氏に換算
  temp_c = ((5 * value1) / 1024) * 100;
  Serial.println( temp_c );

 //温湿度センサから値を取得
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    lcd.setCursor(0,0);
    lcd.print("Can't get data!");
    return;
  }

 //文字のクリア
  lcd.clear();
  Serial.println(h);
  lcd.setCursor(0,1);
  lcd.print("Humidity:");
  lcd.setCursor(9,1);
  lcd.print(h);
  lcd.setCursor(13,1);
  lcd.print("\x25");

 lcd.setCursor(0,0);
 lcd.print("Temp:"); 
  Serial.println(t);
  lcd.setCursor(5,0);
  lcd.print(t);
  lcd.setCursor(9,0);
  lcd.print("\xdf");
  lcd.setCursor(10,0);
  lcd.print("C");

  
  if(t > 20 && t < 30){
     // LEDを点灯 ( HIGHは電圧レベル )
    digitalWrite( blue_led, HIGH ); 
    digitalWrite( red_led, LOW );
  }else{
    digitalWrite( red_led, HIGH );
    digitalWrite( blue_led, LOW ); 
  }
  
  
  // 1000ms待機
  delay(10000);
}