下期第7堂-物聯網IOT-網路時間
前言
今天會介紹網路校正時間的方式,
讓你的開發板一直不斷自動校正時間,準確率在毫秒等級。
比起一般家裡的時鐘,你的開發板抓到的時間將會 ↙
很多的機器都需要抓時間,尤其是考勤系統,
今天的方法讓你的機器”永不過時”
CH340驅動
插上ESP8266主板
到裝置管理員看PORT在幾號
新增網址:http://arduino.esp8266.com/stable/package_esp8266com_index.json
選擇主板
選擇PORT
下載函式
https://github.com/taranais/NTPClient
放在下面位置
每週一常識—GitHub
https://zh.wikipedia.org/wiki/GitHub
網路時間
記得加上SSID與密碼
#include <ESP8266WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
// 儲存日期及時間的變數
String formattedDate;
String dayStamp;
String timeStamp;
// 設定無線基地台SSID跟密碼
const char* ssid = "";
const char* password = "";
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);
void setup() {
Serial.begin(115200);
// 連接無線基地台
WiFi.begin(ssid, password);
Serial.print("\n Working to connect");
// 等待連線,並從 Console顯示 IP
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
timeClient.begin();
// 設定時區 *60分 * 60秒,例如:
// GMT +1 = 3600
// GMT +8 = 28800 台灣時區
// GMT 0 = 0
timeClient.setTimeOffset(28800);
}
void loop() {
while(!timeClient.update()) {
timeClient.forceUpdate();
}
// formattedDate函式取得的日期格式為: 2018-05-28T16:00:13Z
formattedDate = timeClient.getFormattedDate();
Serial.println(formattedDate);
// 取得日期
int splitT = formattedDate.indexOf("T");
dayStamp = formattedDate.substring(0, splitT);
Serial.print("DATE: ");
Serial.println(dayStamp);
// 取得時間
timeStamp = formattedDate.substring(splitT+1, formattedDate.length()-1);
Serial.print("TIME:");
Serial.println(timeStamp);
delay(5000);
}
打開Serial Monitor,欣賞極度準確的時間吧
(速率 115200)
NTP 小知識(引用自維基百科)
網路時間協定(英語:Network Time Protocol,縮寫:NTP),位於OSI模型的應用層。自1985年以來,NTP是目前仍在使用的最古老的網際網路協定之一。
NTP意圖將時間同步到幾毫秒的誤差內。
NTP通常可以在公共網際網路保持幾十毫秒的誤差,並且在理想的區域網路環境中可以實現超過1毫秒的精度。
https://zh.wikipedia.org/wiki/%E7%B6%B2%E8%B7%AF%E6%99%82%E9%96%93%E5%8D%94%E5%AE%9A
第2部分,加上LCD1620顯示
拔下開發板
安裝LCD
正極VCC-VIN
接地GND-G
SDA – GPIO 4(D2)
SCL – GPIO 5(D1)
插上開發板,沒反應立刻拔下來
選擇主板類型
選擇COM PORT
頭腦小體操
請參考 http://hower.forwebs.net/robot/archives/44
把時間打進LCD螢幕吧。
今日小挑戰
同組的同學,甚至是一整班的同學,有可能讓LED”同時”閃爍嗎?
先想好流程,再試試看寫出程式
如果有小組成功,再提供給全班,試試看全班同步閃爍
以下為今天答案,莫急爆雷,慎入
NTP+LCD 參考答案
#include <ESP8266WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <LiquidCrystal_PCF8574.h>
LiquidCrystal_PCF8574 lcd(0x27); // 有0x27和0x3F兩種
// 儲存日期及時間的變數
String formattedDate;
String dayStamp;
String timeStamp;
// 設定無線基地台SSID跟密碼
const char* ssid = "TCGS-Student";
const char* password = "22205108";
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);
void setup() {
lcd.begin(16, 2); // 初始化LCD
Serial.begin(115200);
// 連接無線基地台
WiFi.begin(ssid, password);
Serial.print("\n Working to connect");
// 等待連線,並從 Console顯示 IP
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
timeClient.begin();
// 設定時區 *60分 * 60秒,例如:
// GMT +1 = 3600
// GMT +8 = 28800 台灣時區
// GMT 0 = 0
timeClient.setTimeOffset(28800);
}
void loop() {
while(!timeClient.update()) {
timeClient.forceUpdate();
}
// formattedDate函式取得的日期格式為: 2018-05-28T16:00:13Z
formattedDate = timeClient.getFormattedDate();
Serial.println(formattedDate);
// 取得日期
int splitT = formattedDate.indexOf("T");
dayStamp = formattedDate.substring(0, splitT);
Serial.print("DATE: ");
Serial.println(dayStamp);
// 取得時間
timeStamp = formattedDate.substring(splitT+1, formattedDate.length()-1);
Serial.print("TIME:");
Serial.println(timeStamp);
lcd.setBacklight(255); //亮度
lcd.clear();
lcd.setCursor(0, 0); //設定游標位置 (字,行)
lcd.print(dayStamp);
lcd.setCursor(0, 1); //設定游標位置 (字,行)
lcd.print(timeStamp);
delay(1000);
}