0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

使用ESP8266從NTP服務器獲取時間并在OLED顯示器上顯示

科技觀察員 ? 來源:circuitdigest ? 作者:阿布舍克 ·巴科利 ? 2022-09-01 16:09 ? 次閱讀

RTC 或實時時鐘電子嵌入式設備中最常用的模塊,用于跟蹤時間。但是 RTC 的問題是計算機中的微芯片不是那么準確,它們只能提供本地設備的時間。另一方面,使用互聯(lián)網(wǎng)從 NTP 服務器獲取時間是獲取時間的更好解決方案,因為它更準確并且可以提供世界上任何地理區(qū)域的時間。我們只需要一個 Wi-Fi 模塊并訪問互聯(lián)網(wǎng)即可通過使用 NTP 服務器獲取世界上任何位置的時間。在本教程中,我們將使用 ESP8266 NodeMCU 從 NTP 服務器獲取當前時間和日期,并將其顯示在 OLED 顯示屏上。

網(wǎng)絡時間協(xié)議 (NTP)

NTP 是用于在計算機網(wǎng)絡之間同步時鐘的最古老的網(wǎng)絡 Internet 協(xié)議 (IP) 之一。它由特拉華大學的 David L. Mills 于 1981 年設計。該協(xié)議可用于在幾毫秒內(nèi)將許多網(wǎng)絡與協(xié)調(diào)世界時 (UTC)同步。UTC 是世界調(diào)節(jié)時鐘和時間的主要時間標準。UTC 不會因不同的地理位置而改變和變化。NTP 使用 UTC 作為時間參考,并通過 Internet 提供準確和同步的時間。

NTP 工作在分層的客戶端-服務器模型上。頂級型號具有稱為“stratum0”的參考時鐘,如原子鐘、無線電波、GPS、GSM,可從衛(wèi)星接收時間。從stratum0接收時間的服務器稱為“stratum1”,從stratum1接收時間的服務器稱為“stratum2”,依此類推。這種情況繼續(xù)下去,時間的準確性在每個階段之后都在下降。NTP 自動選擇幾個可用時間源中最好的一個進行同步,這使其具有容錯能力。

所以在這個項目中,我們使用 ESP8266 NodeMCU 從 NTP 服務器獲取時間并將其顯示在 OLED 顯示器上。

poYBAGMQaEyACYWZAACuCOPQix8528.png

ESP8266 可以使用互聯(lián)網(wǎng)訪問 NTP 服務器以獲取準確的時間。這里 NTP 工作在客戶端-服務器模式,ESP8266 作為客戶端設備使用 UDP(用戶數(shù)據(jù)報協(xié)議)與NTP 服務器連接??蛻舳讼?NTP 服務器發(fā)送一個請求包,然后 NTP 發(fā)送一個時間戳包,其中包含準確度、時區(qū)、UNIX 時間戳等信息。然后客戶端將日期和時間詳細信息分離出來,可以根據(jù)需要在應用程序中進一步使用。

所需組件

單色 7 針 SSD1306 0.96” OLED 顯示屏

ESP8266 NodeMCU

微型 USB 數(shù)據(jù)線

面包板

公對公跳線

電路圖和連接

這款 7 針 OLED 顯示器使用 SPI 協(xié)議與 ESP8266 模塊通信,下面是連接 OLED SPI 針與 NodeMCU 以顯示互聯(lián)網(wǎng)時間的電路圖和連接表。

pYYBAGMQaEiAF2QUAACs4o6h844777.png

poYBAGMQaESAJ86uAAASpfea0-g790.png

代碼說明

首先,我們必須將 NTP 庫下載并安裝到 ESP8266 中。有許多可用于 NTP 客戶端的庫。您可以從 Arduino IDE 安裝其中的任何一個。在本教程中,我安裝了Taranais 的 NTPClient 庫,因為它易于使用并且具有從 NTP 服務器獲取日期和時間的功能。

pYYBAGMQaECAVL1dAAEZmMdDWOI454.png

