INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Aktivierung nur in einer bestimmten Zeit
05.09.2019, 14:21 (Dieser Beitrag wurde zuletzt bearbeitet: 05.09.2019 14:25 von Prospekteur.)
Beitrag #1
Aktivierung nur in einer bestimmten Zeit
Ich möchte folgendes verwirklichen:

Wenn Button1 high ist, soll es möglich sein mit Button2 eine Led inerhalb von 5 Sekunden an und auszuschalten. Wenn nach Aktivierung von Button1, 5 Sekunden verstrichen sind kann auch nicht mehr mit Button2 die Led aus- oder angeschaltet werden.

Wie könnte eine einfache Lösung hierfür aussehen?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.09.2019, 14:24
Beitrag #2
RE: Aktivierung nur in einer bestimmten Zeit
Mit millis(). Schau Dir dazu BlinkWithoutDelay in den Beispielen der IDE an und verstehe es.
Dabei kann die die Nachtwächtererklärung oder die Erklärung in Tutorials und Literatur helfen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.09.2019, 16:21
Beitrag #3
RE: Aktivierung nur in einer bestimmten Zeit
(05.09.2019 14:24)Tommy56 schrieb:  Mit millis(). Schau Dir dazu BlinkWithoutDelay in den Beispielen der IDE an und verstehe es.
Dabei kann die die Nachtwächtererklärung oder die Erklärung in Tutorials und Literatur helfen.

Gruß Tommy

Ich habe mir Deinen Link und die Nachtwächtererklärung nun mal angeschaut und ins Gehirn gebrannt;-). Ich verstehe schon wie die Sache mit den Millis funktioniert.......ist auch nicht soooo schwer zu verstehen. Ich tue mir nur unheimlich schwer den code richtig zu setzen. Die LED in einem bestimmten Zeitraum automatisch einschalten und einen bestimmten Zeitraum brennen lassen funktioniert ganz gut. Jedoch möchte ich die Led so programmieren, das sie eben nur in einem Zeitraum (z.B. 5 Sek.) der nach dem drücken von button1 beginnt, mit button2 aktivierbar ist.

Also button1 wird gedrückt......
millis werden subtrahiert, verglichen und um 5000ms addiert.....
nun soll button2 nur in diesen 5000ms die Led an oder ausschalten können (if,else).

.......Ich bekomme es einfach nicht hin......sitz hier nun schon paar Stunden am rumprobieren und ich denke ohne einen kleinen Beispiel-Code wie sowas aussehen könnte komm ich hier nicht weiter. Eventuell gibt es jemand hier der ähnliches auch schon mal gebraucht hat oder einfach aus dem Stehgreif einen Beispiel-Code hier posten kann;-)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.09.2019, 16:33
Beitrag #4
RE: Aktivierung nur in einer bestimmten Zeit
Dann zeige doch mal, was schon funktioniert.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.09.2019, 17:57
Beitrag #5
RE: Aktivierung nur in einer bestimmten Zeit
(05.09.2019 16:21)Prospekteur schrieb:  Eventuell gibt es jemand hier der ähnliches auch schon mal gebraucht hat oder einfach aus dem Stehgreif einen Beispiel-Code hier posten kann;-)
Weil ich gerade Lust dazu hatte...
Die Button müssen nach GND tasten, wegen INPUT_PULLUP:
   

Der Sketch sieht dann so aus:
Code:
const uint8_t BUTTON1_PIN = 2;
const uint8_t BUTTON2_PIN = 3;
const uint8_t LED_PIN = LED_BUILTIN;
const uint16_t TIME_OUT = 5000;

bool startGame = 0, buttonState = 1;
uint8_t progress = 0;
uint16_t count = 0;
uint32_t startMillis, nowMillis, debounceMillis;

void setup() {
  digitalWrite(LED_PIN, LOW);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(BUTTON1_PIN, buttonState);
  pinMode(BUTTON1_PIN, INPUT_PULLUP);
  digitalWrite(BUTTON2_PIN, buttonState);
  pinMode(BUTTON2_PIN, INPUT_PULLUP);
  Serial.begin(115200);
  Serial.println("Bereit! Bitte Button 1 druecken!");
}

