Ich habe eine Schaltung zur Übung gesteckt. Es sollen zwei LEDs unabhängig voneinander blinken.
Mit "millis" habe ich das auch hinbekommen.
Allerdings fällt mir auf, das die LED immer genauso lang AN wie AUS ist.
Ich möchte aber letztendlich eine LED blinken lassen (also AN = AUS)
und eine soll blitzen (also kurz AN ... lange AUS)
cappy0815:
...
Ich möchte aber letztendlich eine LED blinken lassen (also AN = AUS)
und eine soll blitzen (also kurz AN ... lange AUS)
...
Die Schaltung hast Du ja scheinbar richtig hinbekommen. Was Du möchtest, betrifft den Sketch bzw. das Programm. Zeig am besten mal, was Du bisher hast. Fasse es in „Code-Tags“, damit es les- und scrollbar ist (im Editor ganz linkes Icon).
Hallo,
das ihr da nicht selbst nach suchen könnt...
// each "event" (LED) gets their own tracking variable
unsigned long previousMillisTonLED=0;
unsigned long previousMillisPauseLED=0;
// different intervals for each LED
int intervalTonLED = 500;
int intervalPauseLED = 1000;
// each LED gets a state varaible
boolean PauseLEDstate = false; // the LED will turn ON in the first iteration of loop()
boolean TonLEDstate = false; // need to seed the light to be OFF
void setup() {
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
}
void loop() {
// get current time stamp
// only need one for both if-statements
unsigned long currentMillis = millis();
// time to toggle LED on Pin 12?
if ((unsigned long)(currentMillis - previousMillisTonLED) >= intervalTonLED) {
TonLEDstate = !TonLEDstate;
digitalWrite(12, TonLEDstate);
// save current time to pin 12's previousMillis
previousMillisTonLED = currentMillis;
}
// time to toggle LED on Pin 13?
if ((unsigned long)(currentMillis - previousMillisPauseLED) >= intervalPauseLED) {
PauseLEDstate = !PauseLEDstate;
digitalWrite(13, PauseLEDstate);
// save current time to pin 12's previousMillis
previousMillisPauseLED = currentMillis;
}
}
Ich würde meine LED-Ausgänge einfach ledPin1 und ledPin2 nennen.
(Mir fällt gerade auf, dass bei zwei Ausgängen ja auch einfach beide im Programm nacheinander behandelt werden können ... Naja ... aber auch Prinzip, um es zuverstehen) ...
Also würde ich es quasi so tun ...
for (int i = 0; i < 2; i = i + x){
if { ... dann ledState[i] = HIGH ...
digitalWrite(ledPin[i], ledState);
if (i == 2) x = 0;
}
... das soll jeweils der hochgezählte Wert sein. Ist das vom Ansatz her einigermaßen sinnig? Cappy
Ich dachte mir, dass ich die if-Schleife irgendwie in eine Funktion packe, die dann für beide LEDs per Parameter die Millis abfragt ...
Auch eine nette Alternative zur Schleife über beide Led.
Hat den kleinen Nachteil, dass die Funktion jedesmal ihr eigenes previousMillis braucht und das auch noch ändern muss.
Da kannst du schön lernen, wie man eine class schreibt.
Wenn dich das erstmal erschreckt: Gib previousMillis als Parameter mit (als Referenz, weil es geändert wird)
z.B. so
boolean blink(unsigned int an, unsigned int zyklus, unsigned long & prevtime) {
if (millis() - prevtime >= zyklus) {
prevtime += zyklus;
}
if (millis() - prevtime < an) return true;
else return false;
}
unsigned long prevtime1, prevtime2;
void loop() {
digitlaWrite (led1Pin, blink(20, 2000, prevtime1)); // ein Blitz alle 2 sec
digitlaWrite (led2Pin, blink(100, 200, prevtime2)); // 50:50 mit 5 Hz
}
Ich habe hier ein Beispiel für eine sehr einfache Klasse
Es geht auch einfacher, und braucht auch keine Extra-Dateien
class Blink {
private:
unsigned long prevtime;
unsigned int zyklus;
unsigned int an;
public:
Blink(unsigned int _an, unsigned int _zyklus) { zyklus=_zyklus; an = _an;}
boolean currentState () {
// sollte häufig aufgerufen werden, damit der jeweils aktuelle Zustand zurückgeliefert wird
if (millis() - prevtime >= zyklus) {
prevtime = millis();
}
if (millis() - prevtime < an) return true;
else return false;
}
};
Blink blitz(20,2000); // ein Blitz alle 2 sec
Blink schnell(100,200); // 50:50 mit 5 Hz
void loop() {
digitalWrite(led1Pin, blitz.currentState() );
digitalWrite(led2Pin, schnell.currentState() );
}
michael_x:
Es geht auch einfacher, und braucht auch keine Extra-Dateien
Musste die LED-Pins noch 'einarbeiten', dann lässt sich das Programm zu 960 Byte kompilieren.
Leider weigert sich gerade meine USB-Schnittstelle, dem UNO was Anderes beizubringen ...
class Blink {
private:
unsigned long prevtime;
unsigned int zyklus;
unsigned int an;
public:
Blink(unsigned int _an, unsigned int _zyklus) { zyklus=_zyklus; an = _an;}
boolean currentState () {
// sollte häufig aufgerufen werden, damit der jeweils aktuelle Zustand zurückgeliefert wird
if (millis() - prevtime >= zyklus) {
prevtime = millis();
}
if (millis() - prevtime < an) return true;
else return false;
}
};
Blink blitz(20,2000); // ein Blitz alle 2 sec
Blink schnell(100,200); // 50:50 mit 5 Hz
void setup(){
#define led1Pin 2
#define led2Pin 13
}
void loop() {
digitalWrite(led1Pin, blitz.currentState() );
digitalWrite(led2Pin, schnell.currentState() );
}
#define Makros haben keinen Scope und sind immer immer global. Egal wo sie stehen. Und werden vor dem Compilieren abgearbeitet. Zur Laufzeit wird da nichts gemacht.
Die in setup() zu schreiben verwirrt da eher nur
Hallo,
habe mir den Sketch (oder war es das Sketch?) geschnappt, um zu verstehen...
Ergänzt um die Leds, Pin 10 und Pin 8.
hier der Sketch, daran anschliessend die Fehlermeldung.
die Fehlermeldung kann ich nicht aufdröseln, resp. versteh ich nicht.
byte led1Pin=10;
byte led2Pin= 8;
class Blink {
private:
unsigned long prevtime;
unsigned int zyklus;
unsigned int an;
public:
Blink(unsigned int _an, unsigned int _zyklus) { zyklus=_zyklus; an = _an;}
boolean currentState () {
// sollte häufig aufgerufen werden, damit der jeweils aktuelle Zustand zurückgeliefert wird
if (millis() - prevtime >= zyklus) {
prevtime = millis();
}
if (millis() - prevtime < an) return true;
else return false;
}
};
Blink blitz(20,2000); // ein Blitz alle 2 sec
Blink schnell(100,200); // 50:50 mit 5 Hz
void loop() {
digitalWrite(led1Pin, blitz.currentState() );
digitalWrite(led2Pin, schnell.currentState() );
}
Fehlermeldung:
C:\Users\JK\AppData\Local\Temp\cciUVOhx.ltrans0.ltrans.o: In function `main':
C:\Users\JK\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.20\cores\arduino/main.cpp:43: undefined reference to `setup'
collect2.exe: error: ld returned 1 exit status
exit status 1
Fehler beim Kompilieren für das Board Arduino/Genuino Uno.
Was habe ich übersehen, vergessen oder fehlt mir?
Danke schon jetzt.
Flötzinger
Ahh, Danke postmaster-ino.
Sehe jetzt auch, dass viele Wege ( Klaus ww sein trick) zum erfolg führen.
Nun, experimentiert, 3 LEDs blinken/ blitzen nun unterschiedlich.
Klasse.
THX.