Ich habe ein Raspberry Pi und ein Arduino über USB angeschlossen. Arduino bezieht Daten von der Welt über Sensoren (EC und Temperatursensor) und schreibt diese Daten in serielle Daten. Der Raspberry schreibt diese Daten in eine Datenbank.Raspberry Arduino Kommunikation über Pyserial stoppt nach einem Tag
Die Arduino Skizze:
#include <OneWire.h>
#include <DallasTemperature.h>
int R1= 500;
int Ra=25; //Resistance of powering Pins
int ECPin= A0;
int ECGround=A1;
int ECPower =A4;
float PPMconversion=0.7;
float TemperatureCoef = 0.019;
float K=2.88;
#define ONE_WIRE_BUS 10 // Data wire For Temp Probe is plugged into pin 10 on the Arduino
const int TempProbePossitive =8; //Temp Probe power connected to pin 9
const int TempProbeNegative=9; //Temp Probe Negative connected to pin 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);// Pass our oneWire reference to Dallas Temperature.
float Temperature=10;
float EC=0;
float EC25 =0;
int ppm =0;
float raw= 0;
float Vin= 5;
float Vdrop= 0;
float Rc= 0;
float buffer=0;
void setup()
{
Serial.begin(9600);
pinMode(TempProbeNegative , OUTPUT); //seting ground pin as output for tmp probe
digitalWrite(TempProbeNegative , LOW);//Seting it to ground so it can sink current
pinMode(TempProbePossitive , OUTPUT);//ditto but for positive
digitalWrite(TempProbePossitive , HIGH);
pinMode(ECPin,INPUT);
pinMode(ECPower,OUTPUT);//Setting pin for sourcing current
pinMode(ECGround,OUTPUT);//setting pin for sinking current
digitalWrite(ECGround,LOW);//We can leave the ground connected permanantly
delay(100);// gives sensor time to settle
sensors.begin();
delay(100);
R1=(R1+Ra);// Taking into acount Powering Pin Resitance
};
void loop()
{
GetEC();
PrintReadings(); // Cals Print routine [below main loop]
delay(20000);
}
void GetEC(){
sensors.requestTemperatures();// Send the command to get temperatures
Temperature=sensors.getTempCByIndex(0); //Stores Value in Variable
digitalWrite(ECPower,HIGH);
raw= analogRead(ECPin);
raw= analogRead(ECPin);// This is not a mistake, First reading will be low beause if charged a capacitor
digitalWrite(ECPower,LOW);
Vdrop= (Vin*raw)/1024.0;
Rc=(Vdrop*R1)/(Vin-Vdrop);
Rc=Rc-Ra; //acounting for Digital Pin Resitance
EC = 1000/(Rc*K);
EC25 = EC/ (1+ TemperatureCoef*(Temperature-25.0));
ppm=(EC25)*(PPMconversion*1000);
}
void PrintReadings(){
Serial.print("Rc: ");
Serial.print(Rc);
Serial.print(" EC: ");
Serial.print(EC25);
Serial.print(" Simens ");
Serial.print(ppm);
Serial.print(" ppm ");
Serial.print(Temperature);
Serial.println(" *C ");
Serial.print("Vdrop: ");
Serial.println(Vdrop);
Serial.print("Rc: ");
Serial.println(Rc);
Serial.print(EC);
Serial.println("Siemens");
};
Code auf Raspberry Pi:
import serial
import time
import re
import sqlite3
for com in range(0,4):
try:
PORT = '/dev/ttyACM'+str(com)
BAUD = 9600
board = serial.Serial(PORT,BAUD)
board.close()
break
except:
pass
DEVICE = '/dev/ttyACM'+str(com)
BAUD = 9600
s = serial.Serial(DEVICE, BAUD)
conn=sqlite3.connect('mydatabase.db')
cursor=conn.cursor()
#s.open()
time.sleep(5) # der Arduino resettet nach einer Seriellen Verbindung, daher muss kurz gewartet werden
#s.write("test");
while True:
response = s.readline()
numbers = re.findall(r"[-+]?\d*\.\d+|\d+", response)
if len(numbers) == 4:
temp = numbers[3]
ec = numbers[1]
result = cursor.execute("INSERT INTO sensordata (temp, ec) VALUES ({temp}, {ec})".form$
conn.commit()
print response
Daten für etwa 24 Stunden auf Himbeer-Seite geschrieben werden, dann bekomme ich keine serielle Ausgabe von Arduino mehr. Das gleiche Problem, wenn ich das Python-Skript erneut neu starte. Wenn ich das Python-Skript neu starte und die serielle Kommunikation erneut gestartet wird, wird das Arduino zurückgesetzt. Ich habe dieses Standardverhalten nicht geändert. Die Tatsache, dass ich immer noch keine Daten über die serielle Schnittstelle bekomme, zeigt mir, dass es auf der Arduino-Seite kein Speicherproblem gibt. Ein weiterer Hinweis, dass es ein Problem mit dem Raspberry sein muss, bekomme ich von der Tatsache, dass ein Neustart von Raspberry das Problem löst und die Daten für weitere 24 Stunden protokolliert werden.
Ist jemand neugierig genug, um mir einen Hinweis zu geben, wie man eine solide Kommunikation herstellt?
Nur ein paar Vorschläge. Auf dem Raspberry fügen Sie der Hauptschleife etwas Verzögerung hinzu, so dass die CPU nicht zu 100% genutzt wird. Das ist wahrscheinlich nicht das Problem, aber es kann helfen. Auf dem Arduino fügen Sie weitere serielle Ausdrucke in die GetEC-Funktion ein (die Sie auf dem Raspberry ignorieren werden), so dass Sie sehen, ob es immer in der gleichen Zeile stoppt. – ChatterOne
Thx, ChatterOne für Ihren Kommentar. Keine E-Mail erhalten, um Ihre Aktivität zu erkennen. Irgendwie gelingt es Python trotzdem eine Verzögerung hinzuzufügen. Laut Befehlszeilen-Tool-Top gibt es sehr viel freie Zeit.Ja, ich habe den seriellen Druck nach jedem Befehl hinzugefügt und das führte mich zu weiteren Beobachtungen, siehe meine Antwort –