Pages: [1]   Go Down
Author Topic: Blinken mit Verschiedenen Zeiten ohne delay  (Read 282 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo zusammen,

zu meinem Problem habe ich schon viel gesucht und auch ein bisschen was gefunden, zufrieden war ich damit aber nicht. Außerdem wollte ich das selber hinbekommen smiley Darum frage ich nun hier um Hilfe.

Folgende Situation:
Ich hab eine LED, die ich blinken lassen will. Die Zeiten, zu der sie an bzw. aus ist möchte ich frei wählen können, z.B. 1s an, 4s aus, 3s an, 6s aus und dann das ganze von vorne.
delay scheidet aus, und mit millis bekomme ich das nicht hin.

Mein Ansatz:
Wie bei dem Beispiel "blink without delay" eigentlich. Nur eben dass ich die Zeiten von an/ aus mit der Differenz von currentMillis - previousMillis verrechne. Weil es einfacher ist habe ich das bis jetzt nur mit einer Einschalt- und einer Ausschaltzeit versucht. Wenn das dann funktioniert kann ich die anderen Zeiten ja ergänzen.
Was bis jetzt passiert: Die LED geht an und bleibt an.  smiley-roll-blue
Ist dieser Ansatz möglich oder totaler Quatsch? Wenn das prinzipiell geht, wo liegt mein Fehler?

Code:

const int led1 =  8;      // the number of the LED pin

// Variables will change:
int ledState1 = LOW;             // ledState used to set the LED
long previousMillis1 = 0;        // will store last time LED was updated

long blink1 = 200;           // interval at which to blink (milliseconds)
long pause1 = 100;


void setup() {
  // set the digital pin as output:
  pinMode(led1, OUTPUT);
}


void loop()
{
 
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis1 > blink1 + pause1) {
     
  if (ledState1 == LOW)
     {ledState1 = HIGH;}
  else {ledState1 = LOW;}


    // set the LED with the ledState of the variable:
    digitalWrite(led1, ledState1);
    }




   if(currentMillis - previousMillis1 + blink1 >  pause1 ) {
      previousMillis1 = currentMillis;   

    if (ledState1 == HIGH)
       {ledState1 = LOW;}
    else {ledState1 = HIGH; }

    // set the LED with the ledState of the variable:
    digitalWrite(led1, ledState1);
   }
 

}

Vielen Dank für eure Hilfe!
Simon
Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2450
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich hab eine LED, die ich blinken lassen will. Die Zeiten, zu der sie an bzw. aus ist möchte ich frei wählen können, z.B. 1s an, 4s aus, 3s an, 6s aus und dann das ganze von vorne.
delay scheidet aus, und mit millis bekomme ich das nicht hin.

Ich habe hier mal was für jemanden gepostet, der eine "blinkende Leuchtturm-Karte" machen wollte, auf der jeder Leuchtturm mit seinem eigenen ein-aus-ein-aus-ein-aus Rhythmus blinken kann:
http://forum.arduino.cc/index.php?topic=146086.msg1099068#msg1099068

Schau Dir den Thread mal an.
Logged

Offline Offline
Sr. Member
****
Karma: 4
Posts: 369
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@simon97:  Jurs Vorschlag ist natürlich optimal.  
Zu deinem Ansatz, habe den Sketch etwas verändert.
Kann das gerade nicht testen, ein Versuch kostet ja nicht nichts. ;-)      

Code:
const int led1 =  8;      // the number of the LED pin

// Variables will change:
int ledState1 = LOW;             // ledState used to set the LED
long previousMillis1_on = 0;        // will store last time LED was on
long previousMillis1_off = 0;        // will store last time LED was off

long blink1 = 200;           // interval at which to blink (milliseconds)
long pause1 = 100;


void setup() {
  // set the digital pin as output:
  pinMode(led1, OUTPUT);
}


void loop()
{
 
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis1_on > blink1) {
previousMillis1_off = currentMillis;  
    
 
ledState1=LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(led1, ledState1);
    }




if(currentMillis - previousMillis1_off  >  pause1 ) {
      previousMillis1_on = currentMillis;  

    
    
ledState1= HIGH;

    // set the LED with the ledState of the variable:
    digitalWrite(led1, ledState1);
   }
 

}
« Last Edit: February 07, 2014, 01:49:06 pm by rudirabbit » Logged

Arduino UNO,MEGA,Pro Mini Ethernet Shield

Offline Offline
God Member
*****
Karma: 9
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich würde mir einen Grundtakt suchen - am besten das niedrigste Intervall und dann je nach gewünschtem Intervall mit einem regelbaren Zähler abfragen.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dieses Thema passt sehr gut zu deiner Anfrage.

http://forum.arduino.cc/index.php?topic=215606.0

Mit leichten umschreiben kann man dein Problem damit lösen.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke für eure Hilfe!
@rudirabbit: Bei dem Code geht die LED einfach an und bleibt an :-)
@jurs und PhunThom: Ich hab mir beide Threads durchgeschaut und einige der jeweiligen Vorschläge ausprobiert.
Ich habe mich für den Code des Nutzers Theseus aus dem Thread "blink_without_delay für Fortgeschrittene" entschieden http://forum.arduino.cc/index.php?topic=215606.msg1578721#msg1578721  und an meine Bedürfnisse angepasst, indem ich die Zeiten geändert habe und den Code von drei auf zwei mal Blinken verkürzt habe.

Also nochmal vielen Dank für eure Hilfe und die verschiedenen Lösungsansätze!
Logged

Pages: [1]   Go Up
Jump to: