Anfängerfrage - Schalterstellung abfragen und Tasterfunktion auslösen

Da muss ich jetzt noch ein Detail nachfragen:

Wenn der originale Fußtaster slow / fast wirklich direkt zwischen slow und fast umschaltet
dann braucht es keinen Start/Stop-Impuls.

So macht das der Sketch in post # 58

Wenn es da zwei LEDs gibt die immer beide langsam bzw. schnell blinken dann kann man einen von den beiden LEDs einen Fototransistor direkt "auf Gesicht" setzen. Der Foto-Transistor schaltet dann durch wenn Licht auf ihn fällt.

Was für eine Farbe haben die LEDs? Je nachdem was das für eine Farbe ist muss man einen dazu passenden Fototransistor mit möglichst gut passender spektralen Empflindlichkeit aussuchen.
Wenn diese LEDs ziemlich schwach leuchten braucht man da evtl. eine Art Verstärkerschaltung.

Je nach dem wie gut man an die Anschlüsse der LED dran kommt könnte man auch die LED "anzapfen". Wenn man das mit einem Operationsverstärker der als Spannungsfolger geschaltet ist, macht, ist der zusätzliche Strom extrem gering.

Die zusätzlichen Taster die Start/Stop bzw. slow/fast Impulse erzeugen würden am Arduino angeschlossen. Damit hat man die Möglichkeit wenn die Hammond bei einem Impuls auf den falschen Modus schaltet durch das Erzeugen eines Impules ohne den Half-Moon-Schalter zu betätigen auf den richtigen Modus zu bringen.

Den Start/Stop Impuls benötigt es nur dann, wenn das Gerät sich im Stop Modus befindet und von dort wieder auf Langsam oder Schnell gehen soll. Wenn man nämlich im Stop Modus mit Taster D die bisherige Gescheindigkeit, z.B. von Langsam nach Schnell, wechselt wird zwar die Geschwindigkeit sozusagen vorgewählt, aber wirklich aktiv erst dann wenn der Stop Modus explizit aufgehoben wird - an der Stelle hatte ich bisher einen Denkfehler. Ich müsste also, wenn ich aus dem Stop Modus wieder raus will, einmal abfragen welche Geschwindigkeit aktiv war als der Stop Modus aktiviert wurde, und abfragen auf welche Geschwindigkeit der Halfmoon Schalter gestellt wird und dementsprechend entweder nur den Stop Modus aufheben oder zusätzlich auch die Geschwindigkeit umschalten. Oder aber - und das wäre dann einfacher aber trotzdem akzeptabel - nur den Stop Modus mit Impuls von Taste E beenden und dann ggf die Geschwindigkeit manuell korrigieren falls sie falsch ist, also den Halfmoon Schalter dann nochmal zwischen Slow und Fast hin und herschauten

Wenn ich dagegen das Gerät nicht in den Stop Modus geschaltet habe hast Du Recht.

Die beiden LED sind gelb bzw rot. Fototransistor fällt aber weg da die LED auch nach dem Einbau sichtbar bleiben müssen. Der Weg sie über einen OP anzuzapfen wäre da wohl der einzig machbare, muss ich mal überlegen

Hmm das wäre natürlich auch eine zusätzliche Möglichkeit, um das manuell zu korrigieren

Dann mach doch mal eine Art Wahrheits-Tabelle, mit den Schalterstellungen/wechseln und welche Impulse beim jeweiligen Zustandswechsel erzeugt werden müssen.

Ja, mache ich morgen mal

