数码之家

 找回密码
 立即注册
搜索
查看: 2284|回复: 8

[Arduino] 还谈编程菜鸟与arduino-esp8266之间的那些事——LCD12864时钟【2】

[复制链接]
发表于 2022-4-18 13:27:56 | 显示全部楼层 |阅读模式
本帖最后由 慕名而来 于 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
//使用请标明出处!


  1. //代码原创:wannenggong
  2. #include "my_time.h"
  3. #include "TEXT.h"
  4. #include "wifi_time.h"
  5. extern int8_t time_dat[];

  6. void my_time_init()  
  7. {
  8.   setTime(time_dat[2],time_dat[1],time_dat[0],time_dat[4],time_dat[5],time_dat[6]);//初始化时间(格式为:时、分、秒、日、月、年)
  9.   digitalClockDisplay();//上电显示初始时间2022-04-15-周五 11:59:00
  10.   wifi_connect();//获取网络时间更新time_dat[]数据
  11.   setTime(time_dat[2],time_dat[1],time_dat[0],time_dat[4],time_dat[5],time_dat[6]);//校准显示时间
  12. }

  13. void digitalClockDisplay()
  14. {
  15.   int8_t mo,da,wk,hh,hi,mm,ss;
  16.   int32_t yy;  
  17.   char xingqi[][4]= {"日","一","二","三","四","五","六"};//数组用于将set_week()函数换算结果的数字转换成汉字显示
  18.   yy=year();
  19.   mo=month();  
  20.   da=day();
  21.   hh=hour();
  22.   mm=minute();
  23.   ss=second();  
  24.   wk=set_week(yy,mo,da);//换算星期几
  25. //时钟运行为24小时制、时钟显示为12小时制  
  26. //显示时间的转换
  27.   if(hh>0&&hh<=12)
  28.   {
  29.     hi=hh;     //午前
  30.   }
  31.   if(hh>12)
  32.   {
  33.     hi=hh%12;  //午后
  34.   }
  35.   if(hh==0)
  36.   {
  37.     hi=12;     //零点显示为12点  
  38.   }
  39. //0:01:00和12:01:00校时  
  40.   if(((hh==0)&&(mm==1)&&(ss==0))||((hh==12)&&(mm==1)&&(ss==0)))
  41.   {
  42.     my_time_init();
  43.   }
  44.   PutGB8_16(0,0,0,mo/10);
  45.   PutGB8_16(0,0,1,mo%10);//显示月
  46.   PutHZ16_16(0,1,"月");//月
  47.   PutGB8_16(0,0,4,da/10);
  48.   PutGB8_16(0,0,5,da%10);//显示日
  49.   PutHZ16_16(0,3,"日");//日
  50.   
  51.   PutGB16_32(0,1,2,hi/10);
  52.   PutGB16_32(0,1,3,hi%10);
  53.   PutGB16_32(0,1,5,mm/10);
  54.   PutGB16_32(0,1,6,mm%10);
  55.   PutHZ16_16(0,6,"周");
  56.   PutHZ16_16(0,7,xingqi[wk]);

  57.   if(ss%2==0)
  58.   PutGB16_32(0,1,4,10);//显示秒点儿
  59.   else
  60.   PutGB16_32(0,1,4,11);//显示空格
  61. }
复制代码



//****my_time.h****

  1. #ifndef __MY_TIME_H
  2. #define __MY_TIME_H
  3. #include <TimeLib.h>


  4. void my_time_init();
  5. void digitalClockDisplay();


  6. #endif
复制代码


代码中的一些显示函数容后细讲本帖就不多说了。

欲知后事如何且听下回分解,话说我有代码你有兴趣吗?

--------本帖毕



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 1家元 +20 收起 理由
jf201006 + 20 原創內容

查看全部打赏

 楼主| 发表于 2022-4-20 09:57:13 | 显示全部楼层
看来话题没人感兴趣,但是既然开篇了就要善始善终的发完,就当是自己的资料留存在这里。
回复 支持 反对

使用道具 举报

发表于 2022-4-20 16:16:21 | 显示全部楼层
支持!我是小白,正在学......
回复 支持 反对

使用道具 举报

发表于 2022-4-20 18:54:11 | 显示全部楼层
正好我也有这种屏。感谢楼主。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-21 11:03:51 | 显示全部楼层
fsss007 发表于 2022-4-20 18:54
正好我也有这种屏。感谢楼主。

可以玩起来,如果有问题可以回帖讨论。
回复 支持 反对

使用道具 举报

发表于 2022-4-21 13:10:32 | 显示全部楼层
慕名而来 发表于 2022-4-21 11:03
可以玩起来,如果有问题可以回帖讨论。

是啊,记得好久之前买的,看了你的帖子,才想起驱动起来,但page总是不对,是你提示了我,于是用了unsigned int y_arr[]={4,5,6,7,0,1,2,3};
回复 支持 反对

使用道具 举报

发表于 2022-4-24 12:09:41 | 显示全部楼层
咨询下楼主,我玩的geduino mega2560,在最新的IDE(2.0.0 RC3)下,没找到端口在哪里设置,很是恼火
网上搜其他版本的IDE,都有端口设置
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-24 12:22:55 | 显示全部楼层
springvirus 发表于 2022-4-24 12:09
咨询下楼主,我玩的geduino mega2560,在最新的IDE(2.0.0 RC3)下,没找到端口在哪里设置,很是恼火
网上 ...

抱歉,帮不到你,我只是为了玩esp8266才开始了解arduino编程的也只是能玩玩8266,其他arduino的板子没弄过。

打赏

参与人数 1家元 +10 收起 理由
springvirus + 10 熱心助人

查看全部打赏

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-25 02:53 , Processed in 0.093600 second(s), 10 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表