class WaterLevel: def __init__(self, port): self.port = port self.uart = UART(port, 9600) self.uart.init(9600, timeout=10) # 9600, 1byte about 1ms, wait for 10ms self.buffer = RingBuffer(10) # return # False: no change # True: change, need read value def Check(self): count = self.uart.any() if count < 3: return False # At lease 3 bytes in buffer (For example:0mm) value_change = None while 1: # maybe too many data in UART RX buffer data = self.uart.readline() if data: number_string = re.search(b'^\d+', data) if number_string: number = int(number_string.group(0)) value_change = self.buffer.InsertData(number, True) else: break return value_change def GetValue(self): return self.buffer.GetAverage()
class TempSensor: def __init__(self, pin): self.check_ticks_ms = 0 self.ds = DS18X20(OneWire(Pin(pin))) self.rom = None self.buffer = RingBuffer(6) self.state = DS_IDEL roms = self.ds.scan() if roms: self.rom = roms[0] UI.LogOut(str(self.rom)) def Start(self): # Wait for 1000ms(1s) to start if self.state != DS_IDEL: return if time.ticks_diff(time.ticks_ms(), self.check_ticks_ms) < 1000: return if self.rom: self.ds.convert_temp() self.state = DS_START self.check_ticks_ms = time.ticks_ms() def Check(self): if self.rom is None: return None # Need wait for 750ms(800ms) after start if self.state != DS_START: return False if time.ticks_diff(time.ticks_ms(), self.check_ticks_ms) < 800: return False try: value = int(self.ds.read_temp(self.rom) * 100) except: UI.LogOut("Read DS18B20 failed!") return False else: value_change = self.buffer.InsertData(value, True) self.state = DS_IDEL return value_change def GetValue(self): return self.buffer.GetAverage()