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