code added
This commit is contained in:
+109
@@ -0,0 +1,109 @@
|
|||||||
|
# Created by .ignore support plugin (hsz.mobi)
|
||||||
|
### Python template
|
||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Distribution / packaging
|
||||||
|
.Python
|
||||||
|
build/
|
||||||
|
develop-eggs/
|
||||||
|
dist/
|
||||||
|
downloads/
|
||||||
|
eggs/
|
||||||
|
.eggs/
|
||||||
|
lib/
|
||||||
|
lib64/
|
||||||
|
parts/
|
||||||
|
sdist/
|
||||||
|
var/
|
||||||
|
wheels/
|
||||||
|
*.egg-info/
|
||||||
|
.installed.cfg
|
||||||
|
*.egg
|
||||||
|
MANIFEST
|
||||||
|
|
||||||
|
# PyInstaller
|
||||||
|
# Usually these files are written by a python script from a template
|
||||||
|
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||||
|
*.manifest
|
||||||
|
*.spec
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
pip-delete-this-directory.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
htmlcov/
|
||||||
|
.tox/
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
.cache
|
||||||
|
nosetests.xml
|
||||||
|
coverage.xml
|
||||||
|
*.cover
|
||||||
|
.hypothesis/
|
||||||
|
.pytest_cache/
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
*.mo
|
||||||
|
*.pot
|
||||||
|
|
||||||
|
# Django stuff:
|
||||||
|
*.log
|
||||||
|
local_settings.py
|
||||||
|
db.sqlite3
|
||||||
|
|
||||||
|
# Flask stuff:
|
||||||
|
instance/
|
||||||
|
.webassets-cache
|
||||||
|
|
||||||
|
# Scrapy stuff:
|
||||||
|
.scrapy
|
||||||
|
|
||||||
|
# Sphinx documentation
|
||||||
|
docs/_build/
|
||||||
|
|
||||||
|
# PyBuilder
|
||||||
|
target/
|
||||||
|
|
||||||
|
# Jupyter Notebook
|
||||||
|
.ipynb_checkpoints
|
||||||
|
|
||||||
|
# pyenv
|
||||||
|
.python-version
|
||||||
|
|
||||||
|
# celery beat schedule file
|
||||||
|
celerybeat-schedule
|
||||||
|
|
||||||
|
# SageMath parsed files
|
||||||
|
*.sage.py
|
||||||
|
|
||||||
|
# Environments
|
||||||
|
.env
|
||||||
|
.venv
|
||||||
|
env/
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
env.bak/
|
||||||
|
venv.bak/
|
||||||
|
|
||||||
|
# Spyder project settings
|
||||||
|
.spyderproject
|
||||||
|
.spyproject
|
||||||
|
|
||||||
|
# Rope project settings
|
||||||
|
.ropeproject
|
||||||
|
|
||||||
|
# mkdocs documentation
|
||||||
|
/site
|
||||||
|
|
||||||
|
# mypy
|
||||||
|
.mypy_cache/
|
||||||
|
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
## UNITS.INI
|
||||||
|
## GEX v0.3.1 on STM32F072-ZERO
|
||||||
|
## built May 22 2018 at 12:05:33
|
||||||
|
|
||||||
|
[UNITS]
|
||||||
|
# Create units by adding their names next to a type (e.g. DO=A,B),
|
||||||
|
# remove the same way. Reload to update the unit sections below.
|
||||||
|
|
||||||
|
# Digital output
|
||||||
|
DO=trig
|
||||||
|
# Digital input with triggers
|
||||||
|
DI=
|
||||||
|
# Neopixel RGB LED strip
|
||||||
|
NPX=
|
||||||
|
# I2C master
|
||||||
|
I2C=
|
||||||
|
# SPI master
|
||||||
|
SPI=
|
||||||
|
# Serial port
|
||||||
|
USART=
|
||||||
|
# 1-Wire master
|
||||||
|
1WIRE=
|
||||||
|
# Analog/digital converter
|
||||||
|
ADC=adc
|
||||||
|
# Shift register driver (595, 4094)
|
||||||
|
SIPO=
|
||||||
|
# Frequency and pulse measurement
|
||||||
|
FCAP=
|
||||||
|
# Capacitive touch sensing
|
||||||
|
TOUCH=
|
||||||
|
# Simple PWM output
|
||||||
|
PWMDIM=
|
||||||
|
# Two-channel analog output with waveforms
|
||||||
|
DAC=
|
||||||
|
|
||||||
|
[DO:trig@1]
|
||||||
|
# Port name
|
||||||
|
port=B
|
||||||
|
# Pins (comma separated, supports ranges)
|
||||||
|
pins=1
|
||||||
|
# Initially high pins
|
||||||
|
initial=
|
||||||
|
# Open-drain pins
|
||||||
|
open-drain=
|
||||||
|
|
||||||
|
[ADC:adc@2]
|
||||||
|
# Enabled channels, comma separated
|
||||||
|
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
||||||
|
# A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 C0 C1 C2 C3 C4 C5 Tsens Vref
|
||||||
|
channels=0-1
|
||||||
|
|
||||||
|
# Sampling time (0-7)
|
||||||
|
sample_time=2
|
||||||
|
# Sampling frequency (Hz)
|
||||||
|
frequency=20000
|
||||||
|
|
||||||
|
# Sample buffer size
|
||||||
|
# - shared by all enabled channels
|
||||||
|
# - defines the maximum pre-trigger size (divide by # of channels)
|
||||||
|
# - captured data is sent in half-buffer chunks
|
||||||
|
# - buffer overrun aborts the data capture
|
||||||
|
buffer_size=500
|
||||||
|
|
||||||
|
# Enable continuous sampling with averaging
|
||||||
|
# Caution: This can cause DAC output glitches
|
||||||
|
averaging=N
|
||||||
|
# Exponential averaging coefficient (permil, range 0-1000 ~ 0.000-1.000)
|
||||||
|
# - used formula: y[t]=(1-k)*y[t-1]+k*u[t]
|
||||||
|
# - not available when a capture is running
|
||||||
|
avg_factor=500
|
||||||
@@ -1,52 +1,124 @@
|
|||||||
|
import time
|
||||||
|
|
||||||
from PyQt4 import QtCore, QtGui, Qt
|
from PyQt4 import QtCore, QtGui, Qt
|
||||||
from PyQt4.QtGui import QApplication, QMainWindow
|
from PyQt4.QtGui import QApplication, QMainWindow
|
||||||
import sys, math
|
import sys, math
|
||||||
|
import gex
|
||||||
|
|
||||||
class MyMainScreen(QMainWindow):
|
class MyMainScreen(QMainWindow):
|
||||||
def __init__(self, parent=None):
|
def __init__(self, client=None, parent=None):
|
||||||
QtGui.QMainWindow.__init__(self, parent)
|
QtGui.QMainWindow.__init__(self, parent)
|
||||||
|
self.resize(800, 600)
|
||||||
|
|
||||||
|
self.samples = None
|
||||||
|
|
||||||
self.timer = QtCore.QTimer(self)
|
self.timer = QtCore.QTimer(self)
|
||||||
self.timer.setInterval(100)
|
self.timer.setInterval(20)
|
||||||
self.timer.timeout.connect(self.blink)
|
self.timer.timeout.connect(self.measure)
|
||||||
self.timer.start()
|
self.timer.start()
|
||||||
|
|
||||||
self.resize(500, 500)
|
self.timer2 = QtCore.QTimer(self)
|
||||||
self.centralwidget = QtGui.QWidget(self)
|
self.timer2.setInterval(30)
|
||||||
self.horizontalLayout = QtGui.QHBoxLayout(self.centralwidget)
|
self.timer2.timeout.connect(self.updatedisp)
|
||||||
|
self.timer2.start()
|
||||||
|
|
||||||
self.setCentralWidget(self.centralwidget)
|
self.pending = False
|
||||||
self.menubar = QtGui.QMenuBar(self)
|
|
||||||
self.menubar.setGeometry(QtCore.QRect(0, 0, 500, 22))
|
|
||||||
|
|
||||||
self.setMenuBar(self.menubar)
|
# init GEX
|
||||||
|
self.client = client
|
||||||
|
self.trig = gex.DOut(client, 'trig')
|
||||||
|
self.adc = gex.ADC(client, 'adc')
|
||||||
|
|
||||||
self.statusbar = QtGui.QStatusBar(self)
|
self.adc.set_sample_rate(75000)
|
||||||
self.setStatusBar(self.statusbar)
|
|
||||||
QtCore.QMetaObject.connectSlotsByName(self)
|
|
||||||
|
|
||||||
self.n = 0
|
self.failcount = 0
|
||||||
|
self.skipcount = 0
|
||||||
|
self.wantredraw = False
|
||||||
|
|
||||||
def blink(self):
|
# self.fcap = gex.FCAP(client, 'fcap')
|
||||||
self.n += 0.1
|
|
||||||
self.n = self.n % 20
|
def closeEvent(self,event):
|
||||||
|
self.timer.stop()
|
||||||
|
self.client.close()
|
||||||
|
self.close()
|
||||||
|
|
||||||
|
def measure(self):
|
||||||
|
if self.pending:
|
||||||
|
self.failcount += 1
|
||||||
|
if self.failcount > 2:
|
||||||
|
self.pending = False
|
||||||
|
self.adc.disarm()
|
||||||
|
self.skipcount = 0
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.skipcount < 5:
|
||||||
|
self.skipcount += 1
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
self.skipcount = 0
|
||||||
|
|
||||||
|
self.pending = True
|
||||||
|
|
||||||
|
self.failcount = 0
|
||||||
|
|
||||||
|
self.adc.setup_trigger(1, level=1000, edge='rising', count=1000, handler=self.handle_meas)
|
||||||
|
self.adc.arm()
|
||||||
|
|
||||||
|
self.trig.pulse_us(10)
|
||||||
|
|
||||||
|
def handle_meas(self, report):
|
||||||
|
self.samples = report.data[50:]
|
||||||
|
self.pending = False
|
||||||
|
self.wantredraw = True
|
||||||
|
|
||||||
|
def updatedisp(self):
|
||||||
|
if self.wantredraw:
|
||||||
self.repaint()
|
self.repaint()
|
||||||
|
self.wantredraw = False
|
||||||
|
|
||||||
def paintEvent(self, event):
|
def paintEvent(self, event):
|
||||||
|
if self.samples is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
W = self.width()
|
||||||
|
H = self.height()
|
||||||
|
|
||||||
painter = QtGui.QPainter(self)
|
painter = QtGui.QPainter(self)
|
||||||
painter.setRenderHint(QtGui.QPainter.Antialiasing)
|
painter.setRenderHint(QtGui.QPainter.Antialiasing)
|
||||||
painter.setRenderHint(QtGui.QPainter.HighQualityAntialiasing)
|
painter.setRenderHint(QtGui.QPainter.HighQualityAntialiasing)
|
||||||
painter.setPen(QtGui.QPen(QtCore.Qt.red, 2))
|
painter.fillRect(0,0, W,H, QtCore.Qt.black)
|
||||||
|
painter.setPen(QtGui.QPen(QtCore.Qt.green, 1))
|
||||||
|
|
||||||
step = 2
|
step = round(W / len(self.samples))
|
||||||
amp = (self.height()/2)*0.8
|
if step == 0:
|
||||||
for i in range(0, self.width(), step):
|
step = 1
|
||||||
y0 = round(self.height()/2 + amp * math.sin(2*math.pi*self.n*(i/180)))
|
|
||||||
y1 = round(self.height()/2 + amp * math.sin(2*math.pi*self.n*((i+step)/180)))
|
|
||||||
painter.drawLine(QtCore.QLine(i, y0, i+step, y1))
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
mult = 0.12*H/500
|
||||||
|
n = 0
|
||||||
|
for i in range(0, W, step):
|
||||||
|
if n == len(self.samples)-1:
|
||||||
|
break
|
||||||
|
|
||||||
|
v = self.samples[n][0]
|
||||||
|
w = self.samples[n+1][0]
|
||||||
|
if v <= 0: v = 0.000000001
|
||||||
|
if w <= 0: w = 0.000000001
|
||||||
|
y0 = H - v*mult
|
||||||
|
y1 = H - w*mult
|
||||||
|
n += 1
|
||||||
|
painter.drawLine(QtCore.QLine(i, round(y0), i+step, round(y1)))
|
||||||
|
|
||||||
|
font = painter.font()
|
||||||
|
font.setPointSize(22)
|
||||||
|
font.setWeight(QtGui.QFont.DemiBold)
|
||||||
|
painter.setFont(font)
|
||||||
|
|
||||||
|
# label - Raw HC-SR04 signal
|
||||||
|
painter.drawText(W-370, 50, "Surový signál přijímače")
|
||||||
|
painter.drawText(W-370, 85, "HC-SR04")
|
||||||
|
|
||||||
|
with gex.Client(gex.TrxSerialThread()) as client:
|
||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
mainscreen = MyMainScreen()
|
mainscreen = MyMainScreen(client)
|
||||||
mainscreen.show()
|
mainscreen.show()
|
||||||
app.exec_()
|
app.exec_()
|
||||||
|
|||||||
Reference in New Issue
Block a user