Arduino Uno 8chan Relaisekarte "klackern"

Hallo, hab die Suche benutzt und Folgendes gefunden:

http://forum.arduino.cc/index.php?topic=229739.0

Leider klappt der hier beschriebene Weg nicht ganz bei mir.

Die Relaise klackern beim Start / Reboot des Arduinos durch.

Hier mal ein Stück Code dazu:

    pinMode(REL1, OUTPUT);
  digitalWrite(REL2, OFF);
    pinMode(REL2, OUTPUT);
  digitalWrite(REL3, OFF);
    pinMode(REL3, OUTPUT);
  digitalWrite(REL4, OFF);
    pinMode(REL4, OUTPUT);
  digitalWrite(REL4, ON);
  digitalWrite(REL5, OFF);
    pinMode(REL5, OUTPUT);
  digitalWrite(REL6, OFF);
    pinMode(REL6, OUTPUT);
  digitalWrite(REL6, ON);

Hardware ist ein Arduino Uno R3 und eine 8fach Relaisekarte, beides china import.
(Die enstprechenden Links kann ich kann ich bei bedarf nachliefern)

Was kann ich tun um das klickern zu verhindern?

Ich danke im Vorraus!

Indem Du mittels Widerstände die Eingänge der Relasikarte auf ein definiertes Potential bringst. Je nach typ Relaiskarte ist das LOW oder HIGH.
Grüße Uwe

Ich zitiere mal aus dem Forum:

"Bitte den ganzen Code posten. Mit dem Schnipsel kann man nichts anfangen."

Auf jeden Fall klingt:

"pinMode(REL1, OUTPUT);
digitalWrite(REL2, OFF);"

erstmal seltsam. Newoll!?

Fleusner:
8 kanal relais - Deutsch - Arduino Forum

Leider klappt der hier beschriebene Weg nicht ganz bei mir.

Die Relaise klackern beim Start / Reboot des Arduinos durch.

Irgendwie mußt Du meine Antwort in dem Thread überlesen haben.

Du müßtest ALLE Relais auf der Karte so initialisieren, damit nichts klackert.

Hallo zusammen, danke erstmal für die super schnelle Rückmeldung! :slight_smile:

Beim Code-Snippet fehlte noch eine Zeile, REL1 wird natürlich auch erstmal auff OFF gesetzt!

Hier mal der gesammte Code (zumindest Setup und loop):

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include <RTClib.h>

// Konstante Variablen:
// Ventilatorpins

const int FanPin1 = 5;               // Pin für den Lüfter
const int FanPin2 = 6;               // Pin für den Lüfter

const float FanPro = 1;
const float FanPro1 = 0.8;
const float FanPro2 = 0.6;
const float FanPro3 = 0.4;

// Variablen
float version = 0.5;
int Schrittweite = 25;               // Variable für die Schrittweite pro Tasterdruck des PWM Wertes
int FanSpeed1 = FanPro3*255; //192;                   // PWM Startwert des Lüfters (ca.30%)
int FanSpeed2 = FanPro3*255; //192;
int FanSpeed3 = 255;

// Display
#define I2C_ADDR    0x27             // <<----- Add your address here.  Find it from I2C Scanner
#define BACKLIGHT_PIN     3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7

// Relays
#define REL1 8
#define REL2 9
#define REL3 10
#define REL4 11
#define REL5 12
#define REL6 13
#define OFF HIGH
#define ON LOW

// Temperatur
#define DHTPIN1 2     // what pin we're connected to
#define DHTPIN2 3     // what pin we're connected to --> spaeter ergaenzen
#define DHTTYPE DHT22   // DHT 22  (AM2302)


//#define ctr 1000
#define ctr 62500                    //Umrechenfaktor Sekunde bei 62,5kHz

//Uhr
RTC_DS1307 RTC;

// Display
LiquidCrystal_I2C	lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

//Temp
DHT dht1(DHTPIN1, DHTTYPE);
DHT dht2(DHTPIN2, DHTTYPE);

