Euer Fachwissen ist gefragt

Hallo zusammen,

folgendes soll geschehen:

Nach Drücken von Taster 1 soll ein Relais abfallen. Wird dieser Taster 1 nicht innerhalb von 2 Sekunden gedrückt wird das Relais angezogen. Wird der Taster 1 dann dennoch gedrückt fällt das Relais ab.

Dieses soll zwischen 2 Tastern in einem zufälligen Zeitabstand wechseln.

Wer kann hier helfen?

Vielen Dank

Keiner, weil keiner versteht was du willst.

Wahrscheinlich viele, wenn du uns deinen Ansatz in Form eines Sketches präsentierst. Möchtest du, dass dir jemand einen Sketch entwirft, solltest du eine Ausschreibung für einen Job starten.

Ein Taster soll ein Relais abfallen lassen. Wenn das nicht geschieht soll nach 2 Sekunden das Relais anziehen.

Du hast hier doch schon gefragt.
Hat Dir die Antwort nicht gepasst?

Doch, die Antwort war super und es hat auch geholfen.

Nur bin ich wie schon gesagt absolut unerfahren in der Andruino Welt und man sagt immer wieder das man an Hilfe von Beispielen am besten lernt.

Daher sehe ich auch keinen Grund warum ich hier jetzt von einigen wenigen angegriffen werde.

Wenn Du das als Angriff siehst, dann stelle ich mal zur Debatte:
Ich habe Dir heute mehrfach ohne jegliche Information versucht gedanklich zu folgen.
Ich habe nachdem ich das TikTak aus dir rausgepopelt habe, etwas geliefert worauf Du nicht mal eine Reaktion gezeigt hast.
Du eröffnest jetzt eine NEUEN Thread obwohl ganz augenscheinlich ist, das es sich um das gleiche Projekt handelt.
Du beschreibst etwas, was technisch unmöglich ist und es soll sich der nächste jetzt damit auseinandersetzen, Dir aus der Nase zu ziehen, was Du vor hast.

Und glaube mir, ehe ich jemanden angreife, muss schon eine Bombe platzen.

Ganz einfach:

Taster1 wird gedrückt, daraufhin wird das Relais NICHT angezogen, wird der Taster1 nicht innerhalb von 2 Sekunden gedrückt wird das Relais angezogen. Wird der Taster1 dann doch gedrückt fällt das Relais wieder ab.

Nach einer zufälligen Zeit wechselt die Schaltung auf Taster 2.

Wird Taster2 nun gedrückt, wird das Relais NICHT angezogen. Wird der Taster 2 nicht innerhalb von 2 Sekunden gedrückt wird das Relais angezogen. Wird der Taster 2 dann doch gedrückt fällt das Relais wieder ab.

Nach einer zufälligen Zeit wechselt die Schaltung auf Taster 1 zurück.

Und nein es ist nicht das gleiche Projekt.

Mein Ansatz sieht aber wie folgt aus:

if
digitalRead (Button1 = HIGH); //Taster1 wird gedrückt
digitalWrite (Relais = LOW); //Relais zieht NICHT an
else
delay(500); //Verzögerung von X Zeit
digitalWrite (Relais = HIGH); //Relais zieht an

Nur wie mache ich das mit der randNumber und eben der Verzögerung mit nicht 'delay'. Weil delay hält ja das Programm an, das aber weiter laufen soll.

Ich hoffe ich konnte mein Anliegen nun etwas konkretisieren und entschuldige mich das ich gerade mal 30 Stunden Arduino Erfahrung habe und so etwas 'kompliziertes' machen möchte.

Nein.

Das ist technisch nicht möglich! Da fehlt irgendwas.

Den Rest las ich mal absichtlich aussen vor.

Du hast das vor 12 Stunden nicht verstanden und vergessen da zu fragen, was das macht.

Das ist kein Grund, seine Anforderung nicht beschreiben zu können und auf gegebene Hilfe mit Ignoranz zu reagieren.

Hinweis: Bau einen PAP Ich kenne ein ganz einfaches und ohne Schnickschnack sicher unter Windows zu bedienendes Tool
PS: Wie man code postet habe ich Dir auch erklärt.

unsigned long randNumber;
const byte Relais = 6;
const byte Button1 = 5;
const byte Button2 = 2;
byte schritt;
unsigned long lastmillis;

void setup()
{
  Serial.begin(9600);
  randomSeed(analogRead(0));
  pinMode(Relais, OUTPUT);
  pinMode(Button1, INPUT);
  pinMode(Button2, INPUT);
}

