Go Down

Topic: Projekt zur Ermittlung der Dauerbetriebseigenschaften unterschiedlicher Sensoren (Read 6337 times) previous topic - next topic

combie

Quote
Was Du allerdings mir 'Jammern' meinst, verstehe ich nicht.
Dann lese dein Posting #39 nochmal durch!

Aus meiner Sicht ist ein Forenposter, wenn er eine Frage beantwortet haben möchte, verpflichtet die notwendigen Angaben zu machen, damit die Helfer eine Chance haben.

Bei dem 40% Problem wäre es nötig/unabdingbar den Code zu sehen, damit man ihn auf Größe optimieren kann, oder zumindest Vorschläge in die Richtung geben kann.

Tut dieser Forenposter das nicht, so wie du in dem Beitrag, dann jammert er nur.
Und ich wende mich ab....

Dem Link, könntest du entnehmen, dass sich aus einem "Ressourcen Mangel Problem" durchaus eine interessante Diskussion, incl. Lösung, entwickeln kann.

Das "jammern" war als "Wink mit dem Zaunpfahl" gedacht, an dem noch ein ganzer Garten mit dran hängt. Den darfst du natürlich auch gerne falsch verstehen und beleidigt sein. Aber ob dir das dann weiterhilft ist eher fraglich.



Zusammengefasst:
Da du mit den nötigen Fakten hinter dem Berg hältst, kann ich dir bei deinem konkreten 40% Problem nicht helfen, sehe aber die misslichen Lage in der du dich befindest.
Das einzige was ich dir in der Situation geben kann, ist Mitgefühl!



Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
Quelle: Jean-Paul Sartre

Hayley_Hay

Zusammengefasst:
Da du mit den nötigen Fakten hinter dem Berg hältst, kann ich dir bei deinem konkreten 40% Problem nicht helfen, sehe aber die misslichen Lage in der du dich befindest.
Das einzige was ich dir in der Situation geben kann, ist Mitgefühl!
Dann gab es da wohl ein Missverständnis. Die 40% sind kein konkretes Problem, denn der Code ist nicht annähernd im Bereich der Vollständigkeit. Daher habe ich es als überflüssig erachtet ihn zu posten, sondern der Umstand war nur Anlass für mich, mal über die Kapazität nachzudenken und hier die Frage zu stellen. Ansonsten stimme ich Dir natürlich zu, dass konkrete Hilfe nur am konkreten Fall funktioniert. Aber da es eine allgemeine Frage war hat mir wie gesagt Dein Link zu dem allgemeinen Einsparen für's erste schon weitergeholfen.

Hayley_Hay

Neben dem Zwischenmenschlichen Geplänkel: BTT

Gibts jetzt noch einen offenen Punkt der geklärt werden muss?
Wenn ja - Welchen?
Wenn nein, könntest ja mal zum Abschluss ein paar Bilder von deinem Projekt als Dankeschön posten.
Danke für die Nachfrage!

Also der Stand ist, dass ich gerade auf die zweite Bestellung der Hardware (weitere Sensoren, Relais, Displays, Raspberry, Platinen, Gehäuse, etc.) warte und dann hoffentlich nächste Woche mit dem Aufbau der Steuerung anfangen kann. So lange setze ich mich daran, die bisherigen Sensoren in einen einzigen Sketch zu bekommen. Da wird es sicherlich noch einige Fragen geben. Bilder poste ich sehr gerne, wenn es so weit ist, ebenso natürlich wie Ergebnisse etc.

Hayley_Hay

Da ich immer noch auf die Bestellung warte ist vielleicht Zeit für noch ein paar kleine Fragen zum Code:

Ich habe nach Lektüre einiger Seiten und vorläufiger Überlegung folgenden Plan:

Steuerung
-> Arduino_1
write
--> USB (timestamp, quasi-kontinuierliche Werte der Durchflussmessung, Änderung der Relaiszustände)
--> mySQL(RasPi)

Sensoren
-> Arduino_2
write
--> USB (timestamp, Sensorwerte quasi-kontinuierlich, bzw. bei Schaltern nur bei Zustandsänderung)
--> mySQL(RasPi)

