ソロでたのしむ

DIY、電子工作、キャンプ用品などの趣味を紹介します

ArduinoとLCDでコクピット情報を追加表示~プロローグ~ArduinoとDHT11を使うスケッチ(プログラム)

 

JB23ジムニーに装着している、ArduinoとGPSモジュールを使用したモニターに、全7回で表示情報量を多くするバージョンアップをしていきます。

  1. 今回の記事;プロローグ ArduinoとDHT11を使うスケッチ(プログラム)
  2. その① 20x4LCDモニターの表示内容を決める
  3. その② シリアル通信で加速度出力を確認
  4. その③ ArduinoとGY-521(MPU-6050)を使うスケッチ(プログラム)
  5. その④ 自作オーバーヘッドコンソールを拡大
  6. その⑤ 自作オーバーヘッドコンソールにモニターと回路埋め込み
  7. オーバーヘッドコンソール付けディスプレイ完成

 

バージョンアップ前のGPSモニター制作記事はこちら↓

solocamptouring.hatenablog.com

 

バージョンアップ前の車両取付状態↓

JB23ジムニーに装着した、自作オーバーヘッドディスプレイのGPSモニター

モニターの選択

現在使っているGPSモニターには、
・時刻
・高度
・速度
・進行方向
・捕捉している衛星数
の5項目の情報を表示しています。

16x2文字のLCDモニターを使っていますが、5項目を表示するのが精いっぱいで、さらに追加で情報を表示ずるためには、モニターを大型化する必要があります。


簡単に入手できるもののうち、次に表示文字数の多いものは20x4文字のLCDなので、これに変更する前提でセンサー等を追加していきます。

LCDモニター 1602と2004 比較

追加表示する情報

今後、追加表示していきたいのは、
・温度
・傾斜計(クライノメーター)
の2項目です。

まず今回は、比較的に簡単な温度表示の追加について試してみます。

温湿度モジュール

DHT11というセンサーモジュールを使います。

安くて精度はまあまあというものですが、今回は小数点以下を必要としないので十分使えます。

Arduinoで、GPSモジュールと温湿度モジュールを使いLCDディスプレイに表示する

左上のクリップで挟んでいるのがDHT11

回路図

Fritzingで回路図作成しました。


前回記事の回路に対して、左上の温湿度センサーへの接続が増えているだけです。センサーの電源電圧は5Vです。
メモ内に記載している色は、制作時の電線の色を書き留めているだけなので、気にしないでください。

温湿度センサー用のスケッチ

温湿度センサー用のライブラリーは、GitHubのadafruit/DHTセンサライブラリからダウンロードして使いました。
前回記事で紹介したGPSモニターのスケッチに、次に紹介する行を挿入します。

まずは、DHT11用ライブラリを使う事を宣言します。

#include <DHT.h>
#define DHTPIN 13
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

 セットアップで、DHT11と通信開始します。

void setup()
{
  dht.begin();
}

 ループ部で、DHT11からの読み込みとLCDディスプレイへの書き出しを命令します。

void loop()
{
 int h = dht.readHumidity();
 int t = dht.readTemperature();
  if (isnan(h) || isnan(t) ){
     lcd.setCursor(0,3);
     lcd.print("UPDATING           ");
  }else{
   lcd.setCursor(0,3);
   lcd.print("Humid:");
   lcd.setCursor(6,3);
   lcd.print(h);
   lcd.setCursor(8,3);
   lcd.print("%");
   lcd.setCursor(10,3);
   lcd.print("Temp:");
   lcd.setCursor(15,3);
   lcd.print(t);
   lcd.setCursor(17,3);
   lcd.print("c");
  }
}

スケッチ全文は、一番最後に載せておきます。

 

作動確認

20x4行のLCDを使い、問題なく作動しました。

Arduinoで、GPS情報、温度、湿度をLCDモニターに表示する
センサーを手で温めると、すぐに温度が上がってくるので、変動レスポンスも良さそうです。

