diff --git a/Pipfile b/Pipfile index 8a4b3267db27cf6cc4a852b65af9f1d54461fbe5..8c821018dc1c6d58e23beb1f9647e5869e5f8236 100644 --- a/Pipfile +++ b/Pipfile @@ -6,8 +6,9 @@ url = "https://pypi.org/simple" [packages] numpy = "*" scipy = "*" +matplotlib = "*" [dev-packages] [requires] -python_version = "3.5" +python_version = "3.6" diff --git a/Pipfile.lock b/Pipfile.lock index 567e1162baac67137cf091a4e11bc695d6475867..7295ca607b6c3d4e789d9ef28c43411753a472e8 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "17c4e8a5337aa6129b63add7b689030a194c16a3bbc5c634d7872c6fb53a25de" + "sha256": "3ebcddb3e1f4422f65da836d0abcf6878a307f33665b67cba3f7b9ec416a75a9" }, "pipfile-spec": 6, "requires": { - "python_version": "3.5" + "python_version": "3.6" }, "sources": [ { @@ -16,6 +16,65 @@ ] }, "default": { + "cycler": { + "hashes": [ + "sha256:1d8a5ae1ff6c5cf9b93e8811e581232ad8920aeec647c37316ceac982b08cb2d", + "sha256:cd7b2d1018258d7247a71425e9f26463dfb444d411c39569972f4ce586b0c9d8" + ], + "version": "==0.10.0" + }, + "kiwisolver": { + "hashes": [ + "sha256:0ee4ed8b3ae8f5f712b0aa9ebd2858b5b232f1b9a96b0943dceb34df2a223bc3", + "sha256:0f7f532f3c94e99545a29f4c3f05637f4d2713e7fd91b4dd8abfc18340b86cd5", + "sha256:1a078f5dd7e99317098f0e0d490257fd0349d79363e8c923d5bb76428f318421", + "sha256:1aa0b55a0eb1bd3fa82e704f44fb8f16e26702af1a073cc5030eea399e617b56", + "sha256:2874060b91e131ceeff00574b7c2140749c9355817a4ed498e82a4ffa308ecbc", + "sha256:379d97783ba8d2934d52221c833407f20ca287b36d949b4bba6c75274bcf6363", + "sha256:3b791ddf2aefc56382aadc26ea5b352e86a2921e4e85c31c1f770f527eb06ce4", + "sha256:4329008a167fac233e398e8a600d1b91539dc33c5a3eadee84c0d4b04d4494fa", + "sha256:45813e0873bbb679334a161b28cb9606d9665e70561fd6caa8863e279b5e464b", + "sha256:53a5b27e6b5717bdc0125338a822605084054c80f382051fb945d2c0e6899a20", + "sha256:66f82819ff47fa67a11540da96966fb9245504b7f496034f534b81cacf333861", + "sha256:79e5fe3ccd5144ae80777e12973027bd2f4f5e3ae8eb286cabe787bed9780138", + "sha256:8b6a7b596ce1d2a6d93c3562f1178ebd3b7bb445b3b0dd33b09f9255e312a965", + "sha256:9576cb63897fbfa69df60f994082c3f4b8e6adb49cccb60efb2a80a208e6f996", + "sha256:95a25d9f3449046ecbe9065be8f8380c03c56081bc5d41fe0fb964aaa30b2195", + "sha256:aaec1cfd94f4f3e9a25e144d5b0ed1eb8a9596ec36d7318a504d813412563a85", + "sha256:acb673eecbae089ea3be3dcf75bfe45fc8d4dcdc951e27d8691887963cf421c7", + "sha256:b15bc8d2c2848a4a7c04f76c9b3dc3561e95d4dabc6b4f24bfabe5fd81a0b14f", + "sha256:b1c240d565e977d80c0083404c01e4d59c5772c977fae2c483f100567f50847b", + "sha256:ce3be5d520b4d2c3e5eeb4cd2ef62b9b9ab8ac6b6fedbaa0e39cdb6f50644278", + "sha256:e0f910f84b35c36a3513b96d816e6442ae138862257ae18a0019d2fc67b041dc", + "sha256:ea36e19ac0a483eea239320aef0bd40702404ff8c7e42179a2d9d36c5afcb55c", + "sha256:f923406e6b32c86309261b8195e24e18b6a8801df0cfc7814ac44017bfcb3939" + ], + "version": "==1.0.1" + }, + "matplotlib": { + "hashes": [ + "sha256:07055eb872fa109bd88f599bdb52065704b2e22d475b67675f345d75d32038a0", + "sha256:0f2f253d6d51f5ed52a819921f8a0a8e054ce0daefcfbc2557e1c433f14dc77d", + "sha256:1ef9fd285334bd6b0495b6de9d56a39dc95081577f27bafabcf28e0d318bed31", + "sha256:3fb2db66ef98246bafc04b4ef4e9b0e73c6369f38a29716844e939d197df816a", + "sha256:3fd90b407d1ab0dae686a4200030ce305526ff20b85a443dc490d194114b2dfa", + "sha256:45dac8589ef1721d7f2ab0f48f986694494dfcc5d13a3e43a5cb6c816276094e", + "sha256:4bb10087e09629ba3f9b25b6c734fd3f99542f93d71c5b9c023f28cb377b43a9", + "sha256:4dc7ef528aad21f22be85e95725234c5178c0f938e2228ca76640e5e84d8cde8", + "sha256:4f6a516d5ef39128bb16af7457e73dde25c30625c4916d8fbd1cc7c14c55e691", + "sha256:70f0e407fbe9e97f16597223269c849597047421af5eb8b60dbaca0382037e78", + "sha256:7b3d03c876684618e2a2be6abeb8d3a033c3a1bb38a786f751199753ef6227e6", + "sha256:8944d311ce37bee1ba0e41a9b58dcf330ffe0cf29d7654c3d07c572215da68ac", + "sha256:8ff08eaa25c66383fe3b6c7eb288da3c22dcedc4b110a0b592b35f68d0e093b2", + "sha256:9d12378d6a236aa38326e27f3a29427b63edce4ce325745785aec1a7535b1f85", + "sha256:abfd3d9390eb4f2d82cbcaa3a5c2834c581329b64eccb7a071ed9d5df27424f7", + "sha256:bc4d7481f0e8ec94cb1afc4a59905d6274b3b4c389aba7a2539e071766671735", + "sha256:dc0ba2080fd0cfdd07b3458ee4324d35806733feb2b080838d7094731d3f73d9", + "sha256:f26fba7fc68994ab2805d77e0695417f9377a00d36ba4248b5d0f1e5adb08d24" + ], + "index": "pypi", + "version": "==2.2.2" + }, "numpy": { "hashes": [ "sha256:0074d42e2cc333800bd09996223d40ec52e3b1ec0a5cab05dacc09b662c4c1ae", @@ -45,6 +104,32 @@ "index": "pypi", "version": "==1.14.3" }, + "pyparsing": { + "hashes": [ + "sha256:0832bcf47acd283788593e7a0f542407bd9550a55a8a8435214a1960e04bcb04", + "sha256:281683241b25fe9b80ec9d66017485f6deff1af5cde372469134b56ca8447a07", + "sha256:8f1e18d3fd36c6795bb7e02a39fd05c611ffc2596c1e0d995d34d67630426c18", + "sha256:9e8143a3e15c13713506886badd96ca4b579a87fbdf49e550dbfc057d6cb218e", + "sha256:b8b3117ed9bdf45e14dcc89345ce638ec7e0e29b2b579fa1ecf32ce45ebac8a5", + "sha256:e4d45427c6e20a59bf4f88c639dcc03ce30d193112047f94012102f235853a58", + "sha256:fee43f17a9c4087e7ed1605bd6df994c6173c1e977d7ade7b651292fab2bd010" + ], + "version": "==2.2.0" + }, + "python-dateutil": { + "hashes": [ + "sha256:3220490fb9741e2342e1cf29a503394fdac874bc39568288717ee67047ff29df", + "sha256:9d8074be4c993fbe4947878ce593052f71dac82932a677d49194d8ce9778002e" + ], + "version": "==2.7.2" + }, + "pytz": { + "hashes": [ + "sha256:65ae0c8101309c45772196b21b74c46b2e5d11b6275c45d251b150d5da334555", + "sha256:c06425302f2cf668f1bba7a0a03f3c1d34d4ebeef2c72003da308b3947c7f749" + ], + "version": "==2018.4" + }, "scipy": { "hashes": [ "sha256:103fd8253fd3f0df3f50a554abc01b13bee1d70483f23bb03636a74b0a0cbc71", @@ -73,6 +158,13 @@ ], "index": "pypi", "version": "==1.0.1" + }, + "six": { + "hashes": [ + "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9", + "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb" + ], + "version": "==1.11.0" } }, "develop": {} diff --git a/explore_data.py b/explore_data.py index 99c03d159a779a893c1d0d4155f961160d9a3169..4a566c8b62e6d17bee4108edf919c917d3d2b30d 100644 --- a/explore_data.py +++ b/explore_data.py @@ -1,6 +1,8 @@ import scipy.io import os from glob import glob +from matplotlib import pyplot as plt +import numpy as np def convert_matlab_datetime_vector_to_utc(date_vector): @@ -19,6 +21,20 @@ def filter_mat(mat, test_type): return [x for x in mat if x[0][0] == test_type] +def plot(name, values): + plt.figure(name) + plt.plot(range(len(values)), values) + + +def check_length(*items): + base_length = len(items[0]) + for item in items: + if len(item) != base_length: + print(len(item)) + import sys + sys.exit("ERROR") + + def charge_iteration(charge_items): for item in charge_items: test_type = item[0][0] # charge impedence discharge @@ -28,19 +44,90 @@ def charge_iteration(charge_items): voltage_measured = item[3][0][0][0][0] # Battery terminal voltage (Volts) current_measured = item[3][0][0][1][0] # Battery output current (Amps) temperature_measured = item[3][0][0][2][0] # Battery temperature (degree C) - current_charge = item[3][0][0][3] # Current measured at charger (Amps) - voltage_charge = item[3][0][0][4] # Voltage measured at charger (Volts) + current_charge = item[3][0][0][3][0] # Current measured at charger (Amps) + voltage_charge = item[3][0][0][4][0] # Voltage measured at charger (Volts) # MEH time = item[3][0][0][5] # Time vector for the cycle (secs) + plot("voltage_measured", voltage_measured) + plot("current_measured", current_measured) + plot("temperature_measured", temperature_measured) + plot("current_charge", current_charge) + plot("voltage_charge", voltage_charge) + #check size for plotting - if (len(voltage_measured) != len(current_measured) and - len(voltage_measured) != len(temperature_measured) and - len(voltage_measured) != len(voltage_measured) and - len(voltage_measured) != len(current_charge) - ): - import sys - sys.exit("ERROR") + check_length( + voltage_measured, + current_measured, + temperature_measured, + current_charge, + voltage_charge, + ) + + plt.show() + +def discharge_iteration(discharge_items): + for item in discharge_items: + test_type = item[0][0] # charge impedence discharge + ambiant_temp = item[1][0][0] # temperature: 4 ~24 ~43 + datetime = convert_matlab_datetime_vector_to_utc(item[2][0]) + + voltage_measured = item[3][0][0][0][0] # Battery terminal voltage (Volts) + current_measured = item[3][0][0][1][0] # Battery output current (Amps) + temperature_measured = item[3][0][0][2][0] # Battery temperature (degree C) + current_charge = item[3][0][0][3][0] # Current measured at charger (Amps) + voltage_charge = item[3][0][0][4][0] # Voltage measured at charger (Volts) + # MEH + time = item[3][0][0][5][0] # Time vector for the cycle (secs) + capacity = item[3][0][0][6] # Battery capacity (Ahr) for discharge till 2.7V + + plot("voltage_measured", voltage_measured) + plot("current_measured", current_measured) + plot("temperature_measured", temperature_measured) + plot("current_charge", current_charge) + plot("voltage_charge", voltage_charge) + + #check size for plotting + check_length( + voltage_measured, + current_measured, + temperature_measured, + current_charge, + voltage_charge, + ) + + plt.show() + + +def impedance_iteration(impedance_items): + for item in impedance_items: + test_type = item[0][0] # charge impedence discharge + ambiant_temp = item[1][0][0] # temperature: 4 ~24 ~43 + datetime = convert_matlab_datetime_vector_to_utc(item[2][0]) + + sense_current = item[3][0][0][0][0] # Current in sense branch (Amps) + battery_current = item[3][0][0][1][0] # urrent in battery branch (Amps) + current_ratio = item[3][0][0][2][0] # Ratio of the above currents + battery_impedance = item[3][0][0][3] # attery impedance (Ohms) computed from raw data + rectified_impedance = item[3][0][0][4] # alibrated and smoothed battery impedance (Ohms) + re = item[3][0][0][5][0][0] # Estimated electrolyte resistance (Ohms) + rct = item[3][0][0][6][0][0] # Estimated charge transfer resistance (Ohms) + + plot("sense_current", sense_current) + plot("battery_current", battery_current) + plot("current_ratio", current_ratio) + plot("battery_impedance", battery_impedance) + plot("rectified_impedance", rectified_impedance) + + #check size for plotting + check_length( + sense_current, + battery_current, + current_ratio, + battery_impedance, + # rectified_impedance, # WARNING 39 + ) + plt.show() def main(): @@ -57,27 +144,11 @@ def main(): discharge_items = filter_mat(mat, "discharge") charge_iteration(charge_items) + # discharge_iteration(discharge_items) + # impedance_iteration(impedance_items) + + - # print(([1][0])) - # print(mat["B0025"][0][0]) - - # TODO - # for discharge the fields are: - # Voltage_measured: Battery terminal voltage (Volts) - # Current_measured: Battery output current (Amps) - # Temperature_measured: Battery temperature (degree C) - # Current_charge: Current measured at load (Amps) - # Voltage_charge: Voltage measured at load (Volts) - # Time: Time vector for the cycle (secs) - # Capacity: Battery capacity (Ahr) for discharge till 2.7V - # for impedance the fields are: - # Sense_current: Current in sense branch (Amps) - # Battery_current: Current in battery branch (Amps) - # Current_ratio: Ratio of the above currents - # Battery_impedance: Battery impedance (Ohms) computed from raw data - # Rectified_impedance: Calibrated and smoothed battery impedance (Ohms) - # Re: Estimated electrolyte resistance (Ohms) - # Rct: Estimated charge transfer resistance (Ohms) if __name__ == "__main__": main()