ESP8266 + MAX 7219 简易的自动同步的倒计时时钟

正好最近有大事情想需要倒计时

然后翻遍了家里的犄角旮旯,发现还有个很古老的 ESP8266 还闲置着

所以就拿过来用了

引脚接法

其实没什么好说的,如果会接的话根据自己的想法接上去然后修改代码就好了

当然,给出来的代码是这样接的(左 MAX7219 右 ESP8266):

VCC — 3V

GND — GND

DIN — D5

CS — D6

CLK — D7

至于为什么我会这么接

因为刚刚好可以一排线怼一起了

具体实现

废话不多说,直接上代码好了

#include "LedControl.h"
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <ArduinoJson.h>LedControl lc = LedControl(14,13,12,1); unsigned long delaytime=250;
const String url = "http://quan.suning.com/getSysTime.do";int GetDays(int iYear1, int iMonth1, int iDay1, int iYear2, int iMonth2, int iDay2)   //1. 确保 日期1 < 日期2
{unsigned int iDate1 = iYear1 * 10000 + iMonth1 * 100 + iDay1;unsigned int iDate2 = iYear2 * 10000 + iMonth2 * 100 + iDay2;if (iDate1 > iDate2){iYear1 = iYear1 + iYear2 - (iYear2 = iYear1);iMonth1 = iMonth1 + iMonth2 - (iMonth2 = iMonth1);iDay1 = iDay1 + iDay2 - (iDay2 = iDay1);}//2. 开始计算天数//计算 从 iYear1年1月1日 到 iYear2年1月1日前一天 之间的天数int iDays = 0;for (int i = iYear1; i < iYear2; i++){iDays += (IsLeapYear(i) ? 366 : 365);}//减去iYear1年前iMonth1月的天数for (int i = 1; i < iMonth1; i++){switch (i){case 1: case 3: case 5: case 7: case 8: case 10: case 12:iDays -= 31;break;case 4: case 6: case 9: case 11:iDays -= 30;break;case 2:iDays -= (IsLeapYear(iYear1) ? 29 : 28);break;}}//减去iYear1年iMonth1月前iDay1的天数iDays -= (iDay1 - 1);
//加上iYear2年前iMonth2月的天数
for (int i = 1; i < iMonth2; i++){switch (i){case 1: case 3: case 5: case 7: case 8: case 10: case 12:iDays += 31;break;case 4: case 6: case 9: case 11:iDays += 30;break;case 2:iDays += (IsLeapYear(iYear2) ? 29 : 28);break;}}//加上iYear2年iMonth2月前iDay2的天数iDays += (iDay2 - 1);return iDays;
}//判断给定年是否闰年
bool IsLeapYear(int iYear)
{if (iYear % 100 == 0)return ((iYear % 400 == 0));elsereturn ((iYear % 4 == 0));
}String GetTime() {if (WiFi.status() == WL_CONNECTED) {WiFiClient client;HTTPClient http;http.begin(client, url.c_str());int httpResponseCode = http.GET();String res = "202103082332";if (httpResponseCode > 0) {Serial.println("HTTP Response code: " + String(httpResponseCode));res = http.getString();Serial.println("Got: " + res);} else {Serial.println("Error code: " + String(httpResponseCode));}http.end();return DateHandle(res);} else {Serial.println("WiFi Connected Error");return "202103082332";}
}String DateHandle(String payload) {int jsonBeginAt = payload.indexOf("{");int jsonEndAt = payload.lastIndexOf("}");if (jsonBeginAt != -1 && jsonEndAt != -1) {payload = payload.substring(jsonBeginAt, jsonEndAt + 1);const size_t capacity = JSON_OBJECT_SIZE(2) + 60;DynamicJsonDocument doc(capacity);deserializeJson(doc, payload);const char* sysTime1 = doc["sysTime1"];const char* sysTime2 = doc["sysTime2"];return sysTime1;}return "202103082332";
}void setup() {Serial.begin(9600);WiFi.begin("WiFiName", "WiFiPassword");Serial.println("Waiting for connecting ...");int i = 0;while (WiFi.status() != WL_CONNECTED) {delay(100);Serial.print(".");}lc.shutdown(0,false);lc.setIntensity(0,8);lc.clearDisplay(0);
}void ShowDigits(int num) {lc.clearDisplay(0);String numStr = String(num);Serial.println("There is " + numStr + " day(s) to go");if (numStr.length() == 1) {lc.setDigit(0, 4, numStr.toInt(), false);lc.setChar(0, 3, 'd', false);} else if (numStr.length() == 2) {lc.setDigit(0, 4, numStr.substring(0, 1).toInt(), false);lc.setDigit(0, 3, numStr.substring(1, 2).toInt(), false);} else if (numStr.length() == 3) {lc.setDigit(0, 5, numStr.substring(0, 1).toInt(), false);lc.setDigit(0, 4, numStr.substring(1, 2).toInt(), false);lc.setDigit(0, 3, numStr.substring(2, 3).toInt(), false);lc.setChar(0, 2, 'd', false);} else if (numStr.length() == 4) {lc.setDigit(0, 5, numStr.substring(0, 1).toInt(), false);lc.setDigit(0, 4, numStr.substring(1, 2).toInt(), false);lc.setDigit(0, 3, numStr.substring(2, 3).toInt(), false);lc.setDigit(0, 2, numStr.substring(3, 4).toInt(), false);}
}void loop() { String Date = GetTime();int NowYear = Date.substring(0, 4).toInt();int NowMonth = Date.substring(4, 6).toInt();int NowDay = Date.substring(6, 8).toInt();Serial.println("Now time is " + String(NowYear) + "." + String(NowMonth) + "." + String(NowDay));ShowDigits(GetDays(NowYear, NowMonth, NowDay, 2022, 06, 20));delay(3600000);
}
  1. 计算两日期之差代码来源:Arduino如何实现日期差的计算-Arduino中文社区 - Powered by Discuz!

  2. 替换 WiFiName 和 WiFiPassword 成自己家的 WiFi 就可以了

  3. 然后修改倒数第五行的后面那个日期,就是倒计时的目标日期

  4. 默认休眠一个小时自动获取

  5. 当前时间获取 API:http://quan.suning.com/getSysTime.do

  6. 为了偷懒,请求失败我没有重新请求,只单单返回了一个固定的时间

