Go Down

Topic: LED Ausschaltung nach einer bestimmten Zeit (Read 90 times) previous topic - next topic

eric_login

Guten Tag allerseits,


Ich bin relativ neu in der Arduino Welt und bräuchte Unterstützung von euch erfahrenen Programmieren für mein Mini-Projekt.

Folgendes; Ich habe ein Sketch geschrieben welches drei verschiedene LED's ansteuert. Diese sollen  unabhängig voneinander betrieben werden. Jedes LED ist in Verbindung mit einem Taster.

Drückt man diesen einmal so beginnt das LED zu leuchten. Drückt man diesen erneut so hört das LED auf zu leuchten. Ist das LED jedoch aktiviert so soll dies nach einer Stunde selbstständig aufhören zu leuchten.

Ich habe mich intensiv mit diesem Sketch beschäftigt aber ich krieg es einfach nicht hin! Das LED blinkt rum der Taster reagiert auch nicht wirklich und ich bin einfach ratlos da ich dies so schnellst wie möglich fertigstellen sollte. Ich habe vorallem mit der funktion Millis recht probleme und diese nicht wirklich verstanden. Am liebsten hätte ich den Delay genutzt dieses hilft aber leider bei diesem Projekt nicht wirklich viel aus!

Ich hänge hier mal das Sketch an vieelleicht kann mir ja einer helfen :/

Ich bedanke mich schon im vorraus und hoffe das Sketch ist verständlich genug!

Deltaflyer

Ich hab den Sketch hier rasch eingefügt, ist einfacher.

Code: [Select]
// Jeder BB hat einen "Beschäftigt" Knopf am Arbeitsplatz, wird dieser gedrückt so lecuhtet die LED "Beschäftigt" auf der Anzeige sowie beim BB.
// Wird der Taster nochmals gedrückt oder ist eine Stunde vergangen so erlischt die LED wieder.

const int BB_1_Taster = A0;   // Taster von BB1 ist mit A0 verbunden.
const int BB_2_Taster = A1;   // Taster von BB2 ist mit A1 verbunden.
const int BB_3_Taster = A2;   // Taster von BB3 ist mit A2 verbunden.

const int BB_1_LED = 9;       // LED von BB1 ist mit 09 verbunden.
const int BB_2_LED = 10;      // LED von BB2 ist mit 10 verbunden.
const int BB_3_LED = 11;      // LED von BB3 ist mit 11 verbunden.

int BB_1_Taster_Status = 0;   // Liest den Status von BB_1_Taster aus.
int BB_2_Taster_Status = 0;   // Liest den Status von BB_2_Taster aus.
int BB_3_Taster_Status = 0;   // Liest den Status von BB_3_Taster aus.

int BB_1_LED_Status = 0;   // Liest den Status von BB_1_LED aus.
int BB_2_LED_Status = 0;   // Liest den Status von BB_2_LED aus.
int BB_3_LED_Status = 0;   // Liest den Status von BB_3_LED aus.

int period = 0;                   // Dauer für die Entprellungsperiode oder Taster.
int period_LED = 1000;        // Zeit bis zur Selbständigen deaktivierung des LED.
unsigned long zeit_jetzt = 0; // -

boolean on_BB_1 =false;       // Speicher für Selbsthaltung BB_1_LED
boolean on_BB_2 =false;       // Speicher für Selbsthaltung BB_2_LED
boolean on_BB_3 =false;       // Speicher für Selbsthaltung BB_3_LED

void setup() {

  pinMode(BB_1_LED, OUTPUT);  // Pin 09 ist der Signalgeber für BB_1_LED
  pinMode(BB_2_LED, OUTPUT);  // Pin 10 ist der Signalgeber für BB_2_LED
  pinMode(BB_3_LED, OUTPUT);  // Pin 11 ist der Signalgeber für BB_3_LED

  pinMode(BB_1_Taster, INPUT); // Pin A0 ist Signalgeber für Pin 09
  pinMode(BB_1_Taster, INPUT); // Pin A1 ist Signalgeber für Pin 10
  pinMode(BB_3_Taster, INPUT); // Pin A2 ist Signalgeber für Pin 11
 
}