Seit ich drüber nachdenke und mich eingemischt habe, sehe ich das Problem, dass dein Gerät, das mit zwei Tastern gesteuert wird, einen inneren Zustand (schnell / aus / langsam) hat, die Taster selbst aber nicht.
Nun hat der gewünschte "Halfmoon" Schalter auch einen Zustand, und die zwei sollen natürlich zusammen passen.
Leider muss man, um den Zustand des Halfmoon-Schalters auf deine Orgel per Pulse zu übertragen, den aktuellen Zustand der Orgel kennen.
Entweder gibt es sowas wie eine Reset-Funktion, die deine Orgel in einen definierten Zustand bringt, und die du noch nicht kennst oder zumindest nicht erwähnt hast, oder bei der ist zu unsicher, dass die zwei Zustände nie auseinanderlaufen, wenn Impulse verloren gehen oder zuviel erkannt werden. Dann geht es nicht ohne Auslesen des aktuellen Zustands aus deiner Orgel und daraufhin
in den Zustand des Halfmoon-Schalters zu wechseln.

Wenn du an die Anschlüsse der LED kommst, ist es relativ simpel, dieses Signal mit einem kleinen Allerweltstransistor für einen Arduino aufzubereiten, ohne die Ansteuerung der LED oder deren Helligkeit merkbar zu stören. Musst natürlich erstmal messen, welche Pegel an welchem Pin der LED zu sehen sind, sowohl wenn sie leuchtet wie wenn sie aus ist. Dass einer der LED Pins immer auf GND Level und der andere im leuchtend-Zustand ca. 2V positiver ist, wäre am einfachsten, ist aber nicht unbedingt erforderlich.
Danach braucht es nur noch aureichend Geduld, bis man erkennen kann ob das Blinken nun schnell oder langsam ist, (oder ganz aus, wenn das nicht an einer andern LED erkennbar ist).

1 Like

Sooo - jetzt mal hier die Details welche bisher fehlten:

Zu den beiden Tastern am Effektgerät, deren Funktion der Arduino ersetzen soll: geschaltet werden +5V, beim Schließen des Tasters fließt ein Strom vom ca. 0.5mA

Das Gerät selbst behält beim Ausschalten nicht die zuletzt aktive Einstellung, sondern startet nach dem Einschalten immer im Status "Langsam", man hat also einen definierten Ausgangsstand.

Hier auch die gewünschte "Wahrheitstabelle":

Das heißt wenn man deinen Hammond-Orgel-Nachbau neu einschaltet dann ist Leslie-Effekt-slow aktiv.

Einschalten -
du drückst eine Taste auf der Klaviatur und dann ist der Ton mit Leslie-Effekt slow zu hören?

Deine Tabelle hat Spalten Schalterstellung wird verändert auf.
Daraus geht jetzt aber nicht eindeutig hervor was die Schalterstellung vor dem Schalterbetätigen war.

Da hilft so eine Logik-Tabelle nur begrenzt.
Man muss ja genau eine Fallunterscheidung machen was vor der Schalterbetätigung war.

Hier mal explizit nur der Teil aus meinem Arduino-Programm in post # 58

der genau das macht

  // wenn Schalter betätigt wurde
  if ( (lastSlowInputState != actualSlowInputState) || ( lastFastInputState != actualFastInputState ) ) {
    // prüfe auf Stop-Stellung
    if ( (actualSlowInputState == opened) && (actualFastInputState == opened) ) {
      if (runMode == running) {
        runMode = stopped;
        digitalWrite(StartStopPulsePin, HIGH);
        pulseStartTime = millis();
      }
    }
  }


  // wenn es am Arduino-Eingang "slow" eine Veränderung gab 
  if ( lastSlowInputState != actualSlowInputState ) {
    if (actualSlowInputState == closed) { // wenn Half-moon-Schalter auf Stellung slow
      runMode = running;
      // wenn vom mode fast kommend (Schalter war in Stellung fast dann auf Stop jetzt slow
      if (slowFastMode == fast) {
        slowFastMode = slow;
        digitalWrite(SlowFastPulsePin, HIGH);
        pulseStartTime = millis();
      }
      // wenn von Stop erneut slow geschaltet wird dann einen StartStop-Pulse geben
      if (slowFastMode == slow) {
        digitalWrite(StartStopPulsePin, HIGH);
        pulseStartTime = millis();
      }
    }
  }


  // wenn es am Arduino-Eingang "fast" eine Veränderung gab 
  if ( lastFastInputState != actualFastInputState ) {
    if (actualFastInputState == closed) { // wenn Half-moon-Schalter auf Stellung fast
      runMode = running;
      // wenn vom mode slow kommend (Schalter war in Stellung slow dann auf Stop jetzt auf fast
      if (slowFastMode == slow) {
        digitalWrite(SlowFastPulsePin, HIGH);
        pulseStartTime = millis();
      }

      // wenn von Stop erneut auf fast geschaltet wird dann einen StartStop-Pulse geben
      if (slowFastMode == fast) {
        digitalWrite(StartStopPulsePin, HIGH);
        pulseStartTime = millis();
      }
    }
  }

