返回

再也不做掉时差星人!ESP8266 + MAX7219 制作简易自动同步倒计时时钟

闲谈

作为一名现代人,我们都被时差这个烦人的问题所困扰。无论是出差、旅行还是与海外友人联系,时差总能让我们头晕目眩,不知所措。为了帮助您轻松应对时差挑战,今天,我们将共同制作一个简易的自动同步倒计时时钟。有了它,您再也不用担心错过重要时刻,成为名副其实的“时差克星”!

为了实现这一目标,我们将利用ESP8266 和 MAX7219 这两个强大的电子组件。ESP8266 是一款功能强大的微控制器,而 MAX7219 则是一款 8 位数的 LED 显示驱动器。我们将利用这两个组件来构建一个可以自动同步时间、并在天数和秒数之间切换显示的倒计时时钟。

在动手制作之前,我们需要先准备好必要的材料:

  • ESP8266 开发板
  • MAX7219 模块
  • 7 段数码管
  • 电阻
  • 电容器
  • 面包板
  • 跳线

准备好这些材料后,就可以按照以下步骤进行组装:

  1. 将 ESP8266 开发板和 MAX7219 模块连接到面包板上。
  2. 将 7 段数码管连接到 MAX7219 模块上。
  3. 为电路供电。
  4. 将 ESP8266 开发板连接到计算机。
  5. 将代码上传到 ESP8266 开发板上。

代码如下:

/*
 * ESP8266 + MAX7219 自动同步倒计时时钟
 * 作者:**您的大名** 
 * 日期:**今日日期** 
 */

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <NTPClient.h>

// WiFi SSID 和密码
const char* ssid = "**您的 WiFi SSID** ";
const char* password = "**您的 WiFi 密码** ";

// NTP 服务器地址
const char* ntpServer = "pool.ntp.org";

// MAX7219 引脚定义
const int dataPin = 2;
const int clockPin = 3;
const int loadPin = 4;

// 倒计时时间(天数)
const int days = 1;

// 倒计时时间(秒数)
const int seconds = 24 * 60 * 60;

// 当前时间戳
unsigned long currentTime;

// 上次切换时间
unsigned long lastSwitchTime;

// 显示天数或秒数的标志位
bool showDays = true;

// 7 段数码管数字编码表
const byte numDigits[10] = {
  0b00111111, // 0
  0b00000110, // 1
  0b01011011, // 2
  0b01001111, // 3
  0b01100110, // 4
  0b01101101, // 5
  0b01111101, // 6
  0b00000111, // 7
  0b01111111, // 8
  0b01101111  // 9
};

void setup() {
  // 初始化串口
  Serial.begin(9600);

  // 连接 WiFi
  Serial.println("正在连接 WiFi...");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  Serial.println("已连接 WiFi");

  // 初始化 NTP 客户端
  Serial.println("正在初始化 NTP 客户端...");
  NTPClient timeClient(ntpServer);
  timeClient.begin();
  while (!timeClient.update()) {
    timeClient.forceUpdate();
  }
  Serial.println("已初始化 NTP 客户端");

  // 初始化 MAX7219 模块
  Serial.println("正在初始化 MAX7219 模块...");
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(loadPin, OUTPUT);
  digitalWrite(loadPin, LOW);
  Serial.println("已初始化 MAX7219 模块");

  // 设置上次切换时间为当前时间
  lastSwitchTime = millis();
}

void loop() {
  // 获取当前时间戳
  currentTime = timeClient.getEpochTime();

  // 每八秒切换显示天数或秒数
  if (millis() - lastSwitchTime >= 8000) {
    showDays = !showDays;
    lastSwitchTime = millis();
  }

  // 显示天数或秒数
  if (showDays) {
    displayDays();
  } else {
    displaySeconds();
  }
}

// 显示天数
void displayDays() {
  // 计算剩余天数
  int daysLeft = days - (currentTime / (24 * 60 * 60));

  // 显示天数
  displayNumber(daysLeft);
}

// 显示秒数
void displaySeconds() {
  // 计算剩余秒数
  int secondsLeft = seconds - (currentTime % (24 * 60 * 60));

  // 显示秒数
  displayNumber(secondsLeft);
}

// 显示数字
void displayNumber(int number) {
  // 逐位显示数字
  for (int i = 0; i < 4; i++) {
    digitalWrite(loadPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, numDigits[number % 10]);
    digitalWrite(loadPin, HIGH);

    number /= 10;
  }
}

上传代码后,倒计时时钟即可正常工作。每八秒,时钟将在天数和秒数之间切换显示。这样,您就可以轻松地知道还剩多少天或多少秒才能到达目标时间。

这款简易自动同步倒计时时钟不仅制作简单,而且功能强大。它可以自动同步时间,并根据您的需要在天数和秒数之间切换显示。有了它,您再也不用担心错过重要时刻,随时随地都能掌控时间流逝。

如果您想了解更多有关ESP8266和MAX7219 的信息,可以参考以下资源: