Kurze Frage zu der Relais Ansteuerung

Morgen,

baue gerade eine Wärmepumpe und will die Steuerung auch selber machen. Habe mit programmieren nix zu tun (habe mir aber 2 Bücher bestellt da ich verrückt werde wenn ich lange am Monitor lese).

Habe mir erstmal so einen Sketch gebastelt um mit 5 Temperatursensoren 8 Relais zu schalten. Funktioniert auch supi bis jetzt. Das einzige Problem ist das direkt nach dem starten des Arduino Mega alle Relais kurz an gehen (nicht gut für den Verdichter und die Pumpen).
Habe mir gedacht ich drehe einfach HIGH und LOW beim ansteuern der Relais, aber da wären ja beim ableben des Arduino alles an.....auch wieder schlecht :slight_smile:

Gibt es eine Möglichkeit das die Relais beim anschalten aus bleiben ???

Hier das gebastelte :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 10
#define relais1 2
#define relais2 3
#define relais3 4
#define relais4 5
#define relais5 6
#define relais6 7
#define relais7 8
#define relais8 9

const float temp1 = 28;
const float temp2 = 29;
const float temp3 = 30;
const float temp4 = 31;
const float temp5 = 32;
const float temp6 = 33;
const float temp7 = 34;
const float temp8 = 35;

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x27,20,4);
   
void setup()
{
  
  lcd.init();
  lcd.backlight(); 
  sensors.begin();

  pinMode(relais1, OUTPUT);
  pinMode(relais2, OUTPUT);
  pinMode(relais3, OUTPUT);
  pinMode(relais4, OUTPUT);
  pinMode(relais5, OUTPUT);
  pinMode(relais6, OUTPUT);
  pinMode(relais7, OUTPUT);
  pinMode(relais8, OUTPUT);

}

void loop()

  {

  sensors.requestTemperatures();
    
  
  //Sensor 1 lesen
  float temp = sensors.getTempCByIndex(0);
  
  //Sensor 1 aufs Display
  lcd.setCursor (0, 0 );
  lcd.print("T1:");
  lcd.print(temp);
  lcd.print(" ");

  //Sensor 2 lesen
  temp = sensors.getTempCByIndex(1);
  
  //Sensor 2 aufs Display
  lcd.setCursor (0, 1 );
  lcd.print("T2:");  
  lcd.print(temp);
  lcd.print(" ");

  //Sensor 3 lesen
  temp = sensors.getTempCByIndex(2);

  //Sensor 3 aufs Display
  lcd.setCursor (0, 2 );
  lcd.print("T3:");
  lcd.print(temp);
  lcd.print(" ");

  //Sensor 4 lesen
  temp = sensors.getTempCByIndex(3);

  //Sensor 4 aufs Display
  lcd.setCursor (0, 3 );
  lcd.print("T4:");
  lcd.print(temp);
  lcd.print(" ");

  //Sensor 5 lesen 
  temp = sensors.getTempCByIndex(4);

  //Sensor 5 aufs Display
  lcd.setCursor (9, 0 );
  lcd.print("T5:");
  lcd.print(temp);
  lcd.print(" ");

  float temp1m = sensors.getTempCByIndex(0);
  float temp2m = sensors.getTempCByIndex(1);
  float temp3m = sensors.getTempCByIndex(2);
  float temp4m = sensors.getTempCByIndex(3);
  float temp5m = sensors.getTempCByIndex(0);
  float temp6m = sensors.getTempCByIndex(1);
  float temp7m = sensors.getTempCByIndex(2);
  float temp8m = sensors.getTempCByIndex(3);

  if(temp1 < temp1m){
    digitalWrite(relais1, LOW);
 } else {
    digitalWrite(relais1, HIGH);
 }

 if(temp2 < temp2m){
    digitalWrite(relais2, LOW);
 } else {
    digitalWrite(relais2, HIGH);
 }

 if(temp3 < temp3m){
    digitalWrite(relais3, LOW);
 } else {
    digitalWrite(relais3, HIGH);
 }

 if(temp4 < temp4m){
    digitalWrite(relais4, LOW);
 } else {
    digitalWrite(relais4, HIGH);
 }
  if(temp5 < temp5m){
    digitalWrite(relais5, LOW);
 } else {
    digitalWrite(relais5, HIGH);
 }
 if(temp6 < temp6m){
    digitalWrite(relais6, LOW);
 } else {
    digitalWrite(relais6, HIGH);
 }
 if(temp4 < temp7m){
    digitalWrite(relais7, LOW);
 } else {
    digitalWrite(relais7, HIGH);
 }
 if(temp4 < temp8m){
    digitalWrite(relais8, LOW);
 } else {
    digitalWrite(relais8, HIGH);
 }
  
  delay(200);    
 
}

Wenn Deine Relais mit LOW einschalten, Dann Kannst Du das Kurzzeitige einschalten aller Relais beim Startup verhindern. Dazu musst du im Setup BEVOR Du die Relais Pins (relais1 - relais8) mit pinMode auf OUTPUT schaltest ZUERST ein digitalWrite(relais , HIGH) einsetzen.
Dies sorgt dafür, das der relaispin beim Aktivieren auf OUTPUT direkt auf HIGH geschaltet ist.
Das würde dan so aussehen:

digitalWrite(relais1, HIGH);
digitalWrite(relais2, HIGH);
digitalWrite(relais3, HIGH);
digitalWrite(relais4, HIGH);
digitalWrite(relais5, HIGH);
digitalWrite(relais6, HIGH);
digitalWrite(relais7, HIGH);
digitalWrite(relais8, HIGH);

