Hallo ich heiße Kevin und versuche mich gerade an meinem ersten Arduinoprojekt außerhalb des Experementierkastens. Und zwar geht es dabei um die Drucksteuerung unseres Kompressors. Dieser wird derzeit mechanisch über ein Ventil bestehend aus einer Kugel und einer Feder gesteuert. Beim erreichen des eingestellten Drucks wird die Kugel durch den Druck im Kessel angehoben und macht den weg zu den Ventielen frei. Diese werden in der Folge auch angehoben und der Kompressor geht auf Nullförderung bzw. durch die offenen Ventile kann im Zylinderraum nichts Kompremiert werden. Da diese Steuerung ihre besten Tage lange hinter sich gelassen hat möchte ich das ganze mit einem Magnetventil und einem Arduino Steuern. Das von mir gebastelte Programm funktioniert auch soweit. Ich kann den Druck über ein Poti einstellen (Eine Einstellung über einen Inkrementalgeber habe ich leider nicht hin bekommen. Vielleicht im nächstenSchritt). Der Druck wird über einen Drucksensor 0-5V =0-10,2 Bar gemessen und auch im Display angezeit. Was noch nicht funktioniert ist, dass das Magnetventil/Relais schaltet. Und an dem Punkt komme ich jetzt leider auch nicht weiter. Ich habe schon alles mögliche probiert, im Moment ist es so, dass der Ausgang beim Einschalten des Arduino ein paar mal ein und aus Schaltet und dann immer auf 5V bleibt (Relais schatet mit fallender Flanke). Könnte jemand von euch experten mal über meinen Code schauen und mir einen Tip geben was ich falsch mache.
Vielen Dank.
Gruß Kevin
#include <LiquidCrystal_I2C.h>
LiquidCristal_I2C lcd(0x27,20,4);
int Relais = 0; // Relais an Pin 0
void setup() {
// put your setup code here, to run once:
lcd.init();
lcd.backlight();
Serial.begin(9600);
pinMode(Relais, OUTPUT); // Pin Relais = Ausgang
lcd.begin(16, 2);
lcd.print("Druck ist soll"); // Text im Display
}
boolean Ventil;
void loop() {
// put your main code here, to run repeatedly:
int Poti = analogRead(0); //10k Ohm
int Sensor = analogRead(1); // Drucksensor 0-5V 5V = 10,2 Bar
int Faktor = 10; // z.B.: Analogwert Drucksensor bei 5V (1023) /10 = 102,3 würde 10,2 Bar entsprechen
int Druck = 0;
int Soll =0;
int Ventil =0;
Soll=Poti/Faktor; // Soll Druck = Eingestellter Wert am Poti / Faktor
if (Soll>75) Soll=75; //Sollwert max. 75
if (Soll<75) Soll=Poti/Faktor; //Wenn kleiner 75 dann Wert aus Poti/Faktor
Druck=Sensor/Faktor; // Kompressordruck (Systemdruck) = Wert aus Drucksensor / Faktor
if (Druck>=Soll) // Ist der Druck im System größer gleich dem eingestellten Druck, Ventil auf (Relais wird geschaltet)
Ventil = true;
if (Druck < Soll-10) // Ist der Druck im System kleiner dem eingestellten Druck weniger 10 (1 Bar), Ventil zu (Relais fällt ab)
Ventil = false;
if (Ventil) {
digitalWrite(Relais,HIGH);
Serial.println(Relais);
delay(1000);
}
delay(20);
lcd.setCursor(6, 1);
lcd.print(Druck); // Systemdruck im Display
lcd.setCursor(12, 1);
lcd.print(Soll); // Soll der durch Poti eingestellt wurde
lcd.setCursor(0, 1);
lcd.print(Relais); // Relais geschaltet oder nicht
}
Was als erstes auffällt ist, dass das Relais an Pin D0 angeschlossen ist. D0 und D1 werden für die serielle Schnittstelle verwendet. Darum das Relais min. an Pin D2 klemmen.
OK, neuer Versuch:
Erst mal: Der Code darf auch bei Dir nicht compilieren, denn Du hast LiquidCristal_I2C falsch geschrieben, das kann also auch bei Dir nicht funktionieren...
Weshalb so Umständlich, für was der Faktor, weshalb die Bedingung größer oder kleiner 75?
Dein Poti gibt einen AD Wert von 0 bis 1023 und Dein Drucksensor gibt einen Wert von 0 bis 1023, die kannst Du direkt (ohne irgend etwas umzurechnen) vergleichen. Umrechnen musst Du erst für die Displayausgabe.
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
byte Relais = 2; // Relais an Pin 2
void setup() {
// put your setup code here, to run once:
lcd.init();
lcd.backlight();
Serial.begin(9600);
pinMode(Relais, OUTPUT); // Pin Relais = Ausgang
lcd.begin(16, 2);
lcd.print("Druck ist soll"); // Text im Display
}
boolean Ventil;
void loop() {
// put your main code here, to run repeatedly:
int Poti = analogRead(0); //10k Ohm
int Sensor = analogRead(1); // Drucksensor 0-5V 5V = 10,2 Bar
int Faktor = 10; // z.B.: Analogwert Drucksensor bei 5V (1023) /10 = 102,3 würde 10,2 Bar entsprechen
int Druck = 0;
int Soll = 0;
int Ventil = 0;
Soll = Poti / Faktor; // Soll Druck = Eingestellter Wert am Poti / Faktor
if (Soll > 75) Soll = 75; //Sollwert max. 75
if (Soll < 75) Soll = Poti / Faktor; //Wenn kleiner 75 dann Wert aus Poti/Faktor
Druck = Sensor / Faktor; // Kompressordruck (Systemdruck) = Wert aus Drucksensor / Faktor
if (Druck >= Soll) // Ist der Druck im System größer gleich dem eingestellten Druck, Ventil auf (Relais wird geschaltet)
digitalWrite(Relais, HIGH);
if (Druck < (Soll - 10)) // Ist der Druck im System kleiner dem eingestellten Druck weniger 10 (1 Bar), Ventil zu (Relais fällt ab)
digitalWrite(Relais, LOW);
delay(1000);
lcd.setCursor(6, 1);
lcd.print(Druck); // Systemdruck im Display
lcd.setCursor(12, 1);
lcd.print(Soll); // Soll der durch Poti eingestellt wurde
lcd.setCursor(0, 1);
lcd.print(Relais); // Relais geschaltet oder nicht
}
Probier den mal, - Deinen Vergleich ausklamüsern habe aber gerade keine Zeit mehr, - der Bereich macht aber sicher noch nicht das was er soll...
Hallo, Danke, dass du dich mit meinem Problem beschäftist. Ich habe den Code heute abgetippt, da ist mir wohl ein Schreibfehler unterlaufen.
Mit dem Kleiner oder Größer 75 möchte ich erreichen, dass der Druck auf Maximal 7,5 Bar eingestellt werden kann. Aus den 7,5 Bar resultieren dann die 75, da ich noch nicht rausfinden konnte wie man Zahlen mit einer Nachkommastelle Programmiert. Das Ganze funktioniert ja auch soweit und gibt auch auf dem Display den Sollwert und den Istwert aus sowie eine 1 oder 0 wenn das Ventil geschaltet sein müsste oder auch nicht. Diese Anzeige kommt auch so wie sie soll. Einzig der Ausgang wird einfach nicht so ausgegeben wie ich das gerne hätte.
Ich werde heute Abend mal den Pin für den Ausgang ändern, wie im Post vorher empfohlen, und dann das Programm nochmal aufspielen und auch den Code Direkt aus der IDE heraus Kopieren und hier Posten.
Gruß Kevin
Das ist gut so!
float-Zahlen machen mehr Probleme als dass sie helfen.
Und wenn du den Druck mit ',' darstellen wolltest, hättest du auch keine Unterstützung beim Datentyp float.
Es gibt allerdings andere Datentypen als int. das wäre insofern schon ein lohnendes Thema für dich.
In der IDE
erst auf Werkzeuge -> Automatische Formatierung (damit der Code leichter lesbar wird),
dann Bearbeiten ->für Forum Kopieren.
Umgekehrt kannst Du den Code den ich oben gepostet habe auch einfach in die IDE kopieren, - abtippen ist immer Fehleranfällig.
Wenn der Bereich wo Du den Druck kontrollierst so funktioniert und Du damit klar kommst ist es OK, - mir wäre das zu verworren, in einem halben Jahr wüsste ich nicht mehr was ich da eigentlich gemacht habe. Aber das geht anderen mit meinen Codes bestimmt ähnlich...
Guten Morgen,
abtippen musste ich es weil ich gerade nur ein Foto des Codes zur Hand hatte.
Das man den Code einfach kopieren kann war mir schon bekannt.
< Datentyp > < Name > = < Anfangswert > ;
ist eine Möglichkeit, eine Variable zu definieren.
Näheres in jedem C++ Tutorial.
Was Variable sind, und was der Unterschied zwischen lokalen und globalen Variablen ist, wären gute Fragen in diesem Zusammenhang.
Viel Spaß.
geschrieben werden. Dann wäre klarer, warum dieser Wert gewählt worden ist.
Warum die anderen (echten) Variablen mit 0 initialisiert werden, ist eine gute Frage. Das ist nämlich überflüssig, da sie bei der ersten Verwendung gleich ihren Wert bekommen.
Die Variable int Ventil wird später als Datentyp bool verwendet und muss für die Hysterese-Funktion ihren Wert über einen loop-Durchlauf hinweg behalten. Ist also so wie hier verwendet, (doppelt) falsch.
Nur für den Fall, dass du eigentlich weißt, wie Variablen definiert werden, aber hier zu Recht ins Grübeln kamst.
Das der Code nicht annähernd richtig ist habe ich mir schon gedacht.
Ich werde mal schauen ob ich die ganzen Sachen die hier schon genannt wurden heute Abend mal umgesetzt bekomme. Dann kann ich eine Rückmeldung geben.
Vielen Dank für die Hilfe.
Gruß Kevin