robert-hh / BME280

Micropython driver for the BME280 sensor, target platform Pycom devices
Other
103 stars 27 forks source link

Erroneous values returned when memory is low? #12

Open dakin80 opened 9 months ago

dakin80 commented 9 months ago

I am reading values from a bme280 sensor at approx 1 minute intervals. The readings are transmitted by a Waveshare Lora transmitter after reading. The data when received on a separate system is loaded into a MariaDB database and then used to populate web pages with graphs.

I have been finding that at irregular intervals of about an hour there are spikes in the readings for temperature of several degrees C with a spike in pressure of a similar magnitude.

After changing sensors, Raspberry Pico W and Waveshare Lora board I got no improvement.

Upon changing the frequency of readings to one a second I got errors showing more rapidly.

Simply reading the sensor as fast as possible with no Lora radio code showed no problems.

This suggested to me that it had some symptoms of a memory problem.

I'm not an experienced Python user but I am led to understand that if a shortage of memory occurs during an allocation of memory a garbage collection is attempted to try to free up suitable memory.

Upon adding a gc.collect() call after every sensor reading the problem goes away.

I rather suspect that it's the Lora radio calls that are leaking memory but the way that the bme280 readings are incorrect is rather disturbing. Should it not throw an error if it cannot produce correct data?

Attached are graphs for temperature and pressure that are each in three sections. At the start the interval is one sample per minute. Then the sample rate is changed to one per second. You can clearly see the occasional spikes. These first two regions are using just automatic garbage collection. In the last section the interval is back to one per minute but with a call to gc.collect() after each sensor reading. The problem disappears. I have repeated these test several times and they are broadly reproducible.

I appreciate that this error may be difficult to reproduce without a Waveshare Lora radio but I think a resolution is worth seeking to a case where faulty data is being returned.

Temperature Errors Pressure Errors

Here is my Micropython script with comments added to show where the sample rate and garbage collection can be changed:

import time
from machine import Pin, SPI, ADC, I2C
from lora import SX1262
from bme280 import *
import gc

led = Pin("LED", Pin.OUT)
led.off()

def flashLED(numberFlashes):
    flashInterval = 0.3
    for i in range(numberFlashes):
        led.on()
        time.sleep(flashInterval)
        led.off()

batteryADC = machine.ADC(0)
uvADC = machine.ADC(1)
vsysADC = machine.ADC(3)

source = 1
destination = 0
packet = 1
packetType = 1

def getvsys():
    Pin(25, Pin.OUT, value=1)
    Pin(29, Pin.IN, pull=None)
    voltage = machine.ADC(3).read_u16() * 9.9 / 2**16
    Pin(25, Pin.OUT, value=0, pull=Pin.PULL_DOWN)
    Pin(29, Pin.ALT, pull=Pin.PULL_DOWN, alt=7)
    return voltage                                    

def get_modem():
    lora_cfg = {
    "freq_khz": 868000,
    "sf": 12,
    "bw": "125",  # kHz
    "coding_rate": 8,
    "preamble_len": 8,
    "output_power": 14, # dBm
    "syncword": 0x1424,
    }

    return SX1262(
            spi=SPI(1, baudrate=2000_000, polarity=0, phase=0,
                    miso=Pin(12), mosi=Pin(11), sck=Pin(10)),
            cs=Pin(3),
            busy=Pin(2),
            dio1=Pin(20),
            dio2_rf_sw=True,
            dio3_tcxo_millivolts=1600,
            reset=Pin(15),
            lora_cfg=lora_cfg)

def main():
    global packet

    i2c = I2C(0)

    bme280 = BME280(i2c=i2c)

    modem = get_modem()

    while True:
        (temperature, pressure, humidity) = bme280.read_compensated_data()
        uv = 10.0 * uvADC.read_u16() * (3.3 / (65536))        

        battery = batteryADC.read_u16() * (3.3 / (65536))

        vsys = getvsys()

        message = bytes(f"{source},{destination},{packet},{packetType},{temperature:.2f},{pressure:.0f},{humidity:.2f},{uv:.2f},{battery:.2f},{vsys:.3f}", "utf-8")

        modem.send(message)
        print(message)

        flashLED(2)

        packet += 1

        # Comment out following line to reproduce intermittent error in bme280 sensor readings.
        gc.collect()

        # Change range in loop below from 60 to 1 to increase sampling rate and reduce time to errors
        for i in range(60):
            flashLED(1)
            time.sleep(1)

if __name__ == "__main__":
    main()
robert-hh commented 9 months ago

@dakin80 Thank you for the note. That's indeed strange. The BME280 driver does only allocate memory for the array of results. If that fails, an error is raised. That could be simplified by directly returning the tuple. And it allocates implicitly by using float numbers, or large integer in the bme280_int version. I do not know what happens if a float or large int object cannot be allocated. I would expect an exception being raised. So no, at the moment I have no clue, what#s happening. And I cannot replicate your test.

In any case it's helpful to have a gc.collect() in the main loop of a script, reducing the memory fragmentation.

robert-hh commented 9 months ago

I just noticed that after the series of spikes in your graphs the values get pretty noisy, compared to the part of the graph before the spikes. As if the oversampling mode had been changed, which is is stored in the bme280 object. You could check with your code, if these values changed when the error happens. These are bme280._mode_temp and bme280._mode_press.

dakin80 commented 9 months ago

Ran some tests with extra code added:

import time
from machine import Pin, SPI, ADC, I2C
from lora import SX1262
from bme280 import *
import gc

led = Pin("LED", Pin.OUT)
led.off()

def flashLED(numberFlashes):
    flashInterval = 0.3
    for i in range(numberFlashes):
        led.on()
        time.sleep(flashInterval)
        led.off()

batteryADC = machine.ADC(0)
uvADC = machine.ADC(1)
vsysADC = machine.ADC(3)

source = 1
destination = 0
packet = 1
packetType = 1

def getvsys():
    Pin(25, Pin.OUT, value=1)
    Pin(29, Pin.IN, pull=None)
    voltage = machine.ADC(3).read_u16() * 9.9 / 2**16
    Pin(25, Pin.OUT, value=0, pull=Pin.PULL_DOWN)
    Pin(29, Pin.ALT, pull=Pin.PULL_DOWN, alt=7)
    return voltage                                    

def get_modem():
    lora_cfg = {
    "freq_khz": 868000,
    "sf": 12,
    "bw": "125",  # kHz
    "coding_rate": 8,
    "preamble_len": 8,
    "output_power": 14, # dBm
    "syncword": 0x1424,
    }

    return SX1262(
            spi=SPI(1, baudrate=2000_000, polarity=0, phase=0,
                    miso=Pin(12), mosi=Pin(11), sck=Pin(10)),
            cs=Pin(3),
            busy=Pin(2),
            dio1=Pin(20),
            dio2_rf_sw=True,
            dio3_tcxo_millivolts=1600,
            reset=Pin(15),
            lora_cfg=lora_cfg)

def main():
    global packet

    i2c = I2C(0)

    bme280 = BME280(i2c=i2c)

    modem = get_modem()

    lastTemperature = None
    lastPressure = None

    while True:
        (temperature, pressure, humidity) = bme280.read_compensated_data()

        if lastTemperature is not None:
            if abs(temperature - lastTemperature) > 0.1:
                print("Temperature spike/dip ", packet, lastTemperature, temperature, bme280._mode_temp, lastPressure, pressure, bme280._mode_press)

        lastTemperature = temperature
        lastPressure = pressure

        uv = 10.0 * uvADC.read_u16() * (3.3 / (65536))        

        battery = batteryADC.read_u16() * (3.3 / (65536))

        vsys = getvsys()

        message = bytes(f"{source},{destination},{packet},{packetType},{temperature:.2f},{pressure:.0f},{humidity:.2f},{uv:.2f},{battery:.2f},{vsys:.3f}", "utf-8")

        modem.send(message)
        #print(message)

        flashLED(2)

        packet += 1

        # Comment out following line to reproduce intermittent error in bme280 sensor readings.
        #gc.collect()

        # Change range in loop below from 60 to 1 to increase sampling rate and reduce time to errors