Welche Frequenz ist für die Lese-/Schreibvorgänge sinnvoll, so dass ich ohne große Kniffe die Datenbank nicht überlaste?
Sollte der Arduino_2 jeweils einen Sensor lesen und das Ergebnis seriell an die Datenbank schicken, oder erst einen Durchlauf durch alle Sensoren machen und die Ergebnisse dann in einem Zug schreiben? Ist es einfacher, die Arduinos in die Datenbank schreiben zu lassen oder den RasPi sich die Daten holen zu lassen?

Tommy56

Welche Frequenz ist für die Lese-/Schreibvorgänge sinnvoll, so dass ich ohne große Kniffe die Datenbank nicht überlaste?
Sollte der Arduino_2 jeweils einen Sensor lesen und das Ergebnis seriell an die Datenbank schicken, oder erst einen Durchlauf durch alle Sensoren machen und die Ergebnisse dann in einem Zug schreiben? Ist es einfacher, die Arduinos in die Datenbank schreiben zu lassen oder den RasPi sich die Daten holen zu lassen?
Die hHäufigkeit richtet sich nach der realen Änderung der Werte, z.B. bei einer Raumtemperatur ist 1 min ausreichend, bei einer Wassertemperatur in einem großen Volumen genügen auch 15 min.

Die Belastung der DB ist am geringsten, wenn Du die Werte aller Sensoren eines Arduino zu einem Insert-Statement bündelst.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Hayley_Hay

Hallo mal wieder!

Da ich leider immer noch auf die Bestellungen warten muss, hier mal eine in der Zwischenzeit aufgetauchte Frage:

Ich möchte die Steuerung ungefähr folgendermaßen realisieren:
Phase 1 (Pumpen von Behälter A nach B): Magnetventil 1 auf - Magnetventil 2 zu - Verdichter an - Wartezeit lang - Verdichter aus - Wartezeit kurz
Phase 2 (von B nach A): entsprechend umgekehrt
Belüftungsphase: Beide Ventile zu - Verdichter an - Wartezeit - Verdichter aus

Da ich den Durchfluss nicht als Referenz messen kann benötige ich ja in der Auswertung den eindeutigen Zustand der Steuerung in jedem Moment. Dafür müsste es doch reichen, jeden Beginn einer neuen Phase mit timestamp in die Datenbank zu schreiben, oder?
Außerdem möchte ich die Restzeit der aktuellen Phase gerne auf ein Display geben, das würde dann mittels eines am Anfang der Phase gestarteten Countdowns funktionieren, weil die Phasen immer die einmal festgelegte Dauer haben, richtig?
Und zuletzt möchte ich die wichtigen Funktionen gerne auch manuell auslösen können, was aber auch protokolliert werden muss. Das wäre dann wahrscheinlich nur per Interrupt möglich?

Vielen Dank schon einmal!

postmaster-ino

Hi

Was denkst Du, wird dort dann der Interrupt machen sollen?
Ernst gemeinte Frage!!

Dem Arduino ist es vollkommen wurscht, ob die 'Phase' durch einen Tastendruck, oder Ablauf einer zuvor eingestellten Zeit gestartet wird.

MALE Dir doch einfach ein Ablauf-Diagramm, Wo Du angibst, von welchem Zustand Du zu Welchem wechseln kannst und unter welchen Umständen dort hin gewechselt wird.

Und bitte bringe mir bei, was Du laufend mit den Interrupts vor hast - oder verinnerliche, was Die eigentlich in den Tiefen des µC machen sollen.

MfG

PS: Wofür wird der Verdichter gestartet beim Belüften?
PPS: Wenn Du eh gerade einen Stift in der Hand hast - ein Bild, wie das Ganze zusammen aussehen könnte, schadet hier ganz bestimmt auch nicht!!

MfG²
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

Hayley_Hay

Hey!

Was denkst Du, wird dort dann der Interrupt machen sollen?
Also wenn ich zehn Minuten lang in eine Richtung pumpe und während dessen z.B. pausieren, belüften oder in die andere Richtung pumpen lassen möchte, dann muss ich - wenn ich es nicht unter Umgehung der Elektronik sozusagen hard-wired erledigen möchte (wobei ich dann nicht wüsste, wie ich diese Unterbrechung aufzeichnen sollte) - das doch als Unterbrechung der laufenden Funktion machen. Aber vielleicht habe ich da auch etwas falsch verstanden.

Quote
MALE Dir doch einfach ein Ablauf-Diagramm, Wo Du angibst, von welchem Zustand Du zu Welchem wechseln kannst und unter welchen Umständen dort hin gewechselt wird.
Das ist eine sehr gute Idee, die ich zeitnah umsetzen werde!

Quote
PS: Wofür wird der Verdichter gestartet beim Belüften?
Der Verdichter IST sozusagen die Belüftung, bzw. in Kombination mit einem Belüftungsmodul auf dem Boden des Tanks. Wenn beide Ventile zu sind kann die Luft nur noch durch das Modul. Wenn eines geöffnet ist ist der Widerstand des Moduls zu groß als das dadurch belüftet würde.

Quote
PPS: Wenn Du eh gerade einen Stift in der Hand hast - ein Bild, wie das Ganze zusammen aussehen könnte, schadet hier ganz bestimmt auch nicht!!
Stimmt. Ungefähr so:

Theseus

Also wenn ich zehn Minuten lang in eine Richtung pumpe und während dessen z.B. pausieren, belüften oder in die andere Richtung pumpen lassen möchte, dann muss ich - wenn ich es nicht unter Umgehung der Elektronik sozusagen hard-wired erledigen möchte (wobei ich dann nicht wüsste, wie ich diese Unterbrechung aufzeichnen sollte) - das doch als Unterbrechung der laufenden Funktion machen. Aber vielleicht habe ich da auch etwas falsch verstanden.
Beschäftige dich bitte mit Zustands-Maschine und Ablaufsteuerungen mit millis(). Du nimmst eine Zustandsvariable, die bei jedem Schritt weitergezählt wird. Dann baust deine loop, wo du mit Hilfe von millis() und deiner Zustandsvariable deinen Ablauf mit Hilfe von If-Abfragen ablaufen lässt. Deine loop() sollte mindestens einige Zig-mal in der Sekunde durchlaufen werden. Dann ist auch gar kein Problem auf Tastendrücke zu reagieren und diese zu Protokollieren. Das geht alles super ohne Interrupt.

GuntherB - BlinkwithoutDelay - Die Nachtwächtererklärung
http://forum.arduino.cc/index.php?topic=423688.0
Ich erkläre millis()
http://forum.arduino.cc/index.php?topic=400102.msg2752141#msg2752141




Rentner

Hallo,

tut mir leid , mit Deinem Schema kann ich nicht viel anfangen,

was ist das blaue Ding ? Ausgleichsleitung ?

wo ist der Verdichter
wo ist die Saugseite der Pumpe angeschlossen. 
warum ist die Druckseite der Pumpe unten nur an nur einem Behälter angeschlossen, warum unten ?.
was schalten die beiden Ventile.

Ich denke Du bist kurz vor Ende Deines Studium , da solltest Du im Stande sein  ein Schema zu zeichnen in dem zwei Behälter eine Pumpe, einige Ventile und ein Verdichter enthalten sind. Zudem sollte man erkennen können das man damit aus einem Beghälter in den anderen und umgekehrt Pumpen kann, und wo wie ein Verdichter in dem System enthalten ist. Und das Ganze mit  normgerechten Symbolen. Zudem solltest Du im Stande sein eine Aufgabenstellung Gedanklich durchzugehen und daraus eine Lösung zu realisieren, das ist schliesslich Deine Aufgabe , das Projekt ist nur das nötige Beiwerk.

Das was Du messtechnisch und steuerungstechnisch so vorhast ist für einen Anfänger eh schon viel, fang einfach mal an wenn Du den Arduino hast. Die Ventile und Pumpen,Verdichter kannst Du erst mal mittels LED simulieren. Die Bedienelemente Taster usw. gibts als mini Taster für wenige Cent. alles baust Du auf ein Steckbrett auf und kannst es so simulieren. Und dann gaaanz langsam Schritt für Schritt und nich alles auf einmal.

Mir ist auch noch nicht klar warum Du zwei UP einsetzen willst , das schafft zusätzliche Schnittstellen mit denen Du dich beschäftigen must. Aber es ist Dein Projekt. 

Gruß Heinz


Hayley_Hay

Nach längerer Auszeit wegen Krankheit, Urlaub und Warten auf Bauteile melde ich mich jetzt endlich wieder. Inzwischen bin ich was den Aufbau betrifft schon deutlich weiter, hier ein Mal ein paar Bilder. Zuerst eine Übersicht mit beiden Behältern, den Pumpen und der Steuer- und Auswerteelektronik. Dann einige der Sensoren, und noch ein Einblick in den Steuerkasten mit Arduino1.

