前言
之前使用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地址
效果演示
总结
这个实验还有很多需要完善的地方,比如网络连接的判断、自动重连等机制都没有加上,大家可以自己完善下。欢迎交流。
*本文作者:linsensen,本文属FreeBuf原创奖励计划,未经许可禁止转载。