lese mal die Kommentare durch. Das sind die Zeilen die mit "//" beginnen

1 Like

Ich sehe da jetzt plötzlich doch wieder zwei „Impulse“ bei Fast.

Ja das ist korrekt, ich habe mir das Gerät nochmals im Detail angeschaut.

Wenn es durch einen Impuls von Taster E in den Stop Modus versetzt wird muss man diesen nicht durch einen weiteren Impuls von Taster E wieder beenden, es reicht wenn zur Beendigung ein Impuls von Taster D kommt wodurch das Gerät in den Modus "Slow" wechselt. Setze ich also den Schalter in dem Fall von "Stop" auf "Slow" wird der Taster D einmal betätigt, dadurch wird Stop Modus beendet und das Gerät geht automatisch in den Modus "Slow".

Setze ich den Schalter aber von "Stop" auf "Fast" sollte das Gerät ja auch auf "Fast" schalten. Da es durch einen einmaligen Impuls für Taster D aber automatisch erst einmal auf "Slow" geht muss in diesem Fall noch ein zweiter Impuls für Taster D kommen, damit danach von "Slow" auf das gewünschte "Fast" umgeschaltet wird.

Ja, nach dem Einschalten hört man den Effekt "Slow" wenn das Audiosignal der Orgel über den Effekt geht.

Wenn ich das Gerät einschalte ist immer der Effekt "Slow" aktiv. Die Stellung des Schalters beim Einschalten ist dann erst einmal egal, da der Arduino nur auf Veränderungen der Schalterstellung reagieren soll.

Wird also nach dem Einschalten der Schalter auf "Slow" gesetzt (bzw schon darauf steht) ist kein Impuls für Taster D notwendig da der "Slow" Modus ja schon aktiv ist. Falls der Schalter beim Einschalten bereits auf "Stop" oder "Fast" steht werde ich ihn einmalig auf "Slow" setzen damit die Schalterstellung dem Startzustand "Slow" entspricht, das dann also wie im Satz vorher geschrieben ohne das ein Impuls für Taster D gesendet wird - das tritt aber NUR beim ersten Mal nach dem Einschalten auf.

Nur wenn der Schalter auf eine der beiden anderen Positionen "Stop" oder "Fast" gesetzt wird muss der entsprechende Impuls an für Taster E (Stop) oder Taster D (Fast) ausgelöst werden.

Achja. Is schon schwer leicht verständliche Beschreibungen zu schreiben.

Das ganze wird sehr viel eindeutiger wenn der jeweilige Zustand in dem sich das Leslie-Effekt-Gerät "MiniVent_II" befindet beschrieben wird
und
in was für einen Zustand das Leslie-Effekt-Gerät "Mini Vent II" wechselt wenn ein Impuls kommt.

MiniVent_II im Zustand slow aktiv dann START/STOP-Impuls => gestoppt
MiniVent_II im Zustand gestoppt slowFast-Impuls ==> slow aktiv

MiniVent_II im Zustand fast slowFast-Impuls ==> slow aktiv

MiniVent_II im Zustand slow slowFast-Impuls ==> fast aktiv

MiniVent_II im Zustand fast dann START/STOP-Impuls => gestoppt
MiniVent_II im Zustand gestoppt slowFast-Impuls ==> slow aktiv

ist das korrekt?

Woher weiß das Arduino-Programm ob das Leslie-Effekt-Gerät "Mini Vent II" gerade eben erst eingeschaltet wurde?

Ich habe eine Idee dazu:
Du hast geschrieben das an den Fußtastern 5V sind.

"Mini Vent II" ausgeschaltet: 0V
"Mini Vent II" eingeschaltet 5V
Die könnte man auch dem Arudino zuführen.
Da ist aber eine genau Analyse erforderlich.

Die Impulserzeugung wird über einen Relais-Kontakt gemacht.
Dieser Relaiskontakt hat überhaupt keine elektrische Verbindung zum Arduino
deshalb kann man sich sicher sein, dass das über Relais funktioniert.

Wenn man jetzt dem Arduino die +5V zuführen will dann braucht man auch einen Massekontakt (Minusleitung) sonst funktioniert das nicht.

Ja anscheinend, für mich war das klar aber das kommt wohl anders an - sorry für die Unklarheiten und Danke für die Geduld!

Ja das ist korrekt so.

Der Arduino würde immer gemeinsam mit dem Gerät eingeschaltet (und auch ausgeschaltet) werden, nicht unabhängig voneinander, also ist der Einschaltzeitpunkt beider Geräte gleich und der Arduino kann den Zustand des Effekt-Gerätes dadurch voraussetzen - aber vielleicht liege ich da auch falsch?

Man könnte dem Arduino beim Einschalten eine kurze Wartezeit programmieren.
So 2 bis 5 Sekunden damit das MiniVent_II wirklich startklar ist, wenn der Arduino
beginnt die Schalterstellung vom Half-Moon-Schalter auszuwerten.

Damit wäre dann schon recht sicher, dass die Impulse so gegeben werden dass der Zustand des MiniVent_II zur Schalterstellung passt.

Wenn dann in seltenen Fällen der MiniVent_II-Modus je nicht zur Schalterstellung passt könnte man die Lieblingsbeschäftigung aller modernen elektronischen Geräte ausführen um es passend zu machen.

Was diese Beschäftigung ist? : Neu starten. Aus/einschalten, booten

Stimmt, so könnte man das handhaben und es wäre schon elegant, beim Einschalten den Zustand des Geräts mit der Stellung des Schalters abzugleichen und das Gerät in den Zustand zu versetzen, der durch den Schalter angezeigt wird.

Da man ja weiß, dass das Gerät immer im Status "Slow" startet könnte der Arduino beim Start schauen, ob der Schalter auch auf "Slow" steht, dann wäre nichts zu tun. Steht der Schalter auf "Fast" würde dann der entsprechende Impuls gesendet um von "Slow" auf "Fast" umzuschalten, steht der Schalter auf "Stop" dann das Gleiche für den "Stop" Impuls. Das wäre dann also nach dem Einschalten so:

Schalter steht beim Start auf "Slow": Kein Impuls

Schalter steht beim Start auf "Fast": SlowFast-Impuls ==> Fast aktiv

Schalter steht beim Start auf "Stop": START/STOP-Impuls => gestoppt

Hallo allerseits,

aufgrund diverser anderer Prioritäten hat das Projekt erstmal hinten anstehen müssen, jetzt habe ich es aber fertiggebracht und der nachfolgende Code funktioniert so wie gewünscht.

Danke an alle die sich mit Vorschlägen hier im Thread beteiligt haben! :pray: Auch wenn ich davon, wie ihr unten seht, wenig bis gar nichts übernommen habe weil die Beispiele für einen absoluten C-Beginner wie mich schon schwierig zu durchschauen waren, waren sie doch sehr hilfreich für mich um konzeptionell auf den richtigen Weg zu kommen.

Euch stehen wahrscheinlich die Haare zu Berge was den Programmierstil und die Eleganz des u.a. Programms angeht, aber für mich war es in erster Linie wichtig dass ich mal meinen ersten Sketch funktionsfähig hinbekomme :sweat_smile:

