Go Down

Topic: [solved] Kontakte sollen Relais schalten - Macht nicht was es soll (Read 2596 times) previous topic - next topic

aDm1N

Hallo

Ich stehe gerade etwas auf dem schlauch. Folgendes versuche ich gerade. Für den Anfang soll ein Arduino Mega 2560 2 Relais schalten wenn einer der beiden Schwimmerschalter ausgelöst hat. Der Aufbau soll dazu dienen bei einem Aquarium die Förderpumpen ab zu schalten damit das Technik Becken nicht überläuft. Dabei soll egal sein welcher der Beiden Schalter ausgelöst hat, beide sollen die gleiche Wirkung haben, egal ob einzelne, oder zusammen.
Momentan ist es so das zwar beide Relais Schalten, jedoch nur bei Schalter 1, Schalter 2 ist ohne Funktion und ich frage mich was ich übersehen, oder nicht bedacht habe.

Die Relais Karte ist eine wie diese hier.

Ich habe versucht die Schaltung mit Fritzing mal so gut wie möglich dar zu stellen, ich hoffe das hilft weiter. Die Widerstände die ich verwendet habe sind 6,3kohm, etwas passenderes zu 10kohm habe ich leider gerade nicht da, laut meiner suche im www sollte das aber funktionieren, 10ner besorge ich mir aber noch für den endgültigen Aufbau. Ich hoffe nicht das es jetzt daran liegt.

Hier mal der sketch

Code: [Select]
// 8 Relais Shield an Arduino
// In diesem Beispiel schalten Schwimmer Schalter Relais

#define RELAY1  2                        
#define RELAY2  3                        
#define RELAY3  4                        
#define RELAY4  5
#define RELAY5  6                        
#define RELAY6  7                        
#define RELAY7  8                        
#define RELAY8  9
#define schwimmer1  10
#define schwimmer2  11

// variables die sich ändern:
int stateRELAY1 = LOW;
int stateRELAY2 = LOW;
int stateRELAY3 = LOW;
int stateRELAY4 = LOW;
int stateRELAY5 = LOW;
int stateRELAY6 = LOW;
int stateRELAY7 = LOW;
int stateRELAY8 = LOW;
int schwimmer1State = 0;         // variable für den schwimmer status
int schwimmer2State = 0;
 
void setup()
{    
//  Inizialisiere die Pinn's
  pinMode(RELAY1, OUTPUT);      
  pinMode(RELAY2, OUTPUT);
  pinMode(RELAY3, OUTPUT);
  pinMode(RELAY4, OUTPUT);
  pinMode(RELAY5, OUTPUT);      
  pinMode(RELAY6, OUTPUT);
  pinMode(RELAY7, OUTPUT);
  pinMode(RELAY8, OUTPUT);
  pinMode(schwimmer1, INPUT);
  pinMode(schwimmer2, INPUT);
}
 
 void loop()
{
 // liest den status von schwimmer1 und schwimmer2:
  schwimmer1State = digitalRead(schwimmer1); digitalRead(schwimmer2);

  // überprüft ob schwimmer1 ausgelöst hat.
  // wenn das so ist, schaltet RELAY1 und RELAY2 an
  if (schwimmer1State == HIGH) {    
    // schaltet RELAY1 aus:    
    digitalWrite(RELAY1, HIGH); digitalWrite(RELAY2, HIGH);
    // überprüft ob schwimmer2 ausgelöst hat.
  // wenn das so ist, schaltet RELAY1 und RELAY2 an
    if (schwimmer2State == HIGH) {
     digitalWrite(RELAY1, HIGH); digitalWrite(RELAY2, HIGH);
 }
  }
  else {
    // schaltet RELAY1 aus
    digitalWrite(RELAY1, LOW); digitalWrite(RELAY2, LOW);
  }
 }


Die Schaltung ist im Anhang

Gruß

Matthias

Serenifly

Code: [Select]

schwimmer1State = digitalRead(schwimmer1); digitalRead(schwimmer2);

schwimmer2 wird ausgelesen aber keiner Variablen zugewiesen.


