leider ist mein Relais1 (Ventil1) immer geschlossen und lässt sich nicht regeln. Habe viele Möglichkeiten ausprobiert und bekomme es trotzdem nicht gelöst
Ventil 2(Relais2) lässt sich regeln. Es liegt definitiv an dem Code.
Vllt. erkennt Ihr den Fehler?
void uedruck_Flasche3() {
//Unterdruckventil zu machen
if (Relais1Flag)
{
if (druck3 >= PsollF3pos)
{ // wenn der Druck über 150 mbar ist, dann Ventil zu
digitalWrite(Relais1, LOW);
digitalWrite(Relais2, LOW);
}
if (druck3 < PsollF3pos - Hyst1)
{ // ist der Druck <= 150 mbar, dann mach das Ventil auf
digitalWrite(Relais1, HIGH);
digitalWrite(Relais2, LOW);
}
}
else
{
digitalWrite(Relais1, LOW);
digitalWrite(Relais2, HIGH);
}
}
// Unterdruck im Flasche 3 erzeugen
void undruck_Flasche3() {
//Überdruckventil zu macheen
if (Relais2Flag)
{
if (druck3 > PsollF3neg - Hyst1)
{ // wenn der Druck über -150 mbar ist, dann Ventil zu
digitalWrite(Relais1, LOW);
digitalWrite(Relais2, LOW);
}
if (druck3 <= PsollF3neg)
{ // ist der Druck <= -150 mbar, dann mach das Ventil auf
digitalWrite(Relais1, LOW);
digitalWrite(Relais2, HIGH);
}
}
else
{
digitalWrite(Relais1, HIGH);
digitalWrite(Relais2, LOW);
}
}
Bitte den gesamten Sketch weil wir dadurch erst verstehen was der Sketch ganu macht und weil 100% der fehler im nichtgezwigten Teil des Sketches liegt.
Ansonsten plazziere serial.printlm()'s im Sketch und kontrolliere die Variablenwerte und/oder ob Blöcke bzw Funktionen ausgeführt werden.
Wenn Du willst, daß wir Dir helfen dann gib uns wenigstens einen Sketch der richtig kompiliert und nicht 10 Variablen hat die nicht deklariert sind.
Außerdem fehlt eine Klammer und ist an einem anderen Ort zuviel.
Grüße Uwe
Habe einige versionen erstellt und versucht. So jetzt mit auskommentierte (Komplett) bei mir funktioniert der Code und zeigt kein fehlermeldung. Habe gerade getestet
int Hyst = 5;
int Hyst1 = 1;
float Vdac1;
float Vdac2;
float Vdac3;
int PsollF1 = 200;
int PistF1;
bool PF1OK;
bool PFOK;
bool pumpe_ueFlag = true; //Überdruck
bool pumpe_unFlag = true; //Unterdruck
bool Relais1Flag = true; //Überdruck
bool Relais2Flag = true; //Unterdruck
int PsollF2 = -200;
int PistF2;
bool PF2OK;
unsigned long time;
int PsollF3pos = 150;
int PsollF3neg = -150;
int PistF3;
bool PF3OK;
float druck1;
float druck2;
float druck3;
int Sensor1 = A0;
int Sensor2 = A1;
int Sensor3 = A2; // Sensor in Flasche 3
const int Relais1 = 9; // Ventil zwischen Überdruckspeicher und F3
const int Relais2 = 10; // Ventil zwischen Unterdruckspeicher und F3
const int Pumpe_ue = 11;
const int Pumpe_un = 13;
int faktorZeitMin = 20;
int dauer = faktorZeitMin * 60 * 1000;
long startZeit;
void Sensoren_lesen() {
PistF1 = analogRead(Sensor1);
druck1 = 0.5409 * PistF1 - 278.87;
PistF2 = analogRead(Sensor2);
druck2 = 0.543 * PistF2 - 280.19;
PistF3 = analogRead(Sensor3);
druck3 = 0.543 * PistF3 - 280.19;
}
// überdruck im Flasche 3 erzeugen
void uedruck_Flasche3() {
//Unterdruckventil zu macheen
if (Relais1Flag)
{
if (druck3 >= PsollF3pos)
{ // wenn der Druck über 150 mbar ist, dann Ventil zu
digitalWrite(Relais1, LOW);
digitalWrite(Relais2, LOW);
}
if (druck3 < PsollF3pos - Hyst1)
{ // ist der Druck <= 150 mbar, dann mach das Ventil auf
digitalWrite(Relais1, HIGH);
digitalWrite(Relais2, LOW);
}
}
else
{
digitalWrite(Relais1, LOW);
digitalWrite(Relais2, HIGH);
}
}
// Unterdruck im Flasche 3 erzeugen
void undruck_Flasche3() {
if (Relais2Flag)
{
if (druck3 > PsollF3neg - Hyst1)
{
digitalWrite(Relais1, LOW);
digitalWrite(Relais2, LOW);
}
if (druck3 <= PsollF3neg)
{ f
digitalWrite(Relais1, LOW);
digitalWrite(Relais2, HIGH);
}
}
else
{
digitalWrite(Relais1, HIGH);
digitalWrite(Relais2, LOW);
}
}
void debug() {
Serial.print(druck1);
Serial.write(';');
Serial.print(druck2);
Serial.write(';');
Serial.print(druck3);
Serial.write(';');
Serial.println(millis());
Serial.print(Relais1);
Serial.write(Relais1);
}
void guiRequest() //Für Visual Studio
{
if (Serial.available())
{
String data = Serial.readStringUntil('\n');
//Serial.print(data);
if (data.startsWith("scrollBarSensor1"))
{
int scrollBarValue = (data.substring(18)).toInt();
PsollF1 = scrollBarValue;
(11)).toInt();
Hyst1 = scrollBarValue5;*/
}
if (data.startsWith("scrollBarSensor2"))
{
int scrollBarValue = (data.substring(18)).toInt();
PsollF2 = scrollBarValue;
}
if (data.startsWith("scrollBarSensor3"))
{
int scrollBarValue = (data.substring(18)).toInt();
PsollF3pos = scrollBarValue;
PsollF3neg = scrollBarValue;
}
if (data.startsWith("scrollBarPumpe"))
{
int scrollBarValue = (data.substring(16)).toInt();
Hyst = scrollBarValue;
}
if (data.startsWith("scrollBarVentil"))
{
int scrollBarValue = (data.substring(17)).toInt();
Hyst1 = scrollBarValue;
}
if (data == "ueberdruck")
uedruck_Flasche3();
if (data == "unterdruck")
{
undruck_Flasche3();
//Serial.println("unterdruck");
}
if (data == "motorOff") // Pumpe unterdruck
{
pumpe_unFlag = true;
pumpe_ueFlag = false;
Relais1Flag = false;
Relais2Flag = true;
}
if (data == "motorOn") // Pumpe überdruck
{
pumpe_unFlag = false;
pumpe_ueFlag = true;
Relais1Flag = true;
Relais2Flag = false;
}
if (data == "20")
{
faktorZeitMin = 20;
dauer = faktorZeitMin * 60 * 1000;
startZeit = millis();
}
if (data == "40")
{
faktorZeitMin = 40;
dauer = faktorZeitMin * 60 * 1000;
startZeit = millis();
}
if (data == "60")
{
faktorZeitMin = 60;
dauer = faktorZeitMin * 60 * 1000;
startZeit = millis();
}
}
}
//
//// Flasche 1 auf Druck halten
//void Flasche1(){
// //Ventil 2 zu wenn der Druck nicht ok ist
// if(PistF1 < PsollF1 - Hyst){
// digitalWrite(Relai2, LOW);
// PF1OK = 0;
// }
////Ventil 2 auf wenn der Druck ok ist
// if(PistF1 > PsollF1 + Hyst){
// PF1OK = 1;
// digitalWrite(Relai2,HIGH);
// }
//}
//
//void Flasche2(){
// //Ventil 3 zu wenn der Druck nicht ok ist
// if(PistF2 > PsollF2 + Hyst1){
// digitalWrite(Relai3, LOW);
// PF2OK = 0;
// }
////Ventil 2 auf wenn der Druck ok ist
// if(PistF2 < PsollF2 - Hyst1){
// PF2OK = 1;
// digitalWrite(Relai3,HIGH);
// }
//}
// wenn der Druck nicht in einer der Flaschen ok ist, wird die Pumpe eingeschaltet
void Pumpereg_ue() {
if (pumpe_ueFlag)
{
if (druck1 > PsollF1 - Hyst)
{
digitalWrite(Pumpe_ue, LOW); //Wenn der Druck unter Soll - Hysterese fällt. dann schalte die Pumpe ein
}
if (druck1 <= PsollF1)
{
digitalWrite(Pumpe_ue, HIGH); //Wenn der Solldruck erreicht ist, dann schalte die Pumpe aus
}
}
else
{
digitalWrite(Pumpe_ue, LOW);
}
}
void Pumpereg_un() {
if (pumpe_unFlag)
{
if (druck2 < PsollF2 - Hyst)
{
digitalWrite(Pumpe_un, LOW); //Wenn der Druck unter Soll - Hysterese fällt. dann schalte die Pumpe ein
}
if (druck2 >= PsollF2)
{
digitalWrite(Pumpe_un, HIGH); //Wenn der Solldruck erreicht ist, dann schalte die Pumpe aus
}
}
else
{
digitalWrite(Pumpe_un, LOW);
}
}
//-------------------------------------------------------------------------------------------------
void setup() {
// hier werden die ein und ausgänge deklariert
pinMode(Relais1, OUTPUT);
pinMode(Relais2, OUTPUT);
pinMode(Pumpe_ue, OUTPUT);
pinMode(Pumpe_un, OUTPUT);
pinMode(Schdruck, INPUT);
pinMode(Schvak, INPUT);
pinMode(LED_BUILTIN, OUTPUT);
//startZeit = millis();
time = millis();
Serial.begin(9600);
//Serial.begin(115200);
}
//--------------------------------------------------------------------------------------------------
void loop() {
//Sensoren auslesen
Sensoren_lesen();
time = millis();
//Flasche 3 auf druck halten
// if ((millis() - startZeit) < dauer )
// {
// uedruck_Flasche3();
// undruck_Flasche3();
// }
//
//Pumpe einschalten
Pumpereg_ue();
Pumpereg_un();
uedruck_Flasche3();
undruck_Flasche3();
// Flasche3 auf Überdruck wenn geschaltet
// if (digitalRead(Schdruck) == HIGH) {
// uedruck_Flasche3();
// }
// else
// {
// digitalWrite(Relais1, LOW);
// }
//
// // Flasche3 auf Unterdruck wenn geschaltet
// if (digitalRead(Schvak) == HIGH) {
// undruck_Flasche3();
// }
// else
// {
// digitalWrite(Relais2, LOW);
// }
//Flasche3 auf Überdruck wenn Ventil 1 geschaltet
if (digitalRead(Relais1) == HIGH)
{
uedruck_Flasche3();
}
else
{
digitalWrite(Relais1, LOW);
}
//Flasche3 auf Überdruck wenn Ventil 2 geschaltet
if (digitalRead(Relais2) == HIGH)
{
undruck_Flasche3();
}
else
{
digitalWrite(Relais2, LOW);
}
guiRequest();
// Ausgabe im seriellen Monitor
delay(250);
debug();
}
Ich hatte gerade Stromausfall-bedingt eine kleine Auszeit (+ Ersatz für Wandwarze Kabelmodem suchen ... Labornetzgeräte habe ich Ja ein paar) - aber SO macht Das - zumindest mir - keinen Spaß.
keinerlei Eigeninitiative - ist ja nicht der erste Thread des TO
unkompilierbare Sketche zum 'spielen'
unfähig, einen Post zu editieren, alle zwei Minuten einen Post drunter setzen liest sich äußerst zäh
Selbst das 'nur Mitlesen' gibt übeles Sodbrennen ...
@Maria2
Ist Dir wenigstens halbwegs klar, warum Es KEINE gute Idee ist, in einem int (warum eigentlich int ... erwartest Du negative Zeiten ??) 'egal was' mit 60000 zu multiplizieren?
Kleiner Tip: 2^16 = 65536 (der Zahlenvorrat einer 16-bit-Variable - da Du aber, meiner Meinung nach unnötiger Weise, SIGNED benutzt, halbiert sich der Vorrat auch noch)
... toll, jetzt habe ich die Lösung direkt mit geliefert ... hoffentlich hilft's ...
UND: BITTE versuche, den Mist, Den Du hier rein kopierst, VORHER auch 1x zu kompilieren.
Dabei wäre Dir aufgefallen, daß Reste von 'was weiß denn ich', Block-Kommentaren und unvollständige Variablenzugriffen irgendwie nicht passen.
MfG
@Tommy
f ist ein Überbleibsel in einer Zeile vor 96 äh ... 99 ...
Und in Zeile 137 ist Variable scrollBarValue5 (gehört die 5 da vielleicht nicht hin?) nicht deklariert und Auskommentierungsframent */ gehört da nicht hin.
Zeile 297 und 298: Variablen Schdruck und Schvak nicht deklariert.
Bei dieser Beratungsresistenz des TO habe ich langsam den Eindruck, dass das jemand ist (oder ein schlecht programmierter Bot), der ein Psychspiel mit uns treibt.
folgendes kam von ein Informatikingenieur (privat) als gut gemeinter Tipp.
int faktorZeitMin = 20;
int dauer = faktorZeitMin * 60 * 1000;
Da hab ich es als richtig angenommen. Selber hatte nur folgendes stehen:
unsigned long time;
Das f kommt von folgende Komentar
//für
da es überflüssig ist und nichts aussagt, hab ich es vor dem reinkopieren (vollständige Code) im Forum gelöscht und da ist der f nicht gelöscht worden. Hätte ich besser achten sollen, das ich richtig lösche.
Was ich mich frage ist, wenn die Zeit ein Integer Überlauf verursacht, warum das Ventil 2 (Relais2) problemlos funktioniert ? muss es eigentlich auch nicht Probleme bereiten?
Ich glaube ich sollte das Programm nochmal ordentlich schreiben ohnen diese ganzen auskommentierungen die ich nicht brauche!
@Tommy: ich betreibe hier kein Psychospiel.....bevor ich Euch im Forum um Hilfe gebeten habe, hab ich erst mein Freunden gefragt, die als Software Entwickler arbeiten und Informatik studiert haben. Da nichts ordentliches raus kam, hab ich Euch angeschrieben.
Maria2:
Was ich mich frage ist, wenn die Zeit ein Integer Überlauf verursacht, warum das Ventil 2 (Relais2) problemlos funktioniert ? muss es eigentlich auch nicht Probleme bereiten?
Wahrscheinlich weil:
if (data == "20")
if (data == "40")
if (data == "60")