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

2019-05-30 79618人围观 ,发现 5 个不明物体 极客

前言

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

WIFI攻击神器-Arduino篇:

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

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

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

CH34X驱动下载

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

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

效果演示

1.jpg

总结

这个实验还有很多需要完善的地方,比如网络连接的判断、自动重连等机制都没有加上,大家可以自己完善下。欢迎交流。

*本文作者:linsensen,本文属FreeBuf原创奖励计划,未经许可禁止转载。

发表评论

已有 5 条评论

取消
Loading...
linsensen

这家伙太懒,还未填写个人描述!

1 文章数 5 评论数

特别推荐

推荐关注

活动预告

填写个人信息

姓名
电话
邮箱
公司
行业
职位
css.php