This software makes it possible to save and display data, transmitted by CanSat, received from an antenna via the serial port in real time.
The following dependencies must be installed to use the code:
You can install all the python libraries you need using the command:
pip install -r requirements.txt
First of all, it is neessary that redis is running
redis-server
To start the data collection program, simply run
python main.py
Open another shell to plot the data
python worker.py
RedisClient is an object designed to establish a connection with a redis server and that provides methods for adding or removing items from a queue
RedisClient(key: str, host: str, port: int)
initial_del(self) -> None:
push_list(self, element: list) -> Union[Awaitable[int], int]:
pop_list(self) -> None or list:
- Clear redis queue on start
- Push element to queue
- Pop element from queue
# Initialize client
r = RedisClient(host=REDIS_HOST, port=REDIS_PORT, key=REDIS_KEY)
# Delate previus data
r.initial_del()
# Push list to ram
r.push_list([1, 2, 3, 4])
# Pop list from ram
print(r.pop_list())
>>> [1, 2, 3, 4]
Data objects are designed to make data plotting simple; each object holds its data within itself and is responsible for plotting it
DataObject(name: str, key: int, initial_value: float)
update_data(self, new_data: list[float] = None) -> None:
PlottableDataObject(DataObject):
update_graph(self, xdata: list) -> None:
MultiPlotDataObject(
ax: plt.axes,
name: str,
keys: list[int],
xlim: list[int],
ylim: list[int] = None,
delta: int = 0,
sources: list[str] = None,
initial_values: list[float] = None,
colors: list[str] = None
):
update_y_limits():
update_data(self, new_data: list[float] = None) -> None:
- Update data parsing redis data
- Update plot data
- Calculate viewport
# Matplotlib figure
fig = plt.figure()
# Create the axes
temp_axes = fig.add_subplot()
plt.ion()
# Create the plot
temp = MultiPlotDataObject(
ax=temp_axes,
colors=["red", "orange"],
initial_values=[0, 0],
keys=[5, 8],
name="Temperature",
sources=["Pressure", "Humidity"],
xlim=view_section,
ylim=[0, 20],
delta=1
)
# Update the data
temp.update_data(new_data)
# Update graph with new data
temp.update_graph()
Warning
Sorry, documentation is planned ...
The dispatcher handles receiving the data its saving and adding it to a queue hosted on a redis database that is iterated by a worker that parses the data in order to display it in real time in an animated graph
graph
S(Serila Port)
A([Dispatcher])
B([Worker])
c[(Redis Queue)]
D[data.csv]
B --> P[Real time plot dashboard]
S --> A
A <--> c
B <--> c
A --> D