Allgemeiner Tip:
Packe die Pin Nummern in ein Array. Darüber kannst du dann einer Schleife iterieren und musst noch x mal pinMode() schreiben

skorpi080

playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

uwefed

Was ist ein Array und wie macht man es?
??
So eine Frage habe ich von Dir nicht erwartet oder verstehe ich die Frage total falsch?
Grüße Uwe

ElEspanol

Ich glaube Skorpi hat in seiner Kristallkugel den nächsten Beitrag von adm1n gesehen und wollte den Thread nur etwas beschleunigen  :D 

uwefed

Ich glaube Skorpi hat in seiner Kristallkugel den nächsten Beitrag von adm1n gesehen und wollte den Thread nur etwas beschleunigen  :D 
Wie gesagt in solchen belangen hab ich zuwenig Phantasie.  ;)  ;)  ;)
Grüße Uwe

aDm1N

Da könnte durchaus etwas dran sein.  ;)

Ich bin schon auf der suche nach dem Ergebnis, aber habe noch nichts passendes / funktionierendes gefunden. Was mir auf jedenfalls schon mal aufgefallen ist, ich hoffe das war schon mal ein schritt in die richtige Richtung, das dieser teil des code
Code: [Select]
schwimmer1State = digitalRead(schwimmer1); digitalRead(schwimmer2);
den Status von schwimmer1 und 2 liest, aber nur schwimmer1 zuweist.
Meiner Meinung nach sollte es so richtiger sein
Code: [Select]
schwimmer1State = digitalRead(schwimmer1);
  schwimmer2State = digitalRead(schwimmer2);


Ich habe versucht das ganze mit einer if schleife in "und" "oder" vergleiche zu legen, aber das hat bis jetzt auch nicht funktioniert.

Es wäre nett wenn ihr mir Tips geben könntet zu Quellen bei denen ich nachlesen kann wie das besten zu lösen ist, oder Beispiele.
Gruß

Matthias

Serenifly

Was auch noch ist, dass du laut Code da ein ODER willst. Das geht besser so:
Code: [Select]

if(digitalRead(schwimmer1) == HIGH || digitalRead(schwimmer2) == HIGH)
{
   /an
}
else
{
   //aus
}


Du schaltest die beiden Relais nämlich auch nur aus, wenn Schalter 2 LOW ist, unabhängig von Schalter 1

aDm1N

Super, jetzt funktioniert es so wie es soll. Ob es der beste weg ist, oder nicht kann ich nicht sagen, aber es funktioniert.

Ich hatte die und, oder vergleiche in separate klammern gesetzt und bekam nur Fehlermeldungen. Nachdem ich in dem Beispiel den oder vergleich sah, war mir klar wo mein Fehler lag. Ich kann zwar noch immer nicht richtig Programmieren und die Syntax ist mir deshalb fremd, aber stück für stück komme ich voran. Hier mal der Code wie ich es jetzt gelöst habe und es funktioniert.

Code: [Select]
// 8 Relais Shield an Arduino
// In diesem Beispiel schalten Schwimmer Schalter Relais

#define RELAY1  2                       
#define RELAY2  3                       
#define RELAY3  4                       
#define RELAY4  5
#define RELAY5  6                       
#define RELAY6  7                       
#define RELAY7  8                       
#define RELAY8  9
#define schwimmer1  10
#define schwimmer2  11

// variables die sich ändern:
int stateRELAY1 = LOW;
int stateRELAY2 = LOW;
int stateRELAY3 = LOW;
int stateRELAY4 = LOW;
int stateRELAY5 = LOW;
int stateRELAY6 = LOW;
int stateRELAY7 = LOW;
int stateRELAY8 = LOW;
int schwimmer1State = 0;         // variable für den schwimmer status
int schwimmer2State = 0;

void setup()
{   
  //  Inizialisiere die Pin's
  pinMode(RELAY1, OUTPUT);       
  pinMode(RELAY2, OUTPUT);
  pinMode(RELAY3, OUTPUT);
  pinMode(RELAY4, OUTPUT);
  pinMode(RELAY5, OUTPUT);       
  pinMode(RELAY6, OUTPUT);
  pinMode(RELAY7, OUTPUT);
  pinMode(RELAY8, OUTPUT);
  pinMode(schwimmer1, INPUT);
  pinMode(schwimmer2, INPUT);
}

