最好的电子音响科技diy制作网站

haoDIY_音响电子电脑科技DIY小制作发明

当前位置: 主页 > 电子DIY > led显示/灯光 > led显示 >

用ESP8266改造LM8562数字钟互联网校时,比GPS省电,比NTP简单,

时间:2017-06-24 22:02来源:数码之家 作者:maidoo 点击:
(1) 需求篇家里的一个钟控收音机。2英寸的数码管,很大。放在冰箱上,老远都看得清楚,就当一个LED数字钟用,收音机功能闲置。开饭、出门的时间都靠它掌握,责任重大!问题在于这个数字钟两周时间就能快十几分钟,平均每天一分种左右。隔十天半个月就要去手
(1) 需求篇

家里的一个钟控收音机。2英寸的数码管,很大。放在冰箱上,老远都看得清楚,就当一个LED数字钟用,收音机功能闲置。开饭、出门的时间都靠它掌握,责任重大!
问题在于这个数字钟两周时间就能快十几分钟,平均每天一分种左右。隔十天半个月就要去手工调整一下,不胜其烦。但是看着这么大的屏幕和造型又舍不得换,改造它的念头由来已久。
这个数字种使用的是钟控专用芯片LM8562,类似的还有TMS3450,LM8560,LM8561等,上个世纪很流行。它使用市电50Hz的频率进行计时。有些还是采用专用的双阴极数码管,有闹钟/睡眠功能。市电频率不准确,走时就不准,这个问题也由来已久,所以也有个专门的芯片MM5369配上3.58MHz的晶振,可以产生很稳定的时基频率配合这类数字钟芯片。现在都讲究互联网思维了,不想用这个片子了。
用ESP8266改造LM8562数字钟互联网校时,比GPS省电,比NTP简单,


用ESP8266改造LM8562数字钟互联网校时,比GPS省电,比NTP简单,

用ESP8266改造LM8562数字钟互联网校时,比GPS省电,比NTP简单,

用ESP8266改造LM8562数字钟互联网校时,比GPS省电,比NTP简单,



(2) 方案篇


为了能给LM8562校时,有两个技术问题要解决:(一)对外:如何获取到准确时间;(二)对内:如何设置时间


(一)获取时间的方案


a) 通过GPS的方案。数码之家的坛子里已经有数不胜数的帖子了,电路图/PCB/源代码都有公开的,C51/AVR/STM32芯片的都齐全。由于不需要GPS的定位精度和速度,只要时间,所以最烂的GPS都可以,剪线GPS十多块钱就能买到。+5V供电也方便,UART串口操作代码也很经典,调试简单。实在是个不错的方案。就是要拖个尾巴到窗边略显麻烦。


b) 通过电波钟,获取商丘的国家授时中心发出的时间信号,这是中国的BPC格式,15元的模块。另外沿海地区还可以收到小鬼子的JJY格式的时间信号。但是目前还不太稳定,白天没夜间信号好,模块本身抗干扰不行,输出端无法直驱单片机,还需要一个运放整理信号,电路复杂些,调试较困难,坛子里的帖子不多。
thomas: 《永不消逝的电波——Arduino制作BCD码电波钟》
http://www.geek-workshop.com/thread-7797-1-1.html


c) 通过互联网获取时间,有个NTP协议专门是干这事的。我们的PC,无线路由器都在用这个协议,指定一个互联网上的NTP Server,一来一回两个报文,作为Client的我们就能计算出当前的准确时间。我本来是想用这个方案的,后来发现有更简单的,就是从服务器的http报文头里面获取当前时间。这个时间是明文字符串,处理起来更容易,虽然理论精度不及NTP,但是用在数字种上足够了。devcang和我想到一块去了。那个数字钟只显示时和分,不显示秒,所以没必要做到秒同步,只要每天校对一次,消除累积误差就可以了。这类方案的不多,搜到坛子里的几个帖子提及,但都没有完整实践。我就选定这个方案了。
电波钟:http://bbs.mydigit.cn/link.php?action=tag&tagname=%B5%E7%B2%A8%D6%D3
renpeng009: 《基于NTP协议网络校时》
http://bbs.mydigit.cn/read.php?tid=1062532

d) 通过CDMA模块,从运营商的移动通信网获取时间。理论上有可能,也有不少困难,性价比不高。不研究。


e) 锁定广播电台的整点对时信号,"嘟嘟嘟嘟嘟,嘀" 的声音,通过锁相环LM567解出这个“嘀”信号后,给数字钟清零。管你快了还是慢了,到这一时刻,统统给我从整点开始。这还是我N多年前,从《中学科技》上看到的。这个方案无法知道当前到底是几点,只知道是个整点了。能消除累积误差,但是初始时间还需要手工设置一下。如果是电池供电的,设置一次就不会忘,问题不大。我的LM8562数字钟没装电池,掉电后时间就归零到凌晨12点了,有点麻烦。

(二)设置时间的方案