void setup()
{
  TCCR0B = TCCR0B & 0b11111000 | 0x01; 				// Setzt Timer1 (Pin 5 und 6) auf 62500Hz
  
  // Starte LCD
  lcd.begin (20,4); //                                          <<----- My LCD was 16x2

  // Starte RTC
  RTC.begin();
  //RTC.adjust(DateTime(__DATE__, __TIME__));                  // Setze PC-Zeit

  // Starte Tempsensoren
  dht1.begin();
  dht2.begin();

  // Ventilatorenpins initialisieren
  pinMode(FanPin1, OUTPUT); 						// Setzt den Pin des Lüfters als Ausgang
  pinMode(FanPin2, OUTPUT);
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);                          // Switch on the backlight
  lcd.setBacklight(HIGH);
  delay(1*ctr);

  /*  Pinmode Set der Relays, default: LOW -> ON
  |***| |***| |***|
  | 5 | | 4 | | 1 |
  |***| |***| |***|
  |***| |***| |***|
  | 6 | | 3 | | 2 |
  |***| |***| |***|
        |***|  ___
        | 7 | |I/O|
        |***|*/
        
  digitalWrite(REL1, OFF);
    pinMode(REL1, OUTPUT);
  digitalWrite(REL2, OFF);
    pinMode(REL2, OUTPUT); 
  digitalWrite(REL3, OFF);
    pinMode(REL3, OUTPUT);
  digitalWrite(REL4, OFF);
    pinMode(REL4, OUTPUT); 
  digitalWrite(REL5, OFF);
    pinMode(REL5, OUTPUT);
  digitalWrite(REL6, OFF);
    pinMode(REL6, OUTPUT);
  //digitalWrite(REL7, OFF);  REL7 und 8 werden nicht benötigt und sind nicht angeschlossen.
  //digitalWrite(REL8, OFF);
  
  lcd.print(">>-<<  >>-<<  >>-<<");
  lcd.setCursor(0,1);
  lcd.print("  Arduino V");
  lcd.print(version);
  lcd.setCursor(0,2);
  lcd.print("  wird geladen!");
  lcd.setCursor(0,3);
  lcd.print(">>-<<  >>-<<  >>-<<");
  delay(3*ctr);
  lcd.clear();

  lcd.print(">>-<<  >>-<<  >>-<<");
  lcd.setCursor(0,1);
  lcd.print("  Starte Umluft:   ");
  lcd.setCursor(0,2);
  lcd.print("#1 ");
  lcd.print(100);
  lcd.print("%");
  lcd.setCursor(10,2);
  lcd.print("#2 ");
  lcd.print(100);
  lcd.print("%"); 
  lcd.setCursor(0,3);
  lcd.print(">>-<<  >>-<<  >>-<<");

  analogWrite(FanPin1, 255); 
  analogWrite(FanPin2, 255);
  delay(ctr*3);

  lcd.setCursor(3,2);
  lcd.print(FanSpeed1*100/255);
  lcd.print("%");
  lcd.setCursor(13,2);
  lcd.print(FanSpeed2*100/255);
  lcd.print("%");

  analogWrite(FanPin1, FanSpeed1);
  analogWrite(FanPin2, FanSpeed2);
  delay(ctr*3);
  lcd.clear();

  //lcd.setCursor(0,0); 
  lcd.print("Arduino V");
  lcd.print(version);
  lcd.setCursor(0,1);
  lcd.print("No.  Tmp   RLF   FAN");
}

void zeitschaltung(DateTime now){
/*
  //Genaue Startzeit/Endzeit
  if(now.hour()==6 && now.minute() ==0){
    digitalWrite(REL1, LOW);
    digitalWrite(REL2, LOW); 
  }
  else if(now.hour()==18 && now.minute() == 00) {
    digitalWrite(REL1, HIGH);
  }
  else if(now.hour()==22 && now.minute() == 0) {
    //lcd.println("Gute Nacht Ladies, Zeit schlafen zu gehen!");
    digitalWrite(REL2,HIGH);
  }*/
  //Umluft & Abluft
  digitalWrite(REL4, ON);
  digitalWrite(REL6, ON);
  
  if(now.hour() >= 6 && now.hour()<18) digitalWrite(REL1,ON);
  else if(now.hour() >= 18) digitalWrite(REL1,OFF);
  
  if(now.hour() >=6 && now.hour()<22) digitalWrite(REL2, ON);
  else if(now.hour() >=22) digitalWrite(REL2, OFF);
  return;
}

void loop()
{
  float klima[8]; 				//  Klimaarray
  int wahl=0;                                   //  Auswahlvariable			//  Uhrzeitvariable
  DateTime now = RTC.now();

  //Anzeige
  timelcd(now);
  klimafan(FanSpeed1, FanSpeed2, klima,now);

  //Zeitschaltteil! 
  zeitschaltung(now);

  //VentiSteuerung
  humcal(klima);
  
  
}

