1 Signal 2 Funktionen

Hallo,
Ich bin ein Blutiger Anfänger und möchte ein Signal zählen und es dazu benutzen um 2 relais anzusteuern (Relais2 und Relais3)
davor soll relais 2 noch durch Signal2 angesteuert werden… jedoch bekomme ich das irgendwie nicht hin es wird nur Relais1 und relais2 geschalten :crazy_face:

int Relais1 = 13;
int Relais2 = 12;
int Relais3 = 8;
int Signal1 = 2;
int Signal2 = 4;

int SignalAnzahl = 0;
int SignalZustand = 0;
int LetzterSignalZustand = 0;
void setup()
{

pinMode (Relais1,OUTPUT);
pinMode (Relais2,OUTPUT);
pinMode (Relais3,OUTPUT);
pinMode (Signal1,INPUT);
pinMode (Signal2,INPUT);

}

void loop() {
SignalZustand = digitalRead(Signal1);
if (SignalZustand != LetzterSignalZustand)
{
if (SignalZustand == HIGH)
{
SignalAnzahl ++;
LetzterSignalZustand = SignalZustand;

}
else
{
LetzterSignalZustand = SignalZustand;
}
}
if (SignalZustand == 1)
{
digitalWrite(Relais1,HIGH);
delay(1000);
digitalWrite(Relais2,HIGH);
delay(1000);
}

digitalWrite(Relais1,LOW);
digitalWrite(Relais2,LOW);

if (digitalRead(Signal2) == HIGH)
{
digitalWrite(Relais2,HIGH);
delay(30000);
digitalWrite(Relais2,LOW);
}

if (SignalZustand == 2)
{
digitalWrite(Relais3,HIGH);
}
if (digitalRead(Signal2) == LOW)
{
digitalWrite(Relais3,LOW);
delay(300);
SignalZustand = 0;
}
}

Ich hoffe ihr könnt mir helfen

Formatiere zunächst Deinen Code so, dass er schnell zu überschauen ist. Rücke passend und einheitlich ein, klammere einheitlich usw. Guck z.B. hier.

Gruß

Gregor

tut mir leid war der falsche sketch ich hoffe das hier ist übersichtlicher

Da fehlt es dann ganz.
Vielleicht so?

const int Led1 = 13;
const int Led2 = 12;
const int Signal = 2;
unsigned int SignalAnzahl = 0;

unsigned long bouncemillis = 0;
const unsigned long bouncetime = 20;

void setup() {
  pinMode(Led1, OUTPUT);
  pinMode(Led2, OUTPUT);
  pinMode(Signal, INPUT);

}

void loop() {
  if (digitalRead(Signal) && millis() - bouncemillis > bouncetime)
  {
    SignalAnzahl+;
    if (SignalAnzahl > 2) SignalAnzahl = 0;
  }

  if (SignalAnzahl == 1)
  {
    digitalWrite(Led1, HIGH);
    delay(300);
    digitalWrite(Led1, LOW);
  }
  if (SignalAnzahl == 2)
  {
    digitalWrite(Led2, HIGH);
    delay(3000);
    digitalWrite(Led2, LOW);
    SignalAnzahl = 0; // setzt zähler auf 0
  }
}

OK.
Mein Post wird oben als editiert markiert - warum auch immer.
Das war ich nicht!

Ich hatte gehofft das ganze ohne Millis hinzubekommen da ich das thema trotz mehrerer Videos und Forumsbeiträge noch nicht ganz praktisch anwenden kann habe den arduino seit dem 30/04

Das kannst Du.
Dann musst Du sicherstellen, das Dein Eingangssignal nicht prellt.

Dein ganz grosses massivess Problem in Deinem Code: Du verwechselst SignalZustand mit SignalAnzahl

(Achso - Du hast den Sketch jetzt auch noch ausgetauscht.
Na gut. - das ist ja mal ne Ansage)
Das war das Original

const int Led1 = 13;
const int Led2 = 12;
const int Signal = 2;
int SignalAnzahl = 0;
int SignalZustand = 0;
int LetzterSignalZustand = 0;

void setup() {
pinMode(Led1,OUTPUT);
pinMode(Led2,OUTPUT);
pinMode(Signal,INPUT);

}

void loop() {
SignalZustand = digitalRead(Signal); //weist signal pin (const) einer variable zu (Signal zustand)

if (SignalZustand != LetzterSignalZustand) //Signal zustand ungleich letzter signal zustand
{
if (SignalZustand == HIGH) // wenn signal da…
SignalZustand ++; // 1 mal drücken signalzustand 0 +1 = Signal zustand 2 mal drücken Signal zustand = 2… usw

else
{
LetzterSignalZustand = SignalZustand;
}
}

if (SignalZustand == 1)
{
digitalWrite(Led1,HIGH);
delay(300);
digitalWrite(Led1,LOW);
}
if (SignalZustand == 2)
{
digitalWrite(Led2, HIGH);
delay(3000);
digitalWrite(Led2,LOW);
SignalZustand = 0; // setzt zähler auf 0
}
}