效果展示

为了居中

  • 1 位数字会显示:Xd
  • 2 位数字会显示:XX
  • 3 位数字会显示:XXXd
  • 4 位数字会显示:XXXX
  • 5 位数字及以上没有显示

ESP8266 + MAX7219 做一个简易的自动同步的倒计时时钟相关推荐

  1. 怎么用线程刷新 tkinter 进度条_tkinter做一个简易提词板(2)

    书接上文 花果山美男子:tkinter做一个简易提词板​zhuanlan.zhihu.com 上回说到,文字的动态效果还可以用after方法和StringVar来实现,今天我们就用它们来重新制作提词板 ...

  2. 用layui做一个简易的登录注册页面

    用layui做一个简易的登录注册页面 1.首先在主页绑定一个点击事件,点击登录按钮就可以弹出一个弹出窗,一般商场登录页面不会跳转一个新页面,因为如果进入一个新页面,登录后需要跳转会原来的页面,这样会导 ...

  3. 做一个简易计算器(VB版)

    今天小编来带大家用VB做一个简易计算器 废话不多说,下面就是具体步骤了 1.创建控件组的方法首先创建一个命令按钮,调整其大小(觉得合适就行),名称为Command1,Caption 属性为数字 0 : ...

  4. 如何用idea做一个简易的网页登录界面

    在上一节课的内容基础上做一个简易的网页登录界面--18级软工1班03 打开idea后打开上一节课的工程文件(一般在打开idea软件的同时,idea会默认打开上一次的文件)并在左边列表的main文件夹下 ...

  5. arduino智能浇花系统_解放双手!自己动手做一个简易智能浇花系统

    原标题:解放双手!自己动手做一个简易智能浇花系统 面对疫情,宅在家的我们可以以各种方式为战"疫"一线的医护工作者.紧急研究病毒的科研人员.口罩厂日夜工作的人们......加油打气. ...

  6. 使用vue-cli+element-ui+expsess+mysql做一个简易的登录功能

    使用vue-cli+element-ui+expsess+mysql做一个简易的登录功能 1使用webpack下载vue模板 vue init webpack aaa(aaa为项目名称) cd到aaa ...

  7. 用JS做一个简易的时间显示动态效果

    用JS做一个简易的时间显示动态效果 运行效果 代码 <!DOCTYPE html> <html lang="en"><head><meta ...

  8. 【新手向】Python做一个简易登录注册GUI界面(无事件绑定)

    Python做一个简易登录注册GUI界面 一,效果展示 (1)运行结果: (2)点击登录: 注:只有用户名:123 密码123456 会提示登录成功. 登录成功示范: 登录失败示范: (3)点击注册 ...

  9. 第三章:做一个简易登陆界面

    一.内容 做一个简易的登陆界面,包含: 1.有账号输入和密码输入 2.有登陆和取消按钮 3.密码要带有屏蔽功能 4.通过取消按钮讲一点槽函数的运用 二.创建工程(初次做这个小例程,附带上建工程的步骤) ...

最新文章

  1. 关于git的使用记录总结
  2. Merkle Tree(梅克尔树)算法解析
  3. 企业网络推广中用户行为到底能为企业网络推广带来多少影响?
  4. Python Tkinter 常用控件空间位置摆放
  5. Windows上搭建Nginx RTMP服务器并使用FFmpeg实现本地视频推流
  6. python mac 安装pillow,关于python:安装了Pillow,但仍然得到“ImportError:没有名为PIL的模块”...
  7. sklearn的train_test_split函数
  8. lenos快速开发脚手架
  9. bpmn2 vue 设计器_vue项目中使用bpmn-基础篇
  10. 有趣的JS 一行代码 偷取所有图片
  11. 华为服务器本地做系统,华为服务器远程做系统安装
  12. 基于Hive数据仓库的标签画像实战
  13. 神经猫java代码_纯HTML5制作围住神经猫游戏-附源码下载
  14. erp java源代码_erp java
  15. dbm和db的关系、区别
  16. 如此美妙,Python 处理CSV、JSON和XML数据的方法真简便
  17. 在计算机系统中存储容量最大的设备,计算机系统中存储容量最大的部件是().
  18. JS/正则 验证 数字 电话号码 传真 邮箱 手机号码 邮编 日期
  19. LTE学习笔记:OFDM
  20. JDBC模拟SQL注入和避免SQL注入

热门文章

  1. 飞思卡尔 s19 转 bin
  2. The Sandbox 与美国时装设计师协会(CFDA)达成合作,为 Web3 和时尚搭建桥梁
  3. 华为OD面经2022-8-9(持续更新)
  4. MySQL:查询每个部门的员工小时平均工资(显示部门名称、部门员工小时平均 工资)
  5. 教matlab唱周董的《七里香》
  6. 直播区块链APP小葫芦星球即将上线
  7. 又一大型色情直播App被捣毁,女主播哭求别告诉家人
  8. html5学习笔记——三、图文展示网页设计
  9. java过滤微信昵称emoji表情
  10. c语言变量对那一次赋值有效,C语言取整+滤波方法.docx