edit: Außerdem habe ich inzwischen zumindest die vom Arduino2 erfassten Daten seriell zum RasPi und dort in eine SQlite3 DB geschrieben bekommen (mittels dieser Anleitung: http://combustory.com/wiki/index.php/Arduino_Communications_-_SQLite).
Probleme habe ich immer noch mit der komplexen Version der Steuerung (s.o.). Ich habe zwar je ein Programm zum manuellen Pumpen/Belüften mittels dreier Schalter und eines zum kontinuierlichen Hin- und Herpumpen für jeweils 5 Minuten, aber die Verbindung der beiden Programme schaffe ich leider noch nicht, später mehr dazu.

postmaster-ino




Der Upload-Script bietet zwar auch ein Thumbnail, Das wird aber genau so groß angezeigt und mit deutlich weniger Inhalt wird das Bild verwaschen.
*Edit*
Im IMG-Tag werden width und height mit angegeben - liegt daran, daß der 'Daumennagel' dann verwaschen rüber kommt.
*/Edit*
Also die hier gezeigten Bilder sind bereits 'in volle Kanne schön'!
Wenn man die Adresse der Bilder kopiert und die Nummer um 1 erhöht, hat man den 'Daumennagel':
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.


Hayley_Hay

So, hier habe ich jetzt eine erste Version der Steuerung, mit der ich sowohl im Kreis pumpen lassen als auch manuell die Relais ansteuern kann:

Code: [Select]
#include<Wire.h>

// Belegung der Ein- und Ausgaenge, Relais und Switches
const byte RY_V1_pin = 10; // Verdichter
const byte SW1_pin = 4;    // Schalter 1
const byte RY_M1_pin = 5;  // Magnetventil 1
const byte SW2_pin = 6;    // Schalter 2
const byte RY_M2_pin = 7;  // Magnetventil 2
const byte SW3_pin = 8;    // Schalter 3
const byte RY_M3_pin = 9;  // Magnetventil 3
//
bool SW1_status, SW2_status, SW3_status;
//
const int pump_intervall = 3000;
const int pause_intervall = 1000;
const int schreib_intervall = 50;
unsigned long Millis;
unsigned long Intervall;
unsigned long timestore;
unsigned long Rest;
//
enum ZUSTAENDE {A_to_B, pause1 , B_to_A, pause2};
byte zustand = pause2;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  pinMode(RY_M2_pin, OUTPUT);
  pinMode(RY_M1_pin, OUTPUT);
  pinMode(RY_V1_pin, OUTPUT);
  pinMode(SW1_pin, INPUT);
  pinMode(SW2_pin, INPUT);
  pinMode(SW3_pin, INPUT);
  digitalWrite(SW1_pin, HIGH);
  digitalWrite(SW2_pin, HIGH);
  digitalWrite(SW3_pin, HIGH);
}

void A_B () {
  digitalWrite(RY_V1_pin, HIGH);
  digitalWrite(RY_M1_pin, HIGH);
  digitalWrite(RY_M2_pin, LOW);
  digitalWrite(RY_M3_pin, LOW);
  //Serial.println(clock.dateFormat("Y-m-d H:i:s", dt));
  Serial.print("AB");
  return;
}

void B_A () {
  digitalWrite(RY_V1_pin, HIGH);
  digitalWrite(RY_M1_pin, LOW);
  digitalWrite(RY_M2_pin, HIGH);
  digitalWrite(RY_M3_pin, LOW);
  //Serial.println(clock.dateFormat("Y-m-d H:i:s", dt));
  Serial.print("BA");
  return;
}

void Air () {
  digitalWrite(RY_V1_pin, HIGH);
  digitalWrite(RY_M1_pin, LOW);
  digitalWrite(RY_M2_pin, LOW);
  digitalWrite(RY_M3_pin, HIGH);
  //Serial.println(clock.dateFormat("Y-m-d H:i:s", dt));
  Serial.print("air");
  return;
}

void pause () {
  digitalWrite(RY_V1_pin, LOW);
  digitalWrite(RY_M1_pin, LOW);
  digitalWrite(RY_M2_pin, LOW);
  digitalWrite(RY_M3_pin, LOW);
  return;
}