void loop()
{
  switch (schritt)
  
    case 0:                      // Start
      randNumber = random(21);   // die letze zufällige Ziffer ist 20
      Serial.println(randNumber);
      lastmillis = millis();     // Zeit merken
      schritt++;
                     
      if (digitalRead (Button1)==HIGH)  {
      digitalWrite (Relais, LOW);
      } else
      (millis() - lastmillis > 1000UL * randNumber); // Wartezeit
      {
        digitalWrite(Relais, HIGH);
        lastmillis = millis();
        schritt++;
      }
                        // Umschalten
      if (digitalRead(Button2)==HIGH) {
      digitalWrite (Relais, LOW);
      } else {
      (millis() - lastmillis >= 1000); // Wenn Zeit abgelaufen
      {
        digitalWrite(Relais, HIGH);
        lastmillis = millis();
        schritt++;
      }
  }
}

Allerdings soll nach dem Button1 noch gedrückt werden kann das Relais wieder ausschalten.

Dann nach X Sekunden soll das ganze auf dem Button2 genau so erfolgen können.

Ok,
das ist mein Code volkommen verwurstelt - Ich habe hier eine Aufgabe für Dich.
Hier gibt es ein pdf zum download. Einmal von von bis hinten durchlesen. Nur lesen. Dann werden Dir ganz bestimmt einige Dinge klar. Der Autor ist selbst Arduino-User. Da ist sehr viel in wirklich einfacher Sprache geschrieben.

Du musst einige grundlegende Sachen nur erstmal mitnehmen. Nicht auswendig lernen. Nur wissen, das es da steht und nachschlagen.

Hier mal mein Anfangsversuch:

Nach dem das Programm gestartet wurde muss man 'sofort' den Taster gedrückt halten. Dann geht LED 1 mit einer Verzögerung von 2,5 sec. an. Hält man den Taster nicht gedrückt, geht LED2 nach 2,5 sec. an. Drückt man jetzt auf den Taster geht auch LED1 mit an, aber LED2 wird nicht wieder gelöscht was aber geschehen soll. Lässt man hingegen den Taster wieder los geht LED1 aus und LED2 wieder an.

Das ganze soll quasi in einem zufällig gesteuerten Abstand den man einstellen kann so wechseln das man anstelle von Taster1 einen Taster2 drücken muss. Passiert dies nicht soll das gleiche passieren.

Ich mag mich hier vielleicht unklar ausdrücken, aber den Ansatz habe ich:

#define LED1 1
#define LED2 5
#define BUTTON_PIN 3

void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(BUTTON_PIN, INPUT);
}
void loop() {
  delay(2500);
  if (digitalRead(BUTTON_PIN)==HIGH){
    digitalWrite(LED1, HIGH);
    } else
    digitalWrite(LED2, HIGH);
  }

Hat der Taster ein PullDown? Braucht er ja, wenn er High bei gedrückt liefern soll.

Dein Sketch schaltet aktuell die LEDs nur an. Nirgendwo wieder aus. Das ist bestimmt nicht gewollt.

Auch sollte dir bewusst sein das Taster prellen und für ganz kurze Zeit die Werte High und Low hin und her wechseln.

Hallo tuffen
Poste ein Timingdiagramm um alle Abhängigkeiten zu erkennen.
Ich wünsche einen geschmeidigen Tag und viel Spass beim Programmieren in C++.

Du hast auch hier die Möglichkeit die Ignorierfunktion des Forum zu verwenden .

lieber tuffen,

Beim programmieren muss man sich sehr präzise ausdrücken.
Du stehst vor der Wahl durch immer neue jeweils zu unpräzise Beschreibungen Zeit zu verbrauchen und dann immer noch keine Lösung zu haben
oder

Zeit für eine ausführliche und präzise Beschreibung zu verbrauchen.

Bei einer präzisen Beschreibung ist gaaanz wichtig ganz sauber auseinander zu halten was ist das gewollte Programmverhalten und was ist das beobachtete verhalten.

Wenn du gewolltes Programmverhalten und beobachtetes Programmverhalten in einem Satz zusammenmischst wie in deinen obigen Beschreibungen geschehen dann versteht man es nicht.

Also in gaaaaanz kleinen Schritten beschreiben was das gewünschte Programmverhalten sein soll. In dieser Beschreibung das beobachtete (falsche) Verhalten gaaanz weglassen.

Programm startet
Laufzeit des Programms 0,0 Sekunden Zustand von
Relais:
LED1:
LED2:
Taster1:
Taster2:

Laufzeit des Programms 2 Sekunden Zustand von
Relais:
LED1:
LED2:
Taster1:
Taster2:

Laufzeit des Programms 2,5 Sekunden Zustand von
Relais:
LED1:
LED2:
Taster1:
Taster2:

Laufzeit des Programms 3 Sekunden Zustand von
Relais:
LED1:
LED2:
Taster1:
Taster2:

usw.
Trage den Zustand von jedem einzelnen Bauteil ein "eingeschaltet" "ausgeschaltet"
Beim Taster "gedrückt" "nicht gedrückt"
Es ist schon klar dass es dann verschiedene Abläufe gibt
Taster zu früh / genau richtig / zu spät gedrückt

Das musst du dann in einem zweiten, dritten Ablauf beschreiben.