void loop() {
  nowMillis = millis();
  if (!startGame && !digitalRead(BUTTON1_PIN)) {
    startGame = 1;
    startMillis = nowMillis;
    Serial.println("Zeit laeuft...");
  }
  if (startGame && nowMillis - startMillis >= TIME_OUT) {
    startGame = 0;
    digitalWrite(LED_PIN, LOW);
    Serial.println("Zeit ist um!");
    Serial.print("Anzahl: ");
    Serial.println(count);
    Serial.println("Bereit! Bitte Button 1 druecken!");
    count = 0;
  }
  if (startGame && nowMillis - startMillis < TIME_OUT) {
    buttonState = digitalRead(BUTTON2_PIN);
    switch (progress) {
      case 0:
        if (!buttonState) {
          count++;
          digitalWrite(LED_PIN, HIGH);
          progress = 1;
          debounceMillis = nowMillis;
        }
        break;
      case 1:
        if (nowMillis - debounceMillis > 30) progress = 2;
        break;
      case 2:
        if (buttonState) {
          digitalWrite(LED_PIN, LOW);
          progress = 0;
        }
        break;
    }
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.09.2019, 18:48
Beitrag #6
RE: Aktivierung nur in einer bestimmten Zeit
WOW!!! DANKE!!! Das hätte ich nicht ansatzweise hinbekommen. Hätte nicht gedacht, das es so aufwendig ist.

Werde das Morgen gleich mal testen;-)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.09.2019, 15:35 (Dieser Beitrag wurde zuletzt bearbeitet: 06.09.2019 15:46 von MicroBahner.)
Beitrag #7
RE: Aktivierung nur in einer bestimmten Zeit
(05.09.2019 18:48)Prospekteur schrieb:  Hätte nicht gedacht, das es so aufwendig ist.
Naja, da ist ja auch noch einiges mehr drin, als Du jetzt oben als Aufgabe beschrieben hast.
Vielleicht tust Du dich auch mit dem 'EggTimer' aus meinen MobaTools leichter. Da musst Du nicht direkt mit den millis() hantieren.
Das funktioniert wie bei einer Eieruhr: Zeit aufziehen, und dann nachschauen ob die Zeit noch läuft oder abgelaufen ist.
Ich hab das mal als Alternativbeispiel auf deine oben beschriebene Anforderung reduziert: Taster 1 startet das Zeitfenster für die Bedienung, und nur in diesem Zeitfenster kann Taster 2 die Led ein/ausschalten:
Code:
#include <MobaTools.h>

EggTimer freigabeTimer;
const int FREIGABEZEIT = 5000;

const byte BUTTON1_PIN = A0;
const byte BUTTON2_PIN = A1;
const byte LED_PIN = LED_BUILTIN;
const byte FREIGABELED = 9;

bool buttonState2 = HIGH; // Ausgangszustand: nicht gedrückt

void setup() {
  digitalWrite(LED_PIN, LOW);
  pinMode(LED_PIN, OUTPUT);
  pinMode(FREIGABELED, OUTPUT);
  pinMode(BUTTON1_PIN, INPUT_PULLUP);
  pinMode(BUTTON2_PIN, INPUT_PULLUP);
}

void loop() {
  if (!digitalRead(BUTTON1_PIN)) {
    freigabeTimer.setTime( FREIGABEZEIT ); // Freigabezeit starten
    digitalWrite( FREIGABELED, HIGH );
  }
  if ( freigabeTimer.running() ) {
    // Taster 2 nur während der Timerlaufzeit abfragen
    if ( digitalRead(BUTTON2_PIN) != buttonState2 ) {
        // Status Button 2 hat sich geändert
        if ( buttonState2 == HIGH ) {
            digitalWrite( LED_PIN, !digitalRead( LED_PIN ) );
            buttonState2 = LOW;
        } else {
            buttonState2 = HIGH;
        }
    }
  } else {
    digitalWrite( FREIGABELED, LOW );
  }
  delay(20); // kleines delay zum Entprellen
}
Die 'FREIGABELED' braucht man natürlich nicht unbedingt, visualisiert aber, wenn Taster 2 aktiv ist.

Wenn Du es ausprobieren möchtest: Die MobaTools kannst Du einfach über den Bibliotheksverwalter installieren ( oben rechts im Suchfeld 'MobaTools' eingeben ).

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.09.2019, 10:54 (Dieser Beitrag wurde zuletzt bearbeitet: 07.09.2019 11:32 von Prospekteur.)
Beitrag #8
RE: Aktivierung nur in einer bestimmten Zeit
Herzlichen Dank;-)