void programm() {
  if (millis() - Millis >= Intervall) {
    switch (zustand) {
      case A_to_B:
        A_B();
        zustand = pause1;
        Millis = millis();
        Intervall = pump_intervall;
        break;
      case pause1:
        pause();
        zustand = B_to_A;
        Millis = millis();
        Intervall = pause_intervall;
        break;
      case B_to_A:
        B_A();
        zustand = pause2;
        Millis = millis();
        Intervall = pump_intervall;
        break;
      case pause2:
        pause();
        zustand = A_to_B;
        Millis = millis();
        Intervall = pause_intervall;
        break;
    }
  }
}

bool readingSwitches(int SW1_pin, int SW2_pin, int SW3_pin) {
  SW1_status = digitalRead(SW1_pin);
  SW2_status = digitalRead(SW2_pin);
  SW3_status = digitalRead(SW3_pin);
  return SW1_status, SW2_status, SW3_status;
  delay(50);
}

void schreiben() {
  if (millis() - timestore >= schreib_intervall) {
    Serial.print(",");
    Serial.println(zustand);                      // bzw. Schaltzustände der Relais
    timestore = millis();
  }
}


void loop() {

  readingSwitches(SW1_pin, SW2_pin, SW3_pin);

  if (SW1_status == HIGH && SW2_status == HIGH && SW3_status == HIGH) {  // Schalter 1+2+3
    programm();
  }

  if (SW1_status == HIGH && SW2_status == HIGH && SW3_status == LOW) {   // Schalter 1+2
    A_B();
  }

  if (SW1_status == HIGH && SW2_status == LOW && SW3_status == HIGH) {   // Schalter 1+3
    B_A();
  }

  if (SW1_status == HIGH && SW2_status == LOW && SW3_status == LOW) {  // Schalter 1
    Air();
  }

  if (SW1_status == LOW && SW2_status == LOW && SW3_status == LOW) {   // kein Schalter
    pause();
  }

  schreiben();

  delay(50);
}


Es gibt allerdings noch einige Punkte, die ich gern um-/einarbeiten würde.

  • ein Berechnen der Restzeit im programm(), z.B. zur Anzeige auf dem Display oder zur Fortsetzung von programm() nach pause(). Sowas in der Art Rest = pump_intervall - ( millis() - Millis), aber an welcher Stelle muss das berechnet / ausgegeben werden?
    edit: Ok, hab's einfach in schreiben() ergänzt. Allerdings müsste ich es dann wohl in einem noch zu erstellenden display() erneut berechnen - oder wie wäre das richtig zu lösen?
  • eben diese Fortsetzung nach pause(), also ein Zurückspringen in den jeweils vorangegangenen Case
  • außerdem frage ich mich natürlich, ob ich den Code nicht eleganter formulieren könnte, z.B. in Hinblick auf eine mögliche Erweiterung der Schaltzustände (wenn SW1 NICHT gedrückt war und jetzt gedrückt wird...). Oder, dass ich in programm() nicht pause1 und pause2 verwenden muss, die ja identisch sind.


Und über alle weiteren Hinweise und Tipps freue ich mich natürlich auch!

postmaster-ino

Hi

Der Rückgabewert von readingSwitch (drei Werte hinter dem return) funktioniert??
Auch, weil Du den/dir Rückgabewert(e) nicht benutzt.
Das funktioniert gearde nur, weil z.B. SW1_status global definiert ist!!

1. Die Berechnung der Restzeit machst Du entweder zentral in loop() und gibst Diese nur aus, wenn Die auch auf's Display soll (und sich geändert hat), oder direkt vor der Ausgabe auf dem Display.

2. Wenn Du Dir gemerkt hast, was Du zuletzt gemacht hast, kannst Du dahin auch zurück springen - nimm eine neue Variable 'Letzte_Aufgabe' und setze Diese auf 'zustand' bevor Du Den änderst.
So kannst Du nach der Pause auf den 'zustand' davor springen und eben ein weiteres Mal Pumpen o.Ä..

3. 'pause1' und 'pause2' sind verschiedene Status, welche bei Dir aber genau das Gleiche auslösen.
So solltest Du Beide auch zusammen fassen können.
Weitere Status kannst Du ja einfach in die enum Zeile einfügen und in Deiner loop drauf prüfen, ob und in welchen Status jetzt gewechselt werden muß.

MfG

Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

Go Up