Die Variante die schneller geht als Text ist ein grafisches Timing-Diagramm.

Also leg los
vgs

Das ist sicherlich nicht wahr.
Es ist eher eine der vielen Durchhalteparolen, für Dokuleseverweigerer.

Befehle:
Nein, in C++ gibt es leider keine Befehle.
Es gibt tausend Dinge, aber keine Befehle.

Initialisierung von Variablen, Konstanten und Instanzen:
Hier muss man 3 Dinge ganz klar auseinander halten:

  1. Deklaration
  2. Definition
  3. Initialisierung

Auch wenn es manchmal in einer Zeile auftaucht, sind es doch 3 völlig unterschiedliche Dinge.

Einer der Vorteile, wenn man Fachpublikationen wie z.B. ein C++ Gundlagenbuch liest ist, dass man sich mit den richtigen Begriffen vertraut macht. Denn erst wenn ALLE die gleichen Begriffe verwenden und unter den Begriffen das gleiche verstehen, ist eine erfolgreiche Kommunikation möglich.

Die Beschreibungen, was das Programm tun soll, habe ich jetzt mindestens 5 mal gelesen, und nicht verstanden.
Liegt es an mir?

Meine Erfahrung sagt:
Malen von Diagrammen:

  1. Programmlaufplan
  2. Datenflussdiagramm
  3. Zeitdiagramm
  4. Zustandsdiagramm
  5. Beziehungsdiagramm (UML)

Bringt Klarheit ins Denken.
Erst wenn die Klarheit gegeben ist, kann man es erfolgreich in Software gießen.

Hallo,
ich hab das schon verstanden, finde die Beschreibung eigentlich nicht so schlecht. Allerdings sehe ich ein Problem. Woher weiß der Bediener welchen Taster er eigentlich drücken soll.?
Es handelt sich doch eigentlich um eine Einschaltverzögerung die mit einem Taster neu gestartet werden kann (reset der Zeit). Wenn die Zeit dann > 2s wird zieht das Relais an, das geht doch super einfach mit millis(). Zusätzlich gibt es den Wechsel von Taster 1 auf Taster 2 der nach einer zufälligen Zeit sein soll.
Also BlinkWithoutDelay anschauen und verstehen. Für die Abfrage der Taster benötigst Du noch eine Flankenerkennung, damit der Bediener nicht ständig den Taster gedrückt halten kann. Das mit dem Entprellen des Tasters kannst Du erst mal vergessen, es ist doch erst mal völlig egal ob der Reset für die Zeit mit der ersten Flanke oder mit einen geprellten Flanke erfolgt.

Fang mal mit der Zeitverzögerung an. Wenn das klappt baust Du den Blinker dazu und lässt Ihn erst mal einfach parallel dazu mit einer LED laufend blinken. Damit hast Du dann erst mal zwei Funktionen unabhängig voneinander (nebenläufig). Dann baust Du den Blinker so um das die Zeiten zufällig in einem bestimmen Bereich verwendet werden. Ich weiß nicht was Dir da so vorschwebt irgedwas zwischen 2 und 10s ? Dann als letzten Schritt nimmst Du die Umschaltung der beiden Taster mit dazu, abhängig davon ob die BlinkLED an oder aus ist fragst Du die eine oder andere Flanke der Taster ab.

Heinz

Du glücklicher!

Also hier der Programmablauf:

Programm startet mit 5 Sekunden Verzögerung

Relais = NO
Taster 1 = 1
Taster 2 = 0
LED 1 = 1
LED 2 = 0
LED 3 = 0

WENN NACH 2 SEKUNDEN Taster 1 nicht gedrückt wird DANN

Relais = NC
Taster1 = 0
Taster2 = 0
LED 1 = 1
LED 2 = 1
LED 3 = 0

WENN nun Taster1 wieder gedrückt wird dann

Relais = NO
Taster1 = 1
Taster 2 = 0
LED1 = 1
LED2 = 0
LED3 = 0

WENN Taster1 losgelassen wird (0) DANN wiederholt sich Schritt 2

nach einem zufällig gesteuerten Zeitraum (randNumber?) wird das ganze so umgeschaltet das nun der Taster2 bedient werden muss. Das ganze also dann so aussehe:

Relais = NO
Taster 1 = 0
Taster 2 = 1
LED 1 = 0
LED 2 = 0
LED 3 = 1

WENN NACH 2 SEKUNDEN Taster 2 nicht gedrückt wird DANN

Relais = NC
Taster1 = 0
Taster2 = 0
LED 1 = 0
LED 2 = 1
LED 3 = 1

WENN nun Taster2 wieder gedrückt wird DANN

Relais = NO
Taster1 = 0
Taster 2 = 1
LED1 = 0
LED2 = 0
LED3 = 1

WENN Taster2 losgelassen wird (0) DANN wiederholt sich Schritt 2

Und dieses soll sich immer wieder wiederholen. Rein zufällig