Benötige einen Tip

Hallo zusammen,

ich bin neu hier im Forum und hoffe ich bin in der richtigen Rubrik gelandet. Ich sammle gerade erste Erfahrungen mit dem Arduino und bin in diesem Zusammenhang über einen alten Post hier aus dem Forum gestolpert. Es geht mir um eine Umgebungsbeleuchtung für meinen Camper. Dafür müssen drei LED Leisten mittels 3 Relais geschaltet werden. Ich habe hier im Forum einen fast passenden Code gefunden. Allerdings schaltet der Arduino die Relais sofort und nicht erst, wenn ich eine der Tasten auf der Folientatatur drücke - das wäre aber mein Wunsch.
Ich hänge hier mal den verwendeten Code an:

const int ButtonPin[3] = {3,4,5};                                       // Pins an denen die Taster angeschlossen sind
const int RelaisPin[3] = {6,7,8};                                       // Pins die die Relais treiben
boolean RelaisState[3] = {0,0,0};                                       // Array in dem der Status der Relais gespeichert wird
boolean ButtonStatelast[3] = {0,0,0};
    
void setup(){
   Serial.begin(9600);
   for (int i = 0; i<=3; i++){           
     pinMode(RelaisPin[i], OUTPUT);    
     pinMode(ButtonPin[i], INPUT);
 
   }
}

void loop(){
 
 for (int i=0; i<=3; i++){                                             // nacheinander alle 3 Pins abfragen und auswerten.
  boolean ButtonState = digitalRead(ButtonPin[i]);                     // taster einlesen
  boolean Buttonpressed = ButtonState && !ButtonStatelast[i];          // Taste wurde gedrückt wenn letzter Status = 0 und neuer = 1
  ButtonStatelast[i] = ButtonState;                                    // nach Auswertung Taste Wert wieder merken.
  
  if (Buttonpressed == true) {                                         // wenn Taster gedrückt
    RelaisState[i] = !RelaisState[i];                                  // Relaistate ändern
    digitalWrite(RelaisPin[i], RelaisState[i]);                        // und auf Relaispin auusgeben.
  
   }
   
    for (int i=0; i<=3; i++){                                          // Serielle Ausgabe der Relaisstati
     Serial.print("\tRE");Serial.print(i);Serial.print(": ");Serial.print(RelaisState[i]);
    }
   
  }
 
}                                                                       // end loop

Ich hab jetzt lange gesucht und probiert, aber ich raffe es nicht, wie ich es schaffe die Relais am Anfang nicht zu schalten.

Vielleicht habt Ihr ja einen Tip für mich?

Beste Grüße, Michael