Falls sich aber jemand mal den Code anschauen und mir Vorschläge für Verbesserungen jedweder Art machen möchte bin ich sehr dankbar für Tips, da ich gerne lernen möchte wie man solch einen Sketch optimieren bzw. effizienter gestalten könnte.

Viele Grüße, Georg

//
// Halfmoon Schalter Stellungen auslesen und umwandeln in Impulse für Mini Vent II Taster
//

// Konstanten
const byte slowInputPin = 4;  // Pin vom Halfmoon Schalter Slow Stellung
const byte fastInputPin = 5;  // Pin vom Halfmoon Schalter Fast Stellung

const byte SlowFastPulsePin  = 10;  // Pin für MiniVent Impuls Taster Slow/Fast
const byte StartStopPulsePin = 11;  // Pin für MiniVent Impuls Taster Stop (Bypass)

const unsigned int MiniVentPulseLength =300; // Konstante für Tasterlänge in ms am MiniVentII
const unsigned long MiniVentStartTime = 500; // Wartezeit in ms bis MiniVent gestartet hat
const unsigned long StopModeDuration = 500;  // Dauer Halfmoon auf Stop bevor Stop Signal an MiniVentII gesendet wird

// Variablen
byte SlowInputPinState; // Status Pin für Slow
byte FastInputPinState; // Status Pin für Fast

byte StartupPhase = 1;   // Merker für Einschaltphase, relevant für Durchlauf der Initialisierungsprozedur initMiniVent

unsigned int HalfmoonState = 0;  // Stellung Halfmoon Switch beim Start Start: 1=Slow, 2=Stop, 3=Fast

unsigned int CurrentMiniVentMode = 0; // Merker für aktuellen MiniVent Modus: 1=Slow, 2=Stop, 3=Fast

unsigned long StopTimerStart;
unsigned long StopTimerEnd;

//Funktions Prototypen
unsigned int initMiniVent();


void setup() 
{
  Serial.begin(115200);
  Serial.println("Start");
  // Initialisierung digitale Pins
  pinMode(slowInputPin, INPUT_PULLUP);
  pinMode(fastInputPin, INPUT_PULLUP);
  pinMode(SlowFastPulsePin, OUTPUT);
  pinMode(StartStopPulsePin, OUTPUT); 
}