各情報の配置については、傾斜計など全ての表示とあわせて、次回の記事以降でレイアウトしなおしたいと思います。

 

 

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
#include <DHT.h>
#define DHTPIN 13
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd( 12, 11, 5, 4, 3, 2 );
byte smiley[8] = {
  B00100,
  B01110,
  B11111,
  B00000,
  B00100,
  B01110,
  B11111,
};
byte sat1[8] = {
  B00110,
  B01110,
  B01110,
  B01111,
  B01110,
  B01110,
  B01100,
};
byte sat2[8] = {
  B01110,
  B00100,
  B01110,
  B11111,
  B01110,
  B00100,
  B11111,
};
byte sat3[8] = {
  B01100,
  B01110,
  B01110,
  B11110,
  B01110,
  B01110,
  B00110,
};
TinyGPSPlus gps;
SoftwareSerial gpsSerial(6, 7); // RX, TX (TX not used)
const int serialTime = 200; // enough time to read all NMEA sentences once
void setup()
{
  lcd.createChar(1, smiley);
  lcd.createChar(2, sat1);
  lcd.createChar(3, sat2);
  lcd.createChar(4, sat3);
  lcd.begin(20,4);
  lcd.clear();  
  gpsSerial.begin(9600);
  lcd.setCursor(0,0);
  lcd.print("   CAPTURING    ");
  delay(1000);
  lcd.setCursor(0,1);
  lcd.print(" SATELLITES");
  lcd.setCursor(12,1);
  lcd.write(2);
  lcd.write(3);
  lcd.write(4);
  delay(10000);
  lcd.clear(); 
  dht.begin();
} // end setup
void loop()
{
int start = millis(); // reference for starting timestamp
int now = millis();
do {
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
}
now = millis();
} while ((now - start) < serialTime); // breaks out of read gps serial
  if (gps.altitude.isUpdated())
  {
    int h;
    h = (gps.time.hour()) + 9;
    if( 24 <= h ) {
    h = h - 24;
    }
       if (h < 10) {
       lcd.setCursor(0,0);
       lcd.print(" ");
       lcd.setCursor(1,0);
       lcd.print(h);
       } else  {
       lcd.setCursor(0,0);
       lcd.print(h);
       }
    lcd.setCursor(2,0);
    lcd.print(":");
    int m;
    m = gps.time.minute();
       if (m < 10) {
       lcd.setCursor(3,0);
       lcd.print("0");
       lcd.setCursor(4,0);
       lcd.print(m);
       } else {
       lcd.setCursor(3,0);
       lcd.print(m);
       }
  }
 if (gps.altitude.isUpdated())
  {
    lcd.setCursor(7,0);  
    lcd.print("Alt:");
     int koudo;
     koudo = (int)(gps.altitude.meters()); 
     if (koudo == 0) {
     lcd.setCursor(11,0);
     lcd.print("----"); 
     } else if (koudo < 10) {
     lcd.setCursor(11,0);
     lcd.print("   "); 
     lcd.setCursor(14,0);
     lcd.print(koudo); 
     } else if (koudo < 100) {
     lcd.setCursor(11,0);
     lcd.print("  "); 
     lcd.setCursor(13,0);
     lcd.print(koudo); 
     } else if (koudo < 1000) {
     lcd.setCursor(11,0);
     lcd.print(" "); 
     lcd.setCursor(12,0);
     lcd.print(koudo); 
     } else {
     lcd.setCursor(11,0);
     lcd.print(koudo); 
     }
    lcd.setCursor(15,0);
    lcd.print("m");
  }
  if (gps.speed.isUpdated())
  {
    int s;
    s = (int)(gps.speed.kmph());    
       if (s == 0) {
        int satV;
        satV = (int)(gps.satellites.value());
        if (satV < 10){
        lcd.setCursor(0,1);
        lcd.print(" ");
        lcd.setCursor(1,1);
        lcd.print(satV);
         } else {
        lcd.setCursor(0,1);
        lcd.print(satV);
         }
        lcd.setCursor(2,1);
        lcd.write(2);
        lcd.write(3);
        lcd.write(4);
        lcd.print("s ");  
       } else if (s < 10) {
       lcd.setCursor(0,1);
       lcd.print("  ");
       lcd.setCursor(2,1);
       lcd.print(s);
       lcd.print("Km/h");
       } else if (s < 100) {
       lcd.setCursor(0,1);
       lcd.print(" ");
       lcd.setCursor(1,1);
       lcd.print(s);
       lcd.print("Km/h");
       } else {
       lcd.setCursor(0,1);
       lcd.print(s);
       lcd.print("Km/h");
       }
  }
   if (gps.course.isUpdated())
  {
    if ((gps.course.deg()) == 0) {
     lcd.setCursor(9,1);
     lcd.print("WAITING"); 
    }
    else if ((gps.course.deg()) < 11.3) {
     lcd.setCursor(9,1);
     lcd.print("W--N--E"); 
     }
    else if ((gps.course.deg()) < 33.8) {
     lcd.setCursor(9,1);
     lcd.print("--N");
     lcd.setCursor(12,1);
     lcd.write(1); 
     lcd.setCursor(13,1);
     lcd.print("--E"); 
     }
   else if ((gps.course.deg()) < 56.3) {
     lcd.setCursor(9,1);
     lcd.print("-N-"); 
     lcd.setCursor(12,1);
     lcd.write(1); 
     lcd.setCursor(13,1);   
     lcd.print("-E-"); 
     }
   else if ((gps.course.deg()) < 78.8) {
     lcd.setCursor(9,1);
     lcd.print("N--"); 
     lcd.setCursor(12,1);
     lcd.write(1); 
     lcd.setCursor(13,1);   
     lcd.print("E--"); 
     }
   else if ((gps.course.deg()) < 101.3) {
     lcd.setCursor(9,1);
     lcd.print("N--E--S"); 
     }
  else if ((gps.course.deg()) < 123.8) {
     lcd.setCursor(9,1);
     lcd.print("--E"); 
     lcd.setCursor(12,1);
     lcd.write(1); 
     lcd.setCursor(13,1);   
     lcd.print("--S"); 
     }
 else if ((gps.course.deg()) < 146.3) {
     lcd.setCursor(9,1);
     lcd.print("-E-");  
     lcd.setCursor(12,1);
     lcd.write(1); 
     lcd.setCursor(13,1);   
     lcd.print("-S-"); 
     }
 else if ((gps.course.deg()) < 168.8) {
     lcd.setCursor(9,1);
     lcd.print("E--");  
     lcd.setCursor(12,1);
     lcd.write(1); 
     lcd.setCursor(13,1);   
     lcd.print("S--"); 
     }
 else if ((gps.course.deg()) < 191.3) {
     lcd.setCursor(9,1);
     lcd.print("E--S--W"); 
     }
 else if ((gps.course.deg()) < 213.8) {
     lcd.setCursor(9,1);
     lcd.print("--S"); 
     lcd.setCursor(12,1);
     lcd.write(1); 
     lcd.setCursor(13,1);   
     lcd.print("--W"); 
     }
else if ((gps.course.deg()) < 236.3) {
     lcd.setCursor(9,1);
     lcd.print("-S-"); 
     lcd.setCursor(12,1);
     lcd.write(1); 
     lcd.setCursor(13,1);   
     lcd.print("-W-"); 
     }
else if ((gps.course.deg()) < 258.8) {
     lcd.setCursor(9,1);
     lcd.print("S--"); 
     lcd.setCursor(12,1);
     lcd.write(1); 
     lcd.setCursor(13,1); 
     lcd.print("W--"); 
     }
else if ((gps.course.deg()) < 281.3) {
     lcd.setCursor(9,1);
     lcd.print("S--W--N"); 
     }
else if ((gps.course.deg()) < 303.8) {
     lcd.setCursor(9,1);
     lcd.print("--W"); 
     lcd.setCursor(12,1);
     lcd.write(1); 
     lcd.setCursor(13,1); 
     lcd.print("--N"); 
     }
else if ((gps.course.deg()) < 326.3) {
     lcd.setCursor(9,1);
     lcd.print("-W-"); 
     lcd.setCursor(12,1);
     lcd.write(1); 
     lcd.setCursor(13,1); 
     lcd.print("-N-"); 
     }
else if ((gps.course.deg()) < 348.8) {
     lcd.setCursor(9,1);
     lcd.print("W--"); 
     lcd.setCursor(12,1);
     lcd.write(1); 
     lcd.setCursor(13,1); 
     lcd.print("N--"); 
     }
else {
     lcd.setCursor(9,1);
     lcd.print("W--N--E");
     }    
  }
 int h = dht.readHumidity();
 int t = dht.readTemperature();
  if (isnan(h) || isnan(t) ){
     lcd.setCursor(0,3);
     lcd.print("UPDATING           ");
  }else{
   lcd.setCursor(0,3);
   lcd.print("Humid:");
   lcd.setCursor(6,3);
   lcd.print(h);
   lcd.setCursor(8,3);
   lcd.print("%");
   lcd.setCursor(10,3);
   lcd.print("Temp:");
   lcd.setCursor(15,3);
   lcd.print(t);
   lcd.setCursor(17,3);
   lcd.print("c");
  }
}