Sitz heute dran und werde Dein Moba Tool mit dem code antesten;-) Danke das Ihr mir so hilfe leistet! Ich denke es gibt kein besseres deutschsprachiges Arduino Forum!!!

Meld mich wieder wenn alles läuft.......oder nicht läuft;-)

Ok..hab nun in den code meine pinbezeichnungen eingefügt. Wenn ich anschalte ist nun "Soli_8_execute" von Anfang an auf High.

Kann es sein das der code nur mit Input_pullups funktioniert. Meine Kontakte sind nämlich keine Input_pulups sondern externe Pullups (10K Widerstände). Soweit ich weiß sind Input_Pullups auf Low=High und umgekehrt???. Könnte man den code noch entsprechend anpassen oder soll ich alles auf input_pillups umbauen?

Hier der code;-):

Code:
#include <MobaTools.h>

EggTimer freigabeTimer;
const int FREIGABEZEIT = 5000;

const byte contact_10_act_8 = 10;
const byte contact_12_act_40 = 40;
const byte Soli_8_execute = 8;
const byte FREIGABELED = LED_BUILTIN;

bool buttonState2 = HIGH; // Ausgangszustand: nicht gedrückt

void setup() {

  digitalWrite(Soli_8_execute, LOW);
  pinMode(Soli_8_execute, OUTPUT);
  pinMode(FREIGABELED, OUTPUT);
  pinMode(contact_10_act_8, INPUT);
  pinMode(contact_12_act_40, INPUT);
}


  void loop() {

    if (!digitalRead(contact_10_act_8)) {
      freigabeTimer.setTime( FREIGABEZEIT ); // Freigabezeit starten
      digitalWrite( FREIGABELED, HIGH );
    }
    if ( freigabeTimer.running() ) {
      // Taster 2 nur während der Timerlaufzeit abfragen
      if ( digitalRead(contact_12_act_40) != buttonState2 ) {
        // Status Button 2 hat sich geändert
        if ( buttonState2 == HIGH ) {
          digitalWrite( Soli_8_execute, !digitalRead( Soli_8_execute ) );
          buttonState2 = LOW;
        } else {
          buttonState2 = HIGH;
        }
      } else {
        digitalWrite( FREIGABELED, LOW );
      }
      delay(20); // kleines delay zum Entprellen
    }

  }
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Lightbulb Abspielen einer Sounddatei durch Aktivierung eines Bewegungsmelders FeLu 6 242 03.09.2019 20:45
Letzter Beitrag: hotsystems
  delay Zeit falsch golex 9 1.041 24.05.2019 21:18
Letzter Beitrag: GuaAck
  Serielle Ansteuerung einer I2C LCD, Darstellung von Zahlen Peter05 7 817 21.05.2019 21:06
Letzter Beitrag: Bitklopfer
  Programmierung einer Uhr keklik10 6 863 22.04.2019 22:45
Letzter Beitrag: GuaAck
  Auslagern von Code aus einer Bibliothek Blende8 6 669 10.04.2019 20:23
Letzter Beitrag: Tommy56
  Zeit vom Nextion Enhanced mit Arduino auslesen MarkoM 47 4.464 06.03.2019 18:08
Letzter Beitrag: Tommy56
  Schleife bei Zeit x abbrechen BitsAndBytes 7 1.358 23.09.2018 00:30
Letzter Beitrag: BitsAndBytes
  Zeit-Server-Problem 182 19 3.772 07.06.2018 21:42
Letzter Beitrag: ardu_arne
  drei zahlen zu einer zusammen setzen? avoid 10 1.767 06.05.2018 10:55
Letzter Beitrag: avoid
  Wieder mal einer mit serial Probs :-( Bikandajyo 13 1.999 03.03.2018 08:35
Letzter Beitrag: Bikandajyo

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste