RTC tai reaaliaikainen kello on yleisimmin käytetty moduuli elektroniikassa ja sulautetuissa laitteissa ajan seuraamiseksi. Mutta RTC: n ongelma on, että tietokoneiden mikrosirut eivät ole niin tarkkoja ja ne voivat antaa vain paikallisen laitteen ajan. Toisaalta Internetin käyttö ajan hakemiseen NTP-palvelimilta on parempi ratkaisu ajan saamiseen, koska se on tarkempaa ja voi tarjota ajankohdan mille tahansa maailman maantieteelliselle alueelle. Tarvitsemme vain Wi-Fi-moduulin ja pääsyn Internetiin saadaksemme aikaa mihin tahansa paikkaan maailmassa NTP-palvelinten avulla. Tässä opetusohjelmassa käytämme ESP8266 NodeMCU: ta saadaksesi nykyisen ajan ja päivämäärän NTP-palvelimilta ja näyttämään sen OLED-näytöllä.
Verkon aikaprotokolla (NTP)
NTP on yksi vanhimmista verkkoprotokollista (IP) kellojen synkronoimiseksi tietokoneverkkojen välillä. Sen on suunnitellut David L. Mills Delawaren yliopistosta vuonna 1981. Tätä protokollaa voidaan käyttää synkronoimaan monia verkkoja UTC-koordinaatteihin muutamassa millisekunnissa. UTC on ensisijainen aikastandardi, jolla maailma säätelee kelloa ja aikaa. UTC ei muutu ja vaihtele maantieteellisesti. NTP käyttää UTC: tä aikaviitteenä ja tarjoaa tarkan ja synkronoidun ajan Internetissä.
NTP toimii hierarkkisella asiakas-palvelin-mallilla. Huippumallissa on vertailukellot, jotka tunnetaan nimellä “stratum0”, kuten atomikellot, radioaallot, GPS, GSM, joka vastaanottaa aikaa satelliitilta. Palvelimia, jotka vastaanottavat aikaa kerrokselta 0, kutsutaan "kerrokseksi 1" ja palvelimia, jotka vastaanottavat aikaa kerroksesta 1, kutsutaan "kerrokseksi 2" ja niin edelleen. Tämä jatkuu ja ajan tarkkuus vähenee jokaisen vaiheen jälkeen. NTP valitsee automaattisesti parhaat synkronoitavissa olevista aikalähteistä, mikä tekee siitä vikasietoisen protokollan.
Joten täällä tässä projektissa saamme aikaa NTP-palvelimelta ESP8266 NodeMCU: n avulla ja näytämme sen OLED-näytöllä. Tämän tyyppinen Internet-kello on rakennettu käyttämällä ESP32 edellisessä opetusohjelmassa.
ESP8266 voi käyttää NTP-palvelimia Internetin avulla saadakseen tarkan ajan. Tässä NTP toimii asiakas-palvelin- tilassa, ESP8266 toimii asiakaslaitteena ja muodostaa yhteyden NTP-palvelimiin UDP: n (User Datagram Protocol) avulla. Asiakas lähettää pyyntöpaketin NTP-palvelimille ja vastineeksi NTP lähettää aikaleimapaketin, joka sisältää tietoja, kuten tarkkuus, aikavyöhyke, UNIX-aikaleima jne. Tämän jälkeen asiakas erottaa päivämäärän ja kellonajan yksityiskohdat, joita voidaan edelleen käyttää sovelluksissa vaatimusten mukaan.
Tarvittavat komponentit
- Yksivärinen 7-nastainen SSD1306 0,96 tuuman OLED-näyttö
- ESP8266 SolmuMCU
- Mikro-USB-kaapeli
- Leipälauta
- Uros-uros-hyppyjohdot
Piirikaavio ja liitännät
Tämä 7-nastainen OLED-näyttö kommunikoi ESP8266-moduulin kanssa SPI-protokollaa käyttäen. Alla on piirikaavio ja liitetaulukko OLED SPI -nastojen liittämiseksi NodeMCU: n kanssa Internet-ajan näyttämiseksi.
Ei. |
OLED-näyttö |
SolmuMCU |
1 |
GND |
GND |
2 |
VDD |
3,3 V |
3 |
SCK |
D5 |
4 |
MOSI (SPI) tai SDA (I2C) |
D7 |
5 |
NOLLAA |
D3 |
6 |
DC |
D2 |
7 |
CS |
D8 |
Lisätietoja tästä yksivärisestä 7-nastaisesta OLED-näytöstä ja sen liitännästä ESP8266 NodeMCU: een seuraa linkkiä.
Koodin selitys
Ensin meidän on ladattava ja asennettava NTP-kirjasto ESP8266: een. NTP-asiakasohjelmalle on saatavana monia kirjastoja. Voit asentaa minkä tahansa niistä Arduino IDE: stä. Tässä opetusohjelmassa olen asentanut Taranaisin NTPClient-kirjaston, koska sitä on helppo käyttää ja sillä on toimintoja päivämäärän ja kellonajan saamiseksi NTP-palvelimilta. ESP8266 NodeMCU voidaan ohjelmoida helposti Arduino IDE: n avulla.
Asentaaksesi NTP-kirjaston, lataa ensin kirjasto yllä olevaa linkkiä käyttämällä ja asenna se sitten Arduino IDE: n avulla. Asenna se valitsemalla Sketch> Sisällytä kirjasto> Lisää.ZIP-kirjasto , avaa sitten Zip-kansio menemällä kohtaan, johon olet ladannut zip-kansion, ja käynnistä Arduino IDE uudelleen.
NTPClient-kirjastossa on esimerkkejä. Avaa Arduino IDE ja Goto-esimerkit> NTPClient> Lisäasetukset . Tässä piirustuksessa annettu koodi näyttää NTP-palvelimen ajan sarjaliitännässä. Käytämme tätä luonnosta näyttämään nykyisen ajan ja päivämäärän OLED-näytöllä.
Täydellinen koodi on saatavana tämän opetusohjelman lopussa, tässä olen selittänyt muutaman tärkeän osan koodista.
ESP8266WiFi-kirjasto tarjoaa ESP8266-spesifiset Wi-Fi-rutiinit yhteyden muodostamiseksi verkkoon. WiFiUDP.h hoitaa UDP-pakettien lähettämistä ja vastaanottamista. Koska käytämme SPI-protokollaa OLED: n liittämiseen NodeMCU: n kanssa, tuomme SPI.h-kirjaston. Ja OLED-näyttöön käytetään "Adafruit_GFX.h" ja "Adafruit_SSD1306.h".
#sisältää
OLED-koko on 128x64, joten asetamme näytön leveydeksi ja korkeudeksi 128 ja 64. Joten määritä muuttujat NodeMCU: han liitetyille OLED-nastoille SPI-viestintää varten.
#define SCREEN_WIDTH 128 // OLED-näytön leveys pikseleinä #define SCREEN_HEIGHT 64 // OLED-näytön korkeus pikseleinä // Ilmoitus SSD1306-näytölle, joka on liitetty SPI-ohjelmistolla (oletusarvo): #define OLED_MOSI D7 #define OLED_CLK D5 #define OLED_DC D2 #define OLED_CS D8 #define OLED_RESET D3
Adafruit_SSD1306-näyttö (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Korvaa "your_ssid" ja "your_password" Wi-Fi SSID: lläsi ja salasanallasi alla olevilla koodiriveillä.
const char * ssid = "sinun_sidi"; const char * password = "salasanasi";
Määritä WI-Fi-yhteys antamalla SSID ja salasana WiFi.begin- toiminnolle. ESP8266: n yhteys kestää jonkin aikaa, ennen kuin se muodostaa yhteyden NodeMCU: han, joten meidän on odotettava, kunnes se muodostaa yhteyden.
WiFi.begin (ssid, salasana); while (WiFi.status ()! = WL_CONNECTED) { viive (500); Sarjaprintti ("."); }
Pyydä päivämäärä ja kellonaika alustamalla aikaohjelma NTP-palvelinten osoitteilla. Paremman tarkkuuden saavuttamiseksi valitse NTP-palvelinten osoite, jotka ovat lähellä maantieteellistä aluettasi. Tässä käytämme “ pool.ntp.org ” -palvelua, joka antaa palvelimia ympäri maailmaa. Jos haluat valita palvelimia Aasiasta, voit käyttää “ asia.pool.ntp.org ”. timeClient vie myös UTC-aikasiirtymän aikavyöhykkeesi millisekunteina. Esimerkiksi Intian UTC-offset on +5: 30, joten muunnamme tämän siirtymän millisekunteina, joka on yhtä suuri kuin 5 * 60 * 60 + 30 * 60 = 19800.
Alue |
UTC-aikasiirtymä (tuntia ja minuuttia) |
UTC-aikasiirtymä (sekuntia) |
INTIA |
+5: 30 |
19800 |
LONTOO |
0:00 |
0 |
NEW YORK |
-5: 00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800 60000);
SSD1306_SWITCHCAPVCC annetaan 3,3 V: n luomiseksi sisäisesti näytön alustamiseksi. Kun OLED käynnistyy, siinä näkyy teksti “ WELCOME TO CIRCUIT DIGEST ” tekstikoolla 2 ja väri SININEN 3 sekunnin ajan.
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("SSD1306: n allokointi epäonnistui")); varten (;;); // Älä jatka, silmukka ikuisesti } display.clearDisplay (); display.setTextSize (2); // Piirrä 2X-mittakaavan tekstinäyttö.setTextColor (SININEN); display.setCursor (5, 2); display.println ("TERVETULOA"); display.println ("CIRCUIT"); display.println ("DIGEST"); display.display (); viive (3000);
NTP-asiakas alustetaan alkamis () -toiminnolla päivämäärän ja ajan asettamiseksi NTP-palvelimilta.
timeClient.begin ();
Update () -toimintoa käytetään vastaanottamaan päivämäärä ja kellonaika aina, kun pyydämme NTP-palvelimia.
timeClient.update ();
Siirtonopeus 115200 on asetettu tulostamaan aika sarjamittarille.
Sarjan alku (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay ovat kirjastofunktio ja antavat nykyisen tunnin, minuutin, sekunnin ja päivän NTP-palvelimelta. Alla olevaa koodia käytetään erottamaan aika AM ja PM välillä. Jos getHours () -tunnin käyttämämme tunti on yli 12, asetamme tuon ajan PM: ksi, muuten sen AM.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int päivä = timeClient.getDay (); jos (hh> 12) { hh = hh-12; display.print (hh); display.print (":"); display.print (mm); display.print (":"); display.print (ss); display.println ("PM"); } else { display.print (hh); display.print (":"); display.print (mm); display.print (":"); display.print (ss); display.println ("AM"); } int päivä = timeClient.getDay (); display.println ("'" + arr_days + "'");
getFormattedDate () -asetusta käytetään päivämäärän hakemiseen muodossa "vvvv-kk-pp" NTP-palvelimelta. Tämä toiminto antaa päivämäärän ja kellonajan muodossa "vvvv-kk-pp T hh: mm: ss . Mutta tarvitsemme vain päivämäärän, joten meidän on jaettava tämä merkkijono, joka on tallennettu date_time- muotoon, "T": een, joka tehdään substing () -toiminnolla, ja sitten tallentaa päivämäärä muuttujaan "date" .
date_time = timeClient.getFormattedDate (); int index_date = päivämäärä_aika.indexOf ("T"); Merkkijono päivämäärä = date_time.substring (0, index_date); Serial.println (päivämäärä); display.println (päivämäärä); display.display ();
Näin OLED-Internet-kello näyttää lopulta: