Hallo zusammen,
bin neu hier und auch nur ein kleiner Hobbyprogrammierer.
Für meine Arbeit möchte ich einen Arduino Mega eine gewisse Anzahl Sensoren und Eingänge auslesen lassen. Die Werte sollen über ein USB-Kabel an den Raspberry übertragen werden und von diesem in einer LOG-Datei gespeichert werden. (Später soll dann noch über einen Webserver auf den RPi zugegeriffen werden können. Doch das ist zweitrangig.)
Ich habe jetzt mal die beiden Programme beispielhaft fertig. Könntet ihr mal bitte drüber schauen, ob ich etwas verkehrt gemacht habe. Ich habe nämlich keine Ahnung von seriellen Schnittstellen
Vielen Dank schin einmal für Eure Mühen.
Arduino Code:
C
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int inByte = 0;
int Measure;
int Value;
String com_string, String1, String2;
int P1, P2, P3, P4, P5; //, P6, P7, P8;
int E1;
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
lcd.setCursor(0,0);
//pinModes setzen
pinMode (22, INPUT);
/*pinMode (24, INPUT);
pinMode (26, INPUT);*/
// start serial port at 9600 bps:
Serial.begin(9600);
// send a byte to establish contact until receiver responds
establishContact();
String1 = ("Messwert: ");
String2 = ("Druckwert: ") ;
}
void loop() {
com_string = ("");
if (Serial.available() > 0) {
// get incoming byte:
inByte = Serial.read();
P1 = analogRead(A8)/10.23;
P2 = analogRead(A9)/10.23;
P3 = analogRead(A10)/10.23;
P4 = analogRead(A11)/10.23;
P5 = analogRead(A12)/10.23;
E1 = digitalRead(22); //Triggereingang
com_string = com_string + P1;
com_string = com_string + ";";
com_string = com_string + P2;
com_string = com_string + ";";
com_string = com_string + P3;
com_string = com_string + ";";
com_string = com_string + P4;
com_string = com_string + ";";
com_string = com_string + P5;
com_string = com_string + ";";
com_string = com_string + "T=";
com_string = com_string + E1;
com_string = com_string + ";";
Serial.println(com_string);
delay(100);
}
}
void establishContact() {
while (Serial.available() <= 0) {
Serial.print('A'); // send a capital A
delay(300);
}
}
Alles anzeigen
Python Code RPi:
Python
#!/usr/bin/env python
# _*_ config: utf-8 _*_
from serial import Serial
import time
import csv
ser = Serial('/dev/ttyUSB0', 9600, 7, 'E', 1)
incident = 0
str_old = ''
while True :
com_in = str(ser.readline())
if com_in.__contains__( 'A' ) : ##Arduino sendet ein A zur Initialisierung
while True :
ser.write() ##Anforderung an Arduino zum Senden der Daten
com_in = str(ser.readline())##Auslesen der Daten
if com_in == '' : ## leere Zeile = Schleifenanfang, kein speichern in Datei
continue
else :
## Log Zeile generieren
now = time.strftime('%d.%m.%Y;%H:%M:%S;')
log_str = now + com_in
## csv-Datei oeffnen und schreiben
try :
writer = csv.writer(open("/media/DATA/log.csv", "wb"))
writer.writerow([log_str])
writer.close()
except :
print('Log-Datei konnte nicht beschrieben werden. Programm beendet')
quit()
## Wenn eine Stoerung auftritt wird T=1 im Str erscheinen und ein Zaehler laeuft hoch
if (log_str.__contains__('T=1')) and (str_old.__contains__('T=0')) :
incident = incident + 1
print now, 'Stoerungen gesamt:', incident
str_old = com_in
## wenn arduino noch nicht bereit ist zurueck zum Schleifenanfang
else :
continue
Alles anzeigen