Hilfe nötig bei Schulprojekt!

Hallo liebe Arduino Gemeinde!
Da ich ganz neu bin hier möchte ich mich kurz vorstellen. Mein Name ist Aaron und ich gehe
zurzeit auf eine Techniker Schule in Essen wo wir als erste Klasse in den Genuss gekommen sind Arduino
als Basis zu lernen für unseren Beruflichen weg!
Mir bekannt sind die absoluten Grundlagen daher stoße ich oft auf probleme welche mir leider teilweise den Spaß daran nehmen. Trotz alldem macht es sehr viel Spaß wenn etwas funktioniert und immerhin hab ich es geschafft mit Arduino eine Automatische - Bewässerungsanlage für Tomaten auf die Beine zu stellen :slight_smile:

Nun zu meinem Projekt/Problem:
Es handelt sich um ein größeres Projekt im Allgemeinn aber mein Problem bezieht sich aktuell nur auf einen kleinen Punkt ( das hoffe ich zumindest :smiley: )

Die Funktion ist eigentlich ganz simpel und ich habe auch schon eine menge probiert aber trotzdem komme ich nicht auf die gewünschte Aktion!

Es sollen zwei Leds per Knopfdruck in unterschiedlicher geschwindigkeit blinken. Dabei soll nicht eine permanent blinken wie über (millis) oder nacheinander wie mit einem if case durch den delay.
Sondern einfach Knopf drücken: Leds blinken jeweils in ihrer geschwindigkeit.

So sieht mein aktueller sketch aus den ich aber bereits gefühlte 50 mal verändert habe :frowning:

Lasst euch nicht von ledPinB v/h irritieren das ist ausschließlich ein kreis aufgeteilt in vorne und hinten :wink:


const int buttonPin = 2;
const int ledPinB = 13;
const int ledPinBv = 7;
const int ledPinBh = 10;

int buttonState = 0;

void setup() {

pinMode(ledPinB, OUTPUT);
pinMode(ledPinBv, OUTPUT);
pinMode(ledPinBh, OUTPUT);

pinMode(buttonPin, INPUT);

}

void loop()
{
buttonState = digitalRead(buttonPin);

if (buttonState == HIGH) {
digitalWrite(ledPinB, HIGH);
delay(100);

digitalWrite(ledPinB, LOW);
delay(100);

} else {
digitalWrite(ledPinB, LOW);

(buttonState == HIGH); {
digitalWrite(ledPinBv, HIGH);
digitalWrite(ledPinBh, HIGH);
delay(500);

digitalWrite(ledPinBv, LOW);
digitalWrite(ledPinBh, LOW);
delay(500);

} {
digitalWrite(ledPinBv, LOW);
digitalWrite(ledPinBh, LOW);

}
}
}


Bei der letzten Version des sketch blinkt die eine led in ihrer geschwindigkeit dauerhaft und erst bei knopfdruck die andere dann, wobei die erste wieder ausgeht.

Ich würde mich wahnsinnig freuen wenn Ihr mich unterstützt!
Ich habe die hoffnung/befürchtung das ich nur einen kleinen Denkfehler habe. Aber man kann ja etwas dazu lernen.

Ich benutze ein Arduino Uno.
Ich bedanke mich im vorraus recht herzlich für Eure Unterstütung!!

lg
Aaron

Du musst eben mit millis in if Schleifen arbeiten, nicht mit Delay.

Blinken über millis() wie im BLINK WiTHOUT DELAY Beispiel, Für jedes LED eine eigene Speichervariable für den alten millis() Wert und fürs Intervall.

Und dann das Blinken ein und ausschalten:

loop()
{
buttonState = digitalRead(buttonPin);

if (buttonState == HIGH) {
blinken led 1
blinken led 2
}
else 
{
led 1 aus
led 2 aus
}

Danke erstmal für eure schnellen antworten!
Werde mich jetzt nochmal dran setzen. Bisher habe ich das mit millis nicht hinbekommen aber ich versuche es nochmal! :slight_smile:
Dankeschön!!

ich habe dir mal ein kleines Programm geschrieben, bei dem 2 Led's unabhängig voneinander blinken

const byte led1Pin = 2;
const byte led2Pin = 3;
const unsigned long onZeitLed1  =  500; //ms
const unsigned long offZeitLed1 =  100; //ms
const unsigned long onZeitLed2  =  400; //ms
const unsigned long offZeitLed2 =  400; //ms

void setup()
{
  pinMode(led1Pin,OUTPUT);
  pinMode(led2Pin,OUTPUT);
}

void loop()
{
  digitalWrite(led1Pin,(millis()%(onZeitLed1+offZeitLed1))<onZeitLed1);
  digitalWrite(led2Pin,(millis()%(onZeitLed2+offZeitLed2))<onZeitLed2);
}

Ardubu ich küsse deine Füße das funktioniert schonmal! Es klappt nur noch nicht mit dem Schalter in Verbindung :frowning: mache ich etwas falsch?


const int buttonPin = 2;
int buttonState = 0;

const byte led1Pin = 13;
const byte led2Pin = 9;
const byte led3Pin = 7;
const unsigned long onZeitLed1 = 150; //ms
const unsigned long offZeitLed1 = 150; //ms
const unsigned long onZeitLed2 = 400; //ms
const unsigned long offZeitLed2 = 400; //ms
const unsigned long onZeitLed3 = 400; //ms
const unsigned long offZeitLed3 = 400; //ms
void setup()
{
pinMode(led1Pin,OUTPUT);
pinMode(led2Pin,OUTPUT);
pinMode(led3Pin,OUTPUT);

pinMode(buttonPin, INPUT);
}

void loop()
{
buttonState = digitalRead(buttonPin);

{
if (buttonState == HIGH) {
digitalWrite(led1Pin,(millis()%(onZeitLed1+offZeitLed1))<onZeitLed1);
digitalWrite(led2Pin,(millis()%(onZeitLed2+offZeitLed2))<onZeitLed2);
digitalWrite(led3Pin,(millis()%(onZeitLed3+offZeitLed3))<onZeitLed2);
}
else
{
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, LOW);
digitalWrite(led3Pin, LOW);
}
}
}


