2 sketche zusammenfügen

Hallo zusammen,

folgendes Problem, ich habe 2 sketche für Kehrschleifensteuerung Modellbahn. Beide funktionieren einzeln (Steuerung der Weichen, Steuerung der Fahrspannung) Wenn ich sie zusammenführe kommt Fehlermeldung: 'ButtonToggle' was not declared in this scope.

ich finde einfach den Grund nicht. Vielleicht könnt ihr mir helfen. Danke.
Gruß Uwe

int rel1 = 7 ; // PIN für Relais1
int rel2 = 8 ; // PIN für Relais2
const byte rel3 = 9;
int mhSensor1 = 2 ; // PIN für den Magnetischen Hall Sensors 1
int mhSensor2 = 3 ; // PIN für den Magnetischen Hall Sensors 2
int mhSensor34 = 4; // PIN für die Magnetischen Hall Sensoren 3 und 4
bool mhSensorstate34; // status der Hallsensoren 3 und 4
bool rel3state; // status für relais3

void setup () {
pinMode (rel1, OUTPUT) ; // definieren des PIN's für Relais1 als Ausgangssignal
pinMode (rel2, OUTPUT) ; // definieren des PIN's für Relais2 als Ausgangssignal
pinMode (mhSensor1, INPUT) ; // definieren des PIN's für den Sensor1 als Eingangssignal
pinMode (mhSensor2, INPUT) ; // definieren des PIN's für den Sensor2 als Eingangssignal
Serial.begin(9600);
pinMode(mhSensor34, INPUT_PULLUP);
pinMode(rel3, OUTPUT);
}

