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
  Funk Fernbedienung Taster Abfrage kurz oder lange gedrückt Michi_exe 15 594 16.04.2020 17:19
Letzter Beitrag: Tommy56
  Frage zu Uhrzeit auf Display (schneller laufen lassen) ThorstenP 3 319 07.04.2020 14:52
Letzter Beitrag: hotsystems
  Arduino IDE 1.8.11 , lassen sich keine Sketch.zip hinzufügen Christian_Moba-Arduino 4 660 23.02.2020 13:18
Letzter Beitrag: Christian_Moba-Arduino
  Nextion Fehler bei Button Abfrage wenn ich zusätzlich Text sende MarkZero0815 24 1.704 28.01.2020 08:23
Letzter Beitrag: hotsystems
  Arduino zum server telefonieren lassen Penner 42 3 561 27.11.2019 00:54
Letzter Beitrag: Penner 42
  Rotary Encoder - gedrückt und gleichzeitig drehen Gerdchen03 6 680 29.10.2019 10:49
Letzter Beitrag: Tommy56
  Button funktioniert nicht trotz korrekter Schaltung Schneggl 3 727 12.10.2019 08:17
Letzter Beitrag: Schneggl
  Zeitmessung - Taster gedrückt DEL 14 1.559 08.08.2019 21:25
Letzter Beitrag: Bitklopfer
  2 leds Blinken 5 mal 5 Blinken lassen dann 2 andere Leds 5 mal Blinken lassen. Chesleyn 4 1.030 30.05.2019 14:30
Letzter Beitrag: Chesleyn
  Blynk app über eduroam laufen lassen? WLAN Hanno 6 989 06.04.2019 22:03
Letzter Beitrag: Hilgi

Gehe zu:


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