OK danke erstmal ich werde das beheben und Dan noch einmal ausprobieren

An millis() wirst Du nicht vorbei kommen. Lies Dir neben BlinkWithoutDelay, der Nachtwächtererklärung, der Erklärung von Mictobahner - Sketche dazu auch mal diese Erläuterung durch oder das von Rentner von delay bis zur Methode.

Es gibt viele Erklärungen, aber das intensive Erarbeiten bis zum Verstehen kann Dir keiner abnehmen.

Gruß Tommy

Ich verstehe das Millis wichtig sind und will den Umgang damit auch noch lernen jedoch würde ich mich sehr darüber freuen wenn mir jemand Tipps für dieses Projekt geben könnte (Automatisches öffnen u d schließen einer Klappe über funksignal mit endschalter und linearantrieb) ich als Laie finde das der sketch logisch ist und komme deshalb nicht weiter ich kann euch versichern das ich einige Stunden in das Thema investiert habe dieser Forumsbeitrag ist sozusagen ein Schrei nach Hilfe :grin:

JA!!!
Wenn Du einen Sender hast, der NUR EIN SIGNAL PRO TASTENDRUCK abgibt UND SELBER DAS BOUNCE BEARBEITET, dann geht das.
Ich glaube nicht daran, das dieser das tut.

const int Led1 = 13;
const int Led2 = 12;
const int Signal = 2;
unsigned int SignalAnzahl = 0;

void setup() {
  pinMode(Led1, OUTPUT);
  pinMode(Led2, OUTPUT);
  pinMode(Signal, INPUT);

}

void loop() {
  if (digitalRead(Signal))
  {
    SignalAnzahl+;
    if (SignalAnzahl > 2) SignalAnzahl = 0;
  }
  if (SignalAnzahl == 1)
  {
    digitalWrite(Led1, HIGH);
    delay(300);
    digitalWrite(Led1, LOW);
  }
  if (SignalAnzahl == 2)
  {
    digitalWrite(Led2, HIGH);
    delay(3000);
    digitalWrite(Led2, LOW);
    SignalAnzahl = 0; // setzt zähler auf 0
  }
}

Der Sender sendet ein positives Signal für 3500 ms das muss ich allerdings noch einmal überprüfen und ja er sendet nur 1 Signal pro Tastendruck

Hallo,
im einfachsten Fall brauchst du einen Endlichen Automaten, basierend auf der SWITCH/CASE Anweisung, einen Timer und und eine Button-Auswertung, die die Zustandsübergänge im Endlichen Automaten steuern.

Na sag das doch :wink:
Ja, das kann man auch ganz anders machen, aber dann hier zum testen:

const int Led1 = 13;
const int Led2 = 12;
const int Signal = 2;
unsigned int SignalAnzahl = 0;
bool lastsignal=true;
void setup() {
  pinMode(Led1, OUTPUT);
  pinMode(Led2, OUTPUT);
  pinMode(Signal, INPUT);

}

void loop() {
  if (!digitalRead(Signal)&& lastSignal)
  {
    lastsignal=!lastsignal;
    SignalAnzahl+;
    if (SignalAnzahl > 2) SignalAnzahl = 0;
  }
  if (digitalRead(Signal)
  {
    lastsignal=!lastsignal;
  }
  if (SignalAnzahl == 1)
  {
    digitalWrite(Led1, HIGH);
    delay(300);
    digitalWrite(Led1, LOW);
  }
  if (SignalAnzahl == 2)
  {
    digitalWrite(Led2, HIGH);
    delay(3000);
    digitalWrite(Led2, LOW);
    SignalAnzahl = 0; // setzt zähler auf 0
  }
}

Da ich nicht weiss, wie Dein signal ist, prüfe ich auf LOW. Notfalls das ! entfernen und darunter in der abfrage wieder einfügen.

Also ehrlich, ich habe mich gerade nochmal durch Deinen Eingangspost gewurschtelt, aber Deine Beschreibung ist nicht aufklärend.
Der Code da oben nicht in codetags macht es nicht einfacher.

Wenn Du irgendwas willst, dann beschreibe die Aufgabe und kommentiere den Code, den Du bitte in Codetags verfasst!

fangen wir mal von vorne an:
WAS willst du schlussendlich steuern?
Mach eine Handskizze von deinem Aufbau damit wir verstehen was du willst.
Zum Programm:
Wenn du was auslösen willst, beschreibe welche Pins in welcher Reihenfolge geschaltet werden sollen.
Wodurch wird ein Zustand wieder zurückgenommen? Nur durch Zeitablauf und/oder durch ein anderes Signal?

Beschreibe den Programmablauf in kurzen Sätzen.
(bei langen Sätzen tut sich ein Anfänger schwer daraus Code zu machen)

Ich sehe nicht daß es Dir jemand schon gesagt hat.

if (SignalZustand == 2)
{
digitalWrite(Relais3,HIGH);
}

Du verwechselst SignalAnzahl mit SignalZustand.
Grüeß Uwe

In #7 Sogar wortgenau … :wink:

ups