Reading input frequency and drawing using pyqtgraph
-
wrote on 12 Jan 2022, 04:16 last edited by
I have to read a square waveform of frequency 100Hz to 20kHz on GPIO of raspberry. I have checked using piscope the waveform at the required GPIO. Now, I need to draw a GUI window with some information regarding this square waveform. After reading online at various sites, I have finalized pyqtgraph and now I am trying to learn through some examples. In following code, I append a random value at some fixed time to the curve.
from PyQt5 import QtWidgets, QtCore from pyqtgraph.Qt import QtGui import pyqtgraph as pg import sys import os from random import randint class MainWindow(QtWidgets.QMainWindow): def __init__(self,*args,**kwargs): super(MainWindow,self).__init__(*args,**kwargs) self.graphWidget = pg.PlotWidget() self.setCentralWidget(self.graphWidget) pen = pg.mkPen(color='r', width=3) styles = {'color': '#f00', 'font-size': '20px'} self.graphWidget.setLabel('left', 'Temperature (°C)', **styles) self.graphWidget.setLabel('bottom', 'Hour (H)', **styles) self.graphWidget.setTitle("Frequency Plotting", color="b", size="30pt") # Add grid self.graphWidget.showGrid(x=True, y=True) self.x = list(range(100)) # 100 time points self.y = [randint(0, 100) for _ in range(100)] # 100 data points self.lineCurve = self.graphWidget.plot(self.x, self.y,pen=pen) self.timer = QtCore.QTimer() self.timer.setInterval(100) self.timer.timeout.connect(self.update_plot_data) self.timer.start() def update_plot_data(self): # self.x = self.x[1:] # Remove the first y element. # self.x.append(self.x[-1] + 1) # Add a new value 1 higher than the last. self.y = self.y[1:] # Remove the first self.y.append(randint(0, 100)) # Add a new random value. self.lineCurve.setData(self.x, self.y) # Update the data. def main(): app = QtWidgets.QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
Now, I am stuck at how to combine reading square waveform frequency from GPIO and appending this to the array for updating to the waveform. Also, instead of single centralwidget, I require to add some labels with vertical layout.
-
I have to read a square waveform of frequency 100Hz to 20kHz on GPIO of raspberry. I have checked using piscope the waveform at the required GPIO. Now, I need to draw a GUI window with some information regarding this square waveform. After reading online at various sites, I have finalized pyqtgraph and now I am trying to learn through some examples. In following code, I append a random value at some fixed time to the curve.
from PyQt5 import QtWidgets, QtCore from pyqtgraph.Qt import QtGui import pyqtgraph as pg import sys import os from random import randint class MainWindow(QtWidgets.QMainWindow): def __init__(self,*args,**kwargs): super(MainWindow,self).__init__(*args,**kwargs) self.graphWidget = pg.PlotWidget() self.setCentralWidget(self.graphWidget) pen = pg.mkPen(color='r', width=3) styles = {'color': '#f00', 'font-size': '20px'} self.graphWidget.setLabel('left', 'Temperature (°C)', **styles) self.graphWidget.setLabel('bottom', 'Hour (H)', **styles) self.graphWidget.setTitle("Frequency Plotting", color="b", size="30pt") # Add grid self.graphWidget.showGrid(x=True, y=True) self.x = list(range(100)) # 100 time points self.y = [randint(0, 100) for _ in range(100)] # 100 data points self.lineCurve = self.graphWidget.plot(self.x, self.y,pen=pen) self.timer = QtCore.QTimer() self.timer.setInterval(100) self.timer.timeout.connect(self.update_plot_data) self.timer.start() def update_plot_data(self): # self.x = self.x[1:] # Remove the first y element. # self.x.append(self.x[-1] + 1) # Add a new value 1 higher than the last. self.y = self.y[1:] # Remove the first self.y.append(randint(0, 100)) # Add a new random value. self.lineCurve.setData(self.x, self.y) # Update the data. def main(): app = QtWidgets.QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
Now, I am stuck at how to combine reading square waveform frequency from GPIO and appending this to the array for updating to the waveform. Also, instead of single centralwidget, I require to add some labels with vertical layout.
@Maanas Not sure what the problem is exactly?
Can you already read GPIO?"I require to add some labels with vertical layout" - what is the problem with that?
-
wrote on 12 Jan 2022, 08:03 last edited by
I have read GPIO frequency using pigpio library. Now how to update it in pyqtgraph? The given example appends random value. But how to draw square waveform of the read frequency and also update it regularly.
After setting centralWidget, I am not able to change layout or add vertical layout. How to do that?
-
I have read GPIO frequency using pigpio library. Now how to update it in pyqtgraph? The given example appends random value. But how to draw square waveform of the read frequency and also update it regularly.
After setting centralWidget, I am not able to change layout or add vertical layout. How to do that?
wrote on 12 Jan 2022, 08:11 last edited by JonB 1 Dec 2022, 08:12@Maanas said in Reading input frequency and drawing using pyqtgraph:
After setting centralWidget, I am not able to change layout or add vertical layout. How to do that?
Set your central widget to e.g. a plain
QWidget
and then add desired layouts + sub-widgets on that as per normal. -
I have read GPIO frequency using pigpio library. Now how to update it in pyqtgraph? The given example appends random value. But how to draw square waveform of the read frequency and also update it regularly.
After setting centralWidget, I am not able to change layout or add vertical layout. How to do that?
@Maanas said in Reading input frequency and drawing using pyqtgraph:
and also update it regularly
I don't know how exactly you're reading GPIO. You could use a QTimer and add new values you cololected from GPIO to your graph on each timeout.
-
wrote on 12 Jan 2022, 10:22 last edited by
I am only reading frequency value using pigpio module. I have to draw square waveform with updated frequency. The waveform display need not to be real time i.e. I can sample the frequency and later on change the waveform accordingly after some time. My query is how to draw this square waveform.
-
@Maanas said in Reading input frequency and drawing using pyqtgraph:
After setting centralWidget, I am not able to change layout or add vertical layout. How to do that?
Set your central widget to e.g. a plain
QWidget
and then add desired layouts + sub-widgets on that as per normal.
1/8