Adruino signal mit Python verarbeiten

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Stevo Es
User
Beiträge: 2
Registriert: Mittwoch 3. März 2021, 09:34

Hallo zusammen,
ich bin neu hier im Forum und fange direkt mal an worum es geht.

Ich lese mit einem Adruino die Sensor Daten eines Hygrometers aus. Diese habe ich im Sketch des Adruinos schon in Prozent umgewandelt.

Jetzt wollte ich mit der gegenstelle, aktuell mein Notebook, die Daten mit Python empfangen und bearbeiten.

Bisher empfange ich die Daten und nun habe ich es geschafft das die Ergebnisse auch alle in eine output.txt gespeichert werden. Weiteres habe ich später vor. Nur denke ich das mein aktuelles Python Skript nicht wirklich korrekt ist, auch wenn es gerade funktioniert. Vieleicht mag da ja mal jemand rüber schauen.

Python code:

Code: Alles auswählen

import serial

 

serial_port = 'com3';

baud_rate = 9600;

datei_name = "output.txt";

 

datei = open("output.txt", "a+")

ser = serial.Serial(serial_port, baud_rate)

 


while True:

line = ser.readline()

line = line.decode("utf-8")

print(line)

datei.write(line)

datei.close()

datei = open("output.txt", "a+")
Mein Problem lag daran das der code sich nach dem close() befehl geschlossen hatte und somit nur eine Zahl in die Textdatei geschrieben wurde. Nun mit dem letzten befehl, konnte ich die schleife aufrechterhalten und es wird wie es soll jeder Eintrag in die Textdatei geschrieben.

"datei = open("output.txt", "a+")"

Ich habe allerdings das Gefühl das dieser Code fusch ist und man es bestimmt nicht so macht.

Ich bin gespannt auf eure Ratschläge. :)

Zur Vollständigkeit hier nochmal der Adruino Sketch:

Code: Alles auswählen

#include "SevSeg.h" //Die vorher hinzugefügte Library laden

SevSeg sevseg; //Ein sieben Segment Objekt initialisieren

const int dry = 830; // value for dry sensor

const int wet = 430; // value for wet sensor

 

void setup()

{

Serial.begin(9600);

byte numDigits = 3; //Hier wird die Anzahl der Ziffern angegeben

byte digitPins[] = {2, 3, 4, 5}; //Die Pins zu den Ziffern werden festgelegt

byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13}; //Die Pins zu den //Segmenten werden festgelegt

sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins);

 

}

 

void loop()

{

int sensorVal = analogRead(A0);

 

// Sensor has a range of 430 to 830

// We want to translate this to a scale or 0% to 100%

int percentageHumididy = map(sensorVal, wet, dry, 100, 0);

 

static unsigned long timer = millis();

 

if (millis() >= timer) {

timer += 1000;

sevseg.setNumber(percentageHumididy, -1); //Hier können wir nun die gewünschte Zahl eintragen.

Serial.print(percentageHumididy);

Serial.println("%");

}

 

sevseg.refreshDisplay(); // Dieser Teil lässt die Nummer auf dem Display

//erscheinen.

 

sevseg.setBrightness(100); //Hier kann die Helligkeit des Displays angepasst

//werden. In einem Bereich von 0-100 wobei 100 das Hellste ist. 0 bedeutet

//jedoch nicht dass das Display komplett dunkel ist. Für die Anzeige einer Zahl

//ist allein die "sevseg.refreshDisplay();" Zeile verantwortlich

}
Ich hoffe das ich es soweit verständlich rüberbringen konnte.

Schöne Grüße
Stevo Es
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Einrückungen sind kaputt und die vielen Leerzeilen stören das Lesen.
Die "+"-Dateimodi sind für Textdateien alle unsinnig. Du willst einfach nur "a".
Es ist auch unsinnig, direkt vor der Schleife und dann am Ende der Schleife nochmal die Datei zu öffnen.
Man öffnet die Datei, bevor man etwas hineinschreibt; oder noch besser, man schließt nicht jedes mal die Datei wieder.
Konstanten schreibt man nach Konvention komplett gross. Die Strichpunkte sind allesamt überflüssig.
Die Mischung aus Deutsch und Englisch ist unschön, da man ständig die Sprache wechseln muß.
Dateien öffnet man immer mit dem with-Statement, genauso wie das Serial-Objekt.
Statt der while-Schleife nimmt man eine for-Schleife.

Code: Alles auswählen

import serial
 
SERIAL_PORT = 'com3'
BAUD_RATE = 9600
FILENAME = "output.txt"

def main():
    with serial.Serial(SERIAL_PORT, BAUD_RATE) as input:
        with open(FILENAME, "a", encoding="utf8") as output:
            for line in input:
                line = line.decode("utf-8")
                print(line.rstrip())
                output.write(line)
                output.flush()

if __name__ == "__main__":
    main()
Stevo Es
User
Beiträge: 2
Registriert: Mittwoch 3. März 2021, 09:34

Vielen Dank für die schnelle hilfe.
Es hat auf anhieb geklappt. Ich werde mich wohl weiter mit Python beschäftigen um es besser zu verstehen.
Antworten