From f07f9987717c0bfb0687a3e5700cae5388ccd10d Mon Sep 17 00:00:00 2001 From: Pierrick C Date: Fri, 3 Aug 2018 19:59:34 +0200 Subject: [PATCH] Reduction of memory use and fragmentation Add onbaord LED as "read-only flash" indicator --- circuitpython/code/main.py | 111 ++++++++++++++++++------------------- 1 file changed, 55 insertions(+), 56 deletions(-) diff --git a/circuitpython/code/main.py b/circuitpython/code/main.py index b06140c..986fc1f 100644 --- a/circuitpython/code/main.py +++ b/circuitpython/code/main.py @@ -44,7 +44,7 @@ neopixel_max_value =const(70) #max value instead of brightness to spare some ####################### -import board, microcontroller +import microcontroller import gc, os # import micropython import time, rtc @@ -63,59 +63,57 @@ import neopixel class Data: """Class for handling data""" def __init__(self): - self.data = {'SYS': {'time': {'val': "2000/01/01_00:00:00", 'unit': '' }, - 'vbat': {'val': int(), 'unit': 'V' }, - 'CPUtemp': {'val': float(), 'unit': '°C' }}, - 'BME280': {'temp': { 'val': float(), 'unit': '°C' }, - 'hum': { 'val': int(), 'unit': '%' }, - 'press': { 'val': float(), 'unit': 'hPa' }}, - 'GPS': {'timestamp': {'val': "2000/01/01_00:00:00", 'unit': ''}, - 'lat': {'val': float(), 'unit': 'deg'}, - 'lon': {'val': float(), 'unit': 'deg'}, - 'alt': {'val': float(), 'unit': 'm'}, - 'qual': {'val': int(), 'unit': ''}} + self.data = {'SYS': {'time': "2000/01/01_00:00:00", + 'vbat': int(), + 'cput': float()}, + 'BME': {'temp': float(), + 'hum': int(), + 'press': float()}, + 'GPS': {'time': "2000/01/01_00:00:00", + 'lat': float(), + 'lon': float(), + 'alt': float(), + 'qual': int()} } def update(self): """Read the data from various sensors and update the data dict variable""" #Data from Feather board - self.data['SYS']['time']['val'] = datetime_format.format(*clock.datetime[0:6]) - self.data['SYS']['vbat']['val'] = round(measure_vbat(), 3) - self.data['SYS']['CPUtemp']['val'] = round(microcontroller.cpu.temperature, 2) + self.data['SYS']['time'] = datetime_format.format(*clock.datetime[0:6]) + self.data['SYS']['vbat'] = round(measure_vbat(), 3) + self.data['SYS']['cput'] = round(microcontroller.cpu.temperature, 2) #Data from BME280 - self.data['BME280']['temp']['val'] = round(bme280.temperature, 1) - self.data['BME280']['hum']['val'] = int(bme280.humidity) - self.data['BME280']['press']['val'] = round(bme280.pressure, 2) + self.data['BME']['temp'] = round(bme280.temperature, 1) + self.data['BME']['hum'] = int(bme280.humidity) + self.data['BME']['press'] = round(bme280.pressure, 2) if gps_enable: if gps.has_fix: - self.data['GPS']['timestamp']['val'] = datetime_format.format(gps.timestamp_utc.tm_year, - gps.timestamp_utc.tm_mon, - gps.timestamp_utc.tm_mday, - gps.timestamp_utc.tm_hour, - gps.timestamp_utc.tm_min, - gps.timestamp_utc.tm_sec) - self.data['GPS']['lat']['val'] = gps.latitude - self.data['GPS']['lon']['val'] = gps.longitude - self.data['GPS']['alt']['val'] = gps.altitude_m - self.data['GPS']['qual']['val'] = gps.fix_quality + self.data['GPS']['time'] = datetime_format.format(gps.timestamp_utc.tm_year, + gps.timestamp_utc.tm_mon, + gps.timestamp_utc.tm_mday, + gps.timestamp_utc.tm_hour, + gps.timestamp_utc.tm_min, + gps.timestamp_utc.tm_sec) + self.data['GPS']['lat'] = gps.latitude + self.data['GPS']['lon'] = gps.longitude + self.data['GPS']['alt'] = gps.altitude_m + self.data['GPS']['qual'] = gps.fix_quality else: - self.data['GPS']['lat']['val'] = None - self.data['GPS']['lon']['val'] = None - self.data['GPS']['alt']['val'] = None + self.data['GPS']['lat'] = None + self.data['GPS']['lon'] = None + self.data['GPS']['alt'] = None else: self.data['GPS'] = None def show(self): - """Serialize data to json-formatted string for visualization on - serial console - """ + """Serialize data for visualization on serial console""" for source in self.data.keys(): print(source + ": ") if not self.data[source] == None: for d in self.data[source].items(): - print("\t{0}: {val} {unit}".format(d[0], **d[1])) + print("\t{0}: {1}".format(d[0], d[1])) def json(self): """Serialize data to json-formatted string""" @@ -124,31 +122,27 @@ class Data: output = "".join((output, "'", source, "': \n")) if not self.data[source] == None: for d in self.data[source].items(): - output = "".join((output, "{", - "'{}': ".format(d[0]), - "{", - "'val': {val},'unit': {unit}".format(**d[1]), - "}}\n")) + output = "".join((output, " {'{}': '{}'}}\n".format(d[0], d[1]))) output = output + "}, \n" output = output + "}" return output def atmo2rgb(self): - """Congreen atmospheric data from BME280 sensor into NeoPixel color + """Convert atmospheric data from BME280 sensor into NeoPixel color * RED => temperature : max = 35degC, min =10degC (range 25°C) * BLUE => humidity : max= 100%, mini=0% * GREEN => pression : mini=960hPa, maxi = 1030hPa (range 70hPa) """ - red = int((self.data['BME280']['temp']['val']-10)*neopixel_max_value/25) + red = int((self.data['BME']['temp']-10)*neopixel_max_value/25) if red > neopixel_max_value: red = neopixel_max_value if red < 0: red = 0 - blue = int(self.data['BME280']['hum']['val']*neopixel_max_value/100) + blue = int(self.data['BME']['hum']*neopixel_max_value/100) - green = int((self.data['BME280']['press']['val']-960)*neopixel_max_value/70) + green = int((self.data['BME']['press']-960)*neopixel_max_value/70) if green > neopixel_max_value: green = neopixel_max_value if green < 0: @@ -163,14 +157,14 @@ class Data: """Save the current data as csv file on SPI flash""" try: with open("data/data.csv", "a") as csv_file: - csv_file.write("{};{};{};{}\n".format(self.data['SYS']['time']['val'], - self.data['BME280']['temp']['val'], - self.data['BME280']['hum']['val'], - self.data['BME280']['press']['val'])) + csv_file.write("{};{};{};{}\n".format(self.data['SYS']['time'], + self.data['BME']['temp'], + self.data['BME']['hum'], + self.data['BME']['press'])) except OSError as e: - print("Err. {} : R-O FS".format(e)) + print("Err {}: readonly".format(e)) backup_data = False #to avoid trying again till next reset - + led13.value = True ############# # Functions # @@ -229,22 +223,27 @@ clock = rtc.RTC() #clock.datetime = time.struct_time((2018, 7, 29, 15, 31, 30, 0, 0, 0)) # BME280 sensors (I2C) -i2c = I2C(board.SCL, board.SDA) +i2c = I2C(microcontroller.pin.PA23, microcontroller.pin.PA22) # i2c addresses for BME280 breakout : # 0x77 = adafruit breakout board # 0x76 = tiny chinese board bme280 = Adafruit_BME280_I2C(i2c, address=0x76) # Battery voltage -vbat = AnalogIn(board.D9, ) +vbat = AnalogIn(microcontroller.pin.PA07) -gps_en_pin = DigitalInOut(board.A5) +gps_en_pin = DigitalInOut(microcontroller.pin.PB02) gps_en_pin.direction = Direction.OUTPUT +led13 = DigitalInOut(microcontroller.pin.PA17) +led13.direction = Direction.OUTPUT +led13.value = False + # GPS on FeatherWing board gps_en_pin.value = not gps_enable if gps_enable: - gps_uart = UART(board.TX, board.RX, baudrate=9600, timeout=3000) + gps_uart = UART(microcontroller.pin.PA10, microcontroller.pin.PA11, + baudrate=9600, timeout=3000) gps = GPS(gps_uart) # Turn on the basic GGA and RMC info gps.send_command('PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0') @@ -252,10 +251,10 @@ if gps_enable: # Integrated Neopixel if data_to_neopixel: - pixel = neopixel.NeoPixel(board.NEOPIXEL, 1, brightness=1) + pixel = neopixel.NeoPixel(microcontroller.pin.PA06, 1, brightness=1) else: #if neopixel is disable : turn off the LED - pixel = neopixel.NeoPixel(board.NEOPIXEL, 1, brightness=1) + pixel = neopixel.NeoPixel(microcontroller.pin.PA06, 1, brightness=1) pixel[0] = (0,0,0) pixel = None