void loop() 
{
// ---------------------------------------------------
// Durchlauf einmalige Initialisierungsroutine zum Abgleich von Halfmoon Stellung und MiniVent Effektstatus nach Einschalten
// ---------------------------------------------------
if (StartupPhase == 1)
  {
    Serial.println("Initialisierung");
    HalfmoonState = initMiniVent(); // Setze Halfmoon Status Merker auf Stellung beim Einschalten
    CurrentMiniVentMode = HalfmoonState;  // Setze MinitVent Modus Merker auf Effektstatus nach Abgleich mit Halfmoon Switch
    StartupPhase = 0; // Startup zu Ende
  }
// -------------------------------------------------- 
// Scan des Halfmoon Switches auf Veränderungen  
// --------------------------------------------------
{
  SlowInputPinState = digitalRead(slowInputPin);
  FastInputPinState = digitalRead(fastInputPin);
//  
  if((SlowInputPinState == LOW) && (FastInputPinState == HIGH)) // Halfmoon Switch auf Slow
  {   
    HalfmoonState = 1;
  }
  if((SlowInputPinState == HIGH) && (FastInputPinState == HIGH))  // Halfmoon Switch auf Stop
  {
    HalfmoonState= 2;  
  } 
  if((SlowInputPinState == HIGH) && (FastInputPinState == LOW))  // Halfmoon Switch beim Start auf Fast
  {
    HalfmoonState = 3;
  }
// ********************************************************
// MiniVentII steht auf Slow und Schalter nicht auf Slow
// ********************************************************
  if ((CurrentMiniVentMode == 1) && (HalfmoonState != 1))
  {
    if(HalfmoonState == 2)  // Halfmoon Switch hat auf Stop gewechselt
    {
      delay(StopModeDuration); // Nochmalige Abfrage ob Schalter auf Stop verbleibt
      SlowInputPinState = digitalRead(slowInputPin);
      FastInputPinState = digitalRead(fastInputPin);
      if((SlowInputPinState == LOW) && (FastInputPinState == HIGH)) // Halfmoon Switch auf Slow
      {   
        HalfmoonState = 1;
      }
      if((SlowInputPinState == HIGH) && (FastInputPinState == HIGH))  // Halfmoon Switch auf Stop
      {
        HalfmoonState = 2;    
      } 
      if((SlowInputPinState == HIGH) && (FastInputPinState == LOW))  // Halfmoon Switch beim Start auf Fast
      {
        HalfmoonState = 3;
      }
      if(HalfmoonState == 2) // Halfmoon Switch verbleibt auf Stop
        {
          digitalWrite(StartStopPulsePin, HIGH); // Einmaliger Impuls für Taster Stop/Bypass um MiniVent auf Stop zu setzen
          delay(MiniVentPulseLength);
          digitalWrite(StartStopPulsePin, LOW);
          delay(MiniVentPulseLength);
          CurrentMiniVentMode = 2;
        }
      }
  //
    if(HalfmoonState == 3)  // Halfmoon Switch hat über Stop auf Fast gewechselt
    {
      digitalWrite(SlowFastPulsePin, HIGH); // Erster Impuls für Taster Slow/Fast um auf Slow zu wechseln
      delay(MiniVentPulseLength);
      digitalWrite(SlowFastPulsePin, LOW);
      delay(MiniVentPulseLength);
      CurrentMiniVentMode = 3;
    }
  }
// ********************************************************
// MiniVentII steht auf Stop und Schalter nicht auf Stop
// ********************************************************
  if ((CurrentMiniVentMode == 2) && (HalfmoonState != 2)) 
  {
    if(HalfmoonState == 1) // Halfmoon Switch hat auf Slow gewechselt
    {
      digitalWrite(SlowFastPulsePin, HIGH); // Einmaliger Impuls für Taster Slow/Fast um auf Slow zu wechseln
      delay(MiniVentPulseLength);
      digitalWrite(SlowFastPulsePin, LOW);
      delay(MiniVentPulseLength);
      CurrentMiniVentMode = 1;  
    }
    if(HalfmoonState == 3)  // Halfmoon Switch hat auf Fast gewechselt
    {
      digitalWrite(SlowFastPulsePin, HIGH); // Erster Impuls für Taster Slow/Fast um auf Slow zu wechseln
      delay(MiniVentPulseLength);
      digitalWrite(SlowFastPulsePin, LOW);
      delay(MiniVentPulseLength);
      digitalWrite(SlowFastPulsePin, HIGH); // Zweiter Impuls für Taster Slow/Fast um auf Fast zu wechseln
      delay(MiniVentPulseLength);
      digitalWrite(SlowFastPulsePin, LOW);
      delay(MiniVentPulseLength);
      CurrentMiniVentMode = 3;
    }
  } 
}
// ********************************************************
// MiniVentII steht auf Fast und Schalter nicht auf Fast
// ********************************************************
  if ((CurrentMiniVentMode == 3) && (HalfmoonState != 3)) 
  {
    if(HalfmoonState == 1) // Halfmoon Switch hat auf Slow gewechselt
    {
      digitalWrite(SlowFastPulsePin, HIGH); // Einmaliger Impuls für Taster Slow/Fast um auf Slow zu wechseln
      delay(MiniVentPulseLength);
      digitalWrite(SlowFastPulsePin, LOW);
      delay(MiniVentPulseLength);
      CurrentMiniVentMode = 1;  
    }
    if(HalfmoonState == 2)  // Halfmoon Switch hat auf Stop gewechselt
    {
      delay(StopModeDuration); // Nochmalige Abfrage ob Schalter auf Stop verbleibt
      SlowInputPinState = digitalRead(slowInputPin);
      FastInputPinState = digitalRead(fastInputPin);
      if((SlowInputPinState == LOW) && (FastInputPinState == HIGH)) // Halfmoon Switch auf Slow
      {   
        HalfmoonState = 1;
      }
      if((SlowInputPinState == HIGH) && (FastInputPinState == HIGH))  // Halfmoon Switch auf Stop
      {
        HalfmoonState = 2;    
      } 
      if((SlowInputPinState == HIGH) && (FastInputPinState == LOW))  // Halfmoon Switch beim Start auf Fast
      {
        HalfmoonState = 3;
      }
      if(HalfmoonState == 2) // Halfmoon Switch verbleibt auf Stop
        {
          digitalWrite(StartStopPulsePin, HIGH); // Einmaliger Impuls für Taster Stop/Bypass um MiniVent auf Stop zu setzen
          delay(MiniVentPulseLength);
          digitalWrite(StartStopPulsePin, LOW);
          delay(MiniVentPulseLength);
          CurrentMiniVentMode = 2;
        }
      }
  } 
// ********************************************************************
// ********************************************************************
//
}



