hzc1111 发表于 2020-1-4 20:59:00

mcu方案arduino获取NTP

      大道理就不讲了,ntp是什么,意义在哪?对于任意一个智能设备而言,一个精确的实时更新的时间无疑能让它更对得起“智能”这个词,个人认为对于无线模块来说获取NTP远比什么远程开关重要得多,所以不是很明白为什么平台明明已经在协议中给出了接口却不进一步完善它(在库文件里写了个半拉子的函数),在论坛查找相关教程也只是一句简单“调用”,亦或者给出了32的教程视频,没有arduino的,确实想要获取ntp不是多复杂的事,我也不是只想做伸手党,但要知道小白哪里都有,况且平台也声称是一个面向开发者用户提供快速接入使用的平台,所以既然已经给出了接口为什么不完善一下比如在自动生成的代码中(主程序)加入一个可以让人直接用的函数。(吐槽攻城狮+1)      好了,牢骚发完了还是分享一下这几天瞎琢磨的结果吧,真是浪费时间主要参考了这位大哥的教程http://club.gizwits.com/thread-165362-1-1.html,根据他的教程是可以实现的,但其实有些东西是重复的,就像我前面说的:库文件里面明明已经有了(吐槽攻城狮+2)。

      第一步:用记事本或者其他打开自动生成的项目文件夹Gizwits里面的gizwits_protocol.c,里面有一个gizwitsGetNTP(void)函数,这个就是让模块获取ntp的函数,

但显然这个函数并没有返回值,所以直接调用并不能得到你想要的时间值。所以要在这个协议库文件里面自行构建一个时间处理函数:
protocolTime_t ICACHE_FLASH_ATTR returnmytime(void)
{
        protocolTime_t pT;
        protocolTime_t *ptime = (protocolTime_t *)(uint8_t *)&gizwitsProtocol.TimeNTP;
        pT.year = ptime->year;
        pT.month = ptime->month;
        pT.day = ptime->day;
        pT.hour = ptime->hour;
        pT.minute = ptime->minute;
        pT.second = ptime->second;
        pT.ntp = ptime->ntp;
        return pT;
}

随便找个地方加进去就行,比如在最后

别问为哈,我也不知道为啥,加进去就对了。然后保存关掉它。
      第二步:在.c文件中的函数当然还要在.h文件中**一下,所以打开对应的头文件gizwits_protocol.h,大概在这么个地方加进去这句:
protocolTime_t returnmytime(void);

保存,在关掉之前可以往上找找,可以看到里面已经定义了相关事件变量的结构体了

所以之前说另一位兄弟有些步骤重复了。

对了,还有个地方,不知道是工程师疏忽还是我电脑有问题,在gizwits_protocol.h里面这个地方有条定义没有换行,没用到的时候编译是没出错,但像我上面的改动了之后编译就出错了,可能是此时调用到这个定义了吧

总之,给它回车换行再保存就好了。


       第三步:在arduino主程序里面调用。按理说要在loop()函数里面调用gizwitsGetNTP(void),但这样高频率地请求ntp显然会影响其他程序的运行,而且也没必要,所以通过定时器中断来调用这个函数,先调用定时器库文件:
#include <MsTimer2.h>
然后在setup()函数里面设置定时器中断:
MsTimer2::set(1000,gizwitsGetNTP);
MsTimer2::start();

说明:中断函数直接调用ntp获取函数就好了,当然如果你还想干别的事情就另写一个中断函数。这里是定时1秒,即每个1秒钟就获取一次ntp,刚好正常的时间变化就是以秒为单位。所以显示出来的效果刚好就是一秒一秒的刷新的,如果定时间隔更久的话刷新也就更慢。除非你有RTC作为本地时钟,ntp只作为对时用,否则建议还是定时1秒最佳。另外我这里在初始化函数里面直接开启中断了,意味着一上电的时间是不准的,等连上网后才会自动更新,也可以选择在模块联网后再开启中断,个人觉得其实没什么大碍。
       最后一步:在loop()函数里面调用我们前面自己构建的时间处理函数:
protocolTime_t mtime = returnmytime();
没什么特殊要求的话把它放在一开头就好了。
这样一来,就可以直接得到几个时间变量,都是属于自定义的类成员mtime的,所以就是mtime.hour表示时钟,mtime.minute表示分钟,mtime.second表示秒钟······其他几个时间也类似
用串口监视器看一下效果:
String ntp = String("")+mtime.year+"-"+mtime.month+"-"+mtime.day+"\t"+mtime.hour+":"+mtime.minute+":"+mtime.second;
Serial.println(ntp);

1
注意:我用的是2560的板子,mcu跟WiFi模块通信是用3好串口,所以才能用串口监视器打印,如果你用的是UNO或者其他单串口的板子就不能用串口监视器了,用不用都无所谓,这里只是为了演示一下效果而已,毕竟咱们获取这个时间也不是为了在串口监视器上看的,你只要知道使用的是哪些变量就行了。
看一下在OLED上的效果吧

       一路看下来其实就这么几步并不是多复杂,但还是开始讲的,既然水泥都和好了,为什么不把路给铺了?如果是老师,那么鼓励学生多采坑多思考固然是好的,但作为平台,为用户提供最快捷,最方便,最易懂的操作接口难道不是一个提升用户量的最佳选择吗,你知不知道有多少人是因为在其他物联网云平台碰了壁才转到机智云的。顺便再吐槽一次Q群的技术支持,我要是都懂了还问你干什么呢?难不成你还指望随口丢出一个“π”就让我背出3.1415926······吗?希望后台管理能稍稍留意一下这篇帖子吧,这不是抹黑贴,而是由衷建议。
毕竟我也希望平台能够做强做大,这样我们才能有一个稳定可靠的开发平台。

hzc1111 发表于 2020-1-4 21:00:28

对了,星期几的变量还不知道怎么获取,如果有人搞出来麻烦告知一下

admin 发表于 2020-1-6 15:39:18

谢谢分享内容很中用

SPONGEBOB 发表于 2020-5-4 17:26:43

楼主我想问一下我oled显示时间是乱码

hzc1111 发表于 2020-5-16 10:35:04

SPONGEBOB 发表于 2020-5-4 17:26
楼主我想问一下我oled显示时间是乱码

你在串口监视器上打印时间看有问题吗,如果没问题的话就是在OLED 屏幕的显示格式出问题了

哒哒哒嘀哒哒 发表于 2022-4-19 15:55:01

中肯的 一针见血的
页: [1]
查看完整版本: mcu方案arduino获取NTP