要安裝 NTP 庫,首先使用上面的鏈接下載庫,然后使用 Arduino IDE 安裝它。要安裝它,請轉(zhuǎn)到Sketch 》 Include Library 》 Add .ZIP Library,然后通過轉(zhuǎn)到您下載 zip 文件夾的位置打開 Zip 文件夾并重新啟動 Arduino IDE。

poYBAGMQaDyADpGrAAFpdLh1_Zo294.png

poYBAGMQaDiAGjIMAAD3Mbz7ggw937.png

NTPClient 庫附帶示例。打開 Arduino IDE 并轉(zhuǎn)到示例 》 NTPClient 》 高級。此草圖中給出的代碼在串行監(jiān)視器上顯示來自 NTP 服務器的時間。我們將使用此草圖在 OLED 顯示屏上顯示當前時間和日期。

pYYBAGMQaDSAVEv5AAESrJPutls545.png

本教程末尾提供了完整的代碼,這里我解釋了代碼的幾個重要部分。

ESP8266WiFi 庫提供 ESP8266 特定的 Wi-Fi 例程以連接到網(wǎng)絡。WiFiUDP.h處理發(fā)送和接收 UDP 包。由于我們使用 SPI 協(xié)議將 OLED 與 NodeMCU 連接,因此我們將導入“SPI.h”庫。而“Adafruit_GFX.h”和“Adafruit_SSD1306.h”用于OLED顯示。

#include  
#include  // 提供我們調(diào)用的 ESP8266 特定 Wi-Fi 例程以連接到網(wǎng)絡
#include  // 處理 UDP 包的發(fā)送和接收
#include  // 用于將 OLED 與 NodeMCU 連接的 SPI 
#include  
#include 

我們的 OLED 尺寸為 128x64,因此我們將屏幕寬度和高度分別設置為 128 和 64。因此,為連接到 NodeMCU 的 OLED 引腳定義變量以進行 SPI 通信。

#define SCREEN_WIDTH 128 // OLED 顯示寬度,以像素為單位
#define SCREEN_HEIGHT 64 // OLED 顯示高度,以像素為單位

// 使用軟件 SPI 連接 SSD1306 顯示器的聲明(默認情況):
#define OLED_MOSI D7 
#define OLED_CLK D5 
#define OLED_DC D2 
#define OLED_CS D8 
#define OLED_RESET D3

Adafruit_SSD1306 顯示器(SCREEN_WIDTH、SCREEN_HEIGHT、OLED_MOSI、OLED_CLK、OLED_DC、OLED_RESET、OLED_CS);

在下面的代碼行中,將“your_ssid”和“your_password”替換為您的 Wi-Fi SSID 和密碼。

const char *ssid = "your_ssid"; 
const char *password = "your_password";

通過向WiFi.begin函數(shù)提供 SSID 和密碼來設置 WI-Fi 連接。ESP8266 的連接需要一些時間才能連接到 NodeMCU,所以我們必須等到它連接上。

WiFi.begin(ssid, 密碼); 
  而(WiFi.status()!= WL_CONNECTED){
    延遲(500);
    Serial.print("."); 
  }

要請求日期和時間,請使用 NTP 服務器的地址初始化時間客戶端。為了獲得更好的準確性,請選擇靠近您的地理區(qū)域的 NTP 服務器的地址。在這里,我們使用“ pool.ntp.org ”,它提供來自世界各地的服務器。如果您想從亞洲選擇服務器,您可以使用“ asia.pool.ntp.org ”。timeClient還采用您的時區(qū)的 UTC 時間偏移量(以毫秒為單位)。例如,印度的 UTC 偏移量為 +5:30,因此我們以毫秒為單位轉(zhuǎn)換此偏移量,等于 5*60*60+30*60 = 19800。

poYBAGMQaC6ABfuVAAAOV_lz7e4762.png

WiFiUDP ntpUDP;

NTPClient timeClient(ntpUDP, "pool.ntp.org", 19800,60000);

SSD1306_SWITCHCAPVCC在內(nèi)部產(chǎn)生 3.3V 電壓來初始化顯示。當 OLED 啟動時,它會顯示“WELCOME TO CIRCUIT DIGEST”,文字大小為 2,顏色為藍色,持續(xù) 3 秒。

