nur einmal schalten bei wechsel von LOW auf HIGH und umgekehrt

Hallo,

ich weiß es ist warscheinlich richtig einfach aber meine Arduino kenntnisse sind bereits etwas eingerostet. ich habe das Problem, dass ich meine Audioanlage anschalten möchte wenn meine PS4 angeht und auch wieder ausgeht wenn ich meine ps4 ausschalte.

um die verkabelung und die relais macht euch keine sorgen da meine PS4 sowieso schon auf wasserkühlung umgebaut wurde :slight_smile:

mein Problem ist nur wenn ich ein HIGH signal zum arduino bekomme, welches dauerhaft anliegt, soll danach EINMALIG ein HIGH signal DAUERHAFT ausgegeben werden und danach 3 weitere HIGH signale für 300ms also delay(300) ausgegebn werden und wieder auf LOW springen.

erst wenn danach das eingangssignal auf LOW springt, soll das erste ausgangssignal wieder auf LOW springen und die 3 weiteren signale wieder für 300ms HIGH und danach wieder LOW.

das problem ist nur dass ich wenn ich das ganze in eine IF bedingung in den LOOP reinsetzte sich das andauernd wiederholt. aber ich möchte ja nur dass es bei jedem eingangswechsel von low auf high und umgekehrt EINMALIG ausgeführt wird.

mit merkern habe ich auch schon probiert, bin aber nicht so weit gekommen.

ich wäre dankbar wenn mir jemand helfen könnte.

MfG

mit merkern habe ich auch schon probiert,

Das ist der richtige Ansatz!

Du möchtest einen einfachen endlichen Automaten bauen.

Hilfe bekommst du, wenn du uns erklärst, was ein PS4 ist und uns deinen aktuellen Sketch in Code-Tags postest.

PS4 = PlayStation 4 :slight_smile:

uxomm:
PS4 = PlayStation 4 :slight_smile:

Danke...man ist das gut, dass ich das nicht wusste. :wink:

#include <TaskMacro.h>
// https://forum.arduino.cc/index.php?topic=415229.0



//pins
const byte PS4               = 4;  
const byte Endstufe          = 5;  
const byte led               = 13;  // Led zwischen Pin und GND

// globale Konstanten und Variablen
const unsigned long interval = 300; // ms
const byte zyklen            = 3;   // Anzahl Blinker

uint16_t blinkAnforderung        = 0; // Merker für Blink Anforderung

void blinken() 
{
  static byte i = 0;  // Wiederholungszaehler
  taskBegin();
  while(1)
  {
    taskWaitFor(blinkAnforderung);
    for(i=0;i<zyklen;i++)
    {
      digitalWrite(led, HIGH); // leuchte an
      taskPause(interval);
      digitalWrite(led, LOW); // leuchte aus
      taskPause(interval);
    }
    blinkAnforderung-- ; // Anforderung konsumieren
  }
  taskEnd();
}

void schalten()
{
  taskBegin();
  while(1)
  {
    taskWaitFor(digitalRead(PS4));
    digitalWrite(Endstufe,1);
    taskWaitFor(!digitalRead(PS4));
    digitalWrite(Endstufe,0);
    blinkAnforderung++;
  }
  taskEnd();  
}



void setup()
{
  pinMode(led, OUTPUT);
  pinMode(Endstufe, OUTPUT);
  pinMode(PS4,INPUT);
}

void loop()
{
 schalten();
 blinken();
}

tomi123007:
wenn ich ein HIGH signal zum arduino bekomme, welches dauerhaft anliegt, soll danach EINMALIG ein HIGH signal DAUERHAFT ausgegeben werden und danach 3 weitere HIGH signale für 300ms also delay(300) ausgegebn werden und wieder auf LOW springen.

Nach meinen Definitionen von DAUERHAFT, EINMALIG und DANACH ist die Anforderung Quatsch.

Ziemlich viel Wirrwarr was combie da präsentiert.
Hier wäre einfaches delay() wirklich nicht schlimm.
So in der Art denke ich wäre doch ausreichend, mal sehr einfach dargestellt.

if button==HIGH && merker==0
{
merker++;
Signal1, HIGH; 
Signal2, HIGH;
Signal3, HIGH;
Signal4, HIGH;
delay(300);
Signal2, LOW;
Signal3, LOW;
Signal4, LOW;
}

if button==LOW && merker==1
{
merker--;
Signal1, LOW; 
Signal2, HIGH;
Signal3, HIGH;
Signal4, HIGH;
delay(300);
Signal2, LOW;
Signal3, LOW;
Signal4, LOW;
}

skorpi080:
Ziemlich viel Wirrwarr was combie da präsentiert.
Hier wäre einfaches delay() wirklich nicht schlimm.

