Ein Relais aus wenn andere an sind

Hallo zusammen,

ich habe für unsere Serverraumklimatisierung neue Angaben erhalten.
Es soll nun so, sein, dass wenn sich die Klimas (Relais 2-5) zuschalten, egal aus welchem Grund (Temperatur oder Luftfeuchtigkeit) die Lüfter ausgehen sollen (Relais 1).
Anbei mal der Sketch, der bis jetzt super läuft:

#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <DHT.h>
#include <DHT_U.h>

#define DHTPIN1 2
#define DHTPIN2 3
#define DHTTYPE DHT11
DHT dht1(DHTPIN1, DHTTYPE);
DHT dht2(DHTPIN2, DHTTYPE);
LiquidCrystal_I2C lcd(0x3F, 16, 2);

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 199 };
byte subnet[] = { 255, 255, 255, 0 };
EthernetServer server(80);

float humidity, temperature;
//Status der digitalen Pins
bool state5, state6, state7, state8, state9;

void setup() {
  dht1.begin();
  dht2.begin();
  lcd.begin();
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

  Ethernet.begin(mac, ip, subnet);
  server.begin();
}

void loop() {
  humidity = dht1.readHumidity();
  temperature = dht2.readTemperature();
  state5 = digitalRead(5);
  state6 = digitalRead(6);
  state7 = digitalRead(7);
  state8 = digitalRead(8);
  state9 = digitalRead(9);

    

  EthernetClient client = server.available();
  if (client)
  {
    server.println("HTTP/1.1 200 OK");
    server.println("Content-Type: text/html");
    server.println();
    server.print("<HTML><HEAD><TITLE>");
    server.print("Serverraumtemperatur");
    server.print("</TITLE>");
    server.print("<meta http-equiv='Pragma' content='no-cache'>");
    server.print("<meta http-equiv='Cache-Control' content='no-cache'>");
    server.print("<meta http-equiv='refresh' content='5'>");
    server.print("<style>p{max-width:15%; padding:5px;color:white;font-weight:bold;}</style>");
    server.print("</HEAD><BODY style=font-family:Arial;>");

    server.print("<h1>Temperatur und Luftfeuchtigkeit im Serverraum</h1>");
    server.print("<h2>Temperatur:</h2> ");
    server.print(temperature);
    server.print(" &deg;C");
    server.println("
");
    server.println("<hr />");
    server.print("<h2>Luftfeuchtigkeit:</h2> ");
    server.print(humidity);
    server.print(" %");
    server.println("
");
    server.println("<hr />");

    server.print("<h2>L&uuml;fter:</h2>");
    if (state5 == 1)
      server.print("<p style=background-color:#FF4D4D;>- A U S -</p><hr/>");
    else (server.print("<p style=background-color:#4CAF50;>- E I N - </p><hr/>"));

    server.print("<h2>Klima 1 Temperatur:</h2>");
    if (state6 == 1)
      server.print("<p style=background-color:#FF4D4D;>- A U S -</p><hr/>");
    else (server.print("<p style=background-color:#4CAF50;>- E I N - </p><hr/>"));

    server.print("<h2>Klima 2 Temperatur:</h2>");
    if (state7 == 1)
      server.print("<p style=background-color:#FF4D4D;>- A U S -</p><hr/>");
    else (server.print("<p style=background-color:#4CAF50;>- E I N - </p><hr/>"));

    server.print("<h2>Klima 1 Luftfeuchtigkeit:</h2>");
    if (state8 == 1)
      server.print("<p style=background-color:#FF4D4D;>- A U S -</p><hr/>");
    else (server.print("<p style=background-color:#4CAF50;>- E I N - </p><hr/>"));

    server.print("<h2>Klima 2 Luftfeuchtigkeit:</h2>");
    if (state9 == 1)
      server.print("<p style=background-color:#FF4D4D;>- A U S -</p><hr/>");
    else (server.print("<p style=background-color:#4CAF50;>- E I N - </p><hr/>"));

    server.print("</BODY></HTML>");
    delay(10);
    client.stop();
  }

  lcd.setCursor(0, 0);
  lcd.print("Temperatur:");

  lcd.setCursor(0, 1);
  lcd.print("Luftfeuchte:");

  lcd.setCursor(14, 0);
  lcd.print(temperature);

  lcd.setCursor(14, 1);
  lcd.print(humidity);


  if (temperature > 19)
    digitalWrite(5, LOW);

  if (temperature <= 17)
    digitalWrite(5, HIGH);

  if (temperature > 22)
    digitalWrite(6, LOW);

  if (temperature <= 21)
    digitalWrite(6, HIGH);

  if (temperature > 25)
    digitalWrite(7, LOW);

  if (temperature <= 23)
    digitalWrite(7, HIGH);

  if (humidity > 60)
    digitalWrite(8, LOW);

  if (humidity <= 60)
    digitalWrite(8, HIGH);

  if (humidity > 75)
    digitalWrite(9, LOW);

  if (humidity <= 70)
    digitalWrite(9, HIGH);

}

Ich sitze nun schon den ganten Tag an einer Lösung wie ich das ganze programmieren kann :frowning:
Leider ohne einen Erfolg.

Wie gesagt: Wenn 6,7,8 oder 9 auf Low gehen, soll 5 auf High gehen, egal wie die Temperatur ist. Gehen 6,7,8 oder 9 wieder auf High, soll 5 wieder auf Low gehen.

Ich hoffe ihr versteht was ich meine :wink:

Gruß und Dank!

Tom

TaO:
Anbei mal der Sketch, der bis jetzt super läuft: …
Ich sitze nun schon den ganten Tag an einer Lösung wie ich das ganze programmieren kann :frowning:
Leider ohne einen Erfolg. …

Was jetzt?! Läuft der Sketch super oder nicht so?

Wenn Du genau sagen kannst, was unter welchen Bedingungen passieren soll, dann programmier’s doch so.

Mein Tipp: Formatiere den Code so, dass er besser zu lesen ist. Dazu gehört meiner Meinung nach auch, dass das, was auf ein if() folgt, in geschweiften Klammern stehen sollte – dann kann man irgendwelche „wenn nur eine Codezeile folgt“-Regeln vergessen. Anstatt für jede Bedingung drei Zeilen zu verplempern, könnte vieles in einer einzigen Zeile stehen. Wenn Du den Code durch andere Formatierung so stark verkürzt, dass er auf maximal zwei DIN A4-Blätter passt, ist schon sehr viel gewonnen. Bessere Übersicht ist bei Code-Änderungen/-Erweiterungen Gold wert.

Gruß

Gregor

Versuchs mal so (ungetestet):

  if (temperature > 22) 
    digitalWrite(6, LOW);

  if (temperature <= 21)
    digitalWrite(6, HIGH);

  if (temperature > 25)
    digitalWrite(7, LOW);

  if (temperature <= 23)
    digitalWrite(7, HIGH);

  if (humidity > 60)
    digitalWrite(8, LOW);

  if (humidity <= 60)
    digitalWrite(8, HIGH);

  if (humidity > 75)
    digitalWrite(9, LOW);

  if (humidity <= 70)
    digitalWrite(9, HIGH);

boolean luefterKannAn = false;

  if (digitalRead(6) && digitalRead(7) && digitalRead(8) && digitalRead(9)) luefterKannAn = true;


  if (luefterKannAn && temperature > 19)
    digitalWrite(5, LOW);

  if (!luefterKannAn || temperature <= 17)
    digitalWrite(5, HIGH);

Gruß Tommy

Hallo Tommy56,

vielen Dank. Bis jetzt kann ich sagen: Macht das was es soll ;D ;D ;D

@ gregorss:

"Wenn Du genau sagen kannst, was unter welchen Bedingungen passieren soll, dann programmier's doch so."

Sorry, aber wenn ich sowas lese, dann muss ich mich fragen, warum es überhaupt Foren gibt. Wenn ich wüsste wie der Code ausschaut, dann hätte ich garantiert hier nicht um Hilfe gebeten.

Tut mir schon leid, dass ich erst seit 4 Wochen mit einem Arduino zu tun habe und hier Hilfe suche.

Allen die Produktiv helfen: Vielen Dank

Gruß
Tom

TaO:
@ gregorss:
"Wenn Du genau sagen kannst, was unter welchen Bedingungen passieren soll, dann programmier's doch so."
Sorry, aber wenn ich sowas lese, dann muss ich mich fragen, warum es überhaupt Foren gibt. Wenn ich wüsste wie der Code ausschaut, dann hätte ich garantiert hier nicht um Hilfe gebeten.

Naja, Dein Code zeigt, dass Du haufenweise Bedingungen berücksichtigen und programmieren kannst - und Deine Frage besteht - soweit ich das sehe - aus derlei Bedingungen. Und deshalb frage ich mich eben, wieso Du das nicht so programmierst, wie Du Dein Problem beschreibst. Auf den Schlips wollte ich Dir mit meiner Bemerkung jedenfalls nicht treten.

Meine Bemerkungen zur Formatierung des Codes sind ebenfalls ernst gemeint. Wenn ich Deinen Code querlese (zu mehr kam ich bislang nicht), fällt mir auf, dass er ziemlich lang ist (viele Zeilen enthält), was es zumindest mir erschwert, das „große Ganze“ zu erfassen. Deshalb schreibe ich meine Sketche normalerweise so, dass deren Struktur durch die Formatierung schnell erkennbar ist. Und vielen Leuten fällt bei „hübsch“ formatiertem Code auf, wo sie ihn ändern oder erweitern müssen.

Gruß

Gregor

Hallo nochmal @ gregorss:

Mal kurz zur Erklärung :wink:
Ich bin Umschüler zum IT-System-Elektroniker und mache zur Zeit ein Praktikum.
In der Firma wird der Serverraum vom Büro im 3.OG Flachdach in den Keller umgezogen. (Raum-in-Raum-Konzept) Dieser Raum (ca. 15m³) soll nach ökologischen und ökonomischen Gesichtspunkten klimatisiert werden. Im Moment gibts im 3.OG eine 5kW Klimaanlage die dauerhaft läuft.
Ich bekam nun den Auftrags mittels eines Arduinos und einer 8 Relaiskarte eine Steuerung zu entwerfen.
Folgende Vorgaben hatte ich:
Relais 1 die beiden Lüfter, der eine Saugt kühle Luft an, der andere bläst die warme Luft raus.
Relais 2 Klimastandgerät 1 wenns zu warm wird
Relais 3 Klimastandgerät 2 wenns noch wärmer wird
Relais 4 Klimastandgerät 1 wenn Luftfeuchtigkeit zu hoch (Entfeuchten)
Relais 5 Klimastandgerät 2 wenn Luftfeuchtigkeit noch höher wird
Zeitgleich soll zusätzlich noch eine Möglichkeit bestehen über einen Webbrowser die aktuellen Daten udn Schaltzustände zu erfassen.
Dann hieß es zu mir. "Da machen" :wink:
Ich wusste bis dato noch nicht mal, dass es sowas wie einen Arduino gibt.
Ich habe mir dann das Starterkit und ein Buch bestellt und mich von 0 an versucht einzulesen. Ich war auf diversen Seiten und hier im Forum unterwegs.
Das Ergebnis meiner "Sammelleidenschaft" ist ja im Sketch zu sehen :wink:
Bis jetzt lief die Steuerung im Versuchsaufbau auch genau so wie wir uns das dachten.
Gestern kam nun nochmal der Klimabauer und legte sein Veto ein. Die Lüfter Relais1 dürfen eben nicht laufen wenn die Klimageräte an sind.
Ich habe dann gestern mit meinem 1/4 Wissen versucht den Sketch so zu ändern, wie ich glaubte, dass es klappen müsste. Tat es aber nicht.
Deshalb habe ich dann hier im Forum gefragt.

Ich hoffe du/ihr verstehst/versteht um was es bei der ganzen Sache geht.

Du schreibst z.B. auch ich solle den Sketch zusammenfassen.
Schön und gut. Wenn man weis, welche Zeilen und welche Bereich man zusammenfassen kann ist das ja i.O. und bestimmt auch vollkommen in Ordnung. Nur gehöre ICH halt zu denen, die das nicht Wissen. :slight_smile:

Es ist halt immer etwas "demotivierend" wenn man sich in einem Forum Hilfe erhofft dann zu lesen: Das muss am Besten so und so sein, aber der Weg dahin wird nicht erklärt.

Ich wollte dir auch nicht zu nahe Treten, war aber schon ein klein wenig "angesäuselt" als ich wieder "so" eine Antwort sah :wink:

Nix für ungut. Ich hoffe wir kloppen uns deswegen nicht :wink:

Gruß
Tom