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
Led bei gedrückt gehaltenen Button nur 2 Sekunden leuchten lassen
29.12.2018, 12:13
Beitrag #1
Led bei gedrückt gehaltenen Button nur 2 Sekunden leuchten lassen
Hallo zusammen,
wie im Titel steht habe ich ein Problem, was ich nach stundenlangen versuchen nicht gelöst bekommen habe, da ich mich vorher noch nie mit milllis() auseinandergesetzt habe.
Ich habe einen Sender der wenn man den Button drückt die Zahl 1111 übergibt und wenn er losgelassen wird 0 übergibt. Jetzt soll wenn er gedrückt ist die Led nur für 2 Sekunden angehen, das funtioniert.
Mein Problem:
Der Button rastet ein, die LED geht nicht mehr aus da ja immer ein Signal gesendet wird.Was kann ich da machen?

Mein Empfänger:
Code:
#include <SoftwareSerial.h>

    SoftwareSerial mySerial(2, 3); // RX, TX

    int ledPin = 10;
    int ledPin2 = 11;
    int ledPin3 = 12;
    int ledState = LOW;
    int last;
    int ignitotime = 2000;
    int onOff = 0;

void setup() {

    Serial.begin(9600);
    mySerial.begin(9600);
    pinMode(ledPin, OUTPUT);

}

void loop() {

      int input = mySerial.parseInt();
      Serial.println(input);
      if(input == 1111){
          last = millis();
            onOff = 1;
          
        }
          if(millis() - last < ignitotime){
            digitalWrite(ledPin, HIGH);
        }else {

            digitalWrite(ledPin, LOW);
          }
         if(input == 1111 && onOff == 1){

            if(millis() - last <= 1000){
            onOff = 1;
            }else {
            onOff = 0;
          }
          
        }
        
  }
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2018, 12:36
Beitrag #2
RE: Led bei gedrückt gehaltenen Button nur 2 Sekunden leuchten lassen
Da hast Du 2 Möglichkeiten:

1. Du beseitigst das Problem an der Quelle, also im Sender, d.h. Du sendest nur 1 Mal 1111
2. Du fragst den Enpfänger erst wieder ab, wenn die LED aus ist - die wird dann zwar gleich wieder an gehen, das war aber nicht das gefragte Problem.

Wenn Du nach dem Ausschalten erst wieder eine Weile warten willst, dann setze dort last auf millis und warte. In Deine if (miilis...) solltest Du dann den Status mit einbeziehen:

Den Umgang mit millis() musst Du unbedingt verstehen, da er die Grundlage für viele Programme ist. Schau Dir dazu die Nachtwächtererklärung an und die Erklärung in "Tutorials und Literatur".

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
29.12.2018, 13:01 (Dieser Beitrag wurde zuletzt bearbeitet: 29.12.2018 13:02 von kiefer_dev.)
Beitrag #3
RE: Led bei gedrückt gehaltenen Button nur 2 Sekunden leuchten lassen
Vielen Dank,
ich habe deine erste Option verwendet und es hat geklappt. Mit den Millis werde ich mich auch auseinandersetzen.
Jetzt ist ein Zweites "Problem" aufgetreten oder eher gesagt ein mühseliges, denn ich möchte damit 16 leds ansteuern (also 16 buttons), das heist ich muss im emppfänger 16mal "last" deklarieren und alles 16mal wiederholen, gibt es dafür eine andere Lösung, ich hatte mal es mit einer funktion probiert was aber nicht geklappt hat. Villeicht mit ner schleife?

Gruß
Sebastian
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2018, 13:08
Beitrag #4
RE: Led bei gedrückt gehaltenen Button nur 2 Sekunden leuchten lassen
Dann solltest Du Dir Array anschauen und evtl. struct und Array aus structs
Code:
struct led {
  byte pin;
  bool status;
  uint32_t last;
};

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
29.12.2018, 13:15 (Dieser Beitrag wurde zuletzt bearbeitet: 29.12.2018 14:15 von kiefer_dev.)
Beitrag #5
RE: Led bei gedrückt gehaltenen Button nur 2 Sekunden leuchten lassen
Danke,
nun habe ich ein anderes Problem:
Irgenwann reagiert das System nicht mehr wenn ich den Button drücke.
Liegt das an den Millis, und ja ich lese mich da mal ein