mit CODE TAGs und Klammern beim IF würde es auch schöner ausschauen.
Grüße Uwe

da hab ich schon dran gedacht, dann ist mir nur eingefallen dass es evtl manche stören würde weil es ja kein Code ist :wink:

Könnte ich wieder den alten skorpi08 Namen bekommen?
Denn ich bin der Erste und Wahre skorpi08 :wink:
Der andere kann gelöscht werden oder umbenannt, ist nicht so wichtig.

so habe jetzt ein beisspiel und denkanstoß umgesetzt und zu veranschaulichungszwecken die zeiten geändert.

int const button = 2;
int const Signal1 = 5;
int const Signal2 = 6;
int const Signal3 = 7;
int const Signal4 = 8;
int merker = 0;

void setup() {
  pinMode(2, INPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);

}

void loop() {

digitalRead(button);
  
 if (button==HIGH && merker==0)
{
merker++;
digitalWrite(5, HIGH); 
digitalWrite(6, HIGH); 
digitalWrite(7, HIGH); 
digitalWrite(8, HIGH); 

delay(3000);

digitalWrite(6, LOW); 
digitalWrite(7, LOW); 
digitalWrite(8, LOW); 

}

digitalRead(button);

if (button==LOW && merker==1)
{
merker--;
digitalWrite(5, LOW); 
digitalWrite(6, HIGH); 
digitalWrite(7, HIGH); 
digitalWrite(8, HIGH); 
delay(3000);
digitalWrite(6, LOW); 
digitalWrite(7, LOW); 
digitalWrite(8, LOW); 
}

}

allerdings muss ich sagen dass es mit einer einfachen LED als test mit einem knopf nicht funktioniert und es tut sich einfach garnichts.

wo liegt mein Fehler?

digitalRead(button);

Liegt wohl am Fehlen elementarster Grundkenntnisse

tomi123007:
wo liegt mein Fehler?

EIEspanol hat es ja schon geschrieben. Beschäftigte dich mal mit den Grundlagen.
Du definierst die Pins, verwendest die Definition allerdings nicht.

Du solltest Beispiele nicht einfach übernehmen, sondern auch lernen, was diese machen.

skorpi080:
Ziemlich viel Wirrwarr was combie da präsentiert.

Wirrwarr?
OK, offensichtlich habe ich die Eingangsfrage nicht verstanden.
z.B.: habe ich mit einer anderen Definition von “signal” gearbeitet.
So ist das Leben manchmal…
Unklare Frage, führt zu einer unklaren/falschen Antwort.

Wirrwarr?
Grrr…
:smiling_imp: Und dann auch noch “Ziemlich viel” :smiling_imp:

skorpi080:
Hier wäre einfaches delay() wirklich nicht schlimm.

Delay, ist also gut…
Alles klar, keine Fragen, alles klar …

Hier eine Version mit deinem heiß geliebten delay()
Und mit 2 Signalen auf 4 Signalleitungen

#include <TaskMacro.h>
// https://forum.arduino.cc/index.php?topic=415229.0




const byte button  = 2;
const byte Signal1 = 5;
const byte Signal2 = 6;
const byte Signal3 = 7;
const byte Signal4 = 8;

const unsigned long interval = 300; // ms




void yield()
{
  taskBegin();
  while(1)
  {

    // Schritt 0  - Start Schritt
    digitalWrite(Signal1, LOW); 
    digitalWrite(Signal2, LOW); 
    digitalWrite(Signal3, LOW); 
    digitalWrite(Signal4, LOW); 

    
    // Schritt 1
    taskWaitFor(digitalRead(button));


    // Schritt 2
    digitalWrite(Signal1, HIGH); 
    digitalWrite(Signal2, HIGH); 
    digitalWrite(Signal3, HIGH); 
    digitalWrite(Signal4, HIGH); 

    // Schritt 3
    taskPause(interval);

    // Schritt 4
    digitalWrite(Signal2, LOW); 
    digitalWrite(Signal3, LOW); 
    digitalWrite(Signal4, LOW); 

    // Schritt 5
    taskWaitFor(!digitalRead(button));

     // Schritt 6
    digitalWrite(Signal1, LOW ); 
    digitalWrite(Signal2, HIGH); 
    digitalWrite(Signal3, HIGH); 
    digitalWrite(Signal4, HIGH); 

    // Schritt 7
    taskPause(interval);

    // Schritt 8 - Gehe wieder zum Anfang der Schrittkette
  }
  taskEnd();  
}



void setup()
{
  pinMode(button,  INPUT );
  pinMode(Signal1, OUTPUT);
  pinMode(Signal2, OUTPUT);
  pinMode(Signal3, OUTPUT);
  pinMode(Signal4, OUTPUT);
}

void loop()
{
 delay(1000);
}

Wirrwarr?
Grrr…
8) 8) 8)