diff --git a/Automation/GraduationWindow.py b/Automation/GraduationWindow.py new file mode 100644 index 0000000..3709284 --- /dev/null +++ b/Automation/GraduationWindow.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Mon Nov 14 20:18:17 2022 + +@author: anna +""" + +import os +import csv +import time +from PyQt6.QtWidgets import (QLineEdit, + QPushButton, + QWidget, + QTableWidget, + QGridLayout, + QTableWidgetItem, + QHeaderView, + ) +from Abstract_window import AbstractWindow + + +class GraduationWindow(AbstractWindow): + def __init__(self, parent): + super().__init__() + + self.setWindowTitle('Градуировка электромагнита') + self.parent = parent + self.volt = 0 + + # make csv file + self.parent.flow_dataname = 'Induction_data.csv' + self.heads = ['B,mTl', 'E,mV', 'I_M,mA','t,ms'] + with open(os.path.join(self.parent.folder, self.parent.flow_dataname), 'w') as file: + wr = csv.writer(file) + wr.writerow(self.heads) + + self.centralwidget = QWidget() + self.resize(1400, 800) + self.setCentralWidget(self.centralwidget) + self.grid_layout = QGridLayout(self.centralwidget) + + self.start = QPushButton('Старт') + self.start.clicked.connect(self.start_clicked) + self.start.setEnabled(True) + + self.menu = QPushButton('Меню') + self.menu.setEnabled(False) + self.menu.clicked.connect(self.menu_clicked) + + self.lineEdit = QLineEdit(placeholderText='Индукция B, мТл') + self.lineEdit.returnPressed.connect(self.enter_value) + self.lineEdit.setReadOnly(True) + + self.table = QTableWidget(self) # Create a self.table + self.table.setColumnCount(len(self.heads)) # Set three columns + self.table.setRowCount(0) + self.table.setHorizontalHeaderLabels(self.heads) + header = self.table.horizontalHeader() + for i in range(len(self.heads)): + header.setSectionResizeMode(i, QHeaderView.ResizeMode.Stretch) + self.table.resizeColumnsToContents() + + self.grid_layout.addWidget(self.start, 0, 0) + self.grid_layout.addWidget(self.lineEdit, 1, 0) + self.grid_layout.addWidget(self.table, 0, 3, -1, 1) + self.grid_layout.addWidget(self.menu, 2, 0) + + def menu_clicked(self): + self.parent.number = 0 + self.parent.change_number() + + def start_clicked(self): + self.start.setEnabled(False) + self.start_time = round(time.time()*1000) + self.lineEdit.setReadOnly(False) + self.menu.setEnabled(True) + + def enter_value(self): + self.lineEdit.setReadOnly(True) + self.no_data() + self.lineEdit.clear() + self.lineEdit.setReadOnly(False) + + def no_data(self): + current_time = round(time.time()*1000) + b = self.lineEdit.text() + u = str((current_time-self.start_time)/60) + i = str((current_time-self.start_time)/60/2) + t = str(current_time-self.start_time) + self.save_data([b, u, i, t]) + + def save_data(self, data): + with open(os.path.join(self.parent.folder, self.parent.flow_dataname), 'a') as file: + wr = csv.writer(file) + wr.writerow(data) + self.table.insertRow(self.table.rowCount()) + for i in range(len(data)): + self.table.setItem(self.table.rowCount()-1, i, + QTableWidgetItem(str(data[i]))) + + def take_data(self): + t = (round(time.time()*1000)-self.start_time) + b = self.lineEdit.text() + msg = 'VOLTage '+str(self.volt)+'\n' + self.parent.ser.write(msg.encode('ascii')) + time.sleep(1) + + msg = 'MEASure:Current?\n' + self.parent.ser.write(msg.encode('ascii')) + time.sleep(1) + bytesToRead = self.parent.ser.inWaiting() + I_M = self.parent.ser.read(bytesToRead) + self.volt += 5 + self.save_data([b, self.volt, I_M, t]) \ No newline at end of file diff --git a/Automation/Main.py b/Automation/Main.py index c42da1a..5aa9800 100644 --- a/Automation/Main.py +++ b/Automation/Main.py @@ -8,25 +8,27 @@ from PyQt6.QtWidgets import (QApplication, QLineEdit, QPushButton, QWidget, - QTableWidget, QGridLayout, QTableWidgetItem, QHeaderView, + QLabel ) from Abstract_window import AbstractWindow from Main_experiment_window import (MainExperimentDataWindow, MainExperimentChartWindow) +from GraduationWindow import GraduationWindow class Start: def __init__(self): self.number = 0 - self.foldername = '' + self.foldername = None if not QApplication.instance(): self.app = QApplication(sys.argv) else: self.app = QApplication.instance() self.window = StartWindow(self) + # self.add_ser() self.draw() self.app.exec() @@ -34,19 +36,32 @@ class Start: self.window.show() def change_number(self): + if self.number == 0: + self.window.close() + self.window = StartWindow(self) + if self.number == 10: + self.window.close() + self.window = GraduationWindow(self) if self.number == 20: self.window.close() self.window = MainExperimentDataWindow(self) if self.number == 21: self.window.close() self.window = MainExperimentChartWindow(self) - if self.number == 10: + if self.number == 30: self.window.close() - self.window = FlowWindow(self) - if self.number == 0: - self.window.close() - self.window = StartWindow(self) + self.window = SignWindow(self) self.draw() + + def add_ser(self): + self.ser = serial.Serial( + port='/dev/ttyUSB2', + baudrate=9600, + timeout=1 + ) + self.ser.isOpen() + msg = 'OUTput on\n' + self.ser.write(msg.encode('ascii')) class StartWindow(AbstractWindow): @@ -58,20 +73,34 @@ class StartWindow(AbstractWindow): self.centralwidget = QWidget() self.resize(1400, 800) self.setCentralWidget(self.centralwidget) - self.lineEdit = QLineEdit(placeholderText='Введите фамилию') + if not self.parent.foldername: + self.lineEdit = QLineEdit(placeholderText='Введите фамилию') + else: + self.lineEdit = QLineEdit(placeholderText=self.parent.foldername) self.lineEdit.returnPressed.connect(self.enter_name) - self.flow = QPushButton('градуировка электромагнита') + self.flow = QPushButton('Градуировка электромагнита') self.flow.clicked.connect(self.flow_click) - self.flow.setEnabled(False) - self.main = QPushButton('основной эксперимент') + if not self.parent.foldername: + self.flow.setEnabled(False) + + self.sign = QPushButton('Знак носителей') + self.sign.clicked.connect(self.sign_click) + if not self.parent.foldername: + self.sign.setEnabled(False) + + self.main = QPushButton('Основной эксперимент') self.main.clicked.connect(self.main_click) - self.main.setEnabled(False) - + if not self.parent.foldername: + self.main.setEnabled(False) + if self.parent.foldername: + self.lineEdit.setReadOnly(True) + self.hbox_layout = QGridLayout(self.centralwidget) self.hbox_layout.setRowStretch(1, 1) self.hbox_layout.addWidget(self.lineEdit, 1, 0, 1, 2) self.hbox_layout.addWidget(self.flow, 2, 0) + self.hbox_layout.addWidget(self.sign, 3, 0) self.hbox_layout.addWidget(self.main, 2, 1) def flow_click(self): @@ -81,6 +110,10 @@ class StartWindow(AbstractWindow): def main_click(self): self.parent.number = 20 self.parent.change_number() + + def sign_click(self): + self.parent.number = 30 + self.parent.change_number() def enter_name(self): # make folder @@ -91,97 +124,71 @@ class StartWindow(AbstractWindow): self.flow.setEnabled(True) self.main.setEnabled(True) + self.sign.setEnabled(True) self.lineEdit.setReadOnly(True) - -class FlowWindow(AbstractWindow): +class SignWindow(AbstractWindow): def __init__(self, parent): super().__init__() - - self.setWindowTitle('Градуировка электромагнита') + + self.setWindowTitle('Определение знака носителей') self.parent = parent + self.start = QPushButton('Старт') + self.start.clicked.connect(self.start_clicked) + self.start.setEnabled(True) + + self.menu = QPushButton('Меню') + self.menu.setEnabled(False) + self.menu.clicked.connect(self.menu_clicked) - # make csv file - self.parent.flow_dataname = 'Induction_data.csv' - head_1 = 'B,mTl' - head_2 = 'U,mV' - head_3 = 't,ms' - with open(os.path.join(self.parent.folder, self.parent.flow_dataname), 'w') as file: - wr = csv.writer(file) - wr.writerow([head_1, head_2, head_3]) - + self.with_field = QLabel('С полем: ', self) + self.without_field = QLabel('С полем: ', self) + self.with_field_value = QLabel(self) + self.without_field_value = QLabel(self) + self.centralwidget = QWidget() self.resize(1400, 800) self.setCentralWidget(self.centralwidget) self.grid_layout = QGridLayout(self.centralwidget) - - self.start = QPushButton('Старт') - self.start.clicked.connect(self.start_clicked) - self.start.setEnabled(True) - self.next = QPushButton(self) - self.next.setIcon(QIcon('arrow.png')) - self.next.setEnabled(False) - self.next.clicked.connect(self.next_clicked) - - self.lineEdit = QLineEdit(placeholderText='Индукция B, мТл') - self.lineEdit.returnPressed.connect(self.enter_value) - self.lineEdit.setReadOnly(True) - - self.table = QTableWidget(self) # Create a self.table - self.table.setColumnCount(3) # Set three columns - self.table.setRowCount(0) - self.table.setHorizontalHeaderLabels([head_1, head_2, head_3]) - header = self.table.horizontalHeader() - header.setSectionResizeMode(0, QHeaderView.ResizeMode.Stretch) - header.setSectionResizeMode(1, QHeaderView.ResizeMode.Stretch) - header.setSectionResizeMode(2, QHeaderView.ResizeMode.Stretch) - self.table.setItem(0, 0, QTableWidgetItem("Text in column 1")) - self.table.setItem(0, 1, QTableWidgetItem("Text in column 2")) - self.table.setItem(0, 2, QTableWidgetItem("Text in column 3")) - self.table.resizeColumnsToContents() + self.grid_layout.addWidget(self.start, 0, 0, 1, -1) + self.grid_layout.addWidget(self.with_field, 1, 0) + self.grid_layout.addWidget(self.with_field_value, 1, 1) + self.grid_layout.addWidget(self.without_field, 2, 0) + self.grid_layout.addWidget(self.without_field_value, 2, 1) + self.grid_layout.addWidget(self.menu, 3, 0, 1, -1) - self.grid_layout.addWidget(self.start, 0, 0) - self.grid_layout.addWidget(self.lineEdit, 1, 0) - self.grid_layout.addWidget(self.table, 1, 3) - self.grid_layout.addWidget(self.next, 2, 0) - - def next_clicked(self): - self.parent.number = 20 + def menu_clicked(self): + self.parent.number = 0 self.parent.change_number() def start_clicked(self): self.start.setEnabled(False) - self.start_time = round(time.time()*1000) - self.lineEdit.setReadOnly(False) - self.next.setEnabled(True) - - def enter_value(self): - self.lineEdit.setReadOnly(True) - self.get_data() - self.lineEdit.clear() - self.lineEdit.setReadOnly(False) - - def get_data(self): + with_field=10 + without_field=15 + # without_field, with_field = self.get_values() + self.with_field_value.setText(str(with_field)+', mV') + self.without_field_value.setText(str(without_field)+', mV') + self.menu.setEnabled(True) - - - # bytesToRead=ser.inWaiting() - # data=ser.read(bytesToRead) - # print(data) - - current_time = round(time.time()*1000) - b = self.lineEdit.text() - u = str((current_time-self.start_time)/60) - t = str(current_time-self.start_time) - with open(os.path.join(self.parent.folder, self.parent.flow_dataname), 'a') as file: - wr = csv.writer(file) - wr.writerow([b, u, str(t)]) - self.table.insertRow(self.table.rowCount()) - self.table.setItem(self.table.rowCount()-1, 0, QTableWidgetItem(b)) - self.table.setItem(self.table.rowCount()-1, 1, QTableWidgetItem(u)) - self.table.setItem(self.table.rowCount()-1, 2, QTableWidgetItem(t)) + def measure(self, volt): + msg = 'VOLTage '+str(volt)+'\n' + self.parent.ser.write(msg.encode('ascii')) + time.sleep(1) + volt_name = os.path.join('/dev', 'usbtmc0') + f_volt = open(volt_name, 'w') + f_volt.write('Measure:Voltage:DC?\n') + f_volt.close() + f_volt = open(volt_name, 'r') + v = '{:.9f}'.format(float(f_volt.read(15))*10**3) + f_volt.close() + return v + + def get_values(self): + without_field = self.measure(0) + with_field = self.measure(10) + return without_field, with_field @@ -213,4 +220,3 @@ start = Start() # bytesToRead=ser.inWaiting() # data=ser.read(bytesToRead) # print(data) - diff --git a/Automation/Main_experiment_window.py b/Automation/Main_experiment_window.py index 6a8fb87..70da9d3 100644 --- a/Automation/Main_experiment_window.py +++ b/Automation/Main_experiment_window.py @@ -46,7 +46,6 @@ class MainExperimentDataWindow(AbstractWindow): self.setWindowTitle('Основной эксперимент. Получение данных') self.parent = parent - # self.add_ser() self.data_thread = ThreadData(self) self.resize(1400, 800) self.number_iteration = 1 @@ -101,16 +100,6 @@ class MainExperimentDataWindow(AbstractWindow): self.grid_layout.addWidget(self.new, 2, 2, 1, -1) self.grid_layout.addWidget(self.chart, 3, 2, 1, -1) - def add_ser(self): - self.parent.ser = serial.Serial( - port='/dev/ttyUSB2', - baudrate=9600, - timeout=1 - ) - self.parent.ser.isOpen() - msg = 'OUTput on\n' - self.parent.ser.write(msg.encode('ascii')) - def enter_a(self): # TODO self.parent.a = self.lineEdit.text() diff --git a/Automation/__pycache__/GraduationWindow.cpython-39.pyc b/Automation/__pycache__/GraduationWindow.cpython-39.pyc new file mode 100644 index 0000000..a5cc9c6 Binary files /dev/null and b/Automation/__pycache__/GraduationWindow.cpython-39.pyc differ diff --git a/Automation/__pycache__/Main_experiment_window.cpython-39.pyc b/Automation/__pycache__/Main_experiment_window.cpython-39.pyc index 2371fe2..cf8ea08 100644 Binary files a/Automation/__pycache__/Main_experiment_window.cpython-39.pyc and b/Automation/__pycache__/Main_experiment_window.cpython-39.pyc differ diff --git a/Automation/j/Induction_data.csv b/Automation/j/Induction_data.csv index 6c63d70..27450bb 100644 --- a/Automation/j/Induction_data.csv +++ b/Automation/j/Induction_data.csv @@ -1,11 +1 @@ -"B,mTl","U,mV","t,ms" -80,45.18333333333333,2711 -90,70.75,4245 -90,85.66666666666667,5140 -90,99.33333333333333,5960 -90,111.96666666666667,6718 -90,124.51666666666667,7471 -90,136.53333333333333,8192 -90,148.96666666666667,8938 -90,164.7,9882 -90,177.73333333333332,10664 +"B,mTl","E,mV","I_M,mA","t,ms" diff --git a/Automation/j/data.csv b/Automation/j/data.csv index c2c22a0..64726ff 100644 --- a/Automation/j/data.csv +++ b/Automation/j/data.csv @@ -1,5 +1 @@ "U_34,mV","I_M,mA","U_0,mV","I_0,mA","E, mV",N,"t,ms" -0.016666666666666666,0.016666666666666666,0.016666666666666666,0.00016666666666666666,0,1,1 -16.7,16.7,0.016666666666666666,0.16699999999999998,5.0,1,1002 -33.38333333333333,33.38333333333333,0.016666666666666666,0.3338333333333333,10.0,1,2003 -50.06666666666667,50.06666666666667,0.016666666666666666,0.5006666666666667,15.0,1,3004