Hab meinen Fehler gefunden! :smiley: Input für Schalter war im falschen pin >:(

Also nochmal vielen dank Ardubu hat astrein geklappt!!
Und vielen dank auch den anderen!!

lg

} {
digitalWrite(ledPinBv, LOW);
digitalWrite(ledPinBh, LOW);

}
}
}

Das könnte zwar evtl. richtig sein, solltest du aber nie so machen, weil man nicht gut sehen kann, ob es stimmt.

Das Gemeckere über fehlende Code-Tags hast du sicher schon hier irgendwo gelesen. Gilt für dich natürlich auch :wink:

Viel Glück mit dem Knobeln, wie und warum ardubus Vorschlag funktioniert.

Das BlinkWithoutDelay - Beispiel solltest du zusätzlich verstehen ( ... und also auch auf mehrere LEDs und um einen oder mehrere Taster erweitern können. Erst dann hast du es wirklich verstanden. )
Das kommt ohne den Rest_Der_Division - Operator % aus.

Entschuldige habe einfach den gesamten Code geschickt weil ich den Fehler erst nicht gefunden hab und auch nicht wusste wo ich ansetzen sollte.
Bin ja noch ganz neu :wink:
Ich danke! :slight_smile:

Wenn Du mit den millis() auf Anhieb nicht zurecht kommst, empfehle ich Dir dieses kleine Tutorial ....hier wird das Ganze relativ einfach erklärt :wink:

digitalWrite(led2Pin,(millis()%(onZeitLed2+offZeitLed2))<onZeitLed2);
digitalWrite(led3Pin,(millis()%(onZeitLed3+offZeitLed3))<onZeitLed2);

Bist du sicher, dass die untere Zeile korrekt ist?

... in seinem Fall schon :wink:

const unsigned long onZeitLed2 = 400; //ms
const unsigned long onZeitLed3 = 400; //ms

Deswegen wird die Zeile auch nicht richtiger. Es kommt nur eben bei genau diesen Werten aufs gleiche raus. Und wenn er die Werte mal ändert, wird er schon wiederkommen, zur Fehlersuche.

Zur Verwirrung hat das wahrscheinlich beigetragen weil ein Blinker in zwei kreise aufgeteilt ist daher kommt zweimal das selbe zustande :wink:
Die Werte werden zum glück nicht geändert also alles gut :slight_smile:

aaronbm:
ich gehe zurzeit auf eine Techniker Schule in Essen wo wir als erste Klasse in den Genuss gekommen sind Arduino als Basis zu lernen für unseren beruflichen Weg!

Magst Du mal mehr über diese Projekt erzählen?
Ich bin Essener Dipl. Ing. Rentner und könnte gern Eures Projekt unterstützen...

class Blinker
{
  protected:
  const byte ledPin;
  const unsigned long hellPhase;
  const unsigned long dunkelPhase;
  unsigned long zeitMerker = 0;
  void *sprungZiel = 0; // zustandsmerker

  public:
  Blinker(const byte ledPin,const unsigned long hellPhase,const unsigned long dunkelPhase): ledPin(ledPin),hellPhase(hellPhase),dunkelPhase(dunkelPhase){}

  void run(const bool blinkAnforderung)
  {
    if(!sprungZiel) sprungZiel = &&Start;
    goto *sprungZiel;

    Start:
    if(!blinkAnforderung) return;
    digitalWrite(ledPin,HIGH);
    sprungZiel = &&HellPhase;
    zeitMerker = millis();
    
    HellPhase:
    if(millis()-zeitMerker<hellPhase) return;
    digitalWrite(ledPin,LOW);
    sprungZiel = &&DunkelPhase;
    zeitMerker = millis();
  
    DunkelPhase:
    if(millis()-zeitMerker<dunkelPhase) return;
    sprungZiel = 0;
  }
  
  void init()
  {
    pinMode(ledPin,OUTPUT);
  }
};


const byte taster     = 2;
Blinker blinkGruppe[] = { // {pin,hellzeit,dunkelzeit}
                          {13,100, 500},
                          {12,500,1000},
                        };




void setup() 
{
  pinMode(taster,INPUT_PULLUP);
  for(Blinker &blinker:blinkGruppe) blinker.init();
}

void loop() 
{
  bool blinkAnforderung = !digitalRead(taster);
  for(Blinker &blinker:blinkGruppe) blinker.run(blinkAnforderung);
}

Ist das: "Mit Kanonen auf Spatzen schießen?"

Vielleicht...

Aber, ich kann durchnummerierte Variablen nicht leiden!
Kann sie nicht leiden........

Bekomme schon fast körperliche Schmerzen, wenn ich sie sehe.

RIN67630:
Magst Du mal mehr über diese Projekt erzählen?
Ich bin Essener Dipl. Ing. Rentner und könnte gern Eures Projekt unterstützen...

Hab Ihnen eine PN geschickt!