void loop()
{
  // liest den status von schwimmer1 und schwimmer2:
  schwimmer1State = digitalRead(schwimmer1);
  schwimmer2State = digitalRead(schwimmer2);


  // überprüft ob schwimmer1, oder schwimmer2 ausgelöst hat.
  // wenn das so ist, schaltet RELAY1 und RELAY2 an
  if (schwimmer1State == HIGH || digitalRead(schwimmer2) == HIGH) {     
    // schaltet RELAY1 aus:   
    digitalWrite(RELAY1, HIGH);
    digitalWrite(RELAY2, HIGH); 
  }
  else {
    // schaltet RELAY1 aus
    digitalWrite(RELAY1, LOW);
    digitalWrite(RELAY2, LOW);
  }
}

Gruß

Matthias

Serenifly

Code: [Select]

 schwimmer1State = digitalRead(schwimmer1);
 schwimmer2State = digitalRead(schwimmer2);


if (schwimmer1State == HIGH || digitalRead(schwimmer2) == HIGH) {


Entscheide dich für eine Variante. Entweder mit Zwischenvariablen oder nicht. Eigentlich kannst du die weglassen und direkt digitalRead() in der if-Abfrage machen.

Aber du solltest konsequent sein. Also wenn du sie hast, dann hier auch auf die Variable abfragen und nicht nochmal auslesen.

aDm1N

Ich denke ich habe verstanden was du meinst. Hatte da gar nicht drauf geachtet, da es ja funktionierte, aber so sieht es gleich ordentlicher aus.

Code: [Select]
// 8 Relais Shield an Arduino
// In diesem Beispiel schalten Schwimmer Schalter Relais

#define RELAY1  2                       
#define RELAY2  3                       
#define RELAY3  4                       
#define RELAY4  5
#define RELAY5  6                       
#define RELAY6  7                       
#define RELAY7  8                       
#define RELAY8  9
#define schwimmer1  10
#define schwimmer2  11

// variables die sich ändern:
int stateRELAY1 = LOW;
int stateRELAY2 = LOW;
int stateRELAY3 = LOW;
int stateRELAY4 = LOW;
int stateRELAY5 = LOW;
int stateRELAY6 = LOW;
int stateRELAY7 = LOW;
int stateRELAY8 = LOW;
int schwimmer1State = 0;         // variable für den schwimmer status
int schwimmer2State = 0;

void setup()
{   
  //  Inizialisiere die Pin's
  pinMode(RELAY1, OUTPUT);       
  pinMode(RELAY2, OUTPUT);
  pinMode(RELAY3, OUTPUT);
  pinMode(RELAY4, OUTPUT);
  pinMode(RELAY5, OUTPUT);       
  pinMode(RELAY6, OUTPUT);
  pinMode(RELAY7, OUTPUT);
  pinMode(RELAY8, OUTPUT);
  pinMode(schwimmer1, INPUT);
  pinMode(schwimmer2, INPUT);
}

void loop()
{
  // überprüft ob schwimmer1, oder schwimmer2 ausgelöst hat.
  // wenn das so ist, schaltet RELAY1 und RELAY2 an
  if (digitalRead(schwimmer1) == HIGH || digitalRead(schwimmer2) == HIGH) {     
    // schaltet RELAY1 und 2 an   
    digitalWrite(RELAY1, HIGH);
    digitalWrite(RELAY2, HIGH); 
  }
  else {
    // schaltet RELAY1 und 2 aus
    digitalWrite(RELAY1, LOW);
    digitalWrite(RELAY2, LOW);
  }
}



So funktioniert es auch, ich hoffe das es so aussehen sollte. Wenn dem so ist, habe ich das jetzt, denke ich, verstanden und kann bei bedarf weitere Funktionen dazu schreiben.
Gruß

Matthias

Go Up