| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- # PWM
- import math
- import time
- from cmath import log
- import micropython
- import gc
- import uasyncio
- from machine import Pin,PWM,ADC
- def average(series, new_value):
- series.append(new_value)
- if len(series) > 8:
- series.pop(0)
- total = sum(series)
- # print(series)
- return total/len(series)
- class Ntc():
- def __init__(self, pin) -> None:
- self.adc = ADC(Pin(pin), atten=ADC.ATTN_11DB)
- self.VCC = 3344
- self.temp = 0
- self.temp_list = []
- def cal_temperature(self):
- val_uv = self.adc.read_uv()/1000
- Rt = val_uv / ((self.VCC - val_uv)/10000)
- T1 = 1/(log(Rt/10000)/3950 + 1/(273.15+25)) - 273.15
- # 0.5 是误差。T1是复数,T1.real是取它的实部
- temp = T1.real + 0.5
- self.temp = average(self.temp_list, temp)
- # print("Rt:", Rt)
- # print("voltage:", val_uv)
- # print("T1:", T1.real)
- def get_temperature(self):
- return self.temp
-
- class HeatPower():
- _instance = None
- def __new__(cls, *args, **kwargs):
- if cls._instance is None:
- cls._instance = super().__new__(cls)
- return cls._instance # 返回的是内存地址
- def __init__(self) -> None:
- self.sw_pin = PWM(Pin(15))
- self.sw_pin.freq(1000)
- # self.sw_pin.duty(180)
- self.status = 0
- self.duty = 0.0
- def duty_percent(self, percent):
- if percent > 1:
- percent == 1
- elif percent < 0:
- percent = 0
- self.duty = percent
- set_value = round(self.duty * 1023)
- # print(self.duty)
- # print(set_value)
- self.sw_pin.duty(set_value)
-
- def off(self):
- self.status = 0
- self.duty_percent(0)
- # print("heat off")
-
- def on(self, power_percent=0.8):
- self.status = 1
- self.duty_percent(power_percent)
- # print("heat on")
-
- def ajust_duty(self, step=0):
- self.duty += step
- if self.duty > 1:
- self.duty = 1
- elif self.duty < 0:
- self.duty = 0
- self.duty_percent(self.duty)
- def ajust_power(self, wt, ct):
- if not self.status:
- return
- if wt > 88:
- step = (88-wt)/100
- self.ajust_duty(step)
- # print('wt:', wt, "step:", step)
- elif ct > 45:
- step = (45-ct)/100
- self.ajust_duty(step)
- else:
- step = (42-ct)/100
- # print('ct:', ct, "step:", step)
- self.ajust_duty(step)
- wire_ntc = Ntc(34)
- center_ntc = Ntc(36)
- heat = HeatPower()
- async def cal_ntc():
- while True:
- wire_ntc.cal_temperature()
- center_ntc.cal_temperature()
- await uasyncio.sleep_ms(200)
- async def sensor():
- uasyncio.create_task(cal_ntc())
- heat.on()
- cnt = 0
- while True:
- cnt += 1
- if cnt > 10:
- cnt = 0
- print("wire_temp:", wire_temp, "\tcenter_temp:", center_temp, '\tduty:', heat.duty)
- gc.collect()
- wire_temp = wire_ntc.get_temperature()
- center_temp = center_ntc.get_temperature()
- heat.ajust_power(wire_ntc.get_temperature(), center_ntc.get_temperature())
- # 主动垃圾回收是个好习惯,如果没有经常开辟内存,可不用
- await uasyncio.sleep_ms(300)
-
- def test():
- wire_ntc = Ntc(34)
- center_ntc = Ntc(36)
- print("class Ntc:", wire_ntc, center_ntc)
- print("class adc:", wire_ntc.adc, center_ntc.adc)
- print("tim:", wire_ntc.tim, center_ntc.tim)
- if __name__ == '__main__':
- uasyncio.run(sensor())
- # test()
|