基于MicroPython的自动网络时间校准器

leoaran 2019-05-30

基于MicroPython的自动网络时间校准器

前言

之前使用TPYBoard v202(主控ESP8266模块)开发板做过一款WIFI攻击神器,一开始使用Arduino源码做的,后来又接触到micropython。觉得使用micropython真是方便,而且ESP8266模块上面有很多可以挖掘出来的好玩的。后期用它又做过智能家庭控制平台,说白了就是用v202开发板作为Web服务器。最近,接触到了DS3231时钟模块,结合OLED显示屏,做了一个简单的时钟。为了防止时间偏差,从网上找了一个免费的获取时间的API,程序很简单,分享出来,有需要的小伙伴可以直接用。

基于MicroPython的自动网络时间校准器

WIFI攻击神器-Arduino篇:

邪恶改装:TPYBoard制作廉价WIFI干扰器

邪恶改装2:用单片机实现一次简单的WIFI密码欺骗

WIFI攻击神器-micropython篇: MicroPython实现WIFI干扰与抓包

智能家庭控制平台: 利用单片机快速实现家庭智能控制平台

材料准备

名称数量TPYBoard v202开发板1块DS3231时钟模块1个OLED显示屏1个面包板1个杜邦线若干

准备好材料,接下来就是接线。

TPYBoard v202DS3231时钟模块3V3VCCGNDGNDSDASDASCLSCLTPYBoard v202OLED显示屏GNDGND3V33V3MISCKMOSDAG16RESG15DCG5CS

程序编写

先说下程序的思路:

1、开机上连接家中的WIFI网络,确保可以访问网络;

2、然后访问API获取到时间,更新DS3231的设置,并进行显示屏显示;

3、开启定时器,每隔1秒钟刷新下显示屏时间信息;

4、设定每天获取一次API更新下时间,用于时间的校正。

首先,编辑一个boot.py文件,里面主要是连接WIFI的程序。然后编辑一个main.py,里面主要是访问API、操作DS3231、显示屏等主要功能程序。v202开机会先运行boot.py再运行main.py文件。

boot.py

import network
import time
from machine import Pin
LED = Pin(2,Pin.OUT)
#根据设定连接网络
count = 0
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
 print('connecting to TurnipSmart...')
 wlan.connect('WIFI名称','WIFI密码')
 while not wlan.isconnected() and count < 20:
 LED.value(not LED.value())
 count += 1
 time.sleep(0.5)
if wlan.isconnected(): 
 LED.value(0)
 print('ip address:',wlan.ifconfig()[0])
else:
 LED.value(1)
 print('TurnipSmart connect fail')

main.py

import urequests
import json
import time
from machine import SPI,Pin #导入SPI、Pin库
import ssd1306 #导入OLED显示屏驱动库
from ds3231 import DS3231 #导入DS3231时钟模块库
from machine import Timer #导入Timer库
#-----------------------DS3231模块-----------------------#
ds=DS3231() #ds3231初始化
NOW_DATE = ''
#-----------------------OLED显示屏-----------------------#
#SPI接口对应的引脚定义
spi = SPI(baudrate=10000000, polarity=1, phase=0, sck=Pin(12,Pin.OUT), mosi=Pin(13,Pin.OUT), miso=Pin(2))
#OLED显示屏的设置,128宽 64高 spi对象 DC接的G15 RES接的G16 CS接的G5
display = ssd1306.SSD1306_SPI(128, 64, spi, Pin(15),Pin(16), Pin(5))
display.poweron() #打开显示屏
display.init_display() #初始化显示
display.text('Waiting.....',1,1) #显示的内容,x坐标,y坐标
display.show() #进行显示
def getNetTime():
 url = 'http://quan.suning.com/getSysTime.do'
 res=urequests.get(url).text
 print(res)
 j=json.loads(res)
 t2_date = j['sysTime2'].split()[0] #日期
 t2_time = j['sysTime2'].split()[1] #时间
 display.fill(0) #清屏
 display.text(t2_date,1,2)
 display.text(t2_time,1,15)
 display.show()
 #初始日期和时间,设置一次即可
 ds.DATE([int(x) for x in t2_date[2:].split('-')]) #设置初始日期年、月、日
 ds.TIME([int(x) for x in t2_time.split(':')]) #设置初始时间时、分、秒
def updateTime(t):
 global NOW_DATE
 #读取日期和时间,拼接成正常的时间格式
 date = '20'+'-'.join(ds.DATE())
 time = ':'.join(ds.TIME())
 if NOW_DATE != date:
 getNetTime() #设定每天校对一下时间
 NOW_DATE = date
 else:
 display.fill(0) #清屏
 display.text(date,1,2)
 display.text(time,1,15)
 display.show()
if __name__ == '__main__':
 getNetTime()
 time.sleep(1)
 #-----------------------Timer定时器-----------------------#
 tim = Timer(-1) #新建一个定时器
 #每隔1秒执行一次updateTime函数调用,用于更新OLED显示屏上的时间
 tim.init(period=1000, mode=Timer.PERIODIC, callback=updateTime)

里面还需要用到DS3231时钟模块库,已经写好了,直接拿来用就可以。记得也要下载到板子里,否则会提示找不到。文章末会有下载。

程序下载与调试

v202通过micro USB数据线接入PC,即可进行程序下载和REPL操作。插入PC之前,先确保一下器件的电源线没有接错,防止出现器件或开发板烧坏的情况。

1、插上PC之后,设备管理器会出现一个虚拟串口,开发板上用的是CH340芯片(USB转TTL串口),电脑没驱动的话,需要手动安装。

CH34X驱动下载

2、使用 MicroPython File Uploader 工具进行程序的下载,在这里就不介绍具体下载的步骤,大家可去参考现有教程。 TPYBoard v202 快速入手教程 boot.py 、main.py 和 ds3231.py 都需要下载到v202板子里。下载完毕后,点击【RUN】或者按板子的RST键都可以运行程序。

没找到上传附件的功能,把代码放到了GitHub上了。 GitHub地址

效果演示

基于MicroPython的自动网络时间校准器

“我自己是一名从事了多年开发的Python老程序员,辞职目前在做自己的Python私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的Python学习干货,从最基础的到各种框架都有整理,送给每一位喜欢Python小伙伴,想要获取的可以转发文章并关注我的头条。在后台私信我:01,即可免费获取。"

基于MicroPython的自动网络时间校准器

相关推荐