| 
 | 
 
 
 本帖最后由 慕名而来 于 2022-4-18 13:49 编辑  
 
继续我们的话题! 
刚刚看到本帖的朋友请回顾此贴:还谈编程菜鸟与arduino-esp8266之间的那些事——LCD12864时钟【1】https://www.mydigit.cn/thread-307525-1-1.html 
硬件配置在前文中已经详细的说过了,这里给出NODEMUC(ESP8266模块)与12864LED的连接图,虽然不是原理图但应该更直观,详见下图: 
 
 
 
关于arduino编程方面因为我没有深入学习只是一个能凑合使用的水平,所以太深奥的东西不在本题的讨论范围内,只忠告一点:如果代码编译时出现关于引用头文件的错误提示,请查看你的系统中是否缺少相关的库,需要的话可以在“库管理”中下载添加即可。关于各种库文件太详细的解析我弄不了不能展开细说了有不懂的请移步百度自行学习吧,本文计时部分用到了TimeLib库,打开TimeLib.h文件可以发现,它调用了time.h同时又定义、声明了一些time.cpp中的东西,而time.h中只引用了TimeLib.h,arduino库文件的这种封装、包含模式我每次看都是云里雾里的这里就不琢磨了。 
下面是编程过程详解: 
1.试图得到可以运行的时间数据: 
如果不借助RTC芯片,我们用C51单片机实现时钟显示的方法就是利用片内定时/计数器来编程实现,首先弄出一个秒累加而后是60秒、3600秒如此循环运作就形成了可以运行的时间了,本着这个想法去琢磨8266的定时器相关的东西但我百度了好久没弄明白,于是找相关的示例程序,但作为鸟语盲我也不知道那些Time示例除了几个带GPS、NTP、RTC字眼大致知道含义外其他的都不知道用途,于是挨个打开浏览、最后在Timeserial这个示例中发现一个方法就是利用year()、month()、、、这些函数获取日期、时间参数而它引用的是TimeLib.h文件,借助百度翻译粗略的看了一下这个文件,发现原来这些年月日时间都是以1970年为起始点根据当前时间推算出来的,能力所限这些也不详解了。 
 
2.编程历程: 
从示例Timeserial开始编写自己的代码其实并没遇到困难,开始演示这个例程在串口监视器的发送窗口复制粘贴程序介绍的鸟语中的一串字符:T1357041600,发送后就可以在接收窗口中看到走时的时间输出了,详解下图: 
 
 
 
 
 
 
 
接下来修改这个例程让他按照自己的想法显示如下图: 
 
 
 
接下来就是如何初始化这个输出时间的问题了,说实话我知道串行发送的这个串就是初始化时间,在程序中能够看出来它是通过这条语句来初始化时间的:setTime(pctime); 而这个pctime就是程序读回的我们在串口中发送的字符串T1357041600, 但我却不知道数据的对应关系,于是再翻看头文件最终找到了这个函数原型的声明:void   setTime(int hr,int min,int sec,int day, int month, int yr);于是再次修改自己的代码就显示正常了,见下图: 
 
 
 
至此,模拟时钟程序就算完成了,接下来在工程中添加两个文件,一个是my_time.cpp  另一个是my_time.h   
至于在arduino ide窗口的右上角点击那个三角符号-->新建标签-->填写上述文件名字这些谁都不知道的操作我就私藏保留了,请看官莫怪哈。  
 
本帖将这两个文件的完整版本分享给各位感兴趣的新手朋友,如果有兴趣一起玩耍的话就复制后粘贴到你的工程窗口相应的文件中去吧: 
 
//****my_time.cpp**** 
//代码原创:wannenggong 
//使用请标明出处! 
 
- //代码原创:wannenggong
 
 - #include "my_time.h"
 
 - #include "TEXT.h"
 
 - #include "wifi_time.h"
 
 - extern int8_t time_dat[];
 
  
- void my_time_init()  
 
 - {
 
 -   setTime(time_dat[2],time_dat[1],time_dat[0],time_dat[4],time_dat[5],time_dat[6]);//初始化时间(格式为:时、分、秒、日、月、年)
 
 -   digitalClockDisplay();//上电显示初始时间2022-04-15-周五 11:59:00
 
 -   wifi_connect();//获取网络时间更新time_dat[]数据
 
 -   setTime(time_dat[2],time_dat[1],time_dat[0],time_dat[4],time_dat[5],time_dat[6]);//校准显示时间
 
 - }
 
  
- void digitalClockDisplay()
 
 - {
 
 -   int8_t mo,da,wk,hh,hi,mm,ss;
 
 -   int32_t yy;  
 
 -   char xingqi[][4]= {"日","一","二","三","四","五","六"};//数组用于将set_week()函数换算结果的数字转换成汉字显示
 
 -   yy=year();
 
 -   mo=month();  
 
 -   da=day(); 
 
 -   hh=hour();
 
 -   mm=minute();
 
 -   ss=second();  
 
 -   wk=set_week(yy,mo,da);//换算星期几
 
 - //时钟运行为24小时制、时钟显示为12小时制  
 
 - //显示时间的转换
 
 -   if(hh>0&&hh<=12)
 
 -   {
 
 -     hi=hh;     //午前
 
 -   }
 
 -   if(hh>12)
 
 -   {
 
 -     hi=hh%12;  //午后
 
 -   }
 
 -   if(hh==0)
 
 -   {
 
 -     hi=12;     //零点显示为12点  
 
 -   }
 
 - //0:01:00和12:01:00校时  
 
 -   if(((hh==0)&&(mm==1)&&(ss==0))||((hh==12)&&(mm==1)&&(ss==0)))
 
 -   {
 
 -     my_time_init();
 
 -   }
 
 -   PutGB8_16(0,0,0,mo/10);
 
 -   PutGB8_16(0,0,1,mo%10);//显示月
 
 -   PutHZ16_16(0,1,"月");//月
 
 -   PutGB8_16(0,0,4,da/10);
 
 -   PutGB8_16(0,0,5,da%10);//显示日
 
 -   PutHZ16_16(0,3,"日");//日
 
 -   
 
 -   PutGB16_32(0,1,2,hi/10);
 
 -   PutGB16_32(0,1,3,hi%10);
 
 -   PutGB16_32(0,1,5,mm/10);
 
 -   PutGB16_32(0,1,6,mm%10);
 
 -   PutHZ16_16(0,6,"周");
 
 -   PutHZ16_16(0,7,xingqi[wk]);
 
 -  
 
 -   if(ss%2==0)
 
 -   PutGB16_32(0,1,4,10);//显示秒点儿
 
 -   else
 
 -   PutGB16_32(0,1,4,11);//显示空格
 
 - }
 
  复制代码 
 
 
//****my_time.h**** 
 
- #ifndef __MY_TIME_H
 
 - #define __MY_TIME_H
 
 - #include <TimeLib.h>
 
  
 
- void my_time_init();
 
 - void digitalClockDisplay();
 
  
 
- #endif
 
  复制代码 
 
代码中的一些显示函数容后细讲本帖就不多说了。 
 
欲知后事如何且听下回分解,话说我有代码你有兴趣吗? 
 
--------本帖毕 
 
 
 
 |   
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册 
 
 
 
 
x
 
 
打赏
- 
查看全部打赏
 
 
 
 
 
 |