« Arduino で 4-8x8 dotmatrix LED使用方法(いわゆるLチカ) | Main | Arduinoでトイレの電気消し忘れ注意喚起 »

06/12/2019

4-8x8 dot matrix Clock drive by Arduino NANO and GPS

Gpsfritzing3
 4連 8x8 dot matrix LED の Lチカが上手くできたので、GPSを追加して時計を作ってみた。


 Fritzingを使った、8x8 dot matrix LED、GPS、Arduino  NANOの結線状態は、図のようである。

 LEDとGPSに関して、ここで使った部品の Fritzing 画像をネット上で探したが、見つからなかったので、類似部品を使って結線図を作成した。



私が使った部品
は、
・4連 8x8 dot matrix LED : SODIAL(R) 4イン1ドットマトリクスMCU LEDディスプレイモジュールDIYセット
                                       価格 @589 (Amazon から購入)
・GPS unit : GPS受信機キット 1PPS出力付き 「みちびき」3機受信対応 [AE-GYSFDMAXB]
                   価格 @2100(秋月電子通商から購入)
・Arduino NANO 

GPSユニットは、Fritzingで使ったような、価格の安価なものでも利用できるのではないかと思う。
図のように結線し、下記のSketchで稼働させればよい。クリックすれば、画像を拡 大できるブログエディタの機能がどこにあるのか分からない・・・(ココログの新エディタ、使いにくい!)

そのため、結線方法をここに記載しておく(Sketchの中にも記載しておいたが・・・)

Arduino NANO      GPS
D3  ------------------  TXD
D4  ------------------  RXD
GND  ----------------  GND
5V  ------------------  5V

Arduino NANO      Max7219
D10  -----------------  CS
D11  -----------------  DIN
D13  -----------------  CLK
GND  ----------------  GND
5V  ------------------  VCC

Sketchでちょっと苦労したのは、午前0時から9時までのように、1桁になってしまう時刻の表示。加えて、時計が稼働していることを示す方法。

・1桁になる時刻は、GPSから受け取った「時(hour)」の桁数を読んで、1桁の場合には、スペース(” ”)を入れ、表示させることにした。(一般的な処置方法は、10以上か否かという数値の処理で行われている。) 僕は、文字の桁数で処理することにして、「分(minute)」の方は、ゼロ(”0”)を入れて表示させるようにした。
 ただし、Serial.print で表示させる displayTime() のところは、引用した Sketch のまま変更していない。
 displayDate() についても、引用した Sketch のまま変更していない。
 ドットマトリックス表示には無関係なので、消してもよかったのだが、あとで Serial.print する際のことを考慮して残した。
・時計の稼働は、「時」と「分」の間の「:」を点滅させることで、動いていることを表示させるようにした。

《参考としたブログなど》
MAX7219 Arduino Clock  (instructables circuits より)



《Sketch》