const int RelaisPin[3] = {6,7,8};   
...
for (int i = 0; i<=3; i++){           
      pinMode(RelaisPin, OUTPUT);

Oops

Can't follow you...

TheMemberFormerlyKnownAsAWOL:

const int RelaisPin[3] = {6,7,8};   

...
for (int i = 0; i<=3; i++){          
     pinMode(RelaisPin, OUTPUT);



Oops

That problem would disappear if the OP were to use code tags.

OP please use code tags when posting code here.

i<=3;Still oops

Aktuell bist du im deutschen Forumsteil gelandet.

mike_ba:
Can't follow you...

Und ich kann Deinem Code nicht einmal bis über setup() hinaus folgen, denn zu dem, was Du da programmiert hast, fällt mir grad echt nichts mehr ein.

Mach eine Skizze dessen, was Du eigentlich tun möchtest, ungefähr so: Programmablaufplan – Wikipedia. Das setzt Du dann mit Hilfe der möglichen Kontrollstrukturen um.
Wenn Du dabei auch noch auf hübschen Code achtest, fällt Dir die Fehlersuche erheblich leichter.

Gruß

Gregor

Welche Relais verwendest du ?
Vermutlich (wenn Standard-Relais) musst du die zu Anfang alle auf HIGH schalten, dann werden die inaktiv.

Also mal ehrlich, ist es wieder mal so ein Thread verschoben Dinbg?

Ich habe versucht auf den Ausgangspost zu anworten, das das array auch in der for zu verwenden ist.
Jetzt kommen hier irgendwelche englischsprachige Texte nachgetickert - Gregors nun auch noch.

@TO:
Dein Code kompiliert nicht mal.

const int RelaisPin[3] = {6,7,8};   
...
for (int i = 0; i<=3; i++){           
      pinMode(RelaisPin[i], OUTPUT);

ein, zwei, drei . . . oops.

TheMemberFormerlyKnownAsAWOL:
ein, zwei, drei . . . oops.

Da kommt er NIE hin!
Das wird auch nach erneuter Wiederholung nicht besser.

Man bekommt ihn zum kompilieren, wenn man alle [i] nachträgt - ohne Codetags führt der erste zur Kursivschrift und die anderen werden ignoriert.

Fehlermeldungen sind dann:

C:\Users\wno\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\cores\arduino\main.cpp: In function 'main':
C:\Users\wno\Documents\Arduino\forum\sketch_mar11a\sketch_mar11a.ino:18:49: warning: iteration 3 invokes undefined behavior [-Waggressive-loop-optimizations]
    boolean ButtonState = digitalRead(ButtonPin[i]);                     // taster einlesen
                                                 ^
C:\Users\wno\Documents\Arduino\forum\sketch_mar11a\sketch_mar11a.ino:17:18: note: within this loop
   for (int i=0; i<=3; i++){                                             // nacheinander alle 3 Pins abfragen und auswerten.
                  ^
C:\Users\wno\Documents\Arduino\forum\sketch_mar11a\sketch_mar11a.ino:29:89: warning: iteration 3 invokes undefined behavior [-Waggressive-loop-optimizations]
       Serial.print("\tRE");Serial.print(i);Serial.print(": ");Serial.print(RelaisState[i]);
                                                                                         ^
C:\Users\wno\Documents\Arduino\forum\sketch_mar11a\sketch_mar11a.ino:28:21: note: within this loop
      for (int i=0; i<=3; i++){                                          // Serielle Ausgabe der Relaisstati
                     ^
C:\Users\wno\Documents\Arduino\forum\sketch_mar11a\sketch_mar11a.ino:10:26: warning: iteration 3 invokes undefined behavior [-Waggressive-loop-optimizations]
       pinMode(ButtonPin[i], INPUT);
                          ^
C:\Users\wno\Documents\Arduino\forum\sketch_mar11a\sketch_mar11a.ino:8:22: note: within this loop
     for (int i = 0; i<=3; i++){
                      ^

Und leider nur als Warnung darin auch die Erklärung für "oops".
Edit: Da ja trotz Warnung fertig kompiliert wird, sind die roten Zeilen vielleicht schon wieder aus dem Fenster gerutscht. "Treat warning as error" wäre an der Stelle schön. /Edit

Der Sketch verwendet 2410 Bytes (7%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 210 Bytes (10%) des dynamischen Speichers, 1838 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

The guy posted this topic in the English section; the topic title says he needs a tip
I gave him a tip - the tip is "correct your for loop"

Also doch..
son english verschoben dingens.

pinMode(ButtonPin[ i ], INPUT); // mit extern pull-up respektiv pull-down Resistor? Wie geschaltet? Drucken gibt HIGH oder LOW ?

Okay, ich hab schon das erste Problem entdeckt. Das Fenster meiner IDE war zu klein, sodass ich die Fehlermeldungen nicht gesehen habe - Danke für die Tips. Wie gesagt ich bin absoluter Anfänger. Ich hab den Code hier mehr oder weniger so vorgefunden. Mag sein, dass das absoluter Blödsinn ist, aber ich kann zumindest die Relais alle aus- und wieder einschalten. Nur brauche ich sie eben erstmal ausgeschaltet (low). Ich verwende so eine Standard Relaisplatine mit 4 Relais. Also Ich versuche mich noch ein wenig, auch damit, sowas wie einen Programmablaufplan zu zeichnen.
Wusste nicht die Anfänger hier gleich so hart ran genommen werden. Aber das spornt an :slight_smile:

Danke Euch erstmal

mike_ba:
Wusste nicht die Anfänger hier gleich so hart ran genommen werden. Aber das spornt an :slight_smile:

Das ist nur, weil die Woche schon ein paar Tage alt aber noch nicht vorbei ist. Sonntagabend sind hier alle deutlich entspannter.

Als Unkundiger „mal schnell was zusammenstecken“ und programmieren ist halt nicht drin. Du musst vielleicht nicht „richtig“ programmieren können, aber Du solltest wissen, wie Programme und das Programmieren funktionieren.

Gruß

Gregor

mike_ba:
Nur brauche ich sie eben erstmal ausgeschaltet (low). Ich verwende so eine Standard Relaisplatine mit 4 Relais.

Diese Platinen sind i.d.R. low aktiv. D.h. low = an, high = aus

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.