if(!display.begin(SSD1306_SWITCHCAPVCC)) 
  { 
    Serial.println(F("SSD1306 分配失敗")); 
    為了(;;); // 不要繼續(xù),永遠循環(huán)
  } 
  display.clearDisplay(); 
  display.setTextSize(2); // 繪制 2X 比例的文本
  display.setTextColor(BLUE); 
  display.setCursor(5, 2); 
  display.println("歡迎來到"); 
  display.println("電路"); 
  display.println("摘要"); 
  顯示.顯示();
  延遲(3000);

NTP 客戶端使用begin()函數(shù)初始化,以從 NTP 服務器設置日期和時間。

timeClient.begin();

Update()函數(shù)用于在我們向 NTP 服務器請求時接收日期和時間。

timeClient.update();

波特率設置為 115200 以在串行監(jiān)視器上打印時間。

序列號.開始(115200);
Serial.println(timeClient.getFormattedTime());

getHours()、getMinutes()、getSeconds()、getDay是庫函數(shù),并從 NTP 服務器提供當前的小時、分鐘、秒和天。下面的代碼用于區(qū)分 AM 和 PM 之間的時間。如果我們使用getHours()獲得的小時數(shù)大于 12,那么我們將該時間設置為 PM,否則設置為 AM。

int hh = timeClient.getHours(); 
int mm = timeClient.getMinutes(); 
int ss = timeClient.getSeconds(); 
int day = timeClient.getDay();

如果(hh>12)
  { 
    hh=hh-12; 
    顯示.打?。╤h);
    display.print(":"); 
    顯示.打印(毫米);
    display.print(":"); 
    顯示.打印(ss);
    display.println("PM"); 
  }
  其他
  { 
    display.print(hh); 
    display.print(":"); 
    顯示.打印(毫米);
    display.print(":"); 
    顯示.打印(ss);
    display.println("AM");  
  } 
  int day = timeClient.getDay(); 
  display.println("'"+arr_days[天]+"'");

getFormattedDate()用于從 NTP 服務器獲取“yyyy-mm-dd”格式的日期。此函數(shù)以“yyyy-mm-dd T hh:mm:ss格式給出日期和時間。但是我們只需要日期,因此我們必須將這個以date_time格式存儲的字符串拆分為由substring()函數(shù)完成的“T”,然后將日期存儲在“date”變量中。

date_time = timeClient.getFormattedDate(); 
  int index_date = date_time.indexOf("T"); 
  字符串日期 = date_time.substring(0, index_date); 
  序列號.println(日期); 
  display.println(日期); 
  顯示.顯示();     

這就是OLED 互聯(lián)網(wǎng)時鐘最終的樣子:

poYBAGMQaCeAM_9xAART_b8c-6U898.png

#include

#include // 提供我們調(diào)用的 ESP8266 特定 Wi-Fi 例程以連接到網(wǎng)絡

#include // 處理 UDP 包的發(fā)送和接收

#include // 用于將 OLED 與 NodeMCU 連接的 SPI

#include

#include


#define SCREEN_WIDTH 128 // OLED 顯示寬度,以像素為單位

#define SCREEN_HEIGHT 64 // OLED 顯示高度,以像素為單位

// 使用軟件 SPI 連接的 SSD1306 顯示器的聲明(默認情況):

#define OLED_MOSI D7

#define OLED_CLK D5

#define OLED_DC D2

#define OLED_CS D8

#define OLED_RESET D3

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);


const char *ssid = "CircuitLoop";

const char *password = "circuitdigest101";


WiFiUDP ntpUDP;

NTPClient timeClient(ntpUDP, "pool.ntp.org", 19800,60000);

字符串 arr_days[]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};

字符串日期時間;

// 您可以指定時間服務器池和偏移量(以秒為單位,

// 稍后可以使用 setTimeOffset() 更改)。另外,您可以指定

// 更新間隔(以毫秒為單位,可以使用 setUpdateInterval() 更改)。