void loop () {
  BB_1_Taster_Status = digitalRead(BB_1_Taster);                    // Steuerung BB 1 Anzeige
  if (BB_1_Taster_Status == LOW) {   
    if(on_BB_1==false){
      on_BB_1=true;
    }  else{
      on_BB_1=false;
    }
  }
 
   if (on_BB_1 == true) {   
    digitalWrite(BB_1_LED, HIGH); 
  }
   if (on_BB_1 == false) {
    digitalWrite(BB_1_LED, LOW);
  }
  {
    zeit_jetzt = millis();
    while(millis() < zeit_jetzt + period){
    }
  }                                                                   // Ende BB 1 Steuerung
  BB_2_Taster_Status = digitalRead(BB_2_Taster);                    // Steuerung BB 2 Anzeige
  if (BB_2_Taster_Status == HIGH) {   
    if(on_BB_2==true){
      on_BB_2=false;
    }  else{
      on_BB_2=true;
    }
  }
 
   if (on_BB_2 == true) {   
    digitalWrite(BB_2_LED, HIGH); 
  }
  else {
    digitalWrite(BB_2_LED, LOW);
  }
    {
    zeit_jetzt = millis();
    while(millis() < zeit_jetzt + period){
    }
  }
                                                                    // Ende BB 2 Steuerung
  BB_3_Taster_Status = digitalRead(BB_3_Taster);                    // Steuerung BB 3 Anzeige
  if (BB_3_Taster_Status == HIGH) {   
    if(on_BB_3==true){
      on_BB_3=false;
    }  else{
      on_BB_3=true;
    }
  }
 
   if (on_BB_3 == true) {   
    digitalWrite(BB_3_LED, HIGH); 
  }
  else {
    digitalWrite(BB_3_LED, LOW);
  }
  {
    zeit_jetzt = millis();
    while(millis() < zeit_jetzt + period){
    }
  }
}                                                                 // Ende BB 3 Steuerung

Whandall

#2
Aug 19, 2019, 01:18 pm Last Edit: Aug 19, 2019, 01:46 pm by Whandall
Code: [Select]
   while(millis() < zeit_jetzt + period){
    }

Blockierend und falsch (funktioniert nicht beim Überlauf von millis).

Der folgende Code schaltet eine LED über eine Taste ein und aus,
nach zehn Sekunden wird die LED automatisch wieder ausgeschaltet.

Code: [Select]
#include <Bounce2.h>

const byte ledPin = 4, tastenPin = 2;
const uint32_t autoOff = 10000L;

Bounce Taste;
bool ledState;
uint32_t ledAnUm;

void setup() {
  pinMode(ledPin, OUTPUT);
  Taste.attach(tastenPin, INPUT_PULLUP);
}

void loop() {
  if (Taste.update()) {
    if (Taste.fell()) {
      ledState = !ledState;
      digitalWrite(ledPin, ledState ? HIGH : LOW);
      if (ledState) {
        ledAnUm = millis();
      }
    }
  }
  if (ledState && millis() - ledAnUm >= autoOff) {
    ledState = false;
    digitalWrite(ledPin, LOW);
  }
}
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

noiasca

hast du pullup oder pulldown Widerstände an deinen Eingängen?

Wenn nein, nimm INPUT_PULLUP und dreh die Logik auf invers um.
DE: Wie man Fragen postet:
1. was hat man (Sketch und Hardware)
2. was SOLL es machen
3. was macht es: IST (Fehlverhalten, Fehlermeldungen, Serial.Output ...)
4. Eine Frage stellen bzw. erklären was man erwartet

Rentner

Hallo,

warum baust du nicht ein paar ausgaben auf dem Monitor ein um zu sehen wo es klemmt.

mach das doch erst mal für eine LED und denk dir einfachere variable aus mit denen wird man ja ganz qwirre in der Birne.

wie hast Du die Taster angeschlossen ,

Minus schaltend -> dann mit pullup Widerstand oder intern
plus schaltend dann mit pulldown Widerstand

Heinz

Deltaflyer

Was mir direkt auffällt : deine While-schleifen
Code: [Select]
while(millis() < zeit_jetzt + period){}
 blockieren die Loop. Darum blinken die LED's auch  und die Buttons reagieren unzuverlässig.
Hättest du period bereits auf eine stunde (statt einer sekunde, wie hier zum test) gesetzt, würde der Arduino nach drücken eines der Buttons für ne Stunde in der 'While' festhängen.


Whandall

Hier eine Variante bei der du für weitere Tasten nur noch die Pins angeben musst.

Code: [Select]
#include <Bounce2.h>

class AutoTaste : public Bounce {
  protected:
    byte pTaste, pLed, pMode;
    bool ledState;
    uint32_t anUm;
  public:
    AutoTaste(byte taste, byte led, byte mode = INPUT_PULLUP) :
      Bounce(), pTaste(taste), pLed(led), pMode(mode), ledState(false), anUm(0) {}
    void begin() {
      pinMode(pLed, OUTPUT);
      attach(pTaste, pMode);
    }
    void process() {
      if (update() && fell()) {
        ledState = !ledState;
        digitalWrite(pLed, ledState ? HIGH : LOW);
        if (ledState) {
          anUm = millis();
        }
      }
      if (ledState && millis() - anUm >= autoOff) {
        ledState = false;
        digitalWrite(pLed, LOW);
      }
    }
    static const uint32_t autoOff;
} Tasten[] = { {2, 4}, };

const uint32_t AutoTaste::autoOff = 10000L;

void setup() {
  for (auto& t : Tasten) {
    t.begin();
  }
}

void loop() {
  for (auto& t : Tasten) {
    t.process();
  }
}
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Go Up