Relais Problem Externe Spannungsversorgung

Moin Moin,

Und zwar habe ich ein Problem mit dem Betrieb von 4 Relais:
beim schalten der Relais hängt sich der Arduino Uno auf. und wirft nur noch ein ? im Serial Monitor aus.

Hier einmal das Schaltbild:

Die weiteren Relais sind genauso verkabelt außer das die Digital Pins sich ändern 2-5

Ich hoffe ihr könnt mir helfen beste grüße!

Welches Netzteil und welche Relais-(Module) verwendest Du?

Ich hoffe daß Du nur vergessen hast die 5V Versorgung des UNO einzuzeichnen. Oder wie versorgst Du den UNO?

Grüße Uwe

als Netzteil habe ich dieses:
https://www.reichelt.de/steckernetzteil-7-w-5-v-1-5-a-hnp-07-050v2-p298320.html?CCOUNTRY=445&LANGUAGE=de&trstct=pos_0&nbc=1&&r=1

und das relais ist dieses:

Das Relais ist die einzel Ausführung.

Der Arduino wird momentan über die USB Buchse betrieben

Und wenn ich die VCC des Relais an + des Netzteiles anschließe schaltet das Relais kurz und der Arduino hängt sich auch auf.

ÄH.
Es müßte eigentlich funktionieren.
Zeig mal den Sketch.

Wen Du die Pumpe abklemmst blockiert sich der UNO noch?

Grüeß Uwe

#include <Wire.h> // Bibiliothek für BME280
#include <SPI.h> // Bibiliothek für BME280
#include <Adafruit_Sensor.h> // Bibiliothek für BME280
#include <Adafruit_BME280.h> // Bibiliothek für BME280

#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10
#define SEALEVELPRESSURE_HPA (1013.25)

#define sollfeuchtigkeit 65
#define stufe1 sollfeuchtigkeit+10
#define stufe2 sollfeuchtigkeit+25
#define stufe3 sollfeuchtigkeit+35
#define FanPin 9
#define FanPintemp 10

// #define solltemp 26
// #define stufe1 solltemp+1
// #define stufe2 solltemp+2
// #define stufe3 solltemp+3
// #define stufe4 solltemp+4
// #define stufe5 solltemp+5

Adafruit_BME280 bme;
const int analogInPin1 = A0; // Umbenennung AnalogPins
const int analogInPin2 = A1;
const int analogInPin3 = A2;
const int analogInPin4 = A3;

int sensorValue1; // Sensoren Ausgabewerte benennung
int sensorValue2;
int sensorValue3;
int sensorValue4;

unsigned long delayTime;
float feuchtigkeit;
// float temp;
String status1;
// String status2;

void setup() { // Start Programm
    Serial.begin(9600); // Serielle Ausgabe starten

    delayTime = 1000; // 180000Zeit die gewartet werden wenn wieder geprüft werden 180000 ms = 3 min

    digitalWrite(2, HIGH); // Pumpen Relay auf HIGH damit es offen ist
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);

    pinMode(2, OUTPUT); // Pumpenanschlüsse als OUTPUT deklariert
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);
    pinMode(FanPin, OUTPUT); // Ventilatoranschluss als OUTPUT deklariert
    // pinMode(FanPintemp, OUTPUT); 


      if(!bme.begin()) {
       Serial.println(F("Finde keinen BME280 Sensor, Verkabelung überprüfen"));
        while (1);
      }

    Serial.println(F("Temperatur\tLuftfeuchtigkeit\tFeuchtigkeitssensor 1\tFeuchtigkeitssensor 2\tFeuchtigkeitssensor 3\tFeuchtigkeitssensor 4\tVentilator Einstellung Feuchtigkeit"));
     
}

