[Python] Python to Arduino serial communication

Discussão em 'Python' iniciado por Stack, Março 14, 2025.

  1. Stack

    Stack Membro Participativo

    I'm making an interface in Tkinter where you have several options and a send button. When you click the send button it sends a value over serial connection to an Arduino Mega who puts a pin low/high and connects through optocouplers to an external device.

    When I send my commands via the serial monitor to my Arduino everything is working flawless. When I try to send the commands via my Python app I see the led blinking that my Arduino receives something but nothing happens.

    I've installed an LCD, when I send stuff from the serial line I see it on the screen. When it comes from Python I only see "Wachten op data".

    I think the problem will have to do with some kind of carriage return character but I've tried everything I could.

    Thanks!

    PS: the lcd is not important, it's just to debug at the moment.

    Arduino Code

    #include <Arduino.h>
    #include <LiquidCrystal.h>

    const int ledPin = 12;

    // LCD-instellingen: (RS, E, D4, D5, D6, D7)
    LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

    void setup() {
    Serial.begin(9600);
    pinMode(ledPin, OUTPUT);

    lcd.begin(16, 2); // 16 kolommen, 2 rijen
    lcd.print("Wachten op data...");
    }

    void loop() {
    if (Serial.available() > 0) {
    delay(100); // Wacht kort om data volledig binnen te krijgen
    String command = Serial.readString();
    command.trim(); // Verwijder spaties en nieuwe regels

    if (command.length() > 0) {
    // Laat ontvangen bericht zien op het LCD
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Ontvangen:");
    lcd.setCursor(0, 1);
    lcd.print(command);

    // Debug output naar seriële monitor
    Serial.print("Ontvangen: [");
    Serial.print(command);
    Serial.println("]");

    // Controleer op "1" of "2" voor LED aan/uit
    if (command == "1") {
    digitalWrite(ledPin, HIGH);
    Serial.print("LED Aan");
    } else if (command == "2") {
    digitalWrite(ledPin, LOW);
    Serial.print("LED Uit");
    }

    // Controleer op "Aanwezig" en "Uitgeschakeld"
    if (command.indexOf("Aanwezig") != -1) {
    digitalWrite(ledPin, HIGH);
    Serial.println("LED Aanwezig AAN");
    }
    else if (command.indexOf("Uitgeschakeld") != -1) {
    digitalWrite(ledPin, LOW);
    Serial.println("LED Uitgeschakeld UIT");
    }
    }
    }
    }


    Code Python

    import tkinter as tk
    import serial
    import serial.tools.list_ports
    from tkinter import messagebox

    class ParameterRow(tk.Frame):
    def __init__(self, master, label_text, options, default_value, send_function):
    super().__init__(master)
    self.label = tk.Label(self, text=label_text, anchor="w")
    self.label.grid(row=0, column=0, sticky="w")
    self.var = tk.StringVar(value=default_value)
    self.radio_buttons = []
    for i, option in enumerate(options):
    rb = tk.Radiobutton(self, text=option, variable=self.var, value=option)
    rb.grid(row=0, column=i + 1, sticky="w")
    self.send_button = tk.Button(self, text="Verzenden", command=send_function)
    self.send_button.grid(row=0, column=len(options) + 1, sticky="w")

    class ArduinoInterface:
    def __init__(self, master):
    self.master = master
    master.title("Arduino Parameters")

    # COM-poort selectie
    self.com_label = tk.Label(master, text="COM-poort:")
    self.com_label.grid(row=0, column=0, sticky="w")
    self.com_var = tk.StringVar()
    available_ports = self.get_available_ports()
    if available_ports:
    self.com_var.set(available_ports[0])
    self.com_dropdown = tk.OptionMenu(master, self.com_var, *available_ports)
    self.com_dropdown.grid(row=0, column=1, sticky="w")
    else:
    messagebox.showerror("Fout", "Geen COM-poorten beschikbaar.")
    return

    # Bakje toevoerwater
    self.toevoerwater_row = ParameterRow(master, "Bakje toevoerwater:", ["2", "1"], "2", self.send_toevoerwater)
    self.toevoerwater_row.grid(row=1, column=0, sticky="w")

    # Bakje condenswater
    self.condenswater_row = ParameterRow(master, "Bakje condenswater:", ["aanwezig", "afwezig"], "aanwezig", self.send_condenswater)
    self.condenswater_row.grid(row=2, column=0, sticky="w")

    # Niveau toevoerwater
    self.niveau_row = ParameterRow(master, "Niveau toevoerwater:", ["hoog", "laag"], "hoog", self.send_niveau)
    self.niveau_row.grid(row=3, column=0, sticky="w")

    # Deur
    self.deur_row = ParameterRow(master, "Deur:", ["open", "dicht"], "dicht", self.send_deur)
    self.deur_row.grid(row=4, column=0, sticky="w")

    # Extra Aan/Uit optie
    self.extra_aan_uit_row = ParameterRow(master, "Extra Aan/Uit:", ["Aan", "Uit"], "Uit", self.send_extra_aan_uit)
    self.extra_aan_uit_row.grid(row=5, column=0, sticky="w")

    self.ser = None

    def get_available_ports(self):
    ports = [p.device for p in serial.tools.list_ports.comports()]
    return ports

    def send_toevoerwater(self):
    value = self.toevoerwater_row.var.get()
    self.send_data(value)

    def send_condenswater(self):
    self.send_data(f"condenswater,{self.condenswater_row.var.get()}")

    def send_niveau(self):
    self.send_data(f"niveau,{self.niveau_row.var.get()}")

    def send_deur(self):
    self.send_data(f"deur,{self.deur_row.var.get()}")

    def send_extra_aan_uit(self):
    value = self.extra_aan_uit_row.var.get()
    self.send_data(value) # Verzend alleen Aan of Uit.

    def send_data(self, data):
    com_port = self.com_var.get()
    try:
    self.ser = serial.Serial(com_port, 9600)
    self.ser.write((data + "\n").encode())
    print(f"Sent data to {com_port}: {data}")
    self.ser.close()
    except serial.SerialException as e:
    messagebox.showerror("Fout", f"Kan COM-poort {com_port} niet openen.")

    root = tk.Tk()
    my_gui = ArduinoInterface(root)
    if my_gui.com_var.get() != "":
    root.mainloop()

    Continue reading...

Compartilhe esta Página