Hallo, ich habe einen einfachen Sketch für eine Lichterkette bei youtube als Video gefunden und nachdem ich einen Poti zugefügt habe, wollte ich als nächstes das delay "entfernen".
Es ist deutlich zu bemerken, dass die Unterbrechung das Auslesen während der Schleife verhindert.
Sollte ich später andere Varianten hinzufügen und mit Taster abfragen würde genau das ein Problem werden.
Aber ich finde keine Möglichkeit.
Würde mir jemand bitte helfen?
//https://www.youtube.com/watch?v=fFl-ZFbL9Hc&vl=de
//Lauflicht mit einem Punkt
//mit Poti für Taktveränderung
//Auswahl der Ausgänge für die LEDs, 8 Ausgänge
//lässt hier sich erweitern oder verkürzen
int minPin = 6;
int maxPin = 13;
//Poti 10KOhm
int myPin = A0;
int readVal;
float v2;
const long impuls1 = 1;
void setup() {
// put your setup code here, to run once:
for ( int pin = minPin; pin <= maxPin; pin++) {
pinMode(pin, OUTPUT);
}
}
void loop() {
//Poti auslesen
readVal = analogRead(myPin);
v2 = (1) * readVal;
// ein Punkt von rechts nach links
for ( int pin = minPin; pin <= maxPin; pin++) {
digitalWrite(pin, HIGH);
//Original delay(500);
delay (impuls1 * v2 + 30);
digitalWrite(pin, LOW);
}
//Ende loop
}
schau dir als erstes mal das Beispiel "BlinkWithoutDelay" in der IDE an. Lade es hoch, lerne jede Zeile.
Wenn du dann noch Fragen hast - Frage.
https://forum.arduino.cc/index.php?topic=669127.0
Ich hatte das in diesem Beitrag schon einmal versucht.
Aber jetzt durch dieses "for" habe ich das Problem, dass ich nicht weiß, wie ich beide Teile ineinander bringen soll, so dass dieses "for" noch ordentlich funktioniert.
Ich kann diesen URL nicht anklicken. Wenn ich den lesen soll, mach einen Link daraus.
Welche?, die vom Video oder die von meinem anderen Beitrag?
Wie entsteht daraus ein link? Ich habe hier nur ein Fenster ohne Werkzeuge wie in anderen Foren...
du musst das for auflösen.
Was ist das for? du hast eine Zählervariable die hochzählt und entsprechend dieser Variable einen GPIO schaltet . Und es hört auf wenn du dein Maximum erreicht hast. Wegen dem Loop beginnt die For immer wieder.
Genau das baust jetzt in dein BlinkWithoutDelay ein.
im if(millis() ... zählst deine Variable hoch, achtest auf den Überlauf und schaltest entsprechend deine Ausgänge.
Mach mal.
Wenn du Fragen hast - frage. Wenn du Code postest, nur ganzen Code.
Jetzt habe ich ein Blinken und in dem Blinken ein schnelles Durchlaufen der LEDs
Aber ich bin schon weiter als sonst...
//https://www.youtube.com/watch?v=fFl-ZFbL9Hc&vl=de
//Lauflicht mit einem Punkt
//mit Poti für Taktveränderung
//Auswahl der Ausgänge für die LEDs, 8 Ausgänge
//lässt hier sich erweitern oder verkürzen
int minPin = 6;
int maxPin = 13;
//Poti 10KOhm
int myPin = A0;
int readVal;
float v2;
const long impuls1 = 1;
//millis4
unsigned long prevmilles4 = 0;
bool pause4 = LOW;
bool blink4 = LOW;
const long impuls4 = 4;
void setup() {
// put your setup code here, to run once:
for ( int pin = minPin; pin <= maxPin; pin++) {
pinMode(pin, OUTPUT);
}
}
void loop() {
//Poti auslesen
readVal = analogRead(myPin);
v2 = (1) * readVal;
//anfang m4
if (millis() - prevmilles4 >= (v2 + 30)) for ( int pin = minPin; pin <= maxPin; pin++) {
prevmilles4 = millis();
digitalWrite(pin, HIGH);
} else {
for ( int pin = minPin; pin <= maxPin; pin++) {
digitalWrite(pin, LOW);
}
}
//ende m4
//Ende loop
}
ich habe nicht den Eindruck, dass du die Tipps meines Posts umgesetzt hast, aber ok. Jeder ist seines Glückes Schmied.
Ich würde es so machen:
//Lauflicht mit einem Punkt
//mit Poti für Taktveränderung
// schlechtes Beispiel, weil dirty delay auf https://www.youtube.com/watch?v=fFl-ZFbL9Hc&vl=de
// Forum: https://forum.arduino.cc/index.php?topic=671462.0
//Auswahl der Ausgänge für die LEDs, 8 Ausgänge
//lässt hier sich erweitern oder verkürzen
const byte minPin = 6; // const machen, wenn sich Variablen im Sketch nicht ändern sollen/können/dürfen, byte reicht
const byte maxPin = 13;
//Poti 10KOhm
const byte myPin = A0;
void tickLauflicht() // Das Lauflicht bekommt so oft wie möglich einen Tick. Es kümmert sich selbst darum, ob die nächste LED eingeschaltet werden soll
{
// was brauchen wir an Variablen im ticker?
static uint32_t previousMillis = 0; // static, weil die Variable den Durchlauf überleben soll
static byte currentPin = maxPin; // ersetzt den Zähler der for Schleife, ist der aktuelle Pin, auch static, weil wir das im nächsten Durchlauf wieder brauchen,
// wird mit dem Ende des Lauflichts initialisiert, da im Zeitmanagement diese Variable erhöht wird.
int readVal; // reicht im Scope der Funktion, brauchen wir nicht global
uint32_t interval; // der errechnete Intervall für das Lauflicht
// Eingänge auswerten und berechnen
readVal = analogRead(myPin);
interval = readVal + 300; // eine Formel um vom gelesenen Analog-Wert auf einen gewünschten Intervall zu kommen
// Zeitmanagement für das Lauflicht
if (millis() - previousMillis > interval) // so wie im BlinkWithoutDelay Beispiel erklärt
{
digitalWrite(currentPin, LOW); // im Counter steht noch der alte Pin (vom vorhergehenden Durchlauf), das nutzen wir zunächst zum Abschalten des alten Pins
currentPin++; // nächster Pin
if (currentPin > maxPin) currentPin = minPin; // Überlauf behandeln
Serial.print(F("readVal=")); Serial.print(readVal); // nur ein paar Testausgaben, damit wir sehen, was der Sketch so macht
Serial.print (F(" interval=")); Serial.print(interval);
Serial.print(F(" currentPin=")); Serial.println(currentPin);
digitalWrite(currentPin, HIGH); // den neuen Pin einschalten
previousMillis = millis(); // Zeit merken,
}
}
void setup() {
Serial.begin(115200);
Serial.println(F("\nLauflicht"));
for ( byte pin = minPin; pin <= maxPin; pin++) {
pinMode(pin, OUTPUT);
}
}
void loop() {
tickLauflicht();
}
vielen Dank an @noisaca für deine Lösung.
Ja, natürlich ganz anders als ich dachte.
Ich würde gern etwas damit arbeiten und wollte nur erst einmal "reagiert" haben.
Geschwindigkeit anpassen mit anderen Werten bei "interval", Richtung umdrehen usw...
Und dann Taster einbauen, zur Programmauswahl.
Es gibt wirklich viel zu lernen...