'''
实验名称:通过编程采集温度数据,
并在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