void loop () {
int val = digitalRead (mhSensor1) ; // Lesen des Zustandes des Sensors 1.
if (val == LOW) { //Wenn dieser AN ist dann soll Relais1 anziehen.
digitalWrite (rel1, HIGH);
delay (5000);

} else { //Wenn dieser AUS ist dann soll Relais1 NICHT anziehen.
digitalWrite (rel1, LOW);
}

{
int val = digitalRead (mhSensor2) ; // Lesen des Zustandes des Sensors2.
if (val == LOW) { //Wenn dieser AN ist dann soll Relais2 anziehen.
digitalWrite (rel2, HIGH);
delay (5000);

} else { //Wenn dieser AUS ist dann soll Relais2 NICHT anziehen.
  digitalWrite (rel2, LOW);
}
{

  mhSensorstate34 = !digitalRead(mhSensor34); // Hallsensoren 3 und 4 lesen invertiert
  rel3state = ButtonToggle(mhSensorstate34);// verarbeiten
  digitalWrite(rel3, rel3state);// ausgeben

}

bool ButtonToggle( bool btn) {
uint32_t static altzeit;
bool static status = 0;
bool static flanke = 0;

if (millis() - altzeit >= 10) { //entprellen
altzeit = millis();
if (btn & !flanke) { // Flanke abfragen
flanke = true;
status = !status; // Status toggeln
}
if (!btn) flanke = false; // reset flanke
}
return (status);
}
}

Hallo Uwe,
kontrollier mal deine geschweiften Klammern. Die stimmen nicht. Zum eine fehlt eine, und dadurch hast Du die ButtonToggle innerhalb von loop definiert. Wenn Du alle Fehlermeldungen liest, sagt dir der Compiler das auch.

Und setze deinen Code bitte ordentlich in Codetags. Ist jetzt etwas anders als vorher, aber 'Für Forum kopieren' in der IDE funktioniert nach wie vor.

Hallo,
habe eine Klammer eingefügt und ButtonToggle ausserhalb von loop definiert.
nun kommt aber:
ButtonToggle innerhalb von loop definiert
????

int rel1 = 7 ; // PIN für Relais1
int rel2 = 8 ; // PIN für Relais2
const byte rel3 = 9;
int mhSensor1 =  2 ; // PIN für den Magnetischen Hall Sensors 1
int mhSensor2 =  3 ; // PIN für den Magnetischen Hall Sensors 2
int mhSensor34 = 4; // PIN für die Magnetischen Hall Sensoren 3 und 4
bool mhSensorstate34; // status der Hallsensoren 3 und 4
bool rel3state; // status für relais3
bool ButtonToggle( bool btn);

void setup () {
  pinMode (rel1, OUTPUT) ; // definieren des PIN's für Relais1 als Ausgangssignal
  pinMode (rel2, OUTPUT) ; // definieren des PIN's für Relais2 als Ausgangssignal
  pinMode (mhSensor1, INPUT) ;  // definieren des PIN's für den Sensor1 als Eingangssignal
  pinMode (mhSensor2, INPUT) ;  // definieren des PIN's für den Sensor2 als Eingangssignal
  Serial.begin(9600);
  pinMode(mhSensor34, INPUT_PULLUP);
  pinMode(rel3, OUTPUT);
}

void loop () {
  int val = digitalRead (mhSensor1) ; // Lesen des Zustandes des Sensors 1.
  if (val == LOW) { //Wenn dieser AN ist dann soll Relais1 anziehen.
    digitalWrite (rel1, HIGH);
    delay (5000);

  } else { //Wenn dieser AUS ist dann soll Relais1 NICHT anziehen.
    digitalWrite (rel1, LOW);
  }


  {
    int val = digitalRead (mhSensor2) ; // Lesen des Zustandes des Sensors2.
    if (val == LOW) { //Wenn dieser AN ist dann soll Relais2 anziehen.
      digitalWrite (rel2, HIGH);
      delay (5000);

    } else { //Wenn dieser AUS ist dann soll Relais2 NICHT anziehen.
      digitalWrite (rel2, LOW);
    }
    {

      mhSensorstate34 = !digitalRead(mhSensor34); // Hallsensoren 3 und 4 lesen invertiert
      rel3state = ButtonToggle(mhSensorstate34);// verarbeiten
      digitalWrite(rel3, rel3state);// ausgeben

    }
    {
      uint32_t static altzeit;
      bool static status = 0;
      bool static flanke = 0;

      if (millis() - altzeit >= 10) { //entprellen
        altzeit = millis();
        if (btn & !flanke) { // Flanke abfragen
          flanke = true;
          status = !status; // Status toggeln
        }
        if (!btn) flanke = false; // reset flanke
      }
      return (status);
    }
  }
}


In deinem neuen Sketch sehe ich gar keine Definition von ButtonToggle mehr - nur eine Deklaration und der Code selbst steht noch in loop.

Ich vermute, es soll sowas werden:

int rel1 = 7 ; // PIN für Relais1
int rel2 = 8 ; // PIN für Relais2
const byte rel3 = 9;
int mhSensor1 =  2 ; // PIN für den Magnetischen Hall Sensors 1
int mhSensor2 =  3 ; // PIN für den Magnetischen Hall Sensors 2
int mhSensor34 = 4; // PIN für die Magnetischen Hall Sensoren 3 und 4
bool mhSensorstate34; // status der Hallsensoren 3 und 4
bool rel3state; // status für relais3
bool ButtonToggle( bool btn);

void setup () {
  pinMode (rel1, OUTPUT) ; // definieren des PIN's für Relais1 als Ausgangssignal
  pinMode (rel2, OUTPUT) ; // definieren des PIN's für Relais2 als Ausgangssignal
  pinMode (mhSensor1, INPUT) ;  // definieren des PIN's für den Sensor1 als Eingangssignal
  pinMode (mhSensor2, INPUT) ;  // definieren des PIN's für den Sensor2 als Eingangssignal
  Serial.begin(9600);
  pinMode(mhSensor34, INPUT_PULLUP);
  pinMode(rel3, OUTPUT);
}

void loop () {
  int val = digitalRead (mhSensor1) ; // Lesen des Zustandes des Sensors 1.
  if (val == LOW) { //Wenn dieser AN ist dann soll Relais1 anziehen.
    digitalWrite (rel1, HIGH);
    delay (5000);

  } else { //Wenn dieser AUS ist dann soll Relais1 NICHT anziehen.
    digitalWrite (rel1, LOW);
  }


  {
    int val = digitalRead (mhSensor2) ; // Lesen des Zustandes des Sensors2.
    if (val == LOW) { //Wenn dieser AN ist dann soll Relais2 anziehen.
      digitalWrite (rel2, HIGH);
      delay (5000);

    } else { //Wenn dieser AUS ist dann soll Relais2 NICHT anziehen.
      digitalWrite (rel2, LOW);
    }
    {

      mhSensorstate34 = !digitalRead(mhSensor34); // Hallsensoren 3 und 4 lesen invertiert
      rel3state = ButtonToggle(mhSensorstate34);// verarbeiten
      digitalWrite(rel3, rel3state);// ausgeben

    }
  }
}

bool ButtonToggle( bool btn)
{
  uint32_t static altzeit;
  bool static status = 0;
  bool static flanke = 0;

  if (millis() - altzeit >= 10) { //entprellen
    altzeit = millis();
    if (btn & !flanke) { // Flanke abfragen
      flanke = true;
      status = !status; // Status toggeln
    }
    if (!btn) flanke = false; // reset flanke
  }
  return (status);
}

Das kompiliert zumindest fehlerfrei. Ob es tut, was Du willst, kann ich nicht beurteilen oder feststellen. Und es sind einige unnötige { } drin.

Supi,
ich danke dir. Funzt wie es soll.
Gruß Uwe

Super, dann weiterhin viel Spaß :sunglasses:

Muss trotzdem nochmal nerven:
es funzt mit LED am Ausgang. Wenn ich Relais anschließe zieht es nur kurz an und nicht die eingestellte Zeit. Habe sep. Spannungsversorgung (nicht am PC USB Ausgang) brachte nix.
:roll_eyes:

Hallo,
was für ein Relais hast Du wie angeschlossen ?

Heinz

ein Arduino Relais mit VCC IN GND es zieht nur kurz an. Led parallel bleibt Zeit an.

Wenn die parallel geschaltete Led anbleibt, kann es nur ein Problem bei deinem Relais-Modul sein. Was ist das für ein Modul, und wie hast Du es angeschlossen?

wenn ich die LEDs entferne ist der gleiche Effekt.
Typ: HL-52V1.0

als die Sketche noch einzeln waren hat es aber gefunzt.

Relais eventuell L aktiv , mach mal einen einfachen Test-sketch oder stereure das Relais mal mit einer Drahtbrücke an 5V oder GND ohne Arduino an
Heinz

GND an GND
VCD an VCD
IN an GND Relais / zieht IN an VCC passiert nix

Also das relay zieht wenn IN an GND ist. Dann musst Du den Ausgang in Deinem Sketch eventuell invertieren.

Heinz

habe Sketch so geändert:

void loop () {
  int val = digitalRead (mhSensor1) ; // Lesen des Zustandes des Sensors 1.
  if (val == HIGH) { //Wenn dieser AN ist dann soll Relais1 anziehen.
    digitalWrite (rel1, LOW);
    delay (5000);

  } else { //Wenn dieser AUS ist dann soll Relais1 NICHT anziehen.
    digitalWrite (rel1, HIGH);
  }

funzt aber leider auch nicht

Probier das mal mit einem gaaanz einfachen Sketch, der das Relais z.B. nur im Sekundentakt ein- und ausschaltet. Diese Relaisboards haben eine ziemlich bescheuerte Eingangsstufe.

mit dem Sketch:

int PINOUT = 8;                 // Pin 8 am Arduino festlegen
    
void setup() {
   pinMode(PINOUT, OUTPUT);     // Initialisieren des Ausgangs
}
 
void loop() {
   digitalWrite(PINOUT, HIGH);  // Schaltet ein
   delay(1000);
   digitalWrite(PINOUT, LOW);   // Schaltet aus
   delay(1000); 
}

funktioniert das relais

ich wurde das ohne else machen Verrieglung einbauen zB.

`   int val = digitalRead (mhSensor1) ; // Lesen des Zustandes des Sensors 1.
  if (val == LOW) { //Wenn dieser AN ist dann soll Relais1 anziehen.
    digitalWrite (rel2, LOW);
    delay(1000);
    digitalWrite (rel1, HIGH);
    delay (4000);

 // } else { //Wenn dieser AUS ist dann soll Relais1 NICHT anziehen.
 //   digitalWrite (rel1, LOW);
 // }


  {
    int val = digitalRead (mhSensor2) ; // Lesen des Zustandes des Sensors2.
    if (val == LOW) { //Wenn dieser AN ist dann soll Relais2 anziehen.
      digitalWrite (rel1, LOW);
      delay(1000);
      digitalWrite (rel2, HIGH);
      delay (4000);

  //  } else { //Wenn dieser AUS ist dann soll Relais2 NICHT anziehen.
   //   digitalWrite (rel2, LOW);
  //  }
}`

Grüße Bernhard

noch was zu den Modulen sie sind PNP gesteuert = bei einschalten beide EIN. Also im setup rel1 und rel2 auf low setzen oder nach ermessen bei start
Bernhard