インターネットから取得する時計を作ろう!
こんにちは。ブログの更新を週一で頑張ろうかなーって思ってるけど、最近またまた課題が多いです。毎日投稿?誰がそんなこと言っていたのだろう??
まあ電子工作はちょくちょく触っているので頑張って忘れないうちに更新します。
今回は「インターネットに接続する時計」との事で、前回のWi-Fiに接続したESP32を使ってプログラムしていきたいと思います!
今回もたくさんのサイトを拝見させて頂きました。とても参考になります。勝手ですがありがとうございます。
参考にさせていただいたサイト様↓↓↓
https://garretlab.web.fc2.com/arduino/esp32/examples/ESP32/Time_SimpleTime.html
https://wak-tech.com/archives/833
軽い仕組みの説明
てかどうやってネットから時間を取るの〜?って所からだと思います。私も最初は調べまくってわけわかめ状態でした。
それで行き着いた先がNTPサーバという存在です。
このNTPサーバにリクエストを送るとレスポンスとして時間を返してくれます。世の中便利すぎますね
なのでWi-Fiに接続してサーバにおねだりして時間を貰って、最後にそれを表示させればいいわけです。すごいね、まあ概略はこの辺でプログラムの方にいきます
ソースコード
まずはESP32単体で動くかどうか(ソフトウェアのチェック)を試します。コードはこちら↓↓↓
サンプルにも同じようなものがあるのでそれでもいいと思います。
// 時間を取得して(NTPサーバーから)シリアルモニタで見るプログラム
// 必要なライブラリをインクルードする
#include <WiFi.h>
#include <time.h>
// 日本時間を設定するための定義(9時間ずれを秒数に直している)
#define JST 3600* 9
// 家のwifiのssidとパスワードを入力
const char* ssid = "各自のwifiのID";
const char* password = "wifiのパスワード";
// LED点灯用
int led = 13;
void setup() {
// シリアル通信を開始
Serial.begin(115200);
delay(100);
Serial.print("\n\nStart\n");
// wifiに接続する
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(500);
}
Serial.println();
Serial.printf("Connected, IP address: ");
Serial.println(WiFi.localIP());
// configTime( 時差 , サマータイム , 日本のNTPサーバー(複数可能) )
configTime( JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");
}
void loop() {
// 時間を格納する変数を設定
time_t t;
struct tm *tm;
// 曜日のための配列
static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
t = time(NULL);
tm = localtime(&t);
// シリアルモニタに表示させるところ
Serial.printf(" %04d/%02d/%02d(%s) %02d:%02d:%02d\n",
tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
wd[tm->tm_wday],
tm->tm_hour, tm->tm_min, tm->tm_sec);
if(tm->tm_sec%10 == 0){
digitalWrite(led,HIGH);
}
delay(1000);
}
コードの詳細な説明については私がきちんと勉強した訳ではなく、独学によるものなので省かせて頂きます。なのでコードの内容の意味等であれば、私が理解するために書いたコメント部分を参考にお願いします。解釈が間違っていたらすみません、、、
とりあえずマイコンに書き込むことが出来たらいつも通りシリアルモニターで出力されているかを見ましょう
こんな感じで出力されてたら成功です!あとはこれを使って応用的なことが出来ますね、楽しみです。
LCDに接続して表示してみる
せっかくなのでLCDに繋いで表示してみましょう。
今のままだと毎回パソコンに繋いでシリアルモニターで見る状態なので馬鹿らしいですもんね、てかパソコンに時計あるし。
てことでまずはプログラム、今回は上のやつに自分でコードを追加してみました!自分で作ってる感じがすごく出て楽しいです。毎回自分で書ければいいんですけどね〜
出来たのがこちら
// 時間を取得して(NTPサーバーから)LCDで表示させるプログラム
// 必要なライブラリをインクルードする
#include <WiFi.h>
#include <time.h>
#include <LiquidCrystal.h>
// 日本時間を設定するための定義(9時間ずれを秒数に直している)
#define JST 3600* 9
// 家のwifiのssidとパスワードを入力
const char* ssid = "各自のwifiのID";
const char* password = "wifiのパスワード";
// LCDのピンの配線を設定
LiquidCrystal lcd{14, 13, 26, 25, 33, 32};
// time_t型でtを定義し、その中に現在時刻の情報を入力していく
time_t t;
struct tm *tm;
static const char *wd[7] = {"Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat"};
// セットアップを開始
void setup() {
// LCDを開始する
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("NPTclock byESP32");
// シリアル通信を開始
Serial.begin(115200);
delay(100);
Serial.println();
Serial.println("Start");
Serial.println();
// wifiに接続する
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
lcd.setCursor(0, 1);
lcd.print("Connecting WiFi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(500);
}
Serial.println();
Serial.println("Connected");
lcd.setCursor(0, 1);
lcd.print("Connected ! ");
Serial.print("IP address : ");
Serial.println(WiFi.localIP());
delay(1000);
lcd.setCursor(0, 1);
lcd.print(" ");
// configTime( gmtOffset(時差) , daylight Offset(サマータイム) , ntpサーバーのURL(複数のサーバーを使用することが可能))
// 時間の取得先などの情報を入れる
// 使うサーバーは一つでも可
configTime( JST, 0, "ntp.nict.jp", "time.google.com", "ntp.jst.mfeed.ad.jp");
}
void loop() {
// 取得した時刻を変数に入れ、それをシリアル通信で表示させる
t = time(NULL);
tm = localtime(&t);
Serial.printf(" %04d/%02d/%02d(%s) %02d:%02d:%02d\n",
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
wd[tm->tm_wday],
tm->tm_hour, tm->tm_min, tm->tm_sec);
// 取得した時刻をLCDに表示させる
// 年/月/日(曜日)
lcd.setCursor(0, 0);
lcd.printf("%04d/%02d/%02d (%s)", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, wd[tm->tm_wday]);
// 時:分:秒
lcd.setCursor(0, 1);
lcd.printf(" %02d:%02d:%02d", tm->tm_hour, tm->tm_min, tm->tm_sec);
// 1秒ごとに表示する為の遅延
delay(1000);
}
これを書き込みます。動作確認のためシリアルモニターでも見れるように残しました。まずはそこが出てるか確認して配線に行きましょう〜
配線の時間です
実はつなぎ方自体はそこまで難しいものじゃないんですけど、一つ難点が。
前に普通のブレッドボードだとマスが1列しか差せない!みたいな話をしたじゃないですか、ここでも弊害がでます。悲しい
なので今回はその1列で組めるようにしました!いいのかなこれ?!てことでれっつら配線
回路図(fritzingで描画)
今回初めてfritzing使ってみました。使いやすいですねこれ
左側に位置するのがESP32で右側の大きいやつがLCDです。その間に位置するちっちゃい可変抵抗器は、画面のコントラストを調節するためにあります。
キツキツにしているのでジャンパー線が太いと隣同士がきついです、怖い方は素直にブレボ買おう。
ちなみに長いブレッドボードに組み込めばいい感じになるようにしました、たまたまです。
ちなみに今回は片側した使わなかったのですがその中で出力端子として使えないやつがあります。ピンごとに何ができるかはちゃんと確認しましょう
ちなみに私はここで1時間くらい詰まってました泣
(みんなもちゃんと調べよう!)
あとは電源を入れてあげるだけ!ラストです
点灯式
あとは適当な電源を入れてあげると、、、
付きました!ブレボに乗っけただけですが、なかなかいい感じですねこれ、意外とかっこよく出来ました!
まあこれを適当な場所に置いてあげます。いい感じになります。
ベットの縁載せたもの、朝起きた時に確認しやすいね
まとめる
今回はNTPサーバに接続して時計を作りました。
と言っても今は先人のお力によりこれ一つ作るのすごく簡単です。後々はそこの知識も分かるように勉強していきたい
あ、ちなみにこれはあんまり良くない時計です。どう良くないかと言うと常につけっぱなしになっています。つまり電池食い過ぎってことです、このやろう
対策としては私が考える限りこちら
・Wi-Fiを時間を取得の時だけにする(今はつけっぱ)
・バックライトLEDを見る時だけつける
・液晶の切り替えを場所ごとにする(秒数がよく切り替わるのでいつもはその場所だけとか)
Wi-Fiを切るだけでもすごく省エネになると思います。なんせ一晩で20000mAhのバッテリー切れましたもん、計算すると1A弱流れてんのかな〜
そんな感じでやり方は思いつきますがまあこれは次回の作品の時に実装してみたいと思います。みなさんも自分でアレンジを加えると楽しいかも!
最後まで読んで頂きありがとうございます
ではばいばい