// GPS Clock with MAX7219 8x8 display  2019/06/12  << My Spice Cabinet >>
#include <TinyGPS++.h> // Include the TinyGPS++ library
#include <SoftwareSerial.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
TinyGPSPlus tinyGPS;  // Create a TinyGPSPlus object
#define GPSBaud 9600 // GPS module baud rate. defaults to 9600
#define ARDUINO_GPS_RX 4 // GPS TX, Arduino RX pin
#define ARDUINO_GPS_TX 3 // GPS RX, Arduino TX pin
SoftwareSerial ssGPS(ARDUINO_GPS_TX, ARDUINO_GPS_RX);
#define gpsPort ssGPS // Alternatively, use Serial1 on the Leonardo
#define SerialMonitor Serial
const byte PIN_CLK = 13;   // define CLK pin (any digital pin)
const byte PIN_DIO = 11; // define DIO pin (any digital pin)
int pinCS = 10; // Attach CS to this pin, DIN to MOSI and CLK to SCK (cf http://arduino.cc/en/Reference/SPI )
int numberOfHorizontalDisplays = 4;
int numberOfVerticalDisplays = 1;
int wait = 70; // In milliseconds
int spacer = 1;
int Y0 = 0; // if Y0=0 then
int jpt;
int width = 5 + spacer; // The font width is 5 pixels
char time_value[20];
String s;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
void setup()
{
gpsPort.begin(GPSBaud);
SerialMonitor.begin(115200);
matrix.setIntensity(10); // Use a value between 0 and 15 for brightness
matrix.setPosition( 0, 3, 0) ; // The first display is at <0, 0>
matrix.setPosition( 1, 2, 0) ; // The second display is at <1, 0>
matrix.setPosition( 2, 1, 0) ; // The third display is at <2, 0>
matrix.setPosition( 3, 0, 0) ; // The fourth display is at <3, 0>
matrix.setRotation(0, 1); // The first display is position upside down
matrix.setRotation(1, 1); // The first display is position upside down
matrix.setRotation(2, 1); // The first display is position upside down
matrix.setRotation(3, 1); // The first display is position upside down
delay(1000);
}
void loop()
{
// print position, altitude, speed, time/date, and satellites:
displayInfo();
// "Smart delay" looks for GPS data while the Arduino's not doing anything else
smartDelay(1000);
}
void displayInfo()
{
// Print latitude, longitude, altitude in feet, course, speed, date, time,
// and the number of visible satellites.
SerialMonitor.print("Lat: "); SerialMonitor.println(tinyGPS.location.lat(), 6);
SerialMonitor.print("Long: "); SerialMonitor.println(tinyGPS.location.lng(), 6);
SerialMonitor.print("Alt: "); SerialMonitor.println(tinyGPS.altitude.feet());
SerialMonitor.print("Course: "); SerialMonitor.println(tinyGPS.course.deg());
SerialMonitor.print("Speed: "); SerialMonitor.println(tinyGPS.speed.mph());
SerialMonitor.print("Date: "); displayDate();
SerialMonitor.print("Time: "); displayTime();
SerialMonitor.print("Sats: "); SerialMonitor.println(tinyGPS.satellites.value());
SerialMonitor.println();
jpt = tinyGPS.time.hour() + 9;
if( jpt >= 24 ) jpt = jpt - 24;
s=String(jpt);
if( s.length() == 1 )
{
s = " " + s;
time_value[0]= s.charAt(0);
time_value[1]= s.charAt(1);
}
else
{
time_value[0]= s.charAt(0);
time_value[1]= s.charAt(1);
}
s=String(tinyGPS.time.minute() );
if( s.length() == 1 )
{
s = "0" + s;
time_value[3]= s.charAt(0);
time_value[4]= s.charAt(1);
}
else
{
time_value[3]= s.charAt(0);
time_value[4]= s.charAt(1);
}
matrix.fillScreen(LOW);
matrix.drawChar( 2, Y0, time_value[0], HIGH,LOW,1);
matrix.drawChar( 8, Y0, time_value[1], HIGH,LOW,1);
// matrix.drawChar(14, Y0, 58, HIGH,LOW,1); // Fixed 58(ASCII Code) = ":"
matrix.drawChar(20, Y0, time_value[3], HIGH,LOW,1);
matrix.drawChar(26, Y0, time_value[4], HIGH,LOW,1);
matrix.write(); // Send bitmap to display
delay(1000);
matrix.drawChar(14,0, 58, HIGH,LOW,1); // blinking 58(ASCII Code) = ":"
matrix.write(); // Send bitmap to display
}
static void smartDelay(unsigned long ms)
{
unsigned long start = millis();
do
{
// If data has come in from the GPS module
while (gpsPort.available())
tinyGPS.encode(gpsPort.read()); // Send it to the encode function
// tinyGPS.encode(char) continues to "load" the tinGPS object with new
// data coming in from the GPS module. As full NMEA strings begin to come in
// the tinyGPS library will be able to start parsing them for pertinent info
} while (millis() - start < ms);
}
// printDate() formats the date into dd/mm/yy.
void displayDate()
{
SerialMonitor.print(tinyGPS.date.day());
SerialMonitor.print("/");
SerialMonitor.print(tinyGPS.date.month());
SerialMonitor.print("/");
SerialMonitor.println(tinyGPS.date.year());
}
// printTime() formats the time into "hh:mm:ss", and prints leading 0's
// where they're called for.
void displayTime()
{
SerialMonitor.print(tinyGPS.time.hour()+9);
SerialMonitor.print(":");

if (tinyGPS.time.minute() < 10) SerialMonitor.print('0');
SerialMonitor.print(tinyGPS.time.minute());
SerialMonitor.print(":");
if (tinyGPS.time.second() < 10) SerialMonitor.print('0');
SerialMonitor.println(tinyGPS.time.second());
}

« Arduino で 4-8x8 dotmatrix LED使用方法(いわゆるLチカ) | Main | Arduinoでトイレの電気消し忘れ注意喚起 »

Arduino」カテゴリの記事

Comments

Post a comment

Comments are moderated, and will not appear on this weblog until the author has approved them.

(Not displayed with comment.)

« Arduino で 4-8x8 dotmatrix LED使用方法(いわゆるLチカ) | Main | Arduinoでトイレの電気消し忘れ注意喚起 »

July 2019
Sun Mon Tue Wed Thu Fri Sat
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Recent Trackbacks

無料ブログはココログ