Arduinoを使って自作したGPS時計や方位計のディスプレイですが、車のオーバーヘッドコンソールにお試しで装着(シリーズ記事⑥)してから一週間たちました。
前回の記事はこちらです。
www.solocamptouring.com
問題なく作動しており、おおむね満足していますが、改善したい点がでてきました。
少変更を入れつつ、最終的に完成させます。
最終改善ポイント
「S」が「5」に見える対策
GPSモジュールが位置計算に使用している人工衛星の数をLCDの中央下に表示しています。
数字の後ろに衛星(サテライト)を意味する「Sats」を表示していますが、パッと見たときに「S」が数字の「5」に見えてしまいます。
写真は、衛星7機を使って位置計算していることを表示している画面ですが、75っぽく見えてしまいます。
そこで、「S」を小文字に変更して「sats」と表示することで、見やすくします。
停止していると方位角度におかしな数値が出ることがある
GPSで得られる進行方向データを方位として代用しています。
しかし進行方向はGPSモジュールの位置(=車)を動かさないと計算できないため、車が停止している状態だと、稀におかしな数値を表示します。
進行方向を計算できていない時は方位角度を表示せず、「ACT. REQUIRED」と表示するようにスケッチ(プログラム)を変更します。
最新のスケッチ全文は、最後に載せておきます。
オーバーヘッドコンソールへの取り付け
車に一週間装着してみて、ビビリ音もなく作動も安定しているので、透明パネルのままで手を加えていなかったディスプレイ取り付け面を仕上げます。
LCD表示部でない部位は、個人的に好きな黒カーボン柄のカッティングシートでブラックアウトします。
車のオーバーヘッドコンソールに取付けて、動作確認しました。
Arduino project #1「GPSマルチモニター 」Multi-information monitor with GPS module
最新のスケッチ(プログラム)
GPSモジュールは、tinygpsplusライブラリ、
温湿度センサーは、GitHub - adafruit/ DHT11用ライブラリを使っています。
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
#include<Wire.h>
#include <DHT.h>
#define DHTPIN 13
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd( 12, 11, 8, 7, 6, 5 );
byte upword[8] = {
B00100,
B01110,
B11111,
B00000,
B00100,
B01110,
B11111,
};
byte downword[8] = {
B11111,
B01110,
B00100,
B00000,
B11111,
B01110,
B00100,
};
byte righthand[8] = {
B01000,
B01100,
B01110,
B01111,
B01110,
B01100,
B01000,
};
byte lefthand[8] = {
B00010,
B00110,
B01110,
B11110,
B01110,
B00110,
B00010,
};
byte centerpoint[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};
TinyGPSPlus gps;
SoftwareSerial gpsSerial(9, 10);
const int serialTime = 200;
const int MPU_addr=0x68;
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
void setup()
{
Wire.begin();
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
Serial.begin(9600);
lcd.createChar(1, upword);
lcd.createChar(2, downword);
lcd.createChar(3, righthand);
lcd.createChar(4, lefthand);
lcd.createChar(5, centerpoint);
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(0,2);
lcd.print(" Powered by ");
lcd.setCursor(0,3);
lcd.print(" Arduino ");
delay(3000);
lcd.clear();
dht.begin();
}
void loop()
{
int start = millis();
int now = millis();
do {
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
}
now = millis();
} while ((now - start) < serialTime);
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);
}
int sec;
sec = gps.time.second();
if (sec < 10) {
lcd.setCursor(0,1);
lcd.print(" ");
} else if (sec < 20){
lcd.setCursor(0,1);
lcd.write(5);
} else if (sec < 30){
lcd.setCursor(1,1);
lcd.write(5);
} else if (sec < 40){
lcd.setCursor(2,1);
lcd.write(5);
} else if (sec < 50){
lcd.setCursor(3,1);
lcd.write(5);
} else {
lcd.setCursor(4,1);
lcd.write(5);
}
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,14,true);
AcX=Wire.read()<<8|Wire.read();
AcY=Wire.read()<<8|Wire.read();
AcZ=Wire.read()<<8|Wire.read();
Tmp=Wire.read()<<8|Wire.read();
GyX=Wire.read()<<8|Wire.read();
GyY=Wire.read()<<8|Wire.read();
GyZ=Wire.read()<<8|Wire.read();
lcd.setCursor(16,2);
lcd.write(5);
if (AcX < -5000) {
lcd.setCursor(16,1);
lcd.write(1);
} else {
lcd.setCursor(16,1);
lcd.print(" ");
}
if (AcX > 5000) {
lcd.setCursor(16,3);
lcd.write(2);
} else {
lcd.setCursor(16,3);
lcd.print(" ");
}
if (AcY < -5000) {
lcd.setCursor(14,2);
lcd.write(4);
lcd.write(4);
} else if (AcY < -2500) {
lcd.setCursor(14,2);
lcd.print(" ");
lcd.write(4);
} else {
lcd.setCursor(14,2);
lcd.print(" ");
}
if (AcY > 5000) {
lcd.setCursor(17,2);
lcd.write(3);
lcd.write(3);
} else if (AcY > 2500) {
lcd.setCursor(17,2);
lcd.write (3);
lcd.print(" ");
} else {
lcd.setCursor(17,2);
lcd.print(" ");
}
}
if (gps.altitude.isUpdated())
{
lcd.setCursor(6,1);
lcd.print("Alt");
int koudo;
koudo = (int)(gps.altitude.meters());
if (koudo == 0) {
lcd.setCursor(9,1);
lcd.print("----");
} else if (koudo < 10) {
lcd.setCursor(9,1);
lcd.print(" ");
lcd.setCursor(12,1);
lcd.print(koudo);
} else if (koudo < 100) {
lcd.setCursor(9,1);
lcd.print(" ");
lcd.setCursor(11,1);
lcd.print(koudo);
} else if (koudo < 1000) {
lcd.setCursor(9,1);
lcd.print(" ");
lcd.setCursor(10,1);
lcd.print(koudo);
} else {
lcd.setCursor(9,1);
lcd.print(koudo);
}
lcd.setCursor(13,1);
lcd.print("m");
}
if (gps.speed.isUpdated())
{
int satV;
satV = (int)(gps.satellites.value());
if (satV < 10){
lcd.setCursor(8,3);
lcd.print(" ");
lcd.setCursor(9,3);
lcd.print(satV);
} else {
lcd.setCursor(8,3);
lcd.print(satV);
}
lcd.setCursor(10,3);
lcd.print("sats");
int s;
s = (int)(gps.speed.kmph());
if (s == 0) {
lcd.setCursor(0,3);
lcd.print("---");
lcd.print("Km/h");
} else if (s < 10) {
lcd.setCursor(0,3);
lcd.print(" ");
lcd.setCursor(2,3);
lcd.print(s);
lcd.print("Km/h");
} else if (s < 100) {
lcd.setCursor(0,3);
lcd.print(" ");
lcd.setCursor(1,3);
lcd.print(s);
lcd.print("Km/h");
} else {
lcd.setCursor(0,3);
lcd.print(s);
lcd.print("Km/h");
}
}
if (gps.course.isUpdated())
{
int headDir = (gps.course.deg());
if ((gps.course.deg()) <= 0) {
lcd.setCursor(6,0);
lcd.print("ACT. REQUIRED ");
}
else if ((gps.course.deg()) > 360) {
lcd.setCursor(6,0);
lcd.print("ACT. REQUIRED ");
}
else if ((gps.course.deg()) < 11.3) {
lcd.setCursor(13,0);
lcd.print("W--N--E");
if ((gps.course.deg()) < 10) {
lcd.setCursor(6,0);
lcd.print("Dir");
lcd.print(" ");
lcd.print(headDir);
lcd.print(" ");
}else {
lcd.setCursor(6,0);
lcd.print("Dir");
lcd.print(" ");
lcd.print(headDir);
lcd.print(" ");
}
}
else if ((gps.course.deg()) < 33.8) {
lcd.setCursor(13,0);
lcd.print("--N");
lcd.setCursor(16,0);
lcd.write(1);
lcd.setCursor(17,0);
lcd.print("--E");
lcd.setCursor(6,0);
lcd.print("Dir");
lcd.print(" ");
lcd.print(headDir);
lcd.print(" ");
}
else if ((gps.course.deg()) < 56.3) {
lcd.setCursor(13,0);
lcd.print("-N-");
lcd.setCursor(16,0);
lcd.write(1);
lcd.setCursor(17,0);
lcd.print("-E-");
lcd.setCursor(6,0);
lcd.print("Dir");
lcd.print(" ");
lcd.print(headDir);
lcd.print(" ");
}
else if ((gps.course.deg()) < 78.8) {
lcd.setCursor(13,0);
lcd.print("N--");
lcd.setCursor(16,0);
lcd.write(1);
lcd.setCursor(17,0);
lcd.print("E--");
lcd.setCursor(6,0);
lcd.print("Dir");
lcd.print(" ");
lcd.print(headDir);
lcd.print(" ");
}
else if ((gps.course.deg()) < 101.3) {
lcd.setCursor(13,0);
lcd.print("N--E--S");
if ((gps.course.deg()) < 100) {
lcd.setCursor(6,0);
lcd.print("Dir");
lcd.print(" ");
lcd.print(headDir);
lcd.print(" ");
}else {
lcd.setCursor(6,0);
lcd.print("Dir");
lcd.print(headDir);
lcd.print(" ");
}
}
else if ((gps.course.deg()) < 123.8) {
lcd.setCursor(13,0);
lcd.print("--E");
lcd.setCursor(16,0);
lcd.write(1);
lcd.setCursor(17,0);
lcd.print("--S");
lcd.setCursor(6,0);
lcd.print("Dir");
lcd.print(headDir);
lcd.print(" ");
}
else if ((gps.course.deg()) < 146.3) {
lcd.setCursor(13,0);
lcd.print("-E-");
lcd.setCursor(16,0);
lcd.write(1);
lcd.setCursor(17,0);
lcd.print("-S-");
lcd.setCursor(6,0);
lcd.print("Dir");
lcd.print(headDir);
lcd.print(" ");
}
else if ((gps.course.deg()) < 168.8) {
lcd.setCursor(13,0);
lcd.print("E--");
lcd.setCursor(16,0);
lcd.write(1);
lcd.setCursor(17,0);
lcd.print("S--");
lcd.setCursor(6,0);
lcd.print("Dir");
lcd.print(headDir);
lcd.print(" ");
}
else if ((gps.course.deg()) < 191.3) {
lcd.setCursor(13,0);
lcd.print("E--S--W");
lcd.setCursor(6,0);
lcd.print("Dir");
lcd.print(headDir);
lcd.print(" ");
}
else if ((gps.course.deg()) < 213.8) {
lcd.setCursor(13,0);
lcd.print("--S");
lcd.setCursor(16,0);
lcd.write(1);
lcd.setCursor(17,0);
lcd.print("--W");
lcd.setCursor(6,0);
lcd.print("Dir");
lcd.print(headDir);
lcd.print(" ");
}
else if ((gps.course.deg()) < 236.3) {
lcd.setCursor(13,0);
lcd.print("-S-");
lcd.setCursor(16,0);
lcd.write(1);
lcd.setCursor(17,0);
lcd.print("-W-");
lcd.setCursor(6,0);
lcd.print("Dir");
lcd.print(headDir);
lcd.print(" ");
}
else if ((gps.course.deg()) < 258.8) {
lcd.setCursor(13,0);
lcd.print("S--");
lcd.setCursor(16,0);
lcd.write(1);
lcd.setCursor(17,0);
lcd.print("W--");
lcd.setCursor(6,0);
lcd.print("Dir");
lcd.print(headDir);
lcd.print(" ");
}
else if ((gps.course.deg()) < 281.3) {
lcd.setCursor(13,0);
lcd.print("S--W--N");
lcd.setCursor(6,0);
lcd.print("Dir");
lcd.print(headDir);
lcd.print(" ");
}
else if ((gps.course.deg()) < 303.8) {
lcd.setCursor(13,0);
lcd.print("--W");
lcd.setCursor(16,0);
lcd.write(1);
lcd.setCursor(17,0);
lcd.print("--N");
lcd.setCursor(6,0);
lcd.print("Dir");
lcd.print(headDir);
lcd.print(" ");
}
else if ((gps.course.deg()) < 326.3) {
lcd.setCursor(13,0);
lcd.print("-W-");
lcd.setCursor(16,0);
lcd.write(1);
lcd.setCursor(17,0);
lcd.print("-N-");
lcd.setCursor(6,0);
lcd.print("Dir");
lcd.print(headDir);
lcd.print(" ");
}
else if ((gps.course.deg()) < 348.8) {
lcd.setCursor(13,0);
lcd.print("W--");
lcd.setCursor(16,0);
lcd.write(1);
lcd.setCursor(17,0);
lcd.print("N--");
lcd.setCursor(6,0);
lcd.print("Dir");
lcd.print(headDir);
lcd.print(" ");
}
else {
lcd.setCursor(13,0);
lcd.print("W--N--E");
lcd.setCursor(6,0);
lcd.print("Dir");
lcd.print(headDir);
lcd.print(" ");
}
}
int hmdt = dht.readHumidity();
int tmpr = dht.readTemperature();
if (isnan(hmdt) || isnan(tmpr) ){
lcd.setCursor(0,3);
lcd.print("UPDATING ");
}else{
lcd.setCursor(0,2);
lcd.print("Tmp");
if (tmpr < 10) {
lcd.setCursor(3,2);
lcd.print(" ");
lcd.setCursor(4,2);
lcd.print(tmpr);
} else {
lcd.setCursor(3,2);
lcd.print(tmpr);
}
lcd.setCursor(5,2);
lcd.print("c ");
lcd.setCursor(7,2);
lcd.print("Hmd");
lcd.setCursor(10,2);
lcd.print(hmdt);
lcd.setCursor(12,2);
lcd.print("%");
}
}