void loop() { 

sensorValue1 = analogRead(analogInPin1); // ausgelesener Wert 1 wird in Variable gespeichert
sensorValue2 = analogRead(analogInPin2); // ausgelesener Wert 2 wird in Variable gespeichert
sensorValue3 = analogRead(analogInPin3); // ausgelesener Wert 2 wird in Variable gespeichert
sensorValue4 = analogRead(analogInPin4); // ausgelesener Wert 2 wird in Variable gespeichert
  
   if (sensorValue1 > 1000) { // 900 Wert der nicht überschritten werden darf Feuchtigkeit ca 50 - 70 Prozent
   digitalWrite(2, LOW); // Pumpen Relay 2 geschlossen
   delay (1000); // 1000ms ist die Pumpe an 
   digitalWrite(2, HIGH); // Pumpen Relay 2 geöffnet
   }

    if (sensorValue2 > 1000) { // 900 Wert der nicht überschritten werden darf Feuchtigkeit ca 50 - 70 Prozent
    digitalWrite(3, LOW); // Pumpen Relay 3 geschlossen
    delay (1000); // 1000ms ist die Pumpe an 
    digitalWrite(3, HIGH); // Pumpen Relay 3 geöffnet
    }

    if (sensorValue3 > 1000) { // 900 Wert der nicht überschritten werden darf Feuchtigkeit ca 50 - 70 Prozent
    digitalWrite(4, LOW); // Pumpen Relay 3 geschlossen
    delay (1000); // 1000ms ist die Pumpe an 
    digitalWrite(4, HIGH); // Pumpen Relay 3 geöffnet
    }

    if (sensorValue4 > 850) { // 900 Wert der nicht überschritten werden darf Feuchtigkeit ca 50 - 70 Prozent
    digitalWrite(5, LOW); // Pumpen Relay 3 geschlossen
    delay (1000); // 1000ms ist die Pumpe an 
    digitalWrite(5, HIGH); // Pumpen Relay 3 geöffnet
    }



float feuchtigkeit = bme.readHumidity();
if (feuchtigkeit <= sollfeuchtigkeit) { digitalWrite(FanPin,LOW); status1 = "AUS"; }else
if (feuchtigkeit >= stufe3) { digitalWrite(FanPin,HIGH); status1 = "Stufe MAX"; delay (30000); digitalWrite(FanPin,LOW); }else
if (feuchtigkeit >= stufe2) { analogWrite(FanPin,150); status1 = "Stufe 2"; delay (30000); digitalWrite(FanPin,LOW); }else
if (feuchtigkeit >= stufe1) { analogWrite(FanPin,40); status1 = "Stufe 1"; delay (30000); digitalWrite(FanPin,LOW); }else
if (feuchtigkeit >= sollfeuchtigkeit) { analogWrite(FanPin,20); status1 = "Stufe LOW"; delay (30000); digitalWrite(FanPin,LOW); }



//    float temp = bme.readTemperature();
//    if (temp <= solltemp) { digitalWrite(FanPintemp,LOW); status2 = "AUS"; }else
//    if (temp >= stufe5) { digitalWrite(FanPintemp,HIGH); status2 = "Stufe MAX"; }else
//    if (temp >= stufe4) { analogWrite(FanPintemp,190); status2 = "Stufe 4"; }else
//    if (temp >= stufe3) { analogWrite(FanPintemp,150); status2 = "Stufe 3"; }else
//    if (temp >= stufe2) { analogWrite(FanPintemp,90); status2 = "Stufe 2"; }else
//    if (temp >= stufe1) { analogWrite(FanPintemp,40); status2 = "Stufe 1"; }else
//    if (temp >= solltemp) { analogWrite(FanPintemp,20); status2 = "Stufe LOW"; }



Serial.print(bme.readTemperature()); Serial.print(F(" °C\t"));    // Pressure in millibars
Serial.print(bme.readHumidity()); Serial.print(F(" %\t\t\t"));
Serial.print(sensorValue1); Serial.print(F("\t\t\t"));
Serial.print(sensorValue2); Serial.print(F("\t\t\t"));
Serial.print(sensorValue3); Serial.print(F("\t\t\t"));
Serial.print(sensorValue4); Serial.print(F("\t\t\t"));
Serial.print(status1);
Serial.println(); 
// Serial.print(F(status2); 

  
delay (delayTime); 
}
    

Streiche mal alles was nicht mit der Relaisansteuerung und Analogmessung zu tun hat.
Tritt das Problem noch auf?
Grüeß Uwe

Wenn ich die Relaisansteuerung und die Analogmessung raus nehme funktioniert es imprinzip genauso wie auch wenn alles drin ist. Das Problem entsteht wirklich nur wenn die Relais schalten. Also sozusagen von Rot auf Grün umgesprungen wird da fängt der Arduino dann an zu meckern und hängt sich auf

andersrum. alles andere rausnehmen

Wie erkennst Du daß der UNO sich aufhängt?

so habe das mal getestet. gleiches Problem weiterhin das relais schaltet ganz ganz kurz und klackt dann wieder zurück. zumindest hängt sich der Uno nicht mehr auf. ich denke das mit dem aufhängen hat mit dem BME zutun.

Die Relais ziehen für 1 Sekunde an. Das ist so programmiert.

Ich würde eher sagen die Feuchtigkeitsregelung blockiert den NANO für 30 Sekunden.

Wie erkennst Du daß der NANO blockiert?

Ok Schreib einen Sketch der jede Sekunde was auf die serielle schnittstelle schreibt (zb den aktuellen Wert von millis()) und lies einen Taster ein der das Relais einschaltet.
einfach(digitalWrite(2,digitalRead(Taster));

Grüße Uwe

Grüße Uwe

ja das mit 1 sek stimmt in dem geschrieben Sketch, ich hab die werte auch mal hochgesetzt auf 3 sek. leider nur ein ganz kurzes umspringen von nicht mal einer sek.

Mit der internen 5 V Versorgung die ich zum testen auch mal genommen habe blockiert der UNO auch mit externem Netzteil blockiert der UNO nicht mehr aber wie gesagt die Relais ziehen für nicht mal 1 sek an.

das blockieren erkenne ich daran das der Serielle Monitor nur noch ein ? anzeigt und die RX Led auf dem UNO nicht mehr blinkt.

Habe das mit dem Taster auch probiert gleiches Phänomen das Relais zieht für nicht mal 1 sek an

Zeig den Sketch

const byte buttonpin = A0;
const byte outputpin =2;

void setup() {
pinMode(buttonpin, INPUT_PULLUP);
pinMode(outputPin, OUTPUT);
}

void loop() {
if (digitalRead(buttonPin) == LOW) {
digitalWrite(outputPin, HIGH);
delay(3000);
digitalWrite(outputPin, LOW);
}
}

gerade nochmal getestet das Relais funktioniert sauber sofern die Pumpe nicht angeschlossen ist.

Deine Relais sind LOW aktiv. Damit die schalten brauchen die LOW auf dem Eingangspin.

Und brauchst eine Freilaufdiode an der Pumpe.

ja genau das habe ich durch getestet bei LOW schaltet das Relais,
wozu ist die Freilaufdiode ? weil theoretisch schaltet das relais doch nur die 5V durch ?

Das musst du dann im Sketch auch richtig angeben.
Und an jede Induktivität gehört eine Freilaufdiode. Ohne die entstehen Spannungen die den Controller stören und auch kaputt machen können.

alles klar vielen dank für deine tipps, kannst du mir sagen welche Freilaufdiode dafür nötig wäre?