2016-07-15 13 views
0

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?

+0

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

+0

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 –

Antwort

0

Mein Problem ist gelöst.

Als ich massiven seriellen Druck auf der Arduino-Seite hinzugefügt habe, fand ich heraus, dass es auf der Raspberry-Seite nicht wirklich nichts gibt, aber viel weniger, so dass mein Python-Programm einfach nicht analysieren konnte, was die Arduino-Skizze gesendet hat. Eine weitere Beobachtung war:

Wenn ich das serielle Gerät sah mit

screen /dev/ttyACM0 

bekam ich eine sehr ähnliche Wirkung und konnte das Problem reproduzieren. Aufgrund des massiven Debug-Drucks, den ich auf der Arduino-Seite hinzugefügt habe, sah ich einige über pyserial empfangene Zeichen, dass mein Python-Skript druckte, aber die Kommunikation durch diesen Bildschirmbefehl ernsthaft beeinträchtigt wurde. Und als ich das serielle Gerät über den Bildschirm sah, sah ich viel mehr Charaktere, als ob der Bildschirm die Show gestohlen hätte. Es war ein Durcheinander, das ich nicht schaffte, aufzuräumen, und ich musste die Himbeere neu starten. Aber sagte mir, dass das Problem auf der Raspberry Seite sein muss.

Was mein Problem gelöst wurde dieses Kommunikationsmuster versucht:

https://github.com/gskielian/Arduino-DataLogging/blob/master/PySerial/README.md

Verstehe nicht ganz, was der Autor damit meine ‚JEDOCH darauf achten, dass der Arduino nicht ständig Daten an Ihrem Programm zu senden ist - - Sie werden wahrscheinlich Fehler in der Pufferüberfüllung finden. '

Der Arduino wird jetzt nach Daten gefragt und antwortet, anstatt kontinuierlich zu senden.

Das ist alles noch mysteriös für mich, aber meine Frage ist beantwortet und die Himbeere erhält nun erfolgreich Sensordaten für 6 Tage.