From 0180f6196b5d20b2da363860163a80787f0e7719 Mon Sep 17 00:00:00 2001 From: Andreas Gattringer <andreas.gattringer@univie.ac.at> Date: Fri, 19 Apr 2024 16:04:22 +0200 Subject: [PATCH] take a bit more care of memory consumption --- programs/umnp-rhtp-local.py | 79 +++++++++++++++++++ programs/umnp-rhtp.py | 7 +- .../sensors/lps28dfw/__init__.py | 28 +++---- .../microcontroller/sensors/sht45/__init__.py | 17 ++-- 4 files changed, 107 insertions(+), 24 deletions(-) create mode 100644 programs/umnp-rhtp-local.py diff --git a/programs/umnp-rhtp-local.py b/programs/umnp-rhtp-local.py new file mode 100644 index 0000000..96d6800 --- /dev/null +++ b/programs/umnp-rhtp-local.py @@ -0,0 +1,79 @@ +import sys + +from umnp.devices import DEVICE_TYPE_RHTP +from umnp.microcontroller.devices.network.ethernet_w5500 import EthernetW5500 +from umnp.microcontroller.measurementdevice import MeasurementDevice +from umnp.microcontroller.sensors.lps28dfw import LPS28DFW +from umnp.microcontroller.sensors.sht45 import SHT45 +from umnp.microcontroller.tasks.periodictask import PeriodicTask +from umnp.protocol.data_message import DataMessage + +if sys.implementation.name == "micropython": + # noinspection PyUnresolvedReferences + import machine + import gc + + # noinspection PyUnresolvedReferences + import uasyncio as asyncio +else: + from umnp.microcontroller.umock import machine + +# SPI PARAMETERS +SPI_BAUD = 2_000_000 +SPI_MOSI = machine.Pin(19) +SPI_MISO = machine.Pin(16) +SPI_SCK = machine.Pin(18) # serial clock + +# I2C PARAMETERS +I2C_SCL = machine.Pin(27) # serial clock +I2C_SDA = machine.Pin(26) # serial data + +# ETHERNET PARAMETERS +ETH_CS = machine.Pin(17) # chip select +ETH_RST = machine.Pin(20) # reset + +ETH_IP = "192.168.0.33" # IP of microcontroller +ETH_SUBNET = "255.255.255.0" # ... +ETH_GATEWAY = "192.168.0.1" # ... +ETH_DNS = "192.168.0.2" # technically not necessary +ETH_USE_DHCP = False + + +async def aggregate_and_send( + device: MeasurementDevice, sht45: SHT45, p_sensor: LPS28DFW +): + comm = device.communicator + t, rh = await sht45.measure() + p, p_t = await p_sensor.measure() + data = "{:2.2f},{:2.2f},{:2.2f},{:2.2f}".format(t, rh, p, p_t) + print("Sending: '{}'".format(data)) + msg = DataMessage(data, device.identifier_raw, device.device_type) + await comm.send_message(msg) + msg = None + gc.collect() + + +async def main(): + # configure network + device = MeasurementDevice(device_type=DEVICE_TYPE_RHTP) + spi = machine.SPI(0, SPI_BAUD, mosi=SPI_MOSI, miso=SPI_MISO, sck=SPI_SCK) + i2c = machine.I2C(id=1, scl=I2C_SCL, sda=I2C_SDA) + + dev_mac = device.generated_mac_raw() + ether = EthernetW5500(spi, ETH_CS, ETH_RST, dev_mac, ETH_USE_DHCP) + ether.set_network(ETH_IP, ETH_SUBNET, ETH_GATEWAY, ETH_DNS) + + device.add_network_adapter(ether) + comm = device.create_communicator() + + sht45 = SHT45(i2c) + p_sensor = LPS28DFW(i2c, i2c_address=0x5C) + + task = PeriodicTask(aggregate_and_send, None, 1000, device, sht45, p_sensor) + comm.add_task(task, "aggregate_and_send") + + asyncio.run(comm.start()) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/programs/umnp-rhtp.py b/programs/umnp-rhtp.py index 4d40c71..1fd3e5f 100644 --- a/programs/umnp-rhtp.py +++ b/programs/umnp-rhtp.py @@ -11,6 +11,7 @@ from umnp.protocol.data_message import DataMessage if sys.implementation.name == "micropython": # noinspection PyUnresolvedReferences import machine + import gc # noinspection PyUnresolvedReferences import uasyncio as asyncio @@ -44,10 +45,12 @@ async def aggregate_and_send( comm = device.communicator t, rh = await sht45.measure() p, p_t = await p_sensor.measure() - data = f"{t},{rh},{p},{p_t}" - print(f"Sending: '{data}'") + data = "{:2.2f},{:2.2f},{:2.2f},{:2.2f}".format(t, rh, p, p_t) + print("Sending: '{}'".format(data)) msg = DataMessage(data, device.identifier_raw, device.device_type) await comm.send_message(msg) + msg = None + gc.collect() async def main(): diff --git a/umnp/microcontroller/sensors/lps28dfw/__init__.py b/umnp/microcontroller/sensors/lps28dfw/__init__.py index bfc86ab..2815a9f 100644 --- a/umnp/microcontroller/sensors/lps28dfw/__init__.py +++ b/umnp/microcontroller/sensors/lps28dfw/__init__.py @@ -7,25 +7,25 @@ try: except ImportError: from umnp.microcontroller.umock.machine import I2C -LPS28DFW_DEFAULT_ADDRESS = 0x5D -LPS28DFW_READ = 0xB9 -LPS28DFW_WRITE = 0xB8 +LPS28DFW_DEFAULT_ADDRESS = const(0x5D) +LPS28DFW_READ = const(0xB9) +LPS28DFW_WRITE = const(0xB8) -LPS28DFW_CTRL_REG1 = 0x10 -LPS28DFW_CTRL_REG2 = 0x11 -LPS28DFW_CTRL_REG3 = 0x12 -LPS28DFW_CTRL_REG4 = 0x13 +LPS28DFW_CTRL_REG1 = const(0x10) +LPS28DFW_CTRL_REG2 = const(0x11) +LPS28DFW_CTRL_REG3 = const(0x12) +LPS28DFW_CTRL_REG4 = const(0x13) -LPS28DFW_WHO_AM_I = 0x0F +LPS28DFW_WHO_AM_I = const(0x0F) -LPS28DFW_TEMP_OUT_H = 0x2B -LPS28DFW_TEMP_OUT_L = 0x2C +LPS28DFW_TEMP_OUT_H = const(0x2B) +LPS28DFW_TEMP_OUT_L = const(0x2C) -LPS28DFW_PRESS_OUT_H = 0x2A -LPS28DFW_PRESS_OUT_L = 0x29 -LPS28DFW_PRESS_OUT_XL = 0x28 -LPS28DFW_STATUS = 0x27 +LPS28DFW_PRESS_OUT_H = const(0x2A) +LPS28DFW_PRESS_OUT_L = const(0x29) +LPS28DFW_PRESS_OUT_XL = const(0x28) +LPS28DFW_STATUS = const(0x27) VALID_FREQUENCIES_HZ = [0, 1, 4, 10, 25, 50, 75, 100, 200] VALID_AVERAGING = [4, 8, 16, 32, 64, 128, 512] diff --git a/umnp/microcontroller/sensors/sht45/__init__.py b/umnp/microcontroller/sensors/sht45/__init__.py index 83401c0..7b82359 100644 --- a/umnp/microcontroller/sensors/sht45/__init__.py +++ b/umnp/microcontroller/sensors/sht45/__init__.py @@ -6,12 +6,13 @@ except ImportError: import asyncio import time -SHT45_HIRES = 0xFD -NO_HOLD_WAIT_TIME = 18.5 / 1000 / 1000 -SHT45_WAIT_TIME_MS = 9 -SHT45_RESET_TIME_MS = 1 -SHT45_SOFT_RESET = 0x94 -SHT45_DEFAULT_ADDRESS = 0x44 +SHT45_HIRES = const(0xFD) +NO_HOLD_WAIT_TIME = const(1.85e-05) +SHT45_WAIT_TIME_MS = const(9) +SHT45_RESET_TIME_MS = const(1) +SHT45_SOFT_RESET = const(0x94) +SHT45_DEFAULT_ADDRESS = const(0x44) +NAN = float("NAN") class SHT45: @@ -19,7 +20,7 @@ class SHT45: self._i2c = i2c self._i2c_address = i2c_address self._initialised = False - self._nan = float("NAN") + self._nan = NAN devices = self._i2c.scan() @@ -78,7 +79,7 @@ class SHT45: temperature = self._nan rh = self._nan if not self.initialised: - return temperature, rh + return self._nan, self._nan cmd = bytearray(1) cmd[0] = SHT45_HIRES -- GitLab