'''
实验名称:通过编程采集温度数据,
并在OLED上显示。
'''
#引用相关模块
from machine import Pin,SoftI2C,Timer
from ssd1306 import SSD1306_I2C
import onewire, ds18x20, time
#初始化相关模块
i2c = SoftI2C(sda=Pin(12), scl=Pin(13))
oled = SSD1306_I2C(128, 64, i2c, addr=0x3c)
led_r=Pin(2,Pin.OUT) #构建led红光对象,GPIO1,输出
led_g=Pin(4,Pin.OUT) #构建led绿光对象,GPIO2,输出
led_b=Pin(5,Pin.OUT) #构建led蓝光对象,GPIO3,输出
#初始化DS18B20
ow = onewire.OneWire(Pin(15)) #构建单总线,Pin参数根据接线引脚修改
ds = ds18x20.DS18X20(ow) #传感器是DS18B20
rom = ds.scan() #扫描单总线上的传感器地址,支持多个传感器同时连接
def temp_get(tim): # 定义定时器中断回调函数
ds.convert_temp() # 温度转换
temp = ds.read_temp(rom[0]) #获取温度值,rom[0]为第1个DS18B20
#OLED数据显示
oled.fill(0) #清屏背景黑色
oled.text('MicroPython', 0, 0)
oled.text('Temp test:',0,20)
oled.text(str('%.2f'%temp)+' C',0,40) #显示temp,保留2位小数
oled.show()
# 让RGB LED在不同温度下显示不同颜色
if temp > 30:
led_b.value(0)
led_r.value(1)
led_g.value(1)
else:
led_b.value(1)
led_r.value(0)
led_g.value(1)
#开启RTOS定时器,编号为-1
tim = Timer(-1)
tim.init(period=1000, mode=Timer.PERIODIC,callback=temp_get) #周期为1000ms