Lasse jetzt erst alle Relaise auf OFF setzen und später über die Zeitschaltfunktion ON.
Das klackern gibts jedoch leider dennoch wenn ich einen neuen Sketch auf den Arduino spiele bzw wenn ich ihn mit Spannung versorge.

Ich habe ein 3A/5VDC Netzteil welches den Arduino versorgt und separat die Relaisekarte, sie wird also nicht direkt über den Arduino mit Spannung versorgt.

Auf der Karte selbst sind bereits Widerstände verbaut, sorgen diese nicht für das richtige Potential?

Danke und Gruß!

Fleusner:
Das klackern gibts jedoch leider dennoch wenn ich einen neuen Sketch auf den Arduino spiele bzw wenn ich ihn mit Spannung versorge.

Ist doch logisch, dass es klackert, wenn Du einen Bootloader auf dem Board laufen hast.

#define REL6 13

Pin-13 ist die L-LED auf dem Board, die an Pin-13 hängt, und diese LED wird angesteuert und gibt Blinksignale von sich, während der Bootloader läuft.

Und so wie die L-LED auf dem Board blinkt, wenn der Bootloader läuft, so klackert das Relais REL6 am selben Pin.

Abhilfe wäre:

  1. Den Pin-13 nicht für ein Relais verwenden.
    oder
  2. Den Bootloader auf dem Board plattmachen und einen ISP-Programmer verwenden, um Programme auf das Board zu laden

Auf der Karte selbst sind bereits Widerstände verbaut, sorgen diese nicht für das richtige Potential?

Wo sind sie verbaut, wie sind sie verbaut...?
Ich kann das von hier aus nicht sehen.

Zur Schaltung, es handelt sich um ein Replikat folgender Karte:

Die Bauteile sind identisch.

jurs:
Ist doch logisch, dass es klackert, wenn Du einen Bootloader auf dem Board laufen hast.

#define REL6 13

Pin-13 ist die L-LED auf dem Board, die an Pin-13 hängt, und diese LED wird angesteuert und gibt Blinksignale von sich, während der Bootloader läuft.

Und so wie die L-LED auf dem Board blinkt, wenn der Bootloader läuft, so klackert das Relais REL6 am selben Pin.

Abhilfe wäre:

  1. Den Pin-13 nicht für ein Relais verwenden.
    oder
  2. Den Bootloader auf dem Board plattmachen und einen ISP-Programmer verwenden, um Programme auf das Board zu laden

Das klingt logisch, Danke !
Pin-13 wird nicht zwingend benötigt, sind noch ein paar andere frei. Ich werde das heute Abend mal testen und dann berichten, vielen Dank schonmal ! :slight_smile:

Muss nicht pinMode vor digitalWrite kommen? Käme mir logischer vor.

" digitalWrite(REL1, OFF);
pinMode(REL1, OUTPUT);"

Kann natürlich sein, dass der Compiler das berücksichtigt...

newarduinosmith:
Muss nicht pinMode vor digitalWrite kommen? Käme mir logischer vor.

" digitalWrite(REL1, OFF);
pinMode(REL1, OUTPUT);"

Kann natürlich sein, dass der Compiler das berücksichtigt...

Aus dem im ersten Post gelinktem Thread:

jurs:
Wenn Du ein Relaisboard hast, das "active LOW" durchschaltet und das keinen Jumper-Stecker auf dem Board hast, mit dem Du das umkonfigurieren kannst, bleibt Dir nichts anderes übrig, als eine korrekte und passende Ansteuerung für solche Relaiskarte zu programmieren.

Das ist auch überhaupt kein Problem.

Das eine ist dabei, sich zum Ein- und Ausschalten erstmal ein paar Eselsbrücken zu definieren, z.B.:

#define EIN LOW

#define AUS HIGH




Wenn Du lieber international verständliche Quelltexte schreibst, nimmst Du vielleicht ON statt EIN und OFF statt AUS.

Die eine Klippe ist nun, dass beim Aktivieren des Relaispins als OUTPUT das Relais auf AUS-Pegel gesetzt sein muss, sonst schaltet das Relais bereits in dem Moment, indem OUTPUT gesetzt wird, einmal durch. Und selbst wenn man es gleich darauf wieder auf AUS setzt, könnte ein unerwünschtes Relaisklickern entstehen. Das wird vermieden durch folgende Initialisierungssequenz:



#define EIN LOW
#define AUS HIGH

#define RELAISPIN 5

