ESP8266
一.简介
最近看到好多朋友都在制作时钟,感觉挺实用的所以自己也来制作一个省的打开手机来看时间,其实懒到一定程度也是一种境界,其实就是为了那种成就感把,废话不多说直接开始制作教程,很详细哟。
二.准备
1.这里我们需要用到一下模块
- ESP8266 12F我们的核心板
- DS1302时钟模块,自带电池断电也没事,直接获取时间真的很方便
- TM1637时间显示模块,也就是用数码管来显示我们的时间,只能显示4位数字,所以就不显示秒了,就显示时间和日期
2.开发环境
这里我们使用Arduino1.8.12来开发,当然其他版本也是没问题的,这就只是制作一个时钟,所以就不用大费周章来自己写函数,自己调用库就可以了,节省我们的时间成本,也降低了开发难度。
但是使用的库得我们自己来安装,操作也特别简单
下载DS1302和TM1637库
地址:点击此处下载
下载成功之后,将库文件解压到我们Arduino软件安装目录下的libraries目录下
这样库就安装成功了
3.管脚定义
各模块按照下面表进行连接
ESP8266 | DS1302 |
---|---|
3V | VCC |
GND | GND |
D7(GPIO13) | CLK |
D6(GPIO12) | DAT |
D5(GPIO14) | RST |
ESP8266 | TM1637 |
---|---|
D1(GPIO5) | CLK |
D2(GPIO4) | DAT |
3V | VCC |
GND | GND |
由于在代码中使用的都是GPIO的号,所以将ESP8266的全部管脚的定义图放出来
三.代码
#include <stdio.h>
#include <DS1302.h>
#include "TM1637.h"
//时钟显示模块管脚定义
#define CLK 5
#define DIO 4
TM1637 tm1637(CLK,DIO);
//时钟模块管脚定义
#define kCePin 14 // 复位引脚
#define kIoPin 12 // 数据引脚
#define kSclkPin 13 // 时钟引脚
DS1302 rtc(kCePin, kIoPin, kSclkPin);
// 时间分隔符闪烁标识
bool ShowPoint = true;
//时间和日期交替显示
int showCount = 0;
namespace {
String dayAsString(const Time::Day day) {
switch (day) {
case Time::kSunday: return "Sunday";
case Time::kMonday: return "Monday";
case Time::kTuesday: return "Tuesday";
case Time::kWednesday: return "Wednesday";
case Time::kThursday: return "Thursday";
case Time::kFriday: return "Friday";
case Time::kSaturday: return "Saturday";
}
return "(unknown day)";
}
}
void printTime() {
// 从模块获得当前时间
Time t = rtc.time();
// 星期几
const String day = dayAsString(t.day);
// 格式化时间数据
char buf[50];
snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d",
day.c_str(),
t.yr, t.mon, t.date,
t.hr, t.min, t.sec);
Serial.println(buf);
}
void showTime(){
// 从模块获得当前时间
Time t = rtc.time();
int h = t.hr;
int mn = t.min;
int b0 = h / 10;
int b1 = h % 10;
int b2 = mn / 10;
int b3 = mn % 10;
tm1637.display(0, b0);
tm1637.display(1, b1);
tm1637.point(ShowPoint);
tm1637.display(2, b2);
tm1637.display(3, b3);
ShowPoint = !ShowPoint;
}
void showData(){
// 从模块获得当前时间
Time t = rtc.time();
int m = t.mon;
int d = t.date;
int m0 = m / 10;
int m1 = m % 10;
int d2 = d / 10;
int d3 = d % 10;
tm1637.display(0, m0);
tm1637.display(1, m1);
tm1637.display(2, d2);
tm1637.display(3, d3);
tm1637.point(false);
} // namespace
void setTime(){
// 设置初始时间为 2018-1-18,17:28:00 星期四
Time t(2018, 1, 18, 17, 28, 0, Time::kThursday);
rtc.time(t);
}
void setup() {
Serial.begin(9600);
rtc.writeProtect(false);
rtc.halt(false);
//时钟显示模块的初始化
tm1637.init();
//设置亮度0-7
tm1637.set(2);
}
void loop() {
//每隔10s显示一次日期
if( showCount <= 10 )
{
showTime();
showCount++;
delay(1000);
}
else
{
showData();
showCount = 0;
delay(2000);
}
}