#         for i in range(1):
#             flashLED(1)
#             time.sleep(1)

if __name__ == "__main__":
    main()

Which gave spikes:

Temperature spike/dip 2 18.80756 18.48887 4 98744.63 98711.35 4 Temperature spike/dip 45 18.56517 18.80179 4 98710.21 98750.02 4 Temperature spike/dip 46 18.80179 18.61199 4 98750.02 98725.55 4 Temperature spike/dip 144 18.74216 18.95761 4 98724.25 98754.59 4 Temperature spike/dip 145 18.95761 18.77422 4 98754.59 98727.88 4 Temperature spike/dip 194 18.84219 19.04739 4 98732.02 98767.67 4 Temperature spike/dip 195 19.04739 18.89157 4 98767.67 98730.8 4 Temperature spike/dip 293 19.03264 19.22822 4 98745.62 98775.68 4 Temperature spike/dip 294 19.22822 19.06919 4 98775.68 98751.61 4 Temperature spike/dip 343 19.10382 19.31671 4 98750.3 98785.2 4 Temperature spike/dip 344 19.31671 19.15961 4 98785.2 98759.77 4 Temperature spike/dip 442 19.25708 19.45586 4 98764.45 98797.03 4 Temperature spike/dip 443 19.45586 19.29427 4 98797.03 98770.52 4

The oversampling modes appear to be 4. Whatever that is.

The relevant part of the graph is only the last part from 6:40am onwards where the temperature is rising. I'd left it running earlier with too small a tolerance on the spike/dip test so it failed to capture them.

Temperature

On running the test later with manual garbage collection the problem doesn't occur.

dakin80 commented 9 months ago

A few more observations on the problem.

import time
from machine import Pin, SPI, ADC, I2C
from lora import SX1262
from bme280 import *
import gc

led = Pin("LED", Pin.OUT)
led.off()

def flashLED(numberFlashes):
    flashInterval = 0.3
    for i in range(numberFlashes):
        led.on()
        time.sleep(flashInterval)
        led.off()

batteryADC = machine.ADC(0)
uvADC = machine.ADC(1)
vsysADC = machine.ADC(3)

source = 1
destination = 0
packet = 1
packetType = 1

def getvsys():
    Pin(25, Pin.OUT, value=1)
    Pin(29, Pin.IN, pull=None)
    voltage = machine.ADC(3).read_u16() * 9.9 / 2**16
    Pin(25, Pin.OUT, value=0, pull=Pin.PULL_DOWN)
    Pin(29, Pin.ALT, pull=Pin.PULL_DOWN, alt=7)
    return voltage                                    

def get_modem():
    lora_cfg = {
    "freq_khz": 868000,
    "sf": 12,
    "bw": "125",  # kHz
    "coding_rate": 8,
    "preamble_len": 8,
    "output_power": 14, # dBm
    "syncword": 0x1424,
    }

    return SX1262(
            spi=SPI(1, baudrate=2000_000, polarity=0, phase=0,
                    miso=Pin(12), mosi=Pin(11), sck=Pin(10)),
            cs=Pin(3),
            busy=Pin(2),
            dio1=Pin(20),
            dio2_rf_sw=True,
            dio3_tcxo_millivolts=1600,
            reset=Pin(15),
            lora_cfg=lora_cfg)

def main():
    global packet

    i2c = I2C(0)

    bme280 = BME280(i2c=i2c)

    modem = get_modem()

    lastTemperature = None

    while True:
        (temperature, pressure, humidity) = bme280.read_compensated_data()

        if lastTemperature is not None:
            if abs(temperature - lastTemperature) > 0.1:
                print(f"Temperature spike/dip {bme280._mode_temp} {bme280._mode_press}")

        lastTemperature = temperature

        uv = 10.0 * uvADC.read_u16() * (3.3 / (65536))        

        battery = batteryADC.read_u16() * (3.3 / (65536))

        vsys = getvsys()

        print(f"{source},{destination},{packet},{packetType},{temperature:.2f},{pressure:.0f},{humidity:.2f},{uv:.2f},{battery:.2f},{vsys:.3f} gc.mem_free(): {gc.mem_free()}")

        message = bytes(f"{source},{destination},{packet},{packetType},{temperature:.2f},{pressure:.0f},{humidity:.2f},{uv:.2f},{battery:.2f},{vsys:.3f}", "utf-8")

        modem.send(message)

        flashLED(2)

        packet += 1

        # Comment out following line to reproduce intermittent error in bme280 sensor readings.
        #gc.collect()

        # Change range in loop below from 60 to 1 to increase sampling rate and reduce time to errors
#         for i in range(1):
#             flashLED(1)
#             time.sleep(1)

if __name__ == "__main__":
    main()

I've added in outputs of the values at every step along with details of the free memory. In addition the code looks for spikes in temperature. Here's some output:

