下期第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);
}

您可能也會喜歡…

發佈留言