Compare commits

..

No commits in common. "65b04a31deb474e31c3469b879da4fad76c0106e" and "f660b7733580b4ac269f14aa354d3e7b84d35ed9" have entirely different histories.

3 changed files with 85 additions and 87 deletions

View File

@ -2,8 +2,8 @@ from scipy.optimize import curve_fit
from numpy import tanh from numpy import tanh
def probe(x, I_0, T_e, A): def probe(x, I_0, k_0, A):
return I_0 * tanh(x / T_e) + A * x return I_0 * tanh(k_0 / I_0 * x) + A * x
def fit(x, y): def fit(x, y):

View File

@ -1,50 +1,46 @@
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import random import random
import voltmeter
import amperemeter
from numpy import tanh from numpy import tanh
# Значения part = 1, 2 соответствуют режимам считывания с первой и второй пары приборов соответственно, # Значения part = 1, 2 соответствуют режимам считывания с первой и второй пары приборов соответственно
# режимы 3 и 4 являются тестовыми и генерируют значения самостоятельно # (currently not available), режимы 3 и 4 являются тестовыми и генерируют значения самостоятельно
def start_measure(part):
if part == 1:
global v1, i1
v1 = voltmeter.AKIP('/dev/usbtmc0')
i1 = amperemeter.B7_78('/dev/ttyUSB0')
i1.getCurrentDC()
elif part == 2:
global v2, i2
v2 = voltmeter.AKIP('/dev/usbtmc0')
i2 = amperemeter.B7_78('/dev/ttyUSB1')
i2.getCurrentDC()
elif part == 0:
global i
ir = amperemeter.B7_78('/dev/ttyUSB0')
i = float(ir.getCurrentDC()) * 10 ** 3
i = float(ir.getCurrentDC()) * 10 ** 3
def get_point(part, num): def get_point(part, num):
if part == 1: if part == 1:
vol[0][num].append(v1.getVoltageDC()) v1 = open('voltmeter1.txt')
cur[0][num].append(i1.getCurrentDC() * 10 ** 3) i1 = open('ampere-meter1.txt')
vol[0].append(float(v1.readline()))
cur[0].append(float(i1.readline()))
newv1 = v1.read().replace(str(vol[0][-1]) + '\n', '')
newi1 = i1.read().replace(str(cur[0][-1]) + '\n', '')
v1.close()
i1.close()
v1 = open('voltmeter1.txt', 'w')
v1.write(newv1)
i1 = open('ampere-meter1.txt', 'w')
i1.write(newi1)
v1.close()
i1.close()
elif part == 2: elif part == 2:
# global i v2 = open('voltmeter2.txt')
vol[1][num].append(v2.getVoltageDC()) i2 = open('ampere-meter2.txt')
cur[1][num].append(i2.getCurrentDC() * 10 ** 6) vol[1].append(float(v2.readline()))
# i = amperemeter.B7_78('/dev/ttyUSB0').getCurrentDC() * 10 ** 3 cur[1].append(float(i2.readline()))
# print(vol[1], cur[1]) newv2 = v2.read().replace(str(vol[1][-1]) + '\n', '')
newi2 = i2.read().replace(str(cur[1][-1]) + '\n', '')
v2.close()
i2.close()
v2 = open('voltmeter2.txt', 'w')
v2.write(newv2)
i2 = open('ampere-meter2.txt', 'w')
i2.write(newi2)
v2.close()
i2.close()
elif part == 3: elif part == 3:
vol[2][num].append(random.random() * 100) vol[2][num].append(random.random() * 100)
cur[2][num].append(random.random() * 100) cur[2][num].append(random.random() * 100)
elif part == 4: elif part == 4:
vol[3][num].append(random.random() * 50 - 25) vol[3][num].append(random.random() * 50 - 25)
if experiment % 3 == 0: if experiment % 3 == 0:
@ -58,16 +54,17 @@ def get_point(part, num):
(22 * tanh(4.4 / 22 * vol[3][num][-1]) + 0.5 * vol[3][num][-1]) * (0.98 + random.random() / 25)) (22 * tanh(4.4 / 22 * vol[3][num][-1]) + 0.5 * vol[3][num][-1]) * (0.98 + random.random() / 25))
def update_plot(part, num):
for i in range(10):
get_point(part, num)
def saveplot(part): def saveplot(part):
plt.figure(figsize=(8, 6)) plt.figure(figsize=(8, 6))
for j in range(len(vol[part - 1])): for i in range(len(vol[part - 1])):
# print(vol[part - 1][j], cur[part - 1][j]) plt.scatter(vol[part - 1][i], cur[part - 1][i], marker='o')
plt.scatter(vol[part - 1][j], cur[part - 1][j], marker='o')
plt.grid() plt.grid()
plt.xlabel('Напряжение, В') plt.xlabel('Напряжение, В')
if part == 1:
plt.ylabel('Ток, мА')
else:
plt.ylabel('Ток, мкА') plt.ylabel('Ток, мкА')
plt.savefig('tmpplots/tmpplot' + str(part) + '.jpg', dpi=200) plt.savefig('tmpplots/tmpplot' + str(part) + '.jpg', dpi=200)
plt.close() plt.close()
@ -77,7 +74,7 @@ def empty_plot(part):
vol[part - 1] = [[]] vol[part - 1] = [[]]
cur[part - 1] = [[]] cur[part - 1] = [[]]
plt.figure(figsize=(8, 6)) plt.figure(figsize=(8, 6))
plt.scatter(cur[part - 1][0], vol[part - 1][0], marker='o') plt.scatter(cur[part - 1], vol[part - 1], marker='o')
plt.grid() plt.grid()
plt.savefig('tmpplots/tmpplot' + str(part) + '.jpg', dpi=200) plt.savefig('tmpplots/tmpplot' + str(part) + '.jpg', dpi=200)
plt.close() plt.close()
@ -97,7 +94,7 @@ def minus_plot(part):
vol[part - 1].append([]) vol[part - 1].append([])
cur[part - 1].append([]) cur[part - 1].append([])
i = 0
vol = [[[]], [[]], [[]], [[]]] vol = [[], [], [[]], [[]]]
cur = [[[]], [[]], [[]], [[]]] cur = [[], [], [[]], [[]]]
experiment = 0 experiment = 0

