本文將介紹一個基于 ESP8266(從 NTP 服務(wù)器獲取時間)和 Neopixel Ring 的簡單時鐘,以彩色顯示小時、分鐘和秒。
介紹
為了做出這個簡單的時鐘,我買了一個 24 LED Neopixel Ring 。我最初計劃將它用于 Cheerlights 項目,但在制作了 Cheerlight 之后,我認(rèn)為這是對 Neopixel Ring的嚴(yán)重浪費。因此,在一周后我下定了決心。我最終決定用 Ring 制作一個時鐘。
你需要什么
ESP8266 與 wifi 一樣非常適合此功能,因此可以通過 WiFi 獲取時間,并且還可以控制 Neopixel Ring。我使用 Wemos D1 Mini,因為它們非常易于使用,具有用于電源和數(shù)據(jù)的微型 USB 連接,只需幾美元,并且可以很容易地與 Arduino IDE 一起使用。這是一個非常簡單的項目,代碼簡單,電路方式不多。
Neopixel 環(huán)有 3 個連接:5v、接地和數(shù)據(jù)。您需要做的就是將 3 根電線焊接到環(huán)上的這 3 個焊盤上。D1 Mini 上的 VCC 和 Gnd 連接到 5v 和接地,數(shù)據(jù)引腳可以連接到任何輸出引腳。
對于代碼,您將需要 3 個庫:
Adafruit_NeoPixel庫可以從https://github.com/adafruit/Adafruit_NeoPixel下載
TimeClient庫是 Squix 氣象站代碼的一部分,可以從https://github.com/squix78/esp8266-weather-station下載
只需將TimeClient.cpp和 TimeClient.h 文件復(fù)制到您的草圖文件夾中。
TimeClient 庫通過 WiFi 連接到互聯(lián)網(wǎng)并訪問www.google.com來工作。然后它會抓取網(wǎng)頁的標(biāo)題以從標(biāo)題中獲取時間和日期。
當(dāng)您將 ESP8266 安裝為可識別的板時,ESP8266WiFi庫隨 Arduino IDE 一起提供。在開始項目之前,不要忘記使用 Arduino IDE Boards Manager 安裝 ESP8266 文件。
第 1 步
我們將使用 D1 Mini 上的 Pin 5 作為數(shù)據(jù)線。
#define PIN D5
我們需要在我們的代碼中跟蹤最后一次來自互聯(lián)網(wǎng)的時間更新是什么時候發(fā)生的,以及自一秒前以來已經(jīng)過了多長時間(以跟蹤秒數(shù))。
long lastUpdate = millis();
long lastSecond = millis();
小時、分鐘和秒存儲在字符串變量中。
String hours, minutes, seconds;
以及我們跟蹤的當(dāng)前秒、分和小時。
int currentSecond, currentMinute, currentHour;
字符數(shù)組用于存儲您的 WiFi SSID 和密碼。在此處輸入您自己的詳細(xì)信息:
char ssid[] = "xxxxxxx"; // your network SSID (name)
char pass[] = "xxxxxxx"; // your network password
我住在倫敦,所以我與 UTC 有 0 小時的偏移,但夏令時除外,它是 1 小時。為您自己的時區(qū)設(shè)置偏移量。
const float UTC_OFFSET = 0;
我們創(chuàng)建一個 timeClient 對象并將 UTC 偏移量傳遞給它。
TimeClient timeClient(UTC_OFFSET);
然后創(chuàng)建一個 NeoPixel 對象,將其命名為“strip”,并將 LED 的數(shù)量和我們用于數(shù)據(jù)線的引腳傳遞給它。
Adafruit_NeoPixel strip = Adafruit_NeoPixel(24, PIN);
第 2 步
在設(shè)置功能中,我們將首先打開串行通信以進(jìn)行調(diào)試。
void setup()
{
Serial.begin(115200);
然后需要初始化 NeoPixel 環(huán),我們將亮度設(shè)置為 50%
strip.begin();
strip.setBrightness(128);
在我們執(zhí)行 .show 命令之前,環(huán)上什么都不會發(fā)生。
strip.show();
接下來我們連接到您的 WiFi:
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
然后從 timeClient 庫中更新時間。
timeClient.updateTime();
接下來我們運行我們自己的函數(shù) updateTime(); 它調(diào)用庫函數(shù)來獲取當(dāng)前的小時、分鐘和秒。
updateTime() ;
最后,在主循環(huán)之前,我們檢索并存儲 millis() 的當(dāng)前值,以便我們可以跟蹤自上次從互聯(lián)網(wǎng)更新時間以來已經(jīng)過去了多長時間,并且還可以跟蹤經(jīng)過的秒數(shù),因此第二個可以更新。
lastUpdate = millis();
lastSecond = millis();
}
第 3 步
設(shè)置功能完成。接下來主循環(huán)函數(shù)將運行。
void loop()
{
如果距離我們上次更新時間已經(jīng)過去了 1,800,000 毫秒(30 分鐘),我們將再次從 Internet 更新時間。
if ((millis() - lastUpdate) > 1800000) updateTime();
顯示器上的小時、分鐘和秒每秒都會更新一次,因此我們需要檢查自上次更新顯示器以來是否經(jīng)過了 1000 毫秒。如果是,則執(zhí)行 if 語句中的代碼。
if ((millis() - lastSecond) > 1000)
{
第 4 步
“手”的顏色是:
紅色 = 小時
綠色 = 分鐘
藍(lán)色 = 秒
.setPixelColor 命令用于設(shè)置“手”的顏色。我使用的戒指有 24 個 RGB LED,因此秒和分鐘除以 2.5,因此它們顯示在戒指的正確象限上,小時(24 小時格式)除以 2。在時間更改之前,我們設(shè)置當(dāng)前'hands' 到 OFF 以清除最后的位置。
strip.setPixelColor(currentSecond / 2.5, 0, 0, 0);
strip.setPixelColor(currentMinute / 2.5, 0, 0, 0);
strip.setPixelColor(currentHour * 2, 0, 0, 0);
strip.show();
現(xiàn)在存儲 millis() 的當(dāng)前值。
lastSecond = millis();
接下來,存儲在 currentSecond 中的值增加 1。然后我們檢查秒數(shù)是否超過 59,如果是,則將它們設(shè)置回 0。發(fā)生這種情況時,我們還將分鐘數(shù)增加 1 并執(zhí)行相同的檢查。如果分鐘超過 59,那么我們也將小時增加 1。
currentSecond++;
if (currentSecond > 59)
{ currentSecond = 0;
currentMinute++;
if (currentMinute > 59) {
currentMinute = 0;
currentHour++;
if (currentHour > 12) currentHour = 0;
}
}
雖然沒有必要,但我將當(dāng)前時間打印到串行監(jiān)視器窗口以進(jìn)行調(diào)試。我使用 String 對象來生成時間字符串。
String currentTime = String(currentHour) + ':' + String(currentMinute) + ':' + String(currentSecond);
Serial.println(currentTime);
現(xiàn)在已經(jīng)更新了秒、分和小時,我們可以將相關(guān)的“指針”設(shè)置為它們各自的 RGB 值。
strip.setPixelColor(currentSecond / 2.5, 0, 0, 255);
strip.setPixelColor(currentMinute / 2.5, 0, 255, 0);
strip.setPixelColor(currentHour * 2, 255, 0, 0);
strip.show();
最后,我們創(chuàng)建了自己的函數(shù) updateTime()。這會在開始時更新,然后每 30 分鐘更新一次,以保持準(zhǔn)確的時間。
void updateTime()
{
我們從 timeClient 庫中獲取小時、分鐘和秒。
hours = timeClient.getHours();
minutes = timeClient.getMinutes();
seconds = timeClient.getSeconds();
并將這些值存儲為整數(shù)(它們從 timeClient 庫作為字符串返回)。24 小時轉(zhuǎn)換為 12 小時格式。
currentHour = hours.toInt();
if (currentHour > 12) currentHour = currentHour - 12;
currentMinute = minutes.toInt();
currentSecond = seconds.toInt();
最后,我們希望能夠檢查自上次更新以來是否已經(jīng)過去了 30 分鐘,因此我們再次存儲 millis() 的當(dāng)前值。
lastUpdate = millis();
-
時鐘
+關(guān)注
關(guān)注
11文章
1747瀏覽量
131828 -
ESP8266
+關(guān)注
關(guān)注
50文章
962瀏覽量
45356
發(fā)布評論請先 登錄
相關(guān)推薦
帶有Neopixel的ESP8266崩潰的原因?
使用esp8266實現(xiàn)STM32聯(lián)網(wǎng)(最簡單USART方法)
利用ESP8266 WiFi模塊打造科進(jìn)行遙控的圣誕之星
使用ESP8266模塊和12864顯示屏實現(xiàn)網(wǎng)絡(luò)時鐘的資料合集
![使用<b class='flag-5'>ESP8266</b>模塊和12864<b class='flag-5'>顯示</b>屏<b class='flag-5'>實現(xiàn)</b>網(wǎng)絡(luò)<b class='flag-5'>時鐘</b>的資料合集](https://file.elecfans.com/web1/M00/CE/26/pIYBAF-fqy6AcPSuAAEonwd4rgc637.png)
詳細(xì)實現(xiàn)ESP8266WIFI時鐘(基于51單片機)
![詳細(xì)<b class='flag-5'>實現(xiàn)</b><b class='flag-5'>ESP8266</b>WIFI<b class='flag-5'>時鐘</b>(基于51單片機)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ESP8266 WIFI模擬GPS時鐘信號
![<b class='flag-5'>ESP8266</b> WIFI模擬GPS<b class='flag-5'>時鐘</b>信號](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ESP8266矩陣時鐘PCB設(shè)計
![<b class='flag-5'>ESP8266</b>矩陣<b class='flag-5'>時鐘</b>PCB設(shè)計](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
SSD1306 OLED上的ESP8266 NTP時鐘
![SSD1306 OLED上的<b class='flag-5'>ESP8266</b> NTP<b class='flag-5'>時鐘</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ESP8266初次如何實現(xiàn)無線通信(基于電腦與ESP8266)
![<b class='flag-5'>ESP8266</b>初次如何<b class='flag-5'>實現(xiàn)</b>無線通信(基于電腦與<b class='flag-5'>ESP8266</b>)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論