dosierung ok

This commit is contained in:
jens 2025-07-10 22:39:48 +02:00
parent c5c4aa2627
commit 74e4b5f199

View File

@ -165,6 +165,12 @@ class PHControllerGUI(QMainWindow):
self.total_volume = 0.0 # Total volume pumped in ml self.total_volume = 0.0 # Total volume pumped in ml
self.last_flow_rate = 0.0 # Last known flow rate self.last_flow_rate = 0.0 # Last known flow rate
# Auto dosing
self.auto_dosing = False
self.target_volume = 0.0
self.auto_dose_timer = QTimer()
self.auto_dose_timer.timeout.connect(self.check_auto_dose_progress)
# Enable/disable controls based on connection # Enable/disable controls based on connection
self.set_controls_enabled(False) self.set_controls_enabled(False)
@ -227,6 +233,10 @@ class PHControllerGUI(QMainWindow):
# Stop flow rate polling # Stop flow rate polling
self.flow_rate_timer.stop() self.flow_rate_timer.stop()
# Stop auto dose timer
self.auto_dose_timer.stop()
self.auto_dosing = False
self.connect_btn.setText("Verbinden") self.connect_btn.setText("Verbinden")
self.status_bar.showMessage("Getrennt") self.status_bar.showMessage("Getrennt")
self.set_controls_enabled(False) self.set_controls_enabled(False)
@ -237,6 +247,8 @@ class PHControllerGUI(QMainWindow):
self.pump_is_running = False self.pump_is_running = False
self.total_volume = 0.0 self.total_volume = 0.0
self.last_flow_rate = 0.0 self.last_flow_rate = 0.0
self.auto_dosing = False
self.auto_dose_timer.stop()
def set_controls_enabled(self, enabled): def set_controls_enabled(self, enabled):
self.pump_on_btn.setEnabled(enabled) self.pump_on_btn.setEnabled(enabled)
@ -296,8 +308,8 @@ class PHControllerGUI(QMainWindow):
self.total_volume_label.setVisible(True) self.total_volume_label.setVisible(True)
# Check if volume should be reset or continue accumulating # Check if volume should be reset or continue accumulating
if self.reset_volume_checkbox.isChecked(): if self.reset_volume_checkbox.isChecked() or self.auto_dosing:
# Reset volume counter # Reset volume counter (always reset for auto dosing)
self.total_volume = 0.0 self.total_volume = 0.0
self.total_volume_label.setText("Gesamt: 0.0 ml") self.total_volume_label.setText("Gesamt: 0.0 ml")
else: else:
@ -312,6 +324,15 @@ class PHControllerGUI(QMainWindow):
self.flow_rate_label.setVisible(False) self.flow_rate_label.setVisible(False)
# Keep total_volume_label visible to show final amount # Keep total_volume_label visible to show final amount
self.flow_rate_timer.stop() self.flow_rate_timer.stop()
# Stop auto dosing if it was running
if self.auto_dosing:
self.auto_dosing = False
self.auto_dose_timer.stop()
self.auto_dose_btn.setText("Automatisch dosieren")
self.auto_dose_btn.setEnabled(True)
QMessageBox.information(self, "Automatische Dosierung",
f"Dosierung abgeschlossen!\nGepumpte Menge: {self.total_volume:.2f} ml")
def send_tube_command(self, index): def send_tube_command(self, index):
# Only send command if not updating from Arduino response # Only send command if not updating from Arduino response
@ -336,12 +357,66 @@ class PHControllerGUI(QMainWindow):
self.status_bar.showMessage("Debug-Informationen angefragt...") self.status_bar.showMessage("Debug-Informationen angefragt...")
def start_auto_dose(self): def start_auto_dose(self):
if self.auto_dosing:
# Stop auto dosing
self.auto_dosing = False
self.auto_dose_timer.stop()
self.send_pump_command(0) # Turn off pump
self.auto_dose_btn.setText("Automatisch dosieren")
return
volume = self.volume_spin.value() volume = self.volume_spin.value()
# Calculate pump run time based on tube size and volume self.target_volume = volume
# This would need to be implemented based on your specific setup self.auto_dosing = True
QMessageBox.information(self, "Automatische Dosierung",
f"Es werden {volume} ml dosiert. Bitte warten...") # Update button text and disable manual pump controls during auto dosing
# Implementation would need to send appropriate commands to Arduino self.auto_dose_btn.setText("Stop Dosierung")
self.pump_on_btn.setEnabled(False)
self.pump_off_btn.setEnabled(False)
# Reset volume counter for accurate measurement
self.total_volume = 0.0
# Start pumping
self.send_pump_command(1)
# Start monitoring timer (check every 0.5 seconds for better precision)
self.auto_dose_timer.start(500)
self.status_bar.showMessage(f"Automatische Dosierung läuft... Ziel: {volume} ml")
def check_auto_dose_progress(self):
"""Check if target volume has been reached during auto dosing"""
if not self.auto_dosing:
return
# Check if we've reached or exceeded the target volume
if self.total_volume >= self.target_volume:
# Stop dosing
self.auto_dosing = False
self.auto_dose_timer.stop()
self.send_pump_command(0) # Turn off pump
# Re-enable manual controls
self.pump_on_btn.setEnabled(True)
self.pump_off_btn.setEnabled(True)
self.auto_dose_btn.setText("Automatisch dosieren")
# Show completion message
actual_volume = self.total_volume
difference = actual_volume - self.target_volume
message = f"Dosierung abgeschlossen!\n"
message += f"Zielvolumen: {self.target_volume:.2f} ml\n"
message += f"Tatsächliches Volumen: {actual_volume:.2f} ml\n"
message += f"Abweichung: {difference:+.2f} ml"
QMessageBox.information(self, "Automatische Dosierung", message)
self.status_bar.showMessage(f"Dosierung abgeschlossen: {actual_volume:.2f} ml von {self.target_volume:.2f} ml")
else:
# Update progress in status bar
progress = (self.total_volume / self.target_volume) * 100
self.status_bar.showMessage(f"Dosierung: {self.total_volume:.2f}/{self.target_volume:.2f} ml ({progress:.1f}%)")
def read_serial_data(self): def read_serial_data(self):
if not self.serial_connection or not self.serial_connection.is_open: if not self.serial_connection or not self.serial_connection.is_open:
@ -409,6 +484,7 @@ class PHControllerGUI(QMainWindow):
self.ph_request_timer.stop() self.ph_request_timer.stop()
self.tube_request_timer.stop() self.tube_request_timer.stop()
self.flow_rate_timer.stop() self.flow_rate_timer.stop()
self.auto_dose_timer.stop()
self.close_connection() self.close_connection()
event.accept() event.accept()