網頁

透過Blynk的RTC工具製作自動對時TM1637七節顯示時鐘



我是一個相當在意時間精準的人,過沒幾天就會把我手上的錶拿起來做個校正,務必要做到分秒不差才行,這純粹只是一種執著與個性,當然有人時間差了好幾分鐘也無所謂,但我個人就不喜歡這樣。

於是我一直希望在家能有一個時鐘,無時無刻顯示的都是最準確的時間,同時又會自己校正,但是我搜尋外面賣的電波校正時鐘(錶)實在是太貴了,於是我今天就要透過Blynk的RTC工具,來做一個會自動連線校準的時鐘,而我之後還會考慮加上溫溼度、PM2.5等等的功能監控家裡環境,最好還可以留一些訊息打字在鬧鐘上。所以我今天就要先嘗試將TM1637七節顯示器,顯示RTC的時間。至於之後顯示的載具要用OLED、LCD、七節就在看情況了。

程式部份我結合了傑森創工所提供的TM1637範例,以及Blynk官方所提供的RTC範例進行結合,將讀取到的RTC時間直接顯示在七節顯示器上。程式碼如下所示,CLK接上NodeMCU的GPIO16(D0);DIO接上GPIO5(D1),至於VCC的部份我接NodeMCU的3.3V是能工作的,只是亮度"稍微"弱了一點,但擔心接5V會有電位基準的問題,所以還是接3.3V保險,畢竟關於ESP8266能不能直接連接5V的IO訊號還是個爭論不停的議題

#define BLYNK_PRINT Serial

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <TimeLib.h>
#include <WidgetRTC.h>
#include "TM1637.h"

#define CLK 16 //CLK pin,可自行決定接到哪個PIN
#define DIO 5 //DIO pin,可自行決定接到哪個PIN
TM1637 tm1637(CLK, DIO);

int point_flag = 0;

char auth[] = "YourAuthToken";

char ssid[] = "YourNetworkName";
char pass[] = "YourPassword";

BlynkTimer timer;
WidgetRTC rtc;

void setup()
{
  Blynk.begin(auth, ssid, pass);
  rtc.begin();

  tm1637.init();
  tm1637.set(BRIGHTEST); //BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;

  timer.setInterval(1000L, digitalClockDisplay);
  setSyncInterval(3600);
}

void loop()
{
  Blynk.run();
  timer.run();
}

void digitalClockDisplay()
{
  bool result = Blynk.connected();
  if (result) {
    //設定每一位燈號顯示的內容,參數1:燈號,參數2:顯示的數字
    tm1637.display(0, hour() / 10);
    tm1637.display(1, hour() % 10);
    tm1637.display(2, minute() / 10);
    tm1637.display(3, minute() % 10);

    //顯示時和分之間的:,如果目前是顯示,就設定下次不顯示
    if (point_flag) {
      tm1637.point(POINT_OFF);
      point_flag = 0;
    } else {
      tm1637.point(POINT_ON);
      point_flag = 1;
    }
  }
  else {
    tm1637.display(0, 0);
    tm1637.display(1, 0);
    tm1637.display(2, 0);
    tm1637.display(3, 0);
    tm1637.point(POINT_ON);
  }
}

上面的程式中每1小時會自動更新一次RTC時間,當硬體斷線後則會顯示00:00的畫面提示,同時中間的":"符號則會間隔1秒點滅,以模擬時鐘的樣子。如此一來這個時鐘就可以永遠不用調整(除非WIFI斷了或Blynk伺服器收掉了),而比較美中不足的地方是,這個時鐘沒有顯示到秒的單位。

下一次我嘗試使用LCD1602來製作顯示日期、時間的樣式,順便試試看能不能透過Terminal工具將一些字句顯示在上面,做一個小小的留言板。