プログラムを貼ってみる実験したけど、もうどうにもならない。どうすればいいの???(失敗
#include <Time.h>
#include <TimeLib.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
// bit set / clear
#ifndef cbi
#define cbi(PORT, BIT) (_SFR_BYTE(PORT) &= ~_BV(BIT))
#endif
#ifndef sbi
#define sbi(PORT, BIT) (_SFR_BYTE(PORT) |= _BV(BIT))
#endif
// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
unsigned int localPort = 8888; // local port to listen for UDP packets
char timeServer = "time.nist.gov"; // time.nist.gov NTP server
const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message
byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets
// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
byte timecode[60];
unsigned long lastNTPTime = 0;
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// start Ethernet and UDP
if (Ethernet.begin(mac) == 0) {
Serial.println("Failed to configure Ethernet using DHCP");
// no point in carrying on, so do nothing forevermore:
for (;;)
;
}
Udp.begin(localPort);
NTPSetTime();
setupTimeCode();
}
void loop()
{
int wait_start = second();
while (wait_start == second()); // wait until time is corrected
unsigned long startTime = millis();
// generate 40khz from 3 pin using PWM
pinMode(3, OUTPUT);
digitalWrite(3, LOW);
TCCR2A = _BV(WGM20);
TCCR2B = _BV(WGM22) | _BV(CS20);
OCR2A = F_CPU / 2 / 40000/*hz*/;
OCR2B = OCR2A / 2; /* 50% duty */
sbi(TCCR2A,COM2B1);
// calc signal duration (ms)
int ms = calcTimeCodeDuration();
// wait ms and stop PWM
while (millis() - startTime < ms);
cbi(TCCR2A,COM2B1);
if (millis() - lastNTPTime > 60*60*1000L) {
NTPSetTime();
setupTimeCode();
lastNTPTime = millis();
}
}
// send an NTP request to the time server at the given address
void sendNTPpacket(char* address) {
// set all bytes in the buffer to 0
memset(packetBuffer, 0, NTP_PACKET_SIZE);
// Initialize values needed to form NTP request
// (see URL above for details on the packets)
packetBuffer[ 0] = 0b11100011; // LI, Version, Mode
packetBuffer[ 1] = 0; // Stratum, or type of clock
packetBuffer[ 2] = 6; // Polling Interval
packetBuffer[ 3] = 0xEC; // Peer Clock Precision
// 8 bytes of zero for Root Delay & Root Dispersion
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
// all NTP fields have been given values, now
// you can send a packet requesting a timestamp:
Udp.beginPacket(address, 123); //NTP requests are to port 123
Udp.write(packetBuffer, NTP_PACKET_SIZE);
Udp.endPacket();
}
//=========================== NTP ===========================
void NTPSetTime()
{
int packetSize;
do{
sendNTPpacket(timeServer);
Serial.println("Waiting NTP response ...");
delay(1000*5);
packetSize = Udp.parsePacket();
Serial.print("Received packet of size ");
Serial.println(packetSize);
}
while(!packetSize);
Udp.available();
// バッファに受信データを読み込む
Udp.read(packetBuffer, NTP_PACKET_SIZE);
// 時刻情報はパケットの40バイト目からはじまる4バイトのデータ
unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
// NTPタイムスタンプは64ビットの符号無し固定小数点数(整数部32ビット、小数部32ビット)
// 1900年1月1日0時との相対的な差を秒単位で表している
// 小数部は切り捨てて、秒を求めている
unsigned long secsSince1900 = highWord << 16 | lowWord;
Serial.print("Seconds since Jan 1 1900 = " );
Serial.println(secsSince1900);
// NTPタイムスタンプをUNIXタイムに変換する
// UNITタイムは1970年1月1日0時からはじまる
// 1900年から1970年の70年を秒で表すと2208988800秒になる
const unsigned long seventyYears = 2208988800UL;
// NTPタイムスタンプから70年分の秒を引くとUNIXタイムが得られる
unsigned long epoch = secsSince1900 - seventyYears;
Serial.print("Unix time = ");
Serial.println(epoch);
// Timeライブラリに時間を設定(UNIXタイム)
// 日本標準時にあわせるために+9時間しておく
setTime(epoch + (9 * 60 * 60));
Serial.print("JST is ");
Serial.print(year());
Serial.print('/');
Serial.print(month());
Serial.print('/');
Serial.print(day());
Serial.print(' ');
Serial.print(hour());
Serial.print(':');
Serial.print(minute());
Serial.print(':');
Serial.println(second());
Serial.println();
Serial.print("localtime = ");
Serial.println(epoch);
}
//=========================== JJY ===========================
unsigned int calcTimeCodeDuration()
{
int s = second();
if (s == 0)
setupTimeCode();
return timecode[s] * 100;
}
void setupTimeCode()
{
int i;
memset(timecode, 8, sizeof(timecode));
setupTimeCode100(minute(), 0);
timecode[0] = 2;
setupTimeCode100(hour(), 10);
int d = dayOfYear();
setupTimeCode100(d/10, 20);
setupTimeCode100(d%10*10, 30);
int parity1 = 0, parity2 = 0;
for (i = 12; i < 20; i++) parity1 ^= timecode[i] == 5;
for (i = 1; i < 10; i++) parity2 ^= timecode[i] == 5;
timecode[36] = parity1 ? 5 : 8;
timecode[37] = parity2 ? 5 : 8;
setupTimeCode100(year()%100, 40);
for (i = 44; i > 40; i--)
timecode[i] = timecode[i-1];
timecode[40] = 8;
int w = weekday() - 1;
timecode[50] = (w & 4) ? 5 : 8;
timecode[51] = (w & 2) ? 5 : 8;
timecode[52] = (w & 1) ? 5 : 8;
timecode[59] = 2;
/* dump */
for (i = 0; i < 60; i++) {
Serial.print(timecode[i], DEC);
Serial.print(i % 10 == 9 ? "\r\n" : " ");
}
Serial.println();
}
void setupTimeCode100(int m, int i)
{
timecode[i+0] = *1};
time_t t = makeTime(tm);
return (now() - t) / SECS_PER_DAY + 1;
}
*1:m/10) & 8) ? 5 : 8;
timecode[i+1] = ((m/10) & 4) ? 5 : 8;
timecode[i+2] = ((m/10) & 2) ? 5 : 8;
timecode[i+3] = ((m/10) & 1) ? 5 : 8;
timecode[i+4] = 8;
timecode[i+5] = ((m%10) & 8) ? 5 : 8;
timecode[i+6] = ((m%10) & 4) ? 5 : 8;
timecode[i+7] = ((m%10) & 2) ? 5 : 8;
timecode[i+8] = ((m%10) & 1) ? 5 : 8;
timecode[i+9] = 2;
}
int dayOfYear()
{
tmElements_t tm = {0, 0, 0, 0, 1, 1, CalendarYrToTm(year(
GEORGIAのジャパンクラフトマン
ブラックコーヒー
本来好きじゃない
いままでずーーっと味が合わないって思ってた
眠気覚ましと太るの気にして、ブラックを選んでいた
でも、この ジャパンクラフトマン は違う
一口飲むだけで、違いが判る
このスッキリした飲み口のブラック
香りがすごく立っていて、とても美味しい!
初めて 美味しい って感じたブラックコーヒー
今、このタイミングで新発見するなんて、まだまだ探索不足だって感じた
500mlのソフトペットボトルで¥140円くらい
諦めちゃダメ
諦めないで継続し続ける事が重要だなって感じた
でも新商品が多いから、実際試しきれずに、商品の入れ替えに至っている
仮に気に入っても、出荷量が少ないといつの間にか消滅する商品もあったり
難しいな
Arduinoは超かんたんって感じた(電波リピータのアンテナ編
アンテナの作り方を検索
効率の良いアンテナを作る
NTP電波時計リピータ製品
筐体に収まるくらい、アンテナは小さい?
40kHzのアンテナ(西日本は60kHz)
アンテナの仕組み
λ(ラムダ)を計算する必要があるらしい
λ=300M(m/s)/40k(Hz)=7,500(m)
え!?7.5km?波長が!?(w
じゃあ無理(w
1/4波長って言っても8kmを4で割っても2kmでしょう?
そんなアンテナ作れないし(w
他の方法探そう・・・
アンテナの知識
波長の計算
一辺30cmのアンテナ自作
フェライトロッドでバーアンテナ
細かく計算している
既製品電波時計を兼リピータへ改造
ビニール線5~10m位で3mも飛ぶアンテナ
既製品 P18-NTP のアンテナ
小さいよ(w
バーアンテナ
ROHMの情報
アンテナの特性
総括
なるほど、長い線を使えば良さそう
Arduinoは超かんたんって感じた(検証編
アルデュイーノの動作検証
PCと繋いでいる時は、自動的に電力が供給されて動作する
更に、シリアルモニタを起動すれば、動作していると解る
今回買ったアルデュイーノはLANケーブルを差し込むと派手にLEDが点滅するから動作しているだろうなーって解る
最後にアンテナを付けた時にLEDが点滅するから、動作していることが解る
周波数はさすがに解らないから
https://www.amazon.co.jp/gp/product/B077D3XWHX/ref=oh_aui_detailpage_o03_s00?ie=UTF8&psc=1
これを使えば、周波数は確認できる
アンテナが難しい
SEIKOの電波時計4台で電波受信検証
40kHzの周波数では3台は成功
60kHzの周波数では1台しか成功していない
アンテナの作りが悪いのでは?と感じた
DAシリーズのラインナップ
私のはDA203Wで電波受信機能の状態が非常に悪く、一度も受信しない
他の情報として
DA206W DA208K も絶望的にダメらしい
TALK LINERシリーズは全部ダメらしい
元からの設計がダメらしい
これにはとてもビックリ
電波受信した時の動作
針のあるアナログ時計は、秒針が止まるから直ぐ判る
秒針がシンクロして回っている時計達をみると、不思議な感じがする
同じメーカの物なのに、作りが違うのは何故?
1台は見た目電波時計だけど、一度も電波を受信できない。壊れているんじゃない?
電界強度を見てみた
https://www.amazon.co.jp/gp/product/B07CSTKDWR/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1
これでアンテナの効果範囲を探ってみた
結構飛ばない
1mも離れると、電界強度計のLEDが消灯する
やっぱりアンテナの作りが悪いんだって解る
でも、近くなら絶対受信出来ている筈
つまり、SEIKOのTALK LINERは壊れているっぽい?それか製品クオリティが元から低いか
受信メータの振れ具合はとても良いのに
アルデュイーノの電源
アルデュイーノの電源ソケットにはACアダプタが接続できる
センタープラスタイプのACアダプタ
7V~12Vと言われている
6VのセンタープラスACアダプタを繋いだところ、動作している
後はアルデュイーノを箱に収めて、ACアダプタを接続すれば、電波リピーターの完成
総括
LEDが点滅を開始しないと電波は飛んでいない証拠
LANケーブルがきちんと刺さっているか確認
また、DHCPでIPアドレスを取得するようになっているので、DHCPサーバ機能がルータその他で機能しているか確認が必要
DHCPが使えない場合、固定IPアドレスを設定する必要がある
電圧不足の懸念を払拭したいなら7V以上のACアダプタを用意する
センタープラスのACアダプタでなければならない
アルデュイーノ本体は回路むき出しだから、ショートの懸念があり、注意するべき事柄
あとはアンテナ次第。それでも適当なアンテナでも10cm以内なら電波でアジャスト可能
ケースに収めて部屋中の電波時計に適応させたいなら
devmakot.hateblo.jp
電波リピータアンテナ編を参考にする
Arduinoは超かんたんって感じた(動作編
これまでのあらまし
準備編:準備
導入編:アルデュイーノの入り口
試行編:元となるプログラムから好みの動作プログラムを追加・変更
動作編:前編で動作がおかしかったプログラムを見直して動作する様に変更した
動作編
前編で動作がおかしかったプログラムを見直した
詳しくは前編を参照(元になったプログラムへのリンクも)
ちゃんと動作するプログラムに進化させるために、Arduinoオフィシャルサイトへ行って、ちょっと資料を読んでプログラムを改変した
結果、動作するようになった
可能な限りプログラムは書きたくない(書き換えたくない)から最小変更で済むように変更した
実践
元になった記事
の様に、Arduino3ピンにLEDを取り付けて、ワニ口の線をくるくる巻いて、GNDへつないで、電波時計の受信自動調整を試した
セイコーの時計4台中3台は受信した。残りの1台は何かおかしい。製品としておかしいのでは?
中華電波時計(全く同一2台)は電波を一切受信してくれない
プログラム
元となったプログラムへの追加や変更の仕方は前編を参照
NTPプログラムの動作から初めて
元となったプログラムを部分的に貼り付けて動作を確認しながら進めた
ここには最終結果を貼り付け
#include <Time.h>
#include <TimeLib.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
// bit set / clear
#ifndef cbi
#define cbi(PORT, BIT) (_SFR_BYTE(PORT) &= ~_BV(BIT))
#endif
#ifndef sbi
#define sbi(PORT, BIT) (_SFR_BYTE(PORT) |= _BV(BIT))
#endif
// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
unsigned int localPort = 8888; // local port to listen for UDP packets
char timeServer = "time.nist.gov"; // time.nist.gov NTP server
const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message
byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets
// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
byte timecode[60];
unsigned long lastNTPTime = 0;
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// start Ethernet and UDP
if (Ethernet.begin(mac) == 0) {
Serial.println("Failed to configure Ethernet using DHCP");
// no point in carrying on, so do nothing forevermore:
for (;;)
;
}
Udp.begin(localPort);
NTPSetTime();
setupTimeCode();
}
void loop(){
int wait_start = second();
while (wait_start == second()); // wait until time is corrected
unsigned long startTime = millis();
// generate 40khz from 3 pin using PWM
pinMode(3, OUTPUT);
digitalWrite(3, LOW);
TCCR2A = _BV(WGM20);
TCCR2B = _BV(WGM22) | _BV(CS20);
OCR2A = F_CPU / 2 / 40000/*hz*/;
OCR2B = OCR2A / 2; /* 50% duty */
sbi(TCCR2A,COM2B1);
// calc signal duration (ms)
int ms = calcTimeCodeDuration();
// wait ms and stop PWM
while (millis() - startTime < ms);
cbi(TCCR2A,COM2B1);
if (millis() - lastNTPTime > 60*60*1000L) {
NTPSetTime();
setupTimeCode();
lastNTPTime = millis();
}
}
// send an NTP request to the time server at the given address
void sendNTPpacket(char* address) {
// set all bytes in the buffer to 0
memset(packetBuffer, 0, NTP_PACKET_SIZE);
// Initialize values needed to form NTP request
// (see URL above for details on the packets)
packetBuffer[ 0] = 0b11100011; // LI, Version, Mode
packetBuffer[ 1] = 0; // Stratum, or type of clock
packetBuffer[ 2] = 6; // Polling Interval
packetBuffer[ 3] = 0xEC; // Peer Clock Precision
// 8 bytes of zero for Root Delay & Root Dispersion
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
// all NTP fields have been given values, now
// you can send a packet requesting a timestamp:
Udp.beginPacket(address, 123); //NTP requests are to port 123
Udp.write(packetBuffer, NTP_PACKET_SIZE);
Udp.endPacket();
}
//=========================== NTP ===========================
void NTPSetTime(){
int packetSize;
do{
sendNTPpacket(timeServer);
Serial.println("Waiting NTP response ...");
delay(1000*5);
packetSize = Udp.parsePacket();
Serial.print("Received packet of size ");
Serial.println(packetSize);
}
while(!packetSize);
Udp.available();
// バッファに受信データを読み込む
Udp.read(packetBuffer, NTP_PACKET_SIZE);
// 時刻情報はパケットの40バイト目からはじまる4バイトのデータ
unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
// NTPタイムスタンプは64ビットの符号無し固定小数点数(整数部32ビット、小数部32ビット)
// 1900年1月1日0時との相対的な差を秒単位で表している
// 小数部は切り捨てて、秒を求めている
unsigned long secsSince1900 = highWord << 16 | lowWord;
Serial.print("Seconds since Jan 1 1900 = " );
Serial.println(secsSince1900);
// NTPタイムスタンプをUNIXタイムに変換する
// UNITタイムは1970年1月1日0時からはじまる
// 1900年から1970年の70年を秒で表すと2208988800秒になる
const unsigned long seventyYears = 2208988800UL;
// NTPタイムスタンプから70年分の秒を引くとUNIXタイムが得られる
unsigned long epoch = secsSince1900 - seventyYears;
Serial.print("Unix time = ");
Serial.println(epoch);
// Timeライブラリに時間を設定(UNIXタイム)
// 日本標準時にあわせるために+9時間しておく
setTime(epoch + (9 * 60 * 60));
Serial.print("JST is ");
Serial.print(year());
Serial.print('/');
Serial.print(month());
Serial.print('/');
Serial.print(day());
Serial.print(' ');
Serial.print(hour());
Serial.print(':');
Serial.print(minute());
Serial.print(':');
Serial.println(second());
Serial.println();
Serial.print("localtime = ");
Serial.println(epoch);
}
//=========================== JJY ===========================
unsigned int calcTimeCodeDuration(){
int s = second();
if (s == 0)
setupTimeCode();
return timecode[s] * 100;
}
void setupTimeCode(){
int i;
memset(timecode, 8, sizeof(timecode));
setupTimeCode100(minute(), 0);
timecode[0] = 2;
setupTimeCode100(hour(), 10);
int d = dayOfYear();
setupTimeCode100(d/10, 20);
setupTimeCode100(d%10*10, 30);
int parity1 = 0, parity2 = 0;
for (i = 12; i < 20; i++) parity1 ^= timecode[i] == 5;
for (i = 1; i < 10; i++) parity2 ^= timecode[i] == 5;
timecode[36] = parity1 ? 5 : 8;
timecode[37] = parity2 ? 5 : 8;
setupTimeCode100(year()%100, 40);
for (i = 44; i > 40; i--)
timecode[i] = timecode[i-1];
timecode[40] = 8;
int w = weekday() - 1;
timecode[50] = (w & 4) ? 5 : 8;
timecode[51] = (w & 2) ? 5 : 8;
timecode[52] = (w & 1) ? 5 : 8;
timecode[59] = 2;
/* dump */
for (i = 0; i < 60; i++) {
Serial.print(timecode[i], DEC);
Serial.print(i % 10 == 9 ? "\r\n" : " ");
}
Serial.println();
}
void setupTimeCode100(int m, int i)
{
timecode[i+0] = *1};
time_t t = makeTime(tm);
return (now() - t) / SECS_PER_DAY + 1;
}
何故か最後が途切れる
何なの?このブログ。プログラム貼っただけなのに、変な切れ方するの止めて!!!
こんな所、苦労する所じゃないのに!???
信じられない!
因みに、この行が最後の行なのに、この行以降に文字が表示されるのは何故???
*1:m/10) & 8) ? 5 : 8;
timecode[i+1] = ((m/10) & 4) ? 5 : 8;
timecode[i+2] = ((m/10) & 2) ? 5 : 8;
timecode[i+3] = ((m/10) & 1) ? 5 : 8;
timecode[i+4] = 8;
timecode[i+5] = ((m%10) & 8) ? 5 : 8;
timecode[i+6] = ((m%10) & 4) ? 5 : 8;
timecode[i+7] = ((m%10) & 2) ? 5 : 8;
timecode[i+8] = ((m%10) & 1) ? 5 : 8;
timecode[i+9] = 2;
}
int dayOfYear(){
tmElements_t tm = {0, 0, 0, 0, 1, 1, CalendarYrToTm(year(
Arduinoは超かんたんって感じた(試行編
動かしたかったプログラム
で部屋中の電波時計がずれてる問題を解消したくて
こちらのプログラムを動かして、部屋の電波時計の時間を揃えたい
Arduinoは簡単
情報が溢れてる
何かを持ってきて(コピー)
どこかに貼り付ける(ペースト)
するだけで、プログラムが動く
プログラム知らなくても、試行錯誤でいけそうな気がする
ネットワークから時間を取得するところまでは出来てる
あとは
- 取得した時間を電波時計にわかるように変えて
- 電波にして出す
だけ
参考プログラムを眺める
//=======NTP========
と書かれている部分以降が必要っぽいから、コピーして、プログラムの一番最後に追加して貼り付ける
例によって
☑を押してみる
怒られた
timecode[]がないって言われた
オリジナルコードの
これを、コピーして、プログラムの上の方に貼り付ける
同じ様な位置に入れれば良さそうだから
☑を押してみる。通った
追加したプログラムは、ただ追加しただけ
もう少し、追加が必要
この calcTimeCodeDuration() を呼んでいる部分をオリジナルの方で探す
この loop() の部分が殆ど必要そう
だから、元あった loop(){}を全部消して、この部分に入れ替えてみて、☑を押す
sbiがないって怒られた
これが必要そうだから
同じ様な位置に追加してみた
また怒られた
lastNTPTimeが無いって
これを同じ様な位置に入れて
☑を押す
Udp~で怒られた
Udp.readPacket は Udp.read に変更が必要そう
Arduinoリファレンス(EthernetUDP::read())
変わったんだね~
だから
Packet
って文字だけ削除
同様に
Udp.sendPacket も Udp.write に変更が必要そう
Arduinoリファレンス(EthernetUDP::write())
だから、ここでは
sendPacket を write に書き換える
時間がおかしくなっちゃったけど、動いている
void setup() の
この2行が必要そう
☑を押して⇒を押す
時間がとんでもないことになっちゃった(w
Arduinoは超かんたんって感じた(導入編
ちょっと動かす編
ちょっと動かして、様子を見る
Arduinoのウィンドウが表示されている
☑を押す(一番左のボタン):検証:ミスを調べる
⇒を押す(左から2番目のボタン):プログラムをArduinoへ送る
シリアルモニタ:動作させて、結果を得る
何も表示されない(からわからない)
操作してみる
プログラムは組まない
どこからか持ってきて(コピー)
貼り付ける(ペースト)
だけ
ArduinoにLANケーブルをつないでから
このページのプログラムだけをこぴぺ
Arduinoの窓(ウィンドウ)へ貼り付ける
このとき、最初から入っているプログラムは全部消してから、ペースト
☑を押す。ファイル保存を促されるから保存する。
コンパイルが完了しました、と表示される
⇒を押す。スケッチをコンパイルしています>ボードへ書き込みが完了しました、と表示が変わる
Ctrl+Shift+Mを押して、シリアルモニタを表示させ、ちょっと待つ
何かが表示された
ネットワークに繋いで、時間を取得している
プログラムを見ると、このサイトにつないで、時間を取得して、表示してる
何もプログラムを打ち込んでいない
ただ貼り付けただけ
・・・でも、表示はおかしい
表示のおかしいのをただす
その前に、時間だけじゃなくて、日付も表示する
このページを参考に
プログラムを見比べてみると、とても似ている部分がある
この部分を
似ているから、こっちに置き換えると、こうなる
できた。☑を押す
怒られた。時間関係を扱えないって言ってる。
時間を扱う為に、Timeライブラリをインクルードする
もういちど、☑すると、終わったから、⇒を押す
正しく時間を取得してる
UTCって時間がずれてるのがわかる
でも、実はUTCは基準時間で、日本が+9時間ずれているのがわかった
何もしていないのに、動くのは簡単としか言いようがない
だって、プログラム何も書いてないのに、動く
時間を取得して、表示してる
どこからかプログラムをコピーして
貼り付けて
動く
感動しかない!!!