【ESP8266+TM1650时钟数码管+DS3231模块】制作网络时钟

【ESP8266+TM1650时钟数码管+DS3231模块】制作网络时钟

所需元器件

  • ESP8266 NodeMCU——开发板
  • TM1650时钟数码管——显示时钟
  • DS3231模块——网络对时

接线方式

  • TM1650
    SCL—>D1
    SDA—>D2
  • DS3231
    SCL—>D1
    SDA—>D2

代码

#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <Wire.h>
#include <TM1650.h>
#include <SPI.h>  // not used here, but needed to prevent a RTClib compile error
#include <RTClib.h>
#include <UnixTime.h>


const char *ssid = "***";
const char *password = "***";


DS3231 RTC;
TM1650 d;
UnixTime stamp(8);  // 定义东八区时间


WiFiUDP ntpUDP;
// NTPClient timeClient(ntpUDP, "cn.ntp.org.cn", 28800);
NTPClient timeClient(ntpUDP, "cn.ntp.org.cn");


int h, m, s = 0;
int ii = 0;

String intToStr(int x) {
  if (x < 10) {
    return "0" + String(x);
  }
  return String(x);
}

void setup() {
  Serial.begin(74880);
  // Start the I2C interface
  Wire.begin();
  d.init();
  d.displayOn();
  d.setBrightnessGradually(5);
  RTC.begin();
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {  // 连接wifi
    ii++;
    Serial.print(".");
    if (ii % 2 == 0) {
      d.setDot(1, true);
    } else {
      d.setDot(1, false);
    }
    delay(500);
  }
  timeClient.begin();
  d.displayString("8888");
}

void loop() {
  // 0点更新时间
  if (h + m + s == 0) {
    timeClient.update();
    Serial.println("开始同步NTP时间");
    stamp.getDateTime(timeClient.getEpochTime());
    RTC.adjust(DateTime(stamp.year, stamp.month, stamp.day, stamp.hour, timeClient.getMinutes(), timeClient.getSeconds()));
    Serial.println("同步NTP时间完成");
  }
  // 以下获取RTC时间
  DateTime now = RTC.now();
  h = now.hour();
  m = now.minute();
  s = now.second();
  // 以下格式化HH:MM并显示
  String hhmm = intToStr(h) + intToStr(m);
  char charBuf[10];
  hhmm.toCharArray(charBuf, 10);
  d.displayString(charBuf);
  // 以下显示秒的跳动
  d.setDot(1, true);
  delay(500);
  d.setDot(1, false);
  delay(500);
}


时钟效果

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用数码管需要连接到ESP32-C3的引脚,可以使用任何数字引脚,例如GPIO0~GPIO19。 以下是一个基本的示例代码,使用数字引脚连接到共阴极数码管: ```c++ #include <Arduino.h> // 数码管引脚定义 #define A_PIN 2 #define B_PIN 3 #define C_PIN 4 #define D_PIN 5 #define E_PIN 6 #define F_PIN 7 #define G_PIN 8 #define DP_PIN 9 // 数码管数字定义 const byte DIGITS[] = { B11111100, // 0 B01100000, // 1 B11011010, // 2 B11110010, // 3 B01100110, // 4 B10110110, // 5 B10111110, // 6 B11100000, // 7 B11111110, // 8 B11110110 // 9 }; void setup() { // 设定引脚模式 pinMode(A_PIN, OUTPUT); pinMode(B_PIN, OUTPUT); pinMode(C_PIN, OUTPUT); pinMode(D_PIN, OUTPUT); pinMode(E_PIN, OUTPUT); pinMode(F_PIN, OUTPUT); pinMode(G_PIN, OUTPUT); pinMode(DP_PIN, OUTPUT); // 初始化数码管,显示数字0 digitalWrite(A_PIN, HIGH); digitalWrite(B_PIN, HIGH); digitalWrite(C_PIN, HIGH); digitalWrite(D_PIN, HIGH); digitalWrite(E_PIN, HIGH); digitalWrite(F_PIN, HIGH); digitalWrite(G_PIN, LOW); digitalWrite(DP_PIN, HIGH); } void loop() { // 显示 0~9 的数字 for (int i = 0; i < 10; i++) { displayDigit(i); delay(1000); } } // 显示数字 void displayDigit(int digit) { if (digit < 0 || digit > 9) return; byte segments = DIGITS[digit]; digitalWrite(A_PIN, bitRead(segments, 0)); digitalWrite(B_PIN, bitRead(segments, 1)); digitalWrite(C_PIN, bitRead(segments, 2)); digitalWrite(D_PIN, bitRead(segments, 3)); digitalWrite(E_PIN, bitRead(segments, 4)); digitalWrite(F_PIN, bitRead(segments, 5)); digitalWrite(G_PIN, bitRead(segments, 6)); digitalWrite(DP_PIN, HIGH); } ``` 在这个示例中,我们使用共阴极数码管,并将它连接到ESP32-C3的数字引脚。我们还定义了一个数字数组,包含每个数字的段式显示模式。 在setup()函数中,我们将所有的引脚设置为输出模式,并初始化数码管以显示数字0。 在loop()函数中,我们使用displayDigit()函数显示0~9的数字。该函数接受一个数字参数,并设置数码管的引脚以显示相应的数字。 在displayDigit()函数中,我们使用DIGITS数组获取数字对应的段式显示模式,并设置数码管的引脚以显示该数字。 您可以根据需要修改示例代码以显示您想要的数字。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值