1,0,5,1,21.77,99143,39.88,0.14,0.36,4.685 gc.mem_free(): 112960
1,0,6,1,21.78,99140,39.87,0.14,0.36,4.685 gc.mem_free(): 109744
1,0,7,1,21.78,99142,39.86,0.15,0.36,4.671 gc.mem_free(): 106512
1,0,8,1,21.80,99145,39.85,0.16,0.36,4.678 gc.mem_free(): 103296
1,0,9,1,21.79,99141,39.86,0.15,0.36,4.685 gc.mem_free(): 100064
1,0,10,1,21.80,99141,39.86,0.15,0.36,4.651 gc.mem_free(): 96848
1,0,11,1,21.81,99146,39.84,0.14,0.36,4.661 gc.mem_free(): 93632
1,0,12,1,21.81,99142,39.85,0.14,0.36,4.668 gc.mem_free(): 90400
1,0,13,1,21.82,99150,39.84,0.14,0.36,4.668 gc.mem_free(): 87184
1,0,14,1,21.83,99144,39.83,0.15,0.36,4.666 gc.mem_free(): 83968
1,0,15,1,21.84,99144,39.82,0.14,0.36,4.671 gc.mem_free(): 80752
1,0,16,1,21.83,99144,39.83,0.14,0.36,4.673 gc.mem_free(): 77520
1,0,17,1,21.84,99148,39.81,0.15,0.36,4.666 gc.mem_free(): 74304
1,0,18,1,21.85,99150,39.81,0.14,0.36,4.668 gc.mem_free(): 71088
1,0,19,1,21.85,99143,39.81,0.14,0.36,4.666 gc.mem_free(): 67872
1,0,20,1,21.86,99143,39.80,0.15,0.36,4.673 gc.mem_free(): 64656
1,0,21,1,21.86,99146,39.79,0.14,0.36,4.685 gc.mem_free(): 61440
1,0,22,1,21.87,99145,39.79,0.14,0.36,4.668 gc.mem_free(): 58224
1,0,23,1,21.88,99149,39.78,0.14,0.36,4.680 gc.mem_free(): 55008
1,0,24,1,21.91,99151,39.78,0.17,0.36,4.688 gc.mem_free(): 51792
1,0,25,1,21.91,99149,39.78,0.15,0.36,4.656 gc.mem_free(): 48576
1,0,26,1,21.90,99142,39.77,0.15,0.36,4.649 gc.mem_free(): 45344
1,0,27,1,21.92,99144,39.76,0.15,0.36,4.666 gc.mem_free(): 42128
1,0,28,1,21.91,99149,39.76,0.14,0.36,4.676 gc.mem_free(): 38896
1,0,29,1,21.93,99152,39.75,0.14,0.36,4.666 gc.mem_free(): 35680
1,0,30,1,21.92,99149,39.74,0.15,0.36,4.676 gc.mem_free(): 32448
1,0,31,1,21.93,99150,39.74,0.15,0.36,4.663 gc.mem_free(): 29232
1,0,32,1,21.93,99150,39.74,0.14,0.36,4.663 gc.mem_free(): 26016
1,0,33,1,21.93,99151,39.74,0.15,0.36,4.663 gc.mem_free(): 22800
1,0,34,1,21.94,99153,39.73,0.16,0.36,4.680 gc.mem_free(): 19584
1,0,35,1,21.94,99151,39.73,0.15,0.36,4.668 gc.mem_free(): 16352
1,0,36,1,21.95,99144,39.73,0.14,0.36,4.668 gc.mem_free(): 13136
1,0,37,1,21.95,99146,39.73,0.15,0.36,4.683 gc.mem_free(): 9920
1,0,38,1,21.95,99150,39.72,0.15,0.36,4.663 gc.mem_free(): 6704
1,0,39,1,21.96,99150,39.72,0.15,0.36,4.654 gc.mem_free(): 3488
1,0,40,1,21.96,99151,39.72,0.14,0.36,4.673 gc.mem_free(): 272
1,0,41,1,21.97,99152,39.71,0.14,0.36,4.697 gc.mem_free(): 144960
1,0,42,1,21.98,99154,39.72,0.14,0.36,4.671 gc.mem_free(): 141728
1,0,43,1,21.98,99151,39.72,0.15,0.36,4.666 gc.mem_free(): 138480
1,0,44,1,21.99,99155,39.71,0.14,0.36,4.671 gc.mem_free(): 135248
1,0,45,1,22.00,99153,39.70,0.14,0.36,4.673 gc.mem_free(): 132016
1,0,46,1,22.01,99155,39.70,0.15,0.36,4.666 gc.mem_free(): 128784
1,0,47,1,22.02,99158,39.70,0.14,0.36,4.676 gc.mem_free(): 125552
1,0,48,1,21.99,99150,39.69,0.14,0.36,4.668 gc.mem_free(): 122304
1,0,49,1,21.99,99153,39.69,0.14,0.36,4.666 gc.mem_free(): 119072
1,0,50,1,22.03,99160,39.68,0.14,0.36,4.673 gc.mem_free(): 115840
1,0,51,1,22.03,99159,39.69,0.15,0.36,4.673 gc.mem_free(): 112608
1,0,52,1,22.05,99160,39.69,0.15,0.36,4.668 gc.mem_free(): 109376
1,0,53,1,22.05,99160,39.69,0.14,0.36,4.666 gc.mem_free(): 106144
1,0,54,1,22.05,99156,39.68,0.14,0.36,4.666 gc.mem_free(): 102896
1,0,55,1,22.06,99158,39.68,0.15,0.36,4.647 gc.mem_free(): 99664
1,0,56,1,22.06,99159,39.68,0.13,0.36,4.656 gc.mem_free(): 96448
1,0,57,1,22.07,99160,39.67,0.15,0.36,4.692 gc.mem_free(): 93232
1,0,58,1,22.08,99158,39.67,0.14,0.36,4.683 gc.mem_free(): 90016
1,0,59,1,22.08,99156,39.66,0.14,0.36,4.668 gc.mem_free(): 86800
1,0,60,1,22.08,99156,39.65,0.14,0.36,4.661 gc.mem_free(): 83584
1,0,61,1,22.09,99153,39.65,0.14,0.36,4.666 gc.mem_free(): 80368
1,0,62,1,22.10,99160,39.65,0.14,0.36,4.642 gc.mem_free(): 77152
1,0,63,1,22.09,99160,39.64,0.14,0.36,4.663 gc.mem_free(): 73920
1,0,64,1,22.10,99156,39.64,0.14,0.36,4.656 gc.mem_free(): 70704
1,0,65,1,22.11,99159,39.63,0.15,0.36,4.663 gc.mem_free(): 67488
1,0,66,1,22.11,99157,39.63,0.15,0.36,4.673 gc.mem_free(): 64272
1,0,67,1,22.12,99161,39.62,0.14,0.36,4.683 gc.mem_free(): 61056
1,0,68,1,22.12,99166,39.62,0.14,0.36,4.668 gc.mem_free(): 57840
1,0,69,1,22.12,99156,39.61,0.15,0.36,4.651 gc.mem_free(): 54608
1,0,70,1,22.13,99159,39.61,0.14,0.36,4.663 gc.mem_free(): 51392
1,0,71,1,22.13,99157,39.60,0.15,0.36,4.668 gc.mem_free(): 48176
1,0,72,1,22.13,99158,39.59,0.13,0.36,4.659 gc.mem_free(): 44960
1,0,73,1,22.14,99158,39.59,0.14,0.36,4.620 gc.mem_free(): 41744
1,0,74,1,22.15,99161,39.59,0.14,0.36,4.671 gc.mem_free(): 38528
1,0,75,1,22.15,99161,39.58,0.14,0.36,4.656 gc.mem_free(): 35312
1,0,76,1,22.16,99161,39.58,0.14,0.36,4.661 gc.mem_free(): 32096
1,0,77,1,22.16,99159,39.58,0.15,0.36,4.649 gc.mem_free(): 28864
1,0,78,1,22.17,99161,39.57,0.15,0.36,4.661 gc.mem_free(): 25648
1,0,79,1,22.17,99162,39.56,0.14,0.36,4.676 gc.mem_free(): 22432
1,0,80,1,22.18,99160,39.55,0.14,0.36,4.637 gc.mem_free(): 19216
1,0,81,1,22.19,99165,39.55,0.14,0.36,4.676 gc.mem_free(): 16000
1,0,82,1,22.19,99162,39.55,0.15,0.36,4.671 gc.mem_free(): 12784
1,0,83,1,22.19,99157,39.54,0.14,0.36,4.659 gc.mem_free(): 9568
1,0,84,1,22.20,99160,39.54,0.14,0.36,4.644 gc.mem_free(): 6352
1,0,85,1,22.21,99158,39.54,0.14,0.36,4.656 gc.mem_free(): 3136
1,0,86,1,22.22,99163,39.53,0.14,0.36,4.661 gc.mem_free(): 147712
1,0,87,1,22.22,99161,39.53,0.15,0.36,4.676 gc.mem_free(): 144480
1,0,88,1,22.23,99167,39.53,0.15,0.36,4.688 gc.mem_free(): 141248
1,0,89,1,22.23,99164,39.53,0.14,0.36,4.685 gc.mem_free(): 138016
1,0,90,1,22.24,99162,39.51,0.14,0.36,4.666 gc.mem_free(): 134784
1,0,91,1,22.24,99159,39.51,0.14,0.36,4.668 gc.mem_free(): 131552
1,0,92,1,22.25,99164,39.50,0.15,0.36,4.678 gc.mem_free(): 128320
1,0,93,1,22.25,99165,39.50,0.15,0.36,4.666 gc.mem_free(): 125088
1,0,94,1,22.26,99163,39.49,0.15,0.36,4.663 gc.mem_free(): 121856
1,0,95,1,22.26,99161,39.49,0.15,0.36,4.642 gc.mem_free(): 118624
1,0,96,1,22.26,99164,39.48,0.14,0.36,4.661 gc.mem_free(): 115392
1,0,97,1,22.27,99162,39.47,0.15,0.36,4.680 gc.mem_free(): 112160
1,0,98,1,22.27,99164,39.47,0.15,0.36,4.649 gc.mem_free(): 108928
1,0,99,1,22.28,99163,39.46,0.15,0.36,4.663 gc.mem_free(): 105696
1,0,100,1,22.29,99165,39.46,0.14,0.36,4.644 gc.mem_free(): 102464
1,0,101,1,22.29,99167,39.46,0.14,0.36,4.651 gc.mem_free(): 99216
1,0,102,1,22.30,99165,39.45,0.15,0.36,4.666 gc.mem_free(): 95984
1,0,103,1,22.30,99166,39.45,0.15,0.36,4.673 gc.mem_free(): 92752
1,0,104,1,22.31,99168,39.45,0.14,0.36,4.661 gc.mem_free(): 89520
1,0,105,1,22.31,99167,39.45,0.15,0.36,4.666 gc.mem_free(): 86288
1,0,106,1,22.31,99168,39.44,0.14,0.36,4.661 gc.mem_free(): 83056
1,0,107,1,22.32,99170,39.43,0.14,0.36,4.676 gc.mem_free(): 79824
1,0,108,1,22.33,99156,39.42,0.15,0.36,4.683 gc.mem_free(): 76592
1,0,109,1,22.33,99156,39.42,0.14,0.36,4.651 gc.mem_free(): 73360
1,0,110,1,22.33,99158,39.42,0.14,0.36,4.661 gc.mem_free(): 70128
1,0,111,1,22.35,99167,39.41,0.14,0.36,4.685 gc.mem_free(): 66896
1,0,112,1,22.34,99168,39.41,0.15,0.36,4.661 gc.mem_free(): 63648
1,0,113,1,22.35,99166,39.41,0.14,0.36,4.673 gc.mem_free(): 60416
1,0,114,1,22.36,99159,39.41,0.15,0.36,4.671 gc.mem_free(): 57184
1,0,115,1,22.36,99163,39.40,0.15,0.36,4.680 gc.mem_free(): 53952
1,0,116,1,22.36,99162,39.40,0.14,0.36,4.666 gc.mem_free(): 50720
1,0,117,1,22.37,99165,39.40,0.14,0.36,4.663 gc.mem_free(): 47488
1,0,118,1,22.38,99168,39.39,0.14,0.36,4.661 gc.mem_free(): 44256
1,0,119,1,22.38,99165,39.39,0.14,0.36,4.676 gc.mem_free(): 41008
1,0,120,1,22.38,99165,39.39,0.15,0.36,4.649 gc.mem_free(): 37776
1,0,121,1,22.39,99167,39.39,0.14,0.36,4.683 gc.mem_free(): 34544
1,0,122,1,22.39,99165,39.39,0.14,0.36,4.663 gc.mem_free(): 31312
1,0,123,1,22.39,99164,39.37,0.15,0.36,4.680 gc.mem_free(): 28064
1,0,124,1,22.40,99169,39.37,0.15,0.36,4.663 gc.mem_free(): 24832
1,0,125,1,22.41,99167,39.37,0.15,0.36,4.666 gc.mem_free(): 21632
1,0,126,1,22.40,99163,39.37,0.14,0.36,4.663 gc.mem_free(): 18416
1,0,127,1,22.41,99167,39.36,0.15,0.36,4.656 gc.mem_free(): 15184
1,0,128,1,22.41,99167,39.36,0.15,0.36,4.651 gc.mem_free(): 11952
1,0,129,1,22.42,99168,39.36,0.14,0.36,4.656 gc.mem_free(): 8720
1,0,130,1,22.41,99165,39.36,0.14,0.36,4.661 gc.mem_free(): 5488
1,0,131,1,22.43,99168,39.35,0.15,0.36,4.651 gc.mem_free(): 2272
1,0,132,1,22.44,99169,39.35,0.15,0.36,4.647 gc.mem_free(): 146672
Temperature spike/dip 4 4
1,0,133,1,22.62,99191,39.35,0.15,0.36,4.666 gc.mem_free(): 143328
Temperature spike/dip 4 4
1,0,134,1,22.48,99166,39.36,0.16,0.36,4.642 gc.mem_free(): 139968
1,0,135,1,22.48,99171,39.34,0.15,0.36,4.666 gc.mem_free(): 136736
1,0,136,1,22.45,99170,39.34,0.14,0.36,4.673 gc.mem_free(): 133488
1,0,137,1,22.45,99169,39.34,0.14,0.36,4.668 gc.mem_free(): 130256
1,0,138,1,22.46,99174,39.33,0.14,0.36,4.642 gc.mem_free(): 127024
1,0,139,1,22.45,99174,39.33,0.15,0.36,4.666 gc.mem_free(): 123776
1,0,140,1,22.45,99172,39.32,0.14,0.36,4.673 gc.mem_free(): 120544
1,0,141,1,22.46,99171,39.32,0.15,0.36,4.644 gc.mem_free(): 117312
1,0,142,1,22.48,99174,39.32,0.15,0.36,4.647 gc.mem_free(): 114080
1,0,143,1,22.47,99177,39.32,0.15,0.36,4.663 gc.mem_free(): 110832
1,0,144,1,22.47,99179,39.32,0.16,0.36,4.671 gc.mem_free(): 107584
1,0,145,1,22.48,99172,39.32,0.14,0.36,4.671 gc.mem_free(): 104352
1,0,146,1,22.49,99175,39.32,0.15,0.36,4.690 gc.mem_free(): 101120
1,0,147,1,22.49,99179,39.32,0.15,0.36,4.688 gc.mem_free(): 97888
1,0,148,1,22.48,99181,39.31,0.14,0.36,4.651 gc.mem_free(): 94640
1,0,149,1,22.49,99174,39.31,0.14,0.36,4.666 gc.mem_free(): 91408
1,0,150,1,22.50,99167,39.30,0.14,0.36,4.685 gc.mem_free(): 88176
1,0,151,1,22.50,99161,39.30,0.14,0.36,4.688 gc.mem_free(): 84928
1,0,152,1,22.50,99159,39.30,0.14,0.36,4.668 gc.mem_free(): 81696
1,0,153,1,22.49,99165,39.30,0.15,0.36,4.683 gc.mem_free(): 78448
1,0,154,1,22.50,99172,39.30,0.15,0.36,4.678 gc.mem_free(): 75216
1,0,155,1,22.51,99172,39.29,0.14,0.36,4.666 gc.mem_free(): 71984
1,0,156,1,22.52,99170,39.29,0.15,0.36,4.668 gc.mem_free(): 68752
1,0,157,1,22.51,99174,39.29,0.15,0.36,4.663 gc.mem_free(): 65504
1,0,158,1,22.52,99178,39.30,0.15,0.36,4.663 gc.mem_free(): 62272
1,0,159,1,22.53,99180,39.29,0.16,0.36,4.649 gc.mem_free(): 59040
1,0,160,1,22.52,99175,39.29,0.15,0.36,4.642 gc.mem_free(): 55792
1,0,161,1,22.53,99176,39.29,0.15,0.36,4.671 gc.mem_free(): 52560
1,0,162,1,22.53,99176,39.29,0.15,0.36,4.683 gc.mem_free(): 49328
1,0,163,1,22.54,99181,39.28,0.14,0.36,4.659 gc.mem_free(): 46096
1,0,164,1,22.54,99181,39.28,0.14,0.36,4.680 gc.mem_free(): 42864
1,0,165,1,22.54,99182,39.28,0.15,0.36,4.680 gc.mem_free(): 39616
1,0,166,1,22.54,99177,39.28,0.14,0.36,4.673 gc.mem_free(): 36368
1,0,167,1,22.55,99179,39.28,0.15,0.36,4.671 gc.mem_free(): 33136
1,0,168,1,22.54,99175,39.28,0.14,0.36,4.671 gc.mem_free(): 29888
1,0,169,1,22.56,99175,39.27,0.14,0.36,4.690 gc.mem_free(): 26656
1,0,170,1,22.56,99172,39.27,0.14,0.36,4.673 gc.mem_free(): 23424
1,0,171,1,22.56,99173,39.27,0.15,0.36,4.668 gc.mem_free(): 20176
1,0,172,1,22.56,99172,39.27,0.15,0.36,4.668 gc.mem_free(): 16944
1,0,173,1,22.56,99174,39.27,0.14,0.36,4.676 gc.mem_free(): 13696
1,0,174,1,22.56,99174,39.27,0.16,0.36,4.685 gc.mem_free(): 10464
1,0,175,1,22.57,99175,39.27,0.14,0.36,4.666 gc.mem_free(): 7232
1,0,176,1,22.56,99178,39.27,0.14,0.36,4.661 gc.mem_free(): 4000
1,0,177,1,22.58,99180,39.27,0.15,0.36,4.642 gc.mem_free(): 784
1,0,178,1,22.58,99182,39.27,0.14,0.36,4.656 gc.mem_free(): 145312
Temperature spike/dip 4 4
1,0,179,1,22.76,99214,39.26,0.15,0.36,4.654 gc.mem_free(): 141968
Temperature spike/dip 4 4
1,0,180,1,22.62,99187,39.26,0.15,0.36,4.644 gc.mem_free(): 138608
1,0,181,1,22.62,99189,39.26,0.14,0.36,4.666 gc.mem_free(): 135376
1,0,182,1,22.57,99176,39.26,0.15,0.36,4.673 gc.mem_free(): 132128
1,0,183,1,22.58,99174,39.27,0.15,0.36,4.666 gc.mem_free(): 128896
1,0,184,1,22.59,99178,39.26,0.15,0.36,4.649 gc.mem_free(): 125664
1,0,185,1,22.58,99178,39.26,0.14,0.36,4.671 gc.mem_free(): 122416
1,0,186,1,22.58,99181,39.26,0.15,0.36,4.656 gc.mem_free(): 119184
1,0,187,1,22.58,99179,39.26,0.14,0.36,4.651 gc.mem_free(): 115936
1,0,188,1,22.59,99181,39.26,0.14,0.36,4.666 gc.mem_free(): 112704
1,0,189,1,22.61,99183,39.26,0.14,0.36,4.661 gc.mem_free(): 109472
1,0,190,1,22.61,99182,39.26,0.14,0.36,4.695 gc.mem_free(): 106240
1,0,191,1,22.59,99177,39.25,0.14,0.36,4.673 gc.mem_free(): 102992
1,0,192,1,22.61,99183,39.26,0.16,0.36,4.666 gc.mem_free(): 99760
1,0,193,1,22.60,99183,39.25,0.15,0.36,4.654 gc.mem_free(): 96512
1,0,194,1,22.61,99172,39.25,0.14,0.36,4.644 gc.mem_free(): 93280
1,0,195,1,22.62,99174,39.26,0.14,0.36,4.661 gc.mem_free(): 90048
1,0,196,1,22.61,99180,39.25,0.15,0.36,4.666 gc.mem_free(): 86800
1,0,197,1,22.62,99176,39.26,0.15,0.36,4.688 gc.mem_free(): 83568
1,0,198,1,22.62,99176,39.24,0.14,0.36,4.683 gc.mem_free(): 80336
1,0,199,1,22.61,99173,39.25,0.14,0.36,4.680 gc.mem_free(): 77088
1,0,200,1,22.62,99178,39.25,0.14,0.36,4.685 gc.mem_free(): 73856
1,0,201,1,22.63,99180,39.24,0.15,0.36,4.663 gc.mem_free(): 70624
1,0,202,1,22.63,99178,39.25,0.14,0.36,4.676 gc.mem_free(): 67376
1,0,203,1,22.61,99165,39.24,0.14,0.36,4.668 gc.mem_free(): 64128
1,0,204,1,22.63,99181,39.24,0.15,0.36,4.661 gc.mem_free(): 60896
1,0,205,1,22.63,99188,39.25,0.14,0.36,4.651 gc.mem_free(): 57664
1,0,206,1,22.63,99183,39.25,0.14,0.36,4.671 gc.mem_free(): 54432
1,0,207,1,22.64,99179,39.24,0.14,0.36,4.668 gc.mem_free(): 51200
1,0,208,1,22.65,99184,39.24,0.14,0.36,4.661 gc.mem_free(): 47968
1,0,209,1,22.64,99184,39.25,0.15,0.36,4.666 gc.mem_free(): 44720
1,0,210,1,22.65,99184,39.26,0.14,0.36,4.663 gc.mem_free(): 41488
1,0,211,1,22.65,99187,39.26,0.15,0.36,4.651 gc.mem_free(): 38256
1,0,212,1,22.65,99183,39.25,0.15,0.36,4.671 gc.mem_free(): 35008
1,0,213,1,22.65,99180,39.25,0.15,0.36,4.654 gc.mem_free(): 31776
1,0,214,1,22.65,99185,39.25,0.14,0.36,4.654 gc.mem_free(): 28528
1,0,215,1,22.66,99188,39.25,0.16,0.36,4.637 gc.mem_free(): 25296
1,0,216,1,22.66,99183,39.25,0.15,0.36,4.676 gc.mem_free(): 22064
1,0,217,1,22.66,99186,39.26,0.15,0.36,4.673 gc.mem_free(): 18832
1,0,218,1,22.66,99186,39.26,0.14,0.36,4.637 gc.mem_free(): 15584
1,0,219,1,22.65,99185,39.25,0.14,0.36,4.676 gc.mem_free(): 12336
1,0,220,1,22.66,99182,39.25,0.14,0.36,4.671 gc.mem_free(): 9104
1,0,221,1,22.66,99185,39.26,0.14,0.36,4.671 gc.mem_free(): 5872
1,0,222,1,22.66,99189,39.26,0.14,0.36,4.654 gc.mem_free(): 2656
1,0,223,1,22.67,99186,39.26,0.15,0.36,4.690 gc.mem_free(): 147056
Temperature spike/dip 4 4
1,0,224,1,22.84,99220,39.26,0.15,0.36,4.680 gc.mem_free(): 143712
Temperature spike/dip 4 4
1,0,225,1,22.71,99195,39.26,0.14,0.36,4.661 gc.mem_free(): 140352
1,0,226,1,22.70,99195,39.26,0.15,0.36,4.676 gc.mem_free(): 137104
1,0,227,1,22.66,99190,39.26,0.15,0.36,4.663 gc.mem_free(): 133856
1,0,228,1,22.68,99181,39.26,0.14,0.36,4.680 gc.mem_free(): 130624
1,0,229,1,22.67,99187,39.26,0.14,0.36,4.668 gc.mem_free(): 127376
1,0,230,1,22.68,99192,39.26,0.14,0.36,4.683 gc.mem_free(): 124144
1,0,231,1,22.68,99191,39.26,0.15,0.36,4.654 gc.mem_free(): 120896
1,0,232,1,22.68,99194,39.26,0.14,0.36,4.683 gc.mem_free(): 117664
1,0,233,1,22.68,99193,39.27,0.14,0.36,4.632 gc.mem_free(): 114416
1,0,234,1,22.68,99192,39.27,0.14,0.36,4.692 gc.mem_free(): 111184
1,0,235,1,22.69,99192,39.27,0.15,0.36,4.668 gc.mem_free(): 107952
1,0,236,1,22.69,99189,39.27,0.14,0.36,4.680 gc.mem_free(): 104704
1,0,237,1,22.67,99198,39.26,0.15,0.36,4.671 gc.mem_free(): 101456
1,0,238,1,22.69,99193,39.27,0.14,0.36,4.673 gc.mem_free(): 98224
1,0,239,1,22.69,99195,39.27,0.16,0.36,4.659 gc.mem_free(): 94992
1,0,240,1,22.68,99188,39.27,0.14,0.36,4.683 gc.mem_free(): 91744
1,0,241,1,22.70,99196,39.27,0.15,0.36,4.668 gc.mem_free(): 88512
1,0,242,1,22.69,99192,39.27,0.14,0.36,4.685 gc.mem_free(): 85264
1,0,243,1,22.69,99195,39.27,0.14,0.36,4.654 gc.mem_free(): 82032
1,0,244,1,22.69,99189,39.27,0.15,0.36,4.663 gc.mem_free(): 78784
1,0,245,1,22.69,99186,39.27,0.14,0.36,4.678 gc.mem_free(): 75552
1,0,246,1,22.69,99188,39.28,0.14,0.36,4.671 gc.mem_free(): 72320
1,0,247,1,22.70,99194,39.27,0.14,0.36,4.663 gc.mem_free(): 69088
1,0,248,1,22.70,99195,39.28,0.14,0.36,4.644 gc.mem_free(): 65856
1,0,249,1,22.70,99183,39.28,0.15,0.36,4.671 gc.mem_free(): 62624
1,0,250,1,22.69,99186,39.28,0.15,0.36,4.656 gc.mem_free(): 59408
1,0,251,1,22.69,99185,39.28,0.14,0.36,4.656 gc.mem_free(): 56192
1,0,252,1,22.70,99189,39.27,0.14,0.36,4.663 gc.mem_free(): 52960
1,0,253,1,22.71,99188,39.27,0.15,0.36,4.676 gc.mem_free(): 49728
1,0,254,1,22.70,99191,39.28,0.15,0.36,4.663 gc.mem_free(): 46480
1,0,255,1,22.70,99192,39.28,0.14,0.36,4.680 gc.mem_free(): 43248
1,0,256,1,22.70,99186,39.28,0.14,0.36,4.666 gc.mem_free(): 40016
1,0,257,1,22.71,99191,39.28,0.14,0.36,4.671 gc.mem_free(): 36784
1,0,258,1,22.71,99191,39.28,0.14,0.36,4.678 gc.mem_free(): 33552
1,0,259,1,22.71,99197,39.28,0.14,0.36,4.671 gc.mem_free(): 30320
1,0,260,1,22.71,99194,39.29,0.14,0.36,4.661 gc.mem_free(): 27088
1,0,261,1,22.71,99193,39.29,0.14,0.36,4.680 gc.mem_free(): 23840
1,0,262,1,22.71,99193,39.30,0.14,0.36,4.673 gc.mem_free(): 20592
1,0,263,1,22.71,99195,39.30,0.14,0.36,4.661 gc.mem_free(): 17360
1,0,264,1,22.71,99199,39.30,0.14,0.36,4.656 gc.mem_free(): 14128
1,0,265,1,22.71,99199,39.29,0.14,0.36,4.632 gc.mem_free(): 10880
1,0,266,1,22.72,99192,39.29,0.14,0.36,4.692 gc.mem_free(): 7648
1,0,267,1,22.72,99190,39.30,0.14,0.36,4.673 gc.mem_free(): 4416
1,0,268,1,22.71,99189,39.30,0.14,0.36,4.671 gc.mem_free(): 1184
1,0,269,1,22.71,99192,39.30,0.15,0.36,4.644 gc.mem_free(): 145648
Temperature spike/dip 4 4
1,0,270,1,22.89,99221,39.30,0.14,0.36,4.668 gc.mem_free(): 142304
Temperature spike/dip 4 4
1,0,271,1,22.76,99201,39.30,0.15,0.36,4.685 gc.mem_free(): 138944
1,0,272,1,22.76,99204,39.30,0.15,0.36,4.685 gc.mem_free(): 135696
1,0,273,1,22.72,99197,39.30,0.15,0.36,4.680 gc.mem_free(): 132448
1,0,274,1,22.72,99190,39.31,0.15,0.36,4.671 gc.mem_free(): 129200
1,0,275,1,22.70,99190,39.31,0.14,0.36,4.671 gc.mem_free(): 125952
1,0,276,1,22.70,99190,39.31,0.14,0.36,4.666 gc.mem_free(): 122720
1,0,277,1,22.72,99193,39.31,0.14,0.36,4.666 gc.mem_free(): 119488
1,0,278,1,22.71,99193,39.31,0.14,0.36,4.668 gc.mem_free(): 116240
1,0,279,1,22.71,99193,39.31,0.15,0.36,4.651 gc.mem_free(): 113008
1,0,280,1,22.72,99189,39.31,0.14,0.36,4.676 gc.mem_free(): 109776
1,0,281,1,22.72,99195,39.31,0.14,0.36,4.666 gc.mem_free(): 106544
1,0,282,1,22.73,99194,39.31,0.14,0.36,4.654 gc.mem_free(): 103312
1,0,283,1,22.72,99197,39.31,0.14,0.36,4.654 gc.mem_free(): 100064
1,0,284,1,22.72,99198,39.32,0.15,0.36,4.676 gc.mem_free(): 96816
1,0,285,1,22.72,99199,39.32,0.15,0.36,4.632 gc.mem_free(): 93584
1,0,286,1,22.73,99202,39.32,0.15,0.36,4.680 gc.mem_free(): 90352
1,0,287,1,22.72,99196,39.32,0.15,0.36,4.680 gc.mem_free(): 87104
1,0,288,1,22.72,99190,39.32,0.14,0.36,4.683 gc.mem_free(): 83856
1,0,289,1,22.73,99196,39.32,0.14,0.36,4.680 gc.mem_free(): 80624
1,0,290,1,22.72,99194,39.33,0.14,0.36,4.685 gc.mem_free(): 77376
1,0,291,1,22.73,99194,39.32,0.14,0.36,4.676 gc.mem_free(): 74144
1,0,292,1,22.74,99193,39.32,0.15,0.36,4.683 gc.mem_free(): 70912
1,0,293,1,22.73,99192,39.33,0.14,0.36,4.661 gc.mem_free(): 67664
1,0,294,1,22.73,99192,39.32,0.14,0.36,4.668 gc.mem_free(): 64416
1,0,295,1,22.73,99198,39.33,0.15,0.36,4.683 gc.mem_free(): 61184
1,0,296,1,22.74,99194,39.33,0.14,0.36,4.671 gc.mem_free(): 57952
1,0,297,1,22.74,99196,39.33,0.15,0.36,4.668 gc.mem_free(): 54704
1,0,298,1,22.74,99194,39.33,0.14,0.36,4.700 gc.mem_free(): 51472
1,0,299,1,22.74,99199,39.35,0.14,0.36,4.673 gc.mem_free(): 48240
1,0,300,1,22.74,99197,39.34,0.15,0.36,4.659 gc.mem_free(): 44992
1,0,301,1,22.74,99194,39.34,0.14,0.36,4.668 gc.mem_free(): 41744
1,0,302,1,22.74,99191,39.34,0.14,0.36,4.659 gc.mem_free(): 38496
1,0,303,1,22.74,99195,39.35,0.14,0.36,4.680 gc.mem_free(): 35264
1,0,304,1,22.74,99197,39.35,0.15,0.36,4.666 gc.mem_free(): 32016
1,0,305,1,22.74,99200,39.36,0.15,0.36,4.673 gc.mem_free(): 28784
1,0,306,1,22.74,99201,39.35,0.15,0.36,4.661 gc.mem_free(): 25536
1,0,307,1,22.74,99196,39.36,0.14,0.36,4.673 gc.mem_free(): 22304
1,0,308,1,22.74,99197,39.36,0.14,0.36,4.683 gc.mem_free(): 19056
1,0,309,1,22.74,99200,39.35,0.15,0.36,4.676 gc.mem_free(): 15824
1,0,310,1,22.74,99195,39.36,0.14,0.36,4.647 gc.mem_free(): 12592
1,0,311,1,22.74,99191,39.37,0.14,0.36,4.651 gc.mem_free(): 9360
1,0,312,1,22.74,99196,39.35,0.15,0.36,4.680 gc.mem_free(): 6128
1,0,313,1,22.74,99192,39.36,0.15,0.36,4.668 gc.mem_free(): 2896
1,0,314,1,22.74,99191,39.36,0.14,0.36,4.680 gc.mem_free(): 147488
1,0,315,1,22.74,99195,39.36,0.14,0.36,4.668 gc.mem_free(): 144240
1,0,316,1,22.74,99197,39.36,0.14,0.36,4.671 gc.mem_free(): 141008
1,0,317,1,22.75,99202,39.37,0.14,0.36,4.692 gc.mem_free(): 137776
1,0,318,1,22.75,99200,39.37,0.15,0.36,4.634 gc.mem_free(): 134528
1,0,319,1,22.75,99196,39.37,0.15,0.36,4.690 gc.mem_free(): 131296
1,0,320,1,22.75,99198,39.37,0.14,0.36,4.663 gc.mem_free(): 128048
1,0,321,1,22.74,99198,39.37,0.14,0.36,4.666 gc.mem_free(): 124800
1,0,322,1,22.75,99196,39.37,0.15,0.36,4.678 gc.mem_free(): 121568
1,0,323,1,22.75,99198,39.37,0.14,0.36,4.656 gc.mem_free(): 118320
1,0,324,1,22.75,99196,39.38,0.15,0.36,4.676 gc.mem_free(): 115088
1,0,325,1,22.75,99194,39.38,0.15,0.36,4.683 gc.mem_free(): 111840
1,0,326,1,22.75,99201,39.38,0.14,0.36,4.680 gc.mem_free(): 108608
1,0,327,1,22.75,99200,39.38,0.15,0.36,4.688 gc.mem_free(): 105360
1,0,328,1,22.75,99201,39.38,0.14,0.36,4.683 gc.mem_free(): 102128
1,0,329,1,22.75,99201,39.39,0.14,0.36,4.663 gc.mem_free(): 98896
1,0,330,1,22.75,99206,39.39,0.15,0.36,4.683 gc.mem_free(): 95664
1,0,331,1,22.74,99203,39.39,0.15,0.36,4.690 gc.mem_free(): 92416
1,0,332,1,22.74,99197,39.40,0.15,0.36,4.676 gc.mem_free(): 89184
1,0,333,1,22.74,99199,39.39,0.14,0.36,4.676 gc.mem_free(): 85936
1,0,334,1,22.75,99201,39.39,0.15,0.36,4.685 gc.mem_free(): 82704
1,0,335,1,22.74,99199,39.40,0.15,0.36,4.671 gc.mem_free(): 79456
1,0,336,1,22.75,99197,39.40,0.15,0.36,4.668 gc.mem_free(): 76224
1,0,337,1,22.74,99200,39.40,0.15,0.36,4.666 gc.mem_free(): 72976
1,0,338,1,22.75,99208,39.40,0.15,0.36,4.661 gc.mem_free(): 69744
1,0,339,1,22.75,99206,39.40,0.15,0.36,4.678 gc.mem_free(): 66512
1,0,340,1,22.75,99201,39.40,0.14,0.36,4.671 gc.mem_free(): 63280
1,0,341,1,22.75,99202,39.41,0.15,0.36,4.683 gc.mem_free(): 60032
1,0,342,1,22.76,99203,39.41,0.15,0.36,4.680 gc.mem_free(): 56800
1,0,343,1,22.75,99198,39.40,0.15,0.36,4.651 gc.mem_free(): 53552
1,0,344,1,22.76,99196,39.41,0.15,0.36,4.700 gc.mem_free(): 50320
1,0,345,1,22.75,99200,39.41,0.15,0.36,4.692 gc.mem_free(): 47072
1,0,346,1,22.76,99202,39.41,0.14,0.36,4.685 gc.mem_free(): 43840
1,0,347,1,22.76,99199,39.41,0.15,0.36,4.709 gc.mem_free(): 40608
1,0,348,1,22.76,99199,39.41,0.15,0.36,4.685 gc.mem_free(): 37376
1,0,349,1,22.76,99200,39.42,0.14,0.36,4.668 gc.mem_free(): 34128
1,0,350,1,22.76,99203,39.42,0.14,0.36,4.661 gc.mem_free(): 30896
1,0,351,1,22.75,99203,39.42,0.14,0.36,4.673 gc.mem_free(): 27648
1,0,352,1,22.75,99204,39.42,0.15,0.36,4.666 gc.mem_free(): 24416
1,0,353,1,22.75,99203,39.42,0.14,0.36,4.678 gc.mem_free(): 21184
1,0,354,1,22.76,99203,39.43,0.14,0.36,4.692 gc.mem_free(): 17952
1,0,355,1,22.75,99203,39.43,0.16,0.36,4.676 gc.mem_free(): 14704
1,0,356,1,22.76,99204,39.44,0.14,0.36,4.688 gc.mem_free(): 11472
1,0,357,1,22.76,99205,39.43,0.14,0.36,4.688 gc.mem_free(): 8224
1,0,358,1,22.76,99204,39.44,0.14,0.36,4.673 gc.mem_free(): 5008
1,0,359,1,22.76,99195,39.44,0.15,0.36,4.690 gc.mem_free(): 1776
1,0,360,1,22.76,99204,39.44,0.14,0.36,4.649 gc.mem_free(): 146448
Temperature spike/dip 4 4
1,0,361,1,22.94,99237,39.44,0.15,0.36,4.651 gc.mem_free(): 143104
Temperature spike/dip 4 4
1,0,362,1,22.80,99212,39.44,0.15,0.36,4.673 gc.mem_free(): 139744
1,0,363,1,22.80,99213,39.45,0.14,0.36,4.663 gc.mem_free(): 136496
1,0,364,1,22.76,99206,39.45,0.14,0.36,4.676 gc.mem_free(): 133248
1,0,365,1,22.77,99201,39.45,0.15,0.36,4.695 gc.mem_free(): 130016
1,0,366,1,22.76,99204,39.44,0.14,0.36,4.683 gc.mem_free(): 126768
1,0,367,1,22.77,99207,39.45,0.14,0.36,4.673 gc.mem_free(): 123536
1,0,368,1,22.77,99208,39.45,0.14,0.36,4.666 gc.mem_free(): 120304
1,0,369,1,22.76,99206,39.45,0.14,0.36,4.676 gc.mem_free(): 117056
1,0,370,1,22.76,99204,39.46,0.15,0.36,4.690 gc.mem_free(): 113824
1,0,371,1,22.77,99203,39.46,0.14,0.36,4.680 gc.mem_free(): 110592
1,0,372,1,22.76,99206,39.46,0.15,0.36,4.685 gc.mem_free(): 107344
1,0,373,1,22.77,99205,39.46,0.14,0.36,4.637 gc.mem_free(): 104112
1,0,374,1,22.76,99208,39.46,0.15,0.36,4.683 gc.mem_free(): 100864
1,0,375,1,22.76,99204,39.48,0.15,0.36,4.683 gc.mem_free(): 97616
1,0,376,1,22.77,99204,39.46,0.14,0.36,4.680 gc.mem_free(): 94384
1,0,377,1,22.76,99204,39.47,0.15,0.36,4.630 gc.mem_free(): 91136
1,0,378,1,22.77,99205,39.48,0.14,0.36,4.700 gc.mem_free(): 87904
1,0,379,1,22.76,99205,39.48,0.14,0.36,4.673 gc.mem_free(): 84656
1,0,380,1,22.77,99206,39.47,0.14,0.36,4.673 gc.mem_free(): 81424
1,0,381,1,22.77,99207,39.48,0.15,0.36,4.666 gc.mem_free(): 78192
1,0,382,1,22.77,99205,39.49,0.15,0.36,4.673 gc.mem_free(): 74944
1,0,383,1,22.77,99202,39.49,0.14,0.36,4.656 gc.mem_free(): 71712
1,0,384,1,22.77,99209,39.48,0.15,0.36,4.656 gc.mem_free(): 68464
1,0,385,1,22.77,99206,39.49,0.15,0.36,4.692 gc.mem_free(): 65232
1,0,386,1,22.77,99202,39.49,0.14,0.36,4.673 gc.mem_free(): 61984
1,0,387,1,22.77,99206,39.49,0.15,0.36,4.649 gc.mem_free(): 58752
1,0,388,1,22.76,99209,39.50,0.15,0.36,4.685 gc.mem_free(): 55504
1,0,389,1,22.76,99206,39.50,0.15,0.36,4.676 gc.mem_free(): 52272
1,0,390,1,22.77,99212,39.50,0.15,0.36,4.683 gc.mem_free(): 49040
1,0,391,1,22.77,99208,39.51,0.15,0.36,4.685 gc.mem_free(): 45792
1,0,392,1,22.77,99205,39.50,0.15,0.36,4.678 gc.mem_free(): 42560
1,0,393,1,22.78,99211,39.50,0.14,0.36,4.656 gc.mem_free(): 39328
1,0,394,1,22.77,99208,39.51,0.14,0.36,4.683 gc.mem_free(): 36080
1,0,395,1,22.77,99207,39.51,0.14,0.36,4.700 gc.mem_free(): 32848
1,0,396,1,22.78,99208,39.50,0.15,0.36,4.644 gc.mem_free(): 29616
1,0,397,1,22.77,99207,39.51,0.14,0.36,4.683 gc.mem_free(): 26368
1,0,398,1,22.78,99208,39.51,0.14,0.36,4.668 gc.mem_free(): 23136
1,0,399,1,22.77,99208,39.51,0.14,0.36,4.668 gc.mem_free(): 19888
1,0,400,1,22.78,99206,39.51,0.14,0.36,4.676 gc.mem_free(): 16656
1,0,401,1,22.77,99205,39.52,0.15,0.36,4.678 gc.mem_free(): 13408
1,0,402,1,22.77,99205,39.52,0.14,0.36,4.671 gc.mem_free(): 10160
1,0,403,1,22.77,99206,39.52,0.15,0.36,4.663 gc.mem_free(): 6928
1,0,404,1,22.76,99206,39.53,0.15,0.36,4.676 gc.mem_free(): 3696
1,0,405,1,22.77,99208,39.53,0.14,0.36,4.661 gc.mem_free(): 480
1,0,406,1,22.77,99210,39.52,0.15,0.36,4.688 gc.mem_free(): 145056
Temperature spike/dip 4 4
1,0,407,1,22.96,99243,39.53,0.15,0.36,4.673 gc.mem_free(): 141712
Temperature spike/dip 4 4
1,0,408,1,22.81,99220,39.54,0.14,0.36,4.637 gc.mem_free(): 138352
1,0,409,1,22.82,99220,39.53,0.14,0.36,4.692 gc.mem_free(): 135120
1,0,410,1,22.77,99210,39.53,0.15,0.36,4.676 gc.mem_free(): 131872
1,0,411,1,22.77,99210,39.54,0.14,0.36,4.680 gc.mem_free(): 128624
1,0,412,1,22.77,99208,39.54,0.14,0.36,4.692 gc.mem_free(): 125392
1,0,413,1,22.77,99209,39.54,0.15,0.36,4.683 gc.mem_free(): 122144
1,0,414,1,22.77,99211,39.54,0.14,0.36,4.644 gc.mem_free(): 118912
1,0,415,1,22.77,99213,39.54,0.14,0.36,4.668 gc.mem_free(): 115680
1,0,416,1,22.77,99208,39.54,0.14,0.36,4.663 gc.mem_free(): 112432
1,0,417,1,22.77,99210,39.55,0.15,0.36,4.673 gc.mem_free(): 109200
1,0,418,1,22.78,99207,39.54,0.14,0.36,4.678 gc.mem_free(): 105968
1,0,419,1,22.78,99207,39.55,0.14,0.36,4.690 gc.mem_free(): 102736
1,0,420,1,22.77,99202,39.55,0.14,0.36,4.688 gc.mem_free(): 99488
1,0,421,1,22.77,99207,39.55,0.14,0.36,4.676 gc.mem_free(): 96256
1,0,422,1,22.78,99207,39.55,0.13,0.36,4.680 gc.mem_free(): 93024
1,0,423,1,22.78,99203,39.55,0.15,0.36,4.671 gc.mem_free(): 89776
1,0,424,1,22.78,99210,39.56,0.14,0.36,4.661 gc.mem_free(): 86544
1,0,425,1,22.78,99214,39.55,0.15,0.36,4.685 gc.mem_free(): 83312
1,0,426,1,22.78,99213,39.57,0.15,0.36,4.654 gc.mem_free(): 80064
1,0,427,1,22.78,99213,39.56,0.14,0.36,4.680 gc.mem_free(): 76832
1,0,428,1,22.78,99213,39.57,0.14,0.36,4.692 gc.mem_free(): 73584
1,0,429,1,22.78,99216,39.56,0.15,0.36,4.642 gc.mem_free(): 70352
1,0,430,1,22.78,99212,39.57,0.15,0.36,4.632 gc.mem_free(): 67120
1,0,431,1,22.78,99210,39.57,0.16,0.36,4.668 gc.mem_free(): 63872
1,0,432,1,22.78,99209,39.57,0.15,0.36,4.656 gc.mem_free(): 60640
1,0,433,1,22.78,99210,39.57,0.15,0.36,4.656 gc.mem_free(): 57392
1,0,434,1,22.78,99206,39.57,0.14,0.36,4.661 gc.mem_free(): 54160
1,0,435,1,22.78,99210,39.57,0.14,0.36,4.676 gc.mem_free(): 50912
1,0,436,1,22.78,99207,39.57,0.14,0.36,4.680 gc.mem_free(): 47680
1,0,437,1,22.76,99204,39.58,0.14,0.36,4.680 gc.mem_free(): 44432
1,0,438,1,22.76,99206,39.58,0.15,0.36,4.685 gc.mem_free(): 41200

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
MicroPython v1.21.0 on 2023-10-06; Raspberry Pi Pico W with RP2040
Type "help()" for more information.
>>> 
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
MicroPython v1.21.0 on 2023-10-06; Raspberry Pi Pico W with RP2040
Type "help()" for more information.
>>> 

So it does show that the spikes always occur around automatic garbage collections but by no means after every one.

It's difficult to know who to point the finger of suspicion at but I don't think my code is doing anything that could be considered risky.

For the moment the excessive use of a forced garbage collection after every sampling works fine but I wouldn't want to use this environment for a mission critical medical system!

robert-hh commented 9 months ago

So it looks indeed like GC would destroy an object, It has to be a temporary one, otherwise the code would not recover. That is hard to find. As a Side note: I wonder that GC steps in when the memory is almost exhausted. I faintly recall that the limit set with gc.threshold() is higher. You could eventually use gc.threshold() to limit the range, by starting with a higher threshold (like 32k), setting it low before starting an area of interest, and then resetting it to the higher value. That way there will be not automatic GC in the area of interest.

b.t.w.: Did you update the MicroPython firmware to a recent daily build? The float lib has changed for the RP2040 port.

dakin80 commented 9 months ago

Tried with latest daily build and made no difference.