Gruß
Sebastian
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2018, 14:36
Beitrag #6
RE: Led bei gedrückt gehaltenen Button nur 2 Sekunden leuchten lassen
Auch wenn Du den vorherigen Inhalt gelöscht hast, hier eine Anregung:
Code:
struct led {
  byte pin;  // Pin, an dem die Led hängt
  bool status;  // Status true/false = an/aus = HIGH/LOW
  uint32_t last; // lastMillis
  byte code;
  // Kunstruktor nur für die Pins und den Code
  led(byte pin, byte code): pin {pin}, code {code}, status {false}, last {0} {}
};

// Leds an den Pins 10, 11, 12
led leds[] = {{10,B1010}, {11,B1011}, {12, B1100}};
// Berechnung der Anzahl
const byte anzahl = sizeof(leds) / sizeof(leds[0]);
const uint16_t zeit = 2000;

// Hilfsfunktion
void allePrint() {
  for(byte i=0; i<anzahl;i++) {
    Serial.print("Pin: ");Serial.print(leds[i].pin);
    Serial.print(" status: ");Serial.print(leds[i].status? "true":"false");
    Serial.print(" last: ");Serial.print(leds[i].last);
    Serial.print(" code: ");Serial.print(leds[i].code,BIN);
    Serial.println();
  }  
}

void setup() {
  Serial.begin(115200);
  Serial.println("\nStart");
  for(byte i=0; i< anzahl;i++) pinMode(leds[i].pin,OUTPUT);
  Serial.println(anzahl);
  allePrint();
}

void loop() {
uint32_t aktMillis = millis();
  byte input = mySerial.parseInt();
  // Müssen wir LEDs einschalten?
  for (byte i=0; i< anzahl; i++) {
    if (input == leds[i].code) {
      // Code der LED wurde gesendet
      leds[i].status = true;
      leds[i].last = aktMillis;
      digitalWrite(leds[i].pin, HIGH);
      // Da immer nur 1 Code gleichzeitig gesendet werden kann, können wir die Schleife beenden;
    }
  }
  // Müssen wir ausschalten?
  for(byte i=0; i< anzahl; i++) {
    if (leds[i].status && aktMillis - leds[i].last > zeit) {
      // ausschalten
    }    
  }
}

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
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  2 leds Blinken 5 mal 5 Blinken lassen dann 2 andere Leds 5 mal Blinken lassen. Chesleyn 4 205 30.05.2019 14:30
Letzter Beitrag: Chesleyn
  Blynk app über eduroam laufen lassen? WLAN Hanno 6 309 06.04.2019 22:03
Letzter Beitrag: Hilgi
  Button Anzahl erweitern 74HC4051 Andii1980 24 1.764 18.10.2018 23:26
Letzter Beitrag: Andii1980
  Per Tastendruck Stepper-Motor eine bestimmte Drehung machen lassen Chef_2 2 738 09.10.2018 21:59
Letzter Beitrag: Chef_2
  WS2812b LEDs Wellenlänge wiedergeben lassen avoid 3 1.019 04.05.2018 21:56
Letzter Beitrag: avoid
  Servo langsamer drehen und auf position lassen Thor Wallhall 13 5.527 12.04.2018 11:42
Letzter Beitrag: BanditBandeh
  2 Schrittmotoren laufen lassen Reinhard112 20 3.169 09.04.2018 19:16
Letzter Beitrag: Tommy56
  Hold Button - Doppel Klick Hilfe GSA1150 8 2.273 08.03.2018 16:24
Letzter Beitrag: Tommy56
  Button auswerten aggro600 14 2.146 09.11.2017 13:23
Letzter Beitrag: Tommy56
  2 LEDs unabhängig blinken lassen cappy0815 1 1.419 26.09.2017 07:42
Letzter Beitrag: hotsystems

Gehe zu:


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