MicroPython - 代码整合
<!-- [toc] -->
本文仅针对与STM32F405芯片有用
OLED显示
- 导入引用头文件,使用压缩包中的
ssd1306.py
文件、font.py
文件 初始化
oled= SSD1306(pinout={'dc': 'Y9','res': 'Y10'}, height=64, external_vcc=False)
启动OLED,并且初始化
oled.poweron() #启动OLED oled.init_display() #显示函数初始化
向OLED写字符串
定义
def draw_text(self, x, y, string, size=1, space=1):
oled.draw_text(100,1,'hello world',size=1,space=1) # 显示hello world
- 刷新显示
oled.display()
- 清屏
oled.clear()
光照数值检测
初始化引脚配置
Light = pyb.ADC('Y11') #初始化ADC,Pin='Y11'
读取ADC值
value = Light.read() #获取ADC数值
写入计算的电压值,获得的数据0-4095相当于0-3V
string='{:.2f}V'.format(value/4095*3.3) # 字符串格式化 oled.draw_text(1, 20, string, size=2, space=1) # OLED上显示
判断光照强度,分3档写入显示函数
#判断光照强度,分3档写入显示函数 if 0<value<=1365: oled.draw_text(80, 1, 'Bright', size=1, space=1) if 1365 < value <= 2730: oled.draw_text(80, 1, 'Normal', size=1, space=1) if 2730 < value <= 4095: oled.draw_text(80, 1, 'Weak', size=1, space=1)
温湿度获取
- 导入温湿度驱动
from dht import DHT11
在附件中有此文件 创建DHT11对象dt
dt = DHT11(Pin('X5'))
发送一次数值获取信号,等待接受数值
此函数方法如果未成功会抛出异常,这里需要将异常抛出
try: dt.measure() # 检查异常 except Exception as e: print(e)
读取温湿度的值,存放到te、dh中即可
te = dt.temperature() # 获取温度值 dh = dt.humidity() # 获取湿度值
串口的接收
- 引用pyb库中的UART
from pyb import UART
- 初始化一个串口 波特率为9600
uart = UART(1,baudrate=9600)
接收函数:
# 判断是否有接收到任何数据 if(uart.any()): text = uart.readline() # 读取一行数据 cmd = text.decode('ascii') # 转换编码 if('202' in cmd): # 202是不是在刚刚读取的一行中 print('OK'+' '+cmd) # 是 就输出'OK '+cmd的一行 else: print('ERROR') #不 就输出ERROR
所有整合例子
时间日期显示
#时间、日期、星期的显示
import pyb
from ssd1306 import SSD1306
#创建ssd1306的SPI方式的实体
oled= SSD1306(pinout={'dc': 'Y9','res': 'Y10'},
height=64,
external_vcc=False)
oled.poweron() #启动OLED
oled.init_display() #显示函数初始化
rtc = pyb.RTC() #实例化RTC
rtc.datetime((2021, 4, 6, 2, 13, 4, 30, 250)) #初始化时钟
week = ['Mon', 'Tues', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun'] #建立星期列表
supp = ['']*7
while True:
temp = rtc.datetime() #获取时间值
for i in range(7):
if(temp[i] < 10):
supp[i]='0'
else:
supp[i]=''
oled.draw_text(1,1,supp[0]+str(temp[0])+'-'+supp[1]+str(temp[1])+'-'+supp[2]+str(temp[2]),
size=1,space=1) #显示日期
oled.draw_text(100,1,week[temp[3]-1],size=1,space=1) #显示星期
oled.draw_text(1,35,supp[4]+str(temp[4])+':'+supp[5]+str(temp[5])
+':'+supp[6]+str(temp[6]),size=3,space=1)
oled.display()
#延时一段时间后清屏
pyb.delay(500)
oled.clear()
光照强度OLED显示
import pyb
from ssd1306 import SSD1306
#创建ssd1306的SPI方式的实体
oled = SSD1306(pinout={'dc': 'Y9',
'res': 'Y10'},
height=64,
external_vcc=False)
#启动OLED屏并初始化
oled.poweron()
oled.init_display()
rtc = pyb.RTC() #实例化RTC
rtc.datetime((2021, 5, 9, 1, 11, 10, 30, 250)) #初始化时钟
Light = pyb.ADC('Y11') #初始化ADC,Pin='Y11'
supp = ['']*7
while True:
temp = rtc.datetime() #获取时间值
for i in range(7):
if(temp[i] < 10):
supp[i]='0'
else:
supp[i]=''
oled.draw_text(1,44,supp[0]+str(temp[0])+'-'+supp[1]+str(temp[1])+'-'+supp[2]+str(temp[2]),
size=1,space=1) #显示日期
oled.draw_text(70,44,supp[4]+str(temp[4])+':'+supp[5]+str(temp[5])
+':'+supp[6]+str(temp[6]),size=1,space=1)
value = Light.read() #获取ADC数值
#写入读取到的ADC数值
oled.draw_text(1, 1, str(value)+'/'+'4095', size=1, space=1)
#写入计算的电压值,获得的数据0-4095相当于0-3V
string='{:.2f}V'.format(value/4095*3.3) #字符串格式化
oled.draw_text(1, 20, string, size=2, space=1)
#判断光照强度,分3档写入显示函数
if 0<value<=1365:
oled.draw_text(80, 1, 'Bright', size=1, space=1)
if 1365 < value <= 2730:
oled.draw_text(80, 1, 'Normal', size=1, space=1)
if 2730 < value <= 4095:
oled.draw_text(80, 1, 'Weak', size=1, space=1)
#先将写入的内容显示出来,然后清除一边进入下一次数据刷新
oled.display()
oled.clear()
温湿度OLED显示
import pyb
from ssd1306 import SSD1306
# 导入温湿模块
from pyb import Pin
from dht import DHT11
# 创建ssd1306的SPI方式的实体
oled = SSD1306(pinout={'dc': 'Y9',
'res': 'Y10'},
height=64,
external_vcc=False)
# 启动OLED屏并初始化
oled.poweron()
oled.init_display()
# 创建DHT11对象dt
dt = DHT11(Pin('X5'))
while True:
try:
dt.measure() # 检查异常
except Exception as e:
print(e)
te = dt.temperature() # 获取温度值
dh = dt.humidity() # 获取湿度值
# 写入读取到的数据
oled.draw_text(1, 1, str(te) + ' C', size=2, space=1)
oled.draw_text(1, 40, str(dh) + ' %', size=2, space=1)
oled.display() # 在OLED屏上显示出写入的内容
# 延时一段时间后清屏
pyb.delay(500)
oled.clear()
温湿度光照信息串口输出
from pyb import RTC, delay, ADC, Timer, UART
from ssd1306 import SSD1306
import dht
dht = dht.DHT11(pin='X5')
oled = SSD1306(pinout={'dc': 'Y9',
'res': 'Y10'},
height=64,
external_vcc=False)
Light = ADC('Y11') #初始化ADC,Pin='Y11'
rtc = RTC() #实例化RTC
rtc.datetime((2021, 5, 23, 1, 10, 20, 30, 250)) #初始化时钟
ls = []
l0 = ""
l1 = ""
l2 = ""
# 启动OLED屏并初始化
oled.poweron()
oled.init_display()
# 串口输出定时器
uart = UART(1, 9600)
tim1 = Timer(1, freq=1)
def timer_fun(T):
global l0, l1, l2
uart.write(l0)
uart.write(l1)
uart.write(l2)
uart.write('\r\n')
print(l0)
tim1.callback(timer_fun)
# tim1.deinit()
# tim2 = Timer(2, freq=1)
while True:
temp = 0 # 温度
hum = 0 # 湿度
light = 0 # 光照度
# 时间
dtDict = ['year','month','day','week','hour','minute','second','subsecond']
dttime = rtc.datetime()
dtDict = {x:y for x,y in zip(dtDict,list(dttime))} # 合并字典
for x,y in dtDict.items(): # 遍历补齐两位
dtDict = str(y) if y > 9 else "0"+str(y)
# 温湿度
try:
dht.measure() # 检查异常
except Exception as e:
pass
temp = dht.temperature() # 获取温度值
hum = dht.humidity() # 获取湿度值
# 光照度
value = Light.read()
light = str(value)+'/4095' # 获取ADC数值
# 整合字符串
l0 = dtDict['year']+'.'+dtDict['month']+'.'+dtDict['day']+' '+dtDict['hour']+':'+dtDict['minute']+':'+dtDict['second']
l1 = "temp:"+str(temp)+"C hum:"+str(hum)+"%"
l2 = light+"V"
if 0<value<=1365: # 判断光照强度,分3档写入显示函数
l2 = light+"V Bright"
if 1365 < value <= 2730:
l2 = light+"V Normal"
if 2730 < value <= 4095:
l2 = light+"V Weak"
# print(l0)
# print(l1)
# print(l2)
# print("")
# 显示
oled.draw_text(1, 1, l0, size=1, space=1)
oled.draw_text(1, 26, l1, size=1, space=1)
oled.draw_text(1, 50, l2, size=1, space=1)
oled.display() # 在OLED屏上显示出写入的内容
串口接受例子
from pyb import UART, LED
uart = UART(1,baudrate=9600)
led1 = LED(1)
while True:
if(uart.any()):
text = uart.readline()
cmd = text.decode('ascii')
if('202' in cmd):
print('OK'+' '+cmd)
else:
print('ERROR')