無效設置(){

Serial.begin(115200);

WiFi.begin(ssid, 密碼);


而(WiFi.status()!= WL_CONNECTED){

延遲(500);

Serial.print(".");

}


if(!display.begin(SSD1306_SWITCHCAPVCC))

{

Serial.println(F("SSD1306 分配失敗"));

為了(;;); // 不要繼續(xù),永遠循環(huán)

}

display.clearDisplay();

display.setTextSize(2); // 繪制 2X 比例的文本

display.setTextColor(WHITE);

display.setCursor(5, 2);

display.println("歡迎來到");

display.println("電路");

display.println("摘要");

顯示.顯示();

延遲(3000);

timeClient.begin();

}


無效循環(huán)(){

timeClient.update();



display.clearDisplay();



Serial.println(timeClient.getFormattedTime());



display.setTextSize(2); // 繪制 2X 比例的文本

display.setTextColor(BLUE);

display.setCursor(0, 2);

int hh = timeClient.getHours();

int mm = timeClient.getMinutes();

int ss = timeClient.getSeconds();



如果(hh>12)

{

hh=hh-12;

顯示.打?。╤h);

display.print(":");

顯示.打?。ê撩祝?;

display.print(":");

顯示.打印(ss);

display.println("PM");

}

其他

{

display.print(hh);

display.print(":");

顯示.打?。ê撩祝?br />
display.print(":");

顯示.打?。╯s);

display.println("AM");

}


int day = timeClient.getDay();

display.println("'"+arr_days[天]+"'");



date_time = timeClient.getFormattedDate();

int index_date = date_time.indexOf("T");

字符串日期 = date_time.substring(0, index_date);

序列號.println(日期);

display.println(日期);

顯示.顯示();// 顯示初始文本

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • OLED
    +關注

    關注

    119

    文章

    6213

    瀏覽量

    224497
  • NTP
    NTP
    +關注

    關注

    1

    文章

    174

    瀏覽量

    13932
  • ESP8266
    +關注

    關注

    50

    文章

    962

    瀏覽量

    45177