View File

@ -72,7 +72,7 @@ class Part1(QtWidgets.QWidget):
self.started = False self.started = False
self.q = QtGui.QScreen.availableGeometry(QtWidgets.QApplication.primaryScreen()) self.q = QtGui.QScreen.availableGeometry(QtWidgets.QApplication.primaryScreen())
h = self.q.height() * 0.2 h = self.q.height() * 0.2
plots.empty_plot(1) plots.empty_plot(3)
self.points = QtWidgets.QLabel(self) self.points = QtWidgets.QLabel(self)
self.points.setGeometry(QtCore.QRect(7.5 * h - 60, 3 * h - 80, 140, 20)) self.points.setGeometry(QtCore.QRect(7.5 * h - 60, 3 * h - 80, 140, 20))
@ -117,7 +117,6 @@ class Part1(QtWidgets.QWidget):
self.back_button.setGeometry(QtCore.QRect(20, self.q.height() - 20, 80, 40)) self.back_button.setGeometry(QtCore.QRect(20, self.q.height() - 20, 80, 40))
self.back_button.setText("Назад") self.back_button.setText("Назад")
plots.empty_plot(1)
self.pixmap0 = QtGui.QPixmap('tmpplots/tmpplot1.jpg') self.pixmap0 = QtGui.QPixmap('tmpplots/tmpplot1.jpg')
self.pixmap = self.pixmap0.scaledToHeight(3 * h) self.pixmap = self.pixmap0.scaledToHeight(3 * h)
self.plot1 = QtWidgets.QLabel(self) self.plot1 = QtWidgets.QLabel(self)
@ -159,7 +158,7 @@ class Part1(QtWidgets.QWidget):
timer = QtCore.QTimer(self) timer = QtCore.QTimer(self)
timer.timeout.connect(self.upd_plot) timer.timeout.connect(self.upd_plot)
timer.start(1000) timer.start(500)
@QtCore.Slot() @QtCore.Slot()
def save_plot(self): def save_plot(self):
@ -167,7 +166,7 @@ class Part1(QtWidgets.QWidget):
file, check = QtWidgets.QFileDialog.getSaveFileName(None, "Сохранить график 1", file, check = QtWidgets.QFileDialog.getSaveFileName(None, "Сохранить график 1",
r"C:\Users\Vadim\Desktop\plot1.jpg", "Images (*.png *.jpg)") r"C:\Users\Vadim\Desktop\plot1.jpg", "Images (*.png *.jpg)")
if check: if check:
plot1 = PIL.Image.open('tmpplots/tmpplot1.jpg') plot1 = PIL.Image.open('tmpplots/tmpplot3.jpg')
plot1.save(file) plot1.save(file)
def save_values(self): def save_values(self):
@ -175,7 +174,7 @@ class Part1(QtWidgets.QWidget):
file, check = QtWidgets.QFileDialog.getSaveFileName(None, "Сохранить значения", file, check = QtWidgets.QFileDialog.getSaveFileName(None, "Сохранить значения",
r"C:\Users\Vadim\Desktop\experiment1.xlsx", "Table (.xlsx)") r"C:\Users\Vadim\Desktop\experiment1.xlsx", "Table (.xlsx)")
if check: if check:
data = {'U_р, В': plots.vol[0][0], 'I_р, мА': plots.cur[0][0]} data = {'U_р, В': plots.vol[2][0], 'I_р, мА': plots.cur[2][0]}
df = pd.DataFrame(data) df = pd.DataFrame(data)
df.to_excel(file, index=False) df.to_excel(file, index=False)
@ -197,20 +196,19 @@ class Part1(QtWidgets.QWidget):
def show_plot(self): def show_plot(self):
self.points.setText('Измеренных точек: ' + str(self.n)) self.points.setText('Измеренных точек: ' + str(self.n))
self.pixmap0 = QtGui.QPixmap('tmpplots/tmpplot1.jpg') self.pixmap0 = QtGui.QPixmap('tmpplots/tmpplot3.jpg')
self.pixmap = self.pixmap0.scaledToHeight(0.6 * self.q.height()) self.pixmap = self.pixmap0.scaledToHeight(0.6 * self.q.height())
self.plot1.setPixmap(self.pixmap) self.plot1.setPixmap(self.pixmap)
def upd_plot(self): def upd_plot(self):
if self.started: if self.started:
plots.get_point(1, 0) plots.update_plot(3, 0)
plots.saveplot(1) plots.saveplot(3)
self.n += 1 self.n += 10
self.show_plot() self.show_plot()
def start_stop(self): def start_stop(self):
if not self.started: if not self.started:
plots.start_measure(1)
self.start_btn.setText("Стоп") self.start_btn.setText("Стоп")
self.started = True self.started = True
self.save_plot_btn.hide() self.save_plot_btn.hide()
@ -231,7 +229,7 @@ class Part1(QtWidgets.QWidget):
self.save_values_btn.hide() self.save_values_btn.hide()
self.hint_btn.show() self.hint_btn.show()
self.n = 0 self.n = 0
plots.empty_plot(1) plots.empty_plot(3)
self.show_plot() self.show_plot()
@ -245,7 +243,7 @@ class Part2(QtWidgets.QWidget):
self.started = False self.started = False
self.q = QtGui.QScreen.availableGeometry(QtWidgets.QApplication.primaryScreen()) self.q = QtGui.QScreen.availableGeometry(QtWidgets.QApplication.primaryScreen())
h = self.q.height() * 0.2 h = self.q.height() * 0.2
plots.empty_plot(2) plots.empty_plot(4)
self.button = QtWidgets.QPushButton(self) self.button = QtWidgets.QPushButton(self)
self.button.setGeometry(QtCore.QRect(20, 20, 40, 40)) self.button.setGeometry(QtCore.QRect(20, 20, 40, 40))
@ -300,11 +298,11 @@ class Part2(QtWidgets.QWidget):
self.hint_btn.setText('?') self.hint_btn.setText('?')
self.hint_btn.setGeometry(QtCore.QRect(self.q.width() - 60, 20, 40, 40)) self.hint_btn.setGeometry(QtCore.QRect(self.q.width() - 60, 20, 40, 40))
self.pixmap0 = QtGui.QPixmap('tmpplots/tmpplot2.jpg') self.pixmap0 = QtGui.QPixmap('tmpplots/tmpplot4.jpg')
self.pixmap = self.pixmap0.scaledToHeight(3 * h) self.pixmap = self.pixmap0.scaledToHeight(3 * h)
self.plot2 = QtWidgets.QLabel(self) self.plot1 = QtWidgets.QLabel(self)
self.plot2.setPixmap(self.pixmap) self.plot1.setPixmap(self.pixmap)
self.plot2.setGeometry(QtCore.QRect(h, h + 20, 4 * h, 3 * h)) self.plot1.setGeometry(QtCore.QRect(h, h + 20, 4 * h, 3 * h))
self.text = QtWidgets.QLabel(self) self.text = QtWidgets.QLabel(self)
self.text.setText("<html><p align=\"left\"><span style=\" font-size:10pt;\">Перед проведением измерений " self.text.setText("<html><p align=\"left\"><span style=\" font-size:10pt;\">Перед проведением измерений "
@ -338,24 +336,28 @@ class Part2(QtWidgets.QWidget):
timer = QtCore.QTimer(self) timer = QtCore.QTimer(self)
timer.timeout.connect(self.upd_plot) timer.timeout.connect(self.upd_plot)
timer.start(1000) timer.start(500)
timer2 = QtCore.QTimer(self) timer2 = QtCore.QTimer(self)
timer2.timeout.connect(self.cur_check) timer2.timeout.connect(self.cur_check)
timer2.start(10000) timer2.start(1000)
@QtCore.Slot() @QtCore.Slot()
def cur_check(self): def cur_check(self):
plots.start_measure(0) if plots.experiment % 3 == 0:
# plots.get_point(2, self.num) self.i = 5
self.current.setText('Текущий ток разряда: ' + str(plots.i) + 'мА') elif plots.experiment % 3 == 1:
self.i = 3
else:
self.i = 1.5
self.current.setText('Текущий ток разряда: ' + str(self.i) + 'мА')
def save_plot(self): def save_plot(self):
# при замене устройства директорию надо изменить # при замене устройства директорию надо изменить
file, check = QtWidgets.QFileDialog.getSaveFileName(None, "Сохранить график 2", file, check = QtWidgets.QFileDialog.getSaveFileName(None, "Сохранить график 2",
r"C:\Users\Vadim\Desktop\plot2.jpg", "Images (*.png *.jpg)") r"C:\Users\Vadim\Desktop\plot2.jpg", "Images (*.png *.jpg)")
if check: if check:
plot1 = PIL.Image.open('tmpplots/tmpplot2.jpg') plot1 = PIL.Image.open('tmpplots/tmpplot4.jpg')
plot1.save(file) plot1.save(file)
def save_values(self): def save_values(self):
@ -363,21 +365,21 @@ class Part2(QtWidgets.QWidget):
file, check = QtWidgets.QFileDialog.getSaveFileName(None, "Сохранить значения", file, check = QtWidgets.QFileDialog.getSaveFileName(None, "Сохранить значения",
r"C:\Users\Vadim\Desktop\experiment2.xlsx", "Table (.xlsx)") r"C:\Users\Vadim\Desktop\experiment2.xlsx", "Table (.xlsx)")
if check: if check:
data = {'U_1, В': plots.vol[1][0], 'I_1, мкА': plots.cur[1][0]} data = {'U_1, В': plots.vol[3][0], 'I_1, мкА': plots.cur[3][0]}
I_0, T_e, A = [], [], [] I_0, k_0, A = [], [], []
params = fitting.fit(plots.vol[1][0], plots.cur[1][0]) params = fitting.fit(plots.vol[3][0], plots.cur[3][0])
I_0.append(params[0]) I_0.append(params[0])
T_e.append(params[1]) k_0.append(params[1])
A.append(params[2]) A.append(params[2])
for i in range(len(plots.vol[1]) - 1): for i in range(len(plots.vol[3]) - 1):
mes = {'U_' + str(i+2) + ', В': plots.vol[1][i + 1], 'I_' + str(i + 2) + ', мкА': plots.cur[1][i + 1]} mes = {'U_' + str(i+2) + ', В': plots.vol[3][i + 1], 'I_' + str(i + 2) + ', мкА': plots.cur[3][i + 1]}
data.update(mes) data.update(mes)
params = fitting.fit(plots.vol[1][i + 1], plots.cur[1][i + 1]) params = fitting.fit(plots.vol[3][i + 1], plots.cur[3][i + 1])
I_0.append(params[0]) I_0.append(params[0])
T_e.append(params[1]) k_0.append(params[1])
A.append(params[2]) A.append(params[2])
data.update({'I_0, мкА': I_0, 'T_e, K': T_e, 'A, мкА/В': A}) data.update({'I_0, мкА': I_0, 'k_0, мкА/В': k_0, 'A, мкА/В': A})
df = pd.DataFrame(dict([(k, pd.Series(v)) for k, v in data.items()])) df = pd.DataFrame(dict([(k, pd.Series(v)) for k, v in data.items()]))
df.to_excel(file, index=False) df.to_excel(file, index=False)
@ -400,27 +402,26 @@ class Part2(QtWidgets.QWidget):
def show_plot(self): def show_plot(self):
self.points.setText('Измеренных точек в текущей серии: ' + str(self.n)) self.points.setText('Измеренных точек в текущей серии: ' + str(self.n))
self.pixmap0 = QtGui.QPixmap('tmpplots/tmpplot2.jpg') self.pixmap0 = QtGui.QPixmap('tmpplots/tmpplot4.jpg')
self.pixmap = self.pixmap0.scaledToHeight(0.6 * self.q.height()) self.pixmap = self.pixmap0.scaledToHeight(0.6 * self.q.height())
self.plot2.setPixmap(self.pixmap) self.plot1.setPixmap(self.pixmap)
def upd_plot(self): def upd_plot(self):
if self.started: if self.started:
plots.get_point(2, self.num - 1) plots.update_plot(4, self.num - 1)
plots.saveplot(2) plots.saveplot(4)
self.n += 1 self.n += 10
self.show_plot() self.show_plot()
def start_stop(self): def start_stop(self):
if not self.started: if not self.started:
plots.start_measure(2)
self.start_btn.setText("Стоп") self.start_btn.setText("Стоп")
self.started = True self.started = True
self.save_plot_btn.hide() self.save_plot_btn.hide()
self.save_values_btn.hide() self.save_values_btn.hide()
self.hint_btn.hide() self.hint_btn.hide()
if self.num != 0: if self.num != 0:
plots.plus_plot(2) plots.plus_plot(4)
self.num += 1 self.num += 1
self.n = 0 self.n = 0
@ -439,8 +440,8 @@ class Part2(QtWidgets.QWidget):
self.save_values_btn.hide() self.save_values_btn.hide()
self.hint_btn.show() self.hint_btn.show()
self.n = 0 self.n = 0
plots.minus_plot(2) plots.minus_plot(4)
plots.saveplot(2) plots.saveplot(4)
self.show_plot() self.show_plot()
self.num -= 1 self.num -= 1
if self.num == 0: if self.num == 0: