做了一个大致的降温系统,超过28度开启风扇!
demo.py
#降温系统
from machine import I2C, Pin, Timer,PWM
from ssd1306 import SSD1306_I2C
import onewire, ds18x20
#风扇设置
pwm = PWM(Pin(12),freq=10000,duty=512)#设置pwm
pin_dir = Pin(14,Pin.OUT,value = 1)#设置正转
# 显示屏设置
# 初始化I2C通信,sda为数据线,连接到GPIO 23,scl为时钟线,连接到GPIO 19
i2c = I2C(sda=Pin(23), scl=Pin(19))
# 初始化SSD1306 OLED显示屏,尺寸为128x64像素,使用之前初始化的I2C对象,并设置I2C地址为0x3c
oled = SSD1306_I2C(128, 64, i2c, addr=0x3c)
# 单总线温度传感器设置
# 使用Y12引脚(GPIO 18)创建单总线对象,用于与DS18x20温度传感器通信
ow = onewire.OneWire(Pin(18))
# 创建DS18x20对象,用于读取温度数据
ds = ds18x20.DS18X20(ow)
# 扫描总线上的设备地址
# 扫描并获取连接到单总线上的DS18x20传感器的ROM地址列表
rom = ds.scan()
# 定义RUN函数,该函数将作为定时器的回调函数
def RUN(t):
# 触发温度转换
ds.convert_temp()
# 读取第一个(或唯一一个)传感器的温度值
temp = ds.read_temp(rom[0])
#判断是否超过指定温度,这里以28度为例
if temp >= 28:
pwm.duty(1000*1023//100)
else:
pwm.duty(0*1023//100)
# 清空OLED显示屏
oled.fill(0)
# 在OLED显示屏上显示文本"Temperature"
oled.text("Temperature", 0, 0)
# 在OLED显示屏上显示温度值,保留两位小数
oled.text("{:.2f} C".format(temp), 0, 32)
# 更新OLED显示屏以显示新内容
oled.show()
def main():
# 初始化定时器
# 创建一个定时器对象,不指定初始值(-1)
time0 = Timer(-1)
# 初始化定时器,设置周期为1000毫秒(1秒),模式为周期性(PERIODIC),并指定回调函数RUN
time0.init(period=1000, mode=Timer.PERIODIC, callback=RUN)
main.py
from demo import main
if __name__ == "__main__":
main()
电路自行搭建