void setup() {
  digitalWrite(RELAISPIN,AUS); // Verhindert Relaisklicken beim Aktivieren
  pinMode(RELAISPIN,OUTPUT);
}




Und das eigentliche Schalten, ohne dass man sich groß einen Kopp darum machen braucht, ob nun LOW einschaltet oder HIGH, erledigt man dann so wie man es definiert hat:


void loop() {
  digitalWrite(RELAISPIN,EIN);
  delay(1000); 
  digitalWrite(RELAISPIN,AUS);
  delay(1000); 
}




Wenn der Relais-Schaltpin nicht an einen Arduino OUTPUT angeschlossen ist, sondern an einen INPUT (egal ob HIGH oder LOW) oder wegen Kabelbruchs nirgendwo, dann schaltet das Relais NICHT.

Wo liegt nochmal das Problem?
void setup() {

digitalWrite(RELAISPIN,AUS); // Verhindert Relaisklicken beim Aktivieren
  pinMode(RELAISPIN,OUTPUT);
}

Dazu sagt das Handbuch:

If the pin is configured as an INPUT, digitalWrite() will enable (HIGH) or disable (LOW) the internal pullup on the input pin

Was da also das klickern verhindern soll, ist mir vollkommen schleierhaft

Die zwei haben nur wenig miteinander zu tun.

Im ersten geht es darum, dass der Pin erst HIGH sein muss, bevor er auf OUTPUT gesetzt wird, damit das Relais keinen kurzen Einschalt-Impuls kriegt ( LOW + OUTPUT).
Ob ein µs Puls allerdings ein Relais bewegt, keine Ahnhung ...

Im zweiten geht es um den Zusammenhang von internem Pullup und digitalWrite bei einem Input-Pin.

Direkt nach dem Einschalten, also während der Reset-Phase, wenn an der Relais-Karte schon eine Spannung anliegt, und der Signal Pin auf Input (High Impendanz) ist egal ob mit oder ohne aktivem Pullup, sollte das Relais sich noch genauso verhalten wie vorher, ganz ohne Strom.

combie:
Dazu sagt das Handbuch:Was da also das klickern verhindern soll, ist mir vollkommen schleierhaft

Ein "active LOW" schaltendes Relais ist in diesen Fällen stets "nicht geschaltet":

  • der Signaleingang des Relais ist nicht angeschlossen
  • der Signaleingang des Relais ist an einem Arduino INPUT angeschlossen
  • der Signaleingang des Relais ist an einem Arduino OUTPUT mit Signal HIGH angeschlossen

Das Relais schaltet nur in dieser Kombination:

  • der Signaleingang des Relais ist an einem Arduino OUTPUT mit Signal LOW angeschlossen

Nach der Initialisierung sind alle Ein-/Ausgänge des Arduino "INPUT" mit Zustand "Floating".

Wenn Du nun schaltest:

  digitalWrite(RELAISPIN,HIGH); // Verhindert Relaisklicken beim Aktivieren
  pinMode(RELAISPIN,OUTPUT);

Dann wird mit dem ersten Befehl aus "INPUT Floating" ein "INPUT HIGH" mit aktviertem internem PullUp-Widerstand. Und mit dem zweiten Befehl wird aus "INPUT HIGH" direkt ein "OUTPUT HIGH" und das Relais schaltet NICHT.

Wenn Du dagegen in umgekehrter Reihenfolge schaltest:

  pinMode(RELAISPIN,OUTPUT);
  digitalWrite(RELAISPIN,HIGH);

Dann wird aus dem "INPUT Floating" initialisierten Pin erstmal ein "OUTPUT LOW" und das reicht üblicherweise auch bei ganz kurz gesetztem Ausgang aus, um das Relais kurzfristig zu schalten ("Klackern"). Der zweite Befehl wurde dann zwar wieder "OUTPUT HIGH" setzen und das Relais in den nicht geschalteten Zustand zurückfallen lassen. Aber die 4 Mikrosekunden Fehlschaltung beim Initialisieren reichen oft bereits aus, um ein Relais mit "Active LOW" Schaltlogik zum Klackern zu bringen.

Kurze Rückmeldung, klackern ist nun tatsächlich behoben!

Vielen Dank jurs für den richtigen Hinweis ! :slight_smile:

Bin mal gespannt ob morgen alles klappt, heute bin ich um 7:30 vom klackern wach geworden ... Arduino ist in eine Bootloop gefallen,bin mal gespannt wie es morgen früh ausschaut.