收藏 人收藏

    評論

    相關推薦

    請問如何在ESP8266使用sntp協(xié)議連接到ssl中的服務器?

    由于不支持的協(xié)議。TLS 協(xié)議用于安全交易,服務器使用 TLSv1.2,我在互聯(lián)網(wǎng)上讀到ESP8266僅支持 TLSv1.1;是嗎? 另一件奇怪的事情是,在我嘗試建立 tcp 連接后,我正確地獲得了時間
    發(fā)表于 07-19 07:30

    使用EsP8266(NodeMCU)連接阿里云服務器

    ??使用EsP8266(NodeMCU)連接阿里云服務器,并在服務器控制臺點亮板載LED燈,進行數(shù)據(jù)上傳和下傳的測試。創(chuàng)建阿里云產(chǎn)品功能定義:先選擇編輯草稿,才可以看到最下面的布爾值那
    發(fā)表于 11-24 06:23

    有人知道使用GPS/RTC模塊作為時間源的ESP8266 NTP服務器嗎?

    有人知道使用 GPS/RTC 模塊作為時間源的 ESP8266 NTP 服務器嗎?我有一個 WiFi 項目,我想在其中聯(lián)網(wǎng)很多 ESP 板。
    發(fā)表于 02-24 07:48

    Esp8266(NodeMCU)連接阿里云服務器

    ??使用EsP8266(NodeMCU)連接阿里云服務器并在服務器控制臺點亮板載LED燈,進行數(shù)據(jù)上傳和下傳的測試。創(chuàng)建阿里云產(chǎn)品功能定義:先選擇編輯草稿,才可以看到最下面的布爾值那
    發(fā)表于 11-16 10:21 ?18次下載
    <b class='flag-5'>Esp8266</b>(NodeMCU)連接阿里云<b class='flag-5'>服務器</b>

    如何利用ESP8266和Neopixel Ring實現(xiàn)時鐘的彩色顯示

    本文將介紹一個基于 ESP8266 NTP 服務器獲取時間)和 Neopixel Ring
    的頭像 發(fā)表于 04-06 15:30 ?2863次閱讀
    如何利用<b class='flag-5'>ESP8266</b>和Neopixel Ring實現(xiàn)時鐘的彩色<b class='flag-5'>顯示</b>

    如何使用ESP8266制作可配置的Web服務器

    在這個項目中,我們首先研究如何在 Arduino IDE 中安裝 ESP8266 插件,然后使用 ESP8266 制作可配置的 Web 服務器。
    的頭像 發(fā)表于 05-10 15:18 ?1.3w次閱讀
    如何使用<b class='flag-5'>ESP8266</b>制作可配置的Web<b class='flag-5'>服務器</b>

    如何在ESP8266實現(xiàn)基于AJAX的網(wǎng)絡服務器

    在本文中,您將學習如何在 ESP8266 實現(xiàn)基于 AJAX 的網(wǎng)絡服務器。
    發(fā)表于 08-06 16:23 ?1979次閱讀
    如何在<b class='flag-5'>ESP8266</b><b class='flag-5'>上</b>實現(xiàn)基于AJAX的網(wǎng)絡<b class='flag-5'>服務器</b>

    OLED顯示器與NodeMCU ESP8266連接的過程

    在本教程中,我們將使用SPI 協(xié)議將 Monochrome 7-pin SSD1306 0.96 OLED Display 與 NodeMCU 連接,并將學習使用 NodeMCU ESP8266OLED 屏幕
    的頭像 發(fā)表于 09-05 15:05 ?9818次閱讀
    將<b class='flag-5'>OLED</b><b class='flag-5'>顯示器</b>與NodeMCU <b class='flag-5'>ESP8266</b>連接的過程

    SSD1306 OLEDESP8266 NTP時鐘

    電子發(fā)燒友網(wǎng)站提供《SSD1306 OLEDESP8266 NTP時鐘.zip》資料免費下載
    發(fā)表于 11-09 11:28 ?0次下載
    SSD1306 <b class='flag-5'>OLED</b><b class='flag-5'>上</b>的<b class='flag-5'>ESP8266</b> <b class='flag-5'>NTP</b>時鐘

    基于ESP8266NTP時鐘

    電子發(fā)燒友網(wǎng)站提供《基于ESP8266NTP時鐘.zip》資料免費下載
    發(fā)表于 11-11 10:06 ?5次下載
    基于<b class='flag-5'>ESP8266</b>的<b class='flag-5'>NTP</b>時鐘

    基于ESP8266的Web服務器

    項目將告訴你如何在不使用 Arduino 的情況下使用 ESP8266 構建 Web 服務器
    發(fā)表于 12-07 11:02 ?1次下載

    ESP8266調(diào)用NTP服務器進行時間校準

    NTP是網(wǎng)絡時間協(xié)議(Network Time Protocol,簡稱NTP),是一種用于同步計算機時間的協(xié)議。NTP
    的頭像 發(fā)表于 05-04 16:29 ?2627次閱讀

    使用ESP8266 OLED和VisuinoNIST TIME服務器獲取日期和時間

    電子發(fā)燒友網(wǎng)站提供《使用ESP8266 OLED和VisuinoNIST TIME服務器獲取日期和時間
    發(fā)表于 06-28 09:55 ?0次下載
    使用<b class='flag-5'>ESP8266</b> <b class='flag-5'>OLED</b>和Visuino<b class='flag-5'>從</b>NIST TIME<b class='flag-5'>服務器</b><b class='flag-5'>獲取</b>日期和<b class='flag-5'>時間</b>

    ESP8266網(wǎng)絡天氣時鐘OLED顯示

    基于ESP8266實現(xiàn)網(wǎng)絡獲取天氣和時鐘并OLED顯示
    的頭像 發(fā)表于 06-28 04:46 ?1321次閱讀
    <b class='flag-5'>ESP8266</b>網(wǎng)絡天氣時鐘<b class='flag-5'>OLED</b><b class='flag-5'>顯示</b>

    ESP8266 太空人動畫的 OLED 顯示

    ESP8266 太空人動畫的 OLED 顯示
    的頭像 發(fā)表于 10-08 15:06 ?311次閱讀
    <b class='flag-5'>ESP8266</b> 太空人動畫的 <b class='flag-5'>OLED</b> <b class='flag-5'>顯示</b>