a) 废弃LM8562,保留LED屏幕,用单片机计时并驱动。获取到时间后,设置时间自然不在话下。不过改动工程量也是不少的,要不重新制作PCB,要不就会大量飞线。而且LM8562使用的正是双阴极数码管,驱动代码得好好找找。数码之家真是DIYer的大家庭,果然有mengfc网友贡献了双阴极数码管的驱动源代码。实在没有得意的办法时,这是一条退路。
mengfc: 《采用单片机驱动TMS3450数字钟的双阴极LED屏幕》
http://bbs.mydigit.cn/read.php?tid=1177273

b) 祭出IO模拟按键大法,这在我之前的《三个零件,给大金家用中央空调加装遥控功能》 中已经有成功应用。阅读LM8562的资料得知,它有一个时间调整的引脚,平时悬空(二分之一电源电压),接电源负极是分钟加,接电源正极是分钟减。没有单独的小时调整键,调整分钟,小时会自动进位。


举例来说,通过互联网获得当前时间是12:27分,那么单片机先通过IO脚控制LM8562断电再上电,这时LM8562复位到12:00开始计时。然后单片机控制另一个IO模拟按“时间调整”按键27次,LED时钟就调整到12:27了。同理,如果要调整到10:27分,就要模拟按键627次。


实际上,我设计为每天晚上12点到1点之间同步校时一次,这些按键所花费的时间可以忽略。




(3) 硬件篇
改造电路图,参见蓝色的部分。
用ESP8266改造LM8562数字钟互联网校时,比GPS省电,比NTP简单,


继续阅读请打赏22M币,鼓励作者原创更多精彩文章,已有25人打赏支持


 
  1. print("Power on, Setting wifi client connection....")
  2. wifi.setmode(wifi.STATION)
  3. wifi.sta.config("Chinanet","88888888")
  4. wifi.sta.connect()
  5. local cnt = 1
  6. tmr.alarm(1, 1000, 1, function()
  7.     if (wifi.sta.getip() == nil) and (cnt <= 20) then
  8.         print("["..cnt.."] IP invalid, waitting...")
  9.         cnt = cnt + 1
  10.     else
  11.         if (cnt <= 20) then print("Config done, IP is "..wifi.sta.getip())
  12.             tmr.stop(1)
  13.             dofile("netCaliLM8562.lua")
  14.         else print("!!!! Wifi setup time more than 20s, reconnect it again....")
  15.             cnt = 1
  16.             wifi.sta.connect()
  17.         end
  18.     end
  19. end)
  20.  


netCaliLM8562.lua

  1. host = 'baidu.com'
  2. port = 80
  3. --url = "/img/baidu_jgylogo1.gif"
  4. url = '/'
  5. httpPKG = "HEAD " .. url .. " HTTP/1.1\r\nHost: " .. host .. "\r\nConnection: close\r\n\r\n"
  6. curGMT = ""
  7. bConnected = false
  8. calibratedAfterPowerOn = false
  9. tzone = 8   -- 东8区时区
  10. sentCnt = 0
  11. t2cnt = 1
  12. t2target = 0
  13. tmrBtn = 2
  14. tmrCycled = 4
  15. ioPWR  = 1
  16. ioCali = 2
  17. gpio.mode (ioCali, gpio.OUTPUT)
  18. gpio.write(ioCali, gpio.LOW)
  19. -----------------------------
  20. local function loopButton()
  21.     if t2cnt <= t2target then
  22.         if 1 == (t2cnt % 2) then
  23.             gpio.write(ioCali, gpio.HIGH)
  24.         else
  25.             gpio.write(ioCali, gpio.LOW)
  26.         end
  27.         t2cnt = t2cnt + 1
  28.     else
  29.         tmr.stop(tmrBtn)
  30.         gpio.write(ioCali, gpio.LOW)
  31.     end
  32. end
  33. -----------------------------
  34. function adjustClock(hour, minute)
  35.     local cc
  36.     hour = hour % 12
  37.     minute = minute % 60
  38.     cc = hour * 60 + minute
  39.     print("========== Calibrated by Internet ================")
  40.     print("    Adjust LM8562 clock to " .. hour .. ":" .. minute)
  41.     gpio.mode (ioPWR, gpio.OUTPUT)
  42.     gpio.write(ioPWR, gpio.LOW)   -- Clock power off
  43.     tmr.delay(202000)
  44.     gpio.mode (ioPWR, gpio.INPUT) -- Power it on again, with LM8562 it start from 12:00 AM
  45.     tmr.delay(955000)
  46.     tmr.wdclr()
  47.     gpio.mode (ioCali, gpio.OUTPUT)
  48.     t2cnt = 1
  49.     if cc == 0 then cc = 1 end     -- At least press button once to calibrated clock
  50.     t2target = cc * 2
  51.     tmr.alarm(tmrBtn,50,1,function() loopButton() end)
  52. end
  53. function constructConnection() (责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容