pinMode(relais1, OUTPUT);
pinMode(relais2, OUTPUT);
pinMode(relais3, OUTPUT);
pinMode(relais4, OUTPUT);
pinMode(relais5, OUTPUT);
pinMode(relais6, OUTPUT);
pinMode(relais7, OUTPUT);
pinMode(relais8, OUTPUT);

Setze deinen Sketch bitte in Code-Tags, damit dieser für alle besser lesbar ist.
Dazu den Sketch markieren und die Schaltfläche </> klicken.

Wozu sind denn die Transistoren auf dem Steckbrett ? Sind die vor den Relais ?
Die brauchst du da nicht, da schon welche auf den Relaisplatinen drauf sind.

Oder sind das die Temp-Sensoren ?
Das ist in der Verkabelung schwer zu erkennen.

Danke für den Tipp !

Nein das sind die Temperatursensoren (DS18B20)....erst mal so testen und dan ans lebende Objekt.

Das ging ja schnell...DANKE.

Ok, dann sollte es so funktionieren.
Allerdings kann noch ein Problem auftreten, da du den One-Wire-Bus auf den Pin D0 gelegt hast. Da liegt auch der USB-Serialwandler drauf und du könntest beim Sketchupload Probleme bekommen. Nimm da lieber einen anderen Pin.

kein Problem, ich hatte genau dieses Problem während der Entwiklung meines jetzigen Projekts. da muss ich im Setup, eine Initialisierungsroutine aufrufen, die am Ende ein FlipFlop setzt (L-Impuls). Sobald ich jedoch den Pin auf OutPUT gesetzt hate wurde sofort das FlipFlop gesetzt, was jedoch noch zu früh war. Durch das digitalWrite (FlipFlop-Pin, HIGH) war das Problem gelöst.

Ein anderer Fallstrick ist das Pin 13. an diesem ist ein LED das beim Einschalten einige Male blinkt.

Zu Sketch @ bkrysiak

Bitte lerne die Verwendung von Arrays.

const float temp1 = 28;
const float temp2 = 29;
const float temp3 = 30;
const float temp4 = 31;
const float temp5 = 32;
const float temp6 = 33;
const float temp7 = 34;
const float temp8 = 35;

Ein Array vereinfacht den Sketch gewaltig.

  if(temp1 < temp1m){
    digitalWrite(relais1, LOW);
 } else {
    digitalWrite(relais1, HIGH);
 }
...

aus 48 Zeilen werden wenige:

for (int i=0; i<8,i++)
{
 float tempm[i] = sensors.getTempCByIndex(i);
 if(temp[i] < tempm [i]){
    digitalWrite(relais[i], LOW);
 } else {
    digitalWrite(relais[i], HIGH);
 }
}

Grüße Uwe

Danke dir, aber soweit ist mein Gehirn noch nicht. Die Temperaturen sind nicht fortlaufend, das habe ich nur zum ausprobieren genommen. Am Ende werden es ein paar feste Zahlenwerte sein und später eventuell die Möglichkeit diese Werte übers Display zu ändern.

Heute kommt das Erste Buch an :" Arduino ohne Vorkenntnisse: Innerhalb von 7 Tagen das erste eigene Projekt erstellen (Ohne Vorkenntnisse zum Ingenieur)". Bin mal gespannt ob mein Gehirn das auch alles drinnen behält :slightly_smiling_face:

...in 7 Tagen...
meint sicher Arbeitstage, sonst wäre es unrealistisch😄

und wenn dein Gehirn nicht "alles drinnen behält", bleibt da vielleicht auch noch Platz für eigenes.

Hab da mal ein Problem : Habe den Arduino mal über Nacht angelassen. Wo kommt die 0 her ???

  //Sensor 2 lesen
  temp = sensors.getTempCByIndex(1);
  
  //Sensor 2 aufs Display
  lcd.setCursor (0, 1 );
  lcd.print("T2:");  
  lcd.print(temp);
  lcd.print(" ");

verlänger das print" " auf die Länge der gesamten Zeile.
Dann ist die Anzeige weg, aber der Fehler nicht.

T2 wurde nicht ausgelesen und -127.00 wurde angezeigt
T2:-127.00

Das ist das Problem wen die DS zu schnel nach der Reiche werden ausgelesen dann wird -127.00 ausgegeben
Die Null ist die Leiche, mach so wie @my_xy_projekt sagt verlänger das print" "um Minimum 2 Stellen

@bkrysiak
Kann es sein, dass dir dies hier egal ist ?

Allerdings kann noch ein Problem auftreten, da du den One-Wire-Bus auf den Pin D0 gelegt hast. Da liegt auch der USB-Serialwandler drauf und du könntest beim Sketchupload Probleme bekommen. Nimm da lieber einen anderen Pin.

NEIN!
Es ist dafür zu sorgen, das VOR der Anzeige der Wert auf Plausibilität zu prüfen ist!

Mag sein, nur das mit den -127.00 hate ich öfters umgegangen wurde als ich erstmal hartes delay eingebaut habe
und danach milis eingesetzt
speichere auf SD 3 Temperaturwerte
Grüße
Bernhard

Das auch :wink:

Und was hat das mit der ungünstigen Nutzung des D0 (RX) zu tun ?

Habe auf Pin 2-9 geändert. Danke.

Ok, aber wieso 2-9 ?