python 串口时钟校对_基于MicroPython的自动网络时间校准器

前言

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

WIFI攻击神器-Arduino篇:

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

材料准备

名称

数量

TPYBoard v202开发板

1块

DS3231时钟模块

1个

OLED显示屏

1个

面包板

1个

杜邦线

若干

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

TPYBoard v202

DS3231时钟模块

3V3

VCC

GND

GND

SDA

SDA

SCL

SCL

TPYBoard v202

OLED显示屏

GND

GND

3V3

3V3

MI

SCK

MO

SDA

G16

RES

G15

DC

G5

CS

程序编写

先说下程序的思路:

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串口),电脑没驱动的话,需要手动安装。

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

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

效果演示

你可能感兴趣的:(python,串口时钟校对)