// Funktion zur Initialisierung des MiniVent abhängig vom Stand des Halfmoon Switches beim Start
unsigned int initMiniVent()
{
  delay(MiniVentStartTime); // warten bis MiniVent hochgefahren ist - MiniVent ist nach Start immer im Modus Slow
  SlowInputPinState = digitalRead(slowInputPin);
  FastInputPinState = digitalRead(fastInputPin);
  if((SlowInputPinState == LOW) && (FastInputPinState == HIGH)) // Halfmoon Switch beim Start auf Slow
  {
    return 1;
  }
  if((SlowInputPinState == HIGH) && (FastInputPinState == HIGH))  // Halfmoon Switch beim Start auf Stop
  {
    digitalWrite(StartStopPulsePin, HIGH); // Einmaliger Impuls für Taster Stop/Bypass um auf Stop zu wechseln
    delay(MiniVentPulseLength);
    digitalWrite(StartStopPulsePin, LOW);
    return 2;
  } 
  if((SlowInputPinState == HIGH) && (FastInputPinState == LOW))  // Halfmoon Switch beim Start auf Fast
  {
    digitalWrite(SlowFastPulsePin, HIGH); // Einmaliger Impuls für Taster Slow/Fast um auf Fast zu wechseln
    delay(MiniVentPulseLength);
    digitalWrite(SlowFastPulsePin, LOW);
    return 3;
  }
}

Da muß ich korrigieren.

Ich beziehe mich auf einen Standart-Optokpoppler mit einer IR-LED und einem NPN-Fototransistor. Es gibt noch solche mit Logikausgang, Tyristor, Triac oder FET. Sold State Relais mit MOSFET oder Triac Ausgang zähle ich nicht zu Optokopplern. Ich weiß nicht, ob es keine Optokoppler mit PNP Transistoren gibt; Mir sind jedenfalls keine bekannt.

Da der Ausgangstransistor eines Optokopplers vom Eingang isoliert ist, ist er nicht auf Masse bezogen. Darum kann der Ausgangstransitor (Kollektor und Emitter) auf Masse (mit dem Emitter) und Pullup-Widerstand oder auch auf +Versorgungsspannuung (mit Kollektor) und Pulldown-Widerstand geschaltet werden. Der Emittor muß, bezogen auf den Collektor, an die negativere Seite zB des Tasters ( den der Optokoppler elektrisch betätigen soll) geschaltet werden.
Siehe Optokoppler – Mikrocontroller.net

Grüße Uwe

Richtig. Ich habe mich wohl ungenau ausgedrückt. Eigentlich habe ich das Gleiche sagen wollen. Der Emitter würde dann an GND liegen, der Collektot am Eingang, der mit einem Widerstand nach Vcc beschaltet ist.

Gruß Tommy

Ach ja - der o.g. Code steuert die hier im Thread empfohlenen Reed Relais für die Impulse an den MiniVent II. Wie langlebig und störanfällig diese sind weiß ich nicht, man wird sehen

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