erster Versuch

erster Versuch mich mit "ohne delay" und Taster beschäftigen...

Aber der Taster ist noch etwas verzögert.
Als nächstes möchte ich dann verschiedenen Muster mit Umschalter versuchen.

// Versuch mit lillis und vielen Unterbrechungen zu arbeiten
// LED lichterkette 4 Ausgänge
//Poti zum Takt einstellen
//Umschalter auf Eingang 2+3


//Taster+Umschalter
int tasterPin = 2;

// Poti
int myPin=A2;
int readVal;
float V2;

//m1
unsigned long pm1=0;
int p1=LOW;
const long i1=1;

//m2
unsigned long pm2=0;
int p2=LOW;
const long i2=2;

//m3
unsigned long pm3=0;
int p3=LOW;
const long i3=3;

//m4
unsigned long pm4=0;
int p4=LOW;
const long i4=4;

//msp
unsigned long pmsp=0;
int psp=LOW;
const long isp=500;

// 4 LED Ausgänge
const int ledPin13=13;
int ledState13 = LOW;

const int ledPin12=12;
int ledStat12  = LOW;

const int ledPin11=11;
int ledStat11  = LOW;

const int ledPin10=10;
int ledStat10  = LOW;

const int ledPin9=9;
int ledStat9  = LOW;



void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
//Taster+Umschalter
pinMode(tasterPin,INPUT);

// 4 LED Ausgänge  
  pinMode(ledPin13, OUTPUT);
  pinMode(ledPin12, OUTPUT);
  pinMode(ledPin11, OUTPUT);
  pinMode(ledPin10, OUTPUT);

  pinMode(ledPin9, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

//Taster+Schalter auslesen
//if (digitalRead (tasterPin) == HIGH){
//Serial.println("Taster an");
//}else {
//Serial.println("Taster aus");
//}

//Poti auslesen
readVal=analogRead(myPin);
V2=(1)*readVal;

//anfang m1
{ unsigned long cm1=millis();
if (cm1 - pm1 >= (i1*V2+30)) {
pm1 = cm1;
if (p1 == LOW) {
p1 = HIGH;}
else {p1 = LOW; }}
digitalWrite(ledPin13,p1);}
//ende m1

//anfang m2
{ unsigned long cm2=millis();
if (cm2 - pm2 >= (i2*V2+30)) {
pm2 = cm2;
if (p2 == LOW) {
p2 = HIGH;}
else {p2 = LOW; }}
digitalWrite(ledPin12,p2);}
//ende m2

//anfang m3
{ unsigned long cm3=millis();
if (cm3 - pm3 >= (i3*V2+30)) {
pm3 = cm3;
if (p3 == LOW) {
p3 = HIGH;}
else {p3 = LOW; }}
digitalWrite(ledPin11,p3);}
//ende m3

//anfang m4
{ unsigned long cm4=millis();
if (cm4 - pm4 >= (i4*V2+30)) {
pm4 = cm4;
if (p4 == LOW) {
p4 = HIGH;}
else {p4 = LOW; }}
digitalWrite(ledPin10,p4);}
//ende m4

//anfang msp
{ unsigned long cmsp=millis();
if (cmsp - pmsp >= isp) {
pmsp = cmsp;
if (psp == LOW) {
psp = HIGH;
Serial.println(V2);

if (digitalRead (tasterPin) == HIGH){
Serial.println("Taster an");

digitalWrite(ledPin9, HIGH);
}else {digitalWrite(ledPin9, LOW);}
}
}

//ende msp

//anfang msp fuer Taster
{ unsigned long cmsp=millis();
if (cmsp - pmsp >= isp) {
pmsp = cmsp;
if (psp == LOW) {
psp = HIGH;

//Taster+Schalter auslesen
if (digitalRead (tasterPin) == HIGH){
Serial.println("Taster an");
}

}else {Serial.println("Taster aus");
}

//Serial.println(V2);
}else {psp = LOW; }}
}
//ende msp fuer Taster




//Ende Schleife

}

Was soll uns dieser Beitrag sagen?
Wenn Du den Code ordentlich einrückst (+T in der IDE hilft Dir dabei) ist er auch für Dich besser lesbar.

Gruß Tommy

Hallo,
etwas unübersichtlich ist es noch :slight_smile: ich denke es sind mehere unabhängige Blinker mit verschiedene Blinkzeiten.

drei Anmerkungen noch dazu

  1. Du verwendest z.B

int p1 = LOW;

int ist eigendlich ein integer Zahlenwert, was du hier haben willst ist eine Stausvariable die den Wert HIGH oder LOW annehmen kann, da wäre eine bool Variable besser geeignet. (false /true)

  1. es gibt unnötige Klammern jeweils vor und irgendwo am ende des jeweiligen Blocks

{ unsigned long cm1 = millis();

vermutlich bist Du damit etwas durcheinander geraten.

  1. die Variablen cm1 bis cm4 kannst Du dir eigendlich sparen und Anstelle dessen direkt millis() verwenden.

könnte dann so aussehen

 //anfang m1
  if (millis() - pm1 >= (i1 * V2 + 30)) {
    pm1 = millis();
    if (p1) { 
      p1 = false;
    }
    else {
      p1 = true;
    }
  }
  digitalWrite(ledPin13, p1);
 //ende m1

Da du jetzt mehrfach den fast identischen Code verwendet hast könnte eine der nächsten Übungen darin bestehen daraus eine Blink-Funktion zu machen die Du mehrfach aufrufen kannst. Nächster Schritt könnte dann die Verwendung eine Struktur oder eine Klasse sein.

Ganz bescheiden hier ein Link auf mein Geschreibsel.

Heinz

Tommy56:
Was soll uns dieser Beitrag sagen?
Wenn Du den Code ordentlich einrückst (+T in der IDE hilft Dir dabei) ist er auch für Dich besser lesbar.

Gruß Tommy

Das war mein erster Beitrag hier und ich wollte einfach mal meinen Zwischenstand veröffentlichen um Hinweise, wie die von oben zu bekommen.

Mit Hilfe meiner kleinen Platinen, LEDs und Schalter werden dann verschiedene Versuche erfolgen. natürlich bin ich mir bewusst, dass die Summe immer mehr ist als wenn dann später noch mal konzentriert entwickelt wird.

Danke und Gruß zurück

Hier noch ein Bild:

Hi

Dann noch als Tipp:
Nimm sprechende Variablen!!
m1 ... m4 ... joha ... irgend Was mit 'M' und davon wohl 4 Stück ...
Kommentare ... in einem Jahr weiß Niemand mehr, was Du Dir Da gedacht hast - schreibe, was die Zeile machen SOLL, NICHT, was Sie macht!
Datentypen - wurden schon angesprochen - nur so groß, wie nötig - jedes nicht gelesene Byte spart Dir Zeit.
Mache const, was konstant ist - z.B. Pin-Nummern - Die werden Sich während der Ausführung nicht ändern - feste Zeiten - bei mir z.B. ein Herzschlag - also wiederkehrende Funktionen (LED aufblinken lassen, ein 'Hallo' per seriellem Monitor - daß man sieht, der Arduino lebt noch) bekommen bei mir die 'Wartezeit' als konstanten Wert (... 8000ms macht sich ganz gut ...)

Wer ist i2, was bedeutet das 'p' bei pm1 ... wird wohl auch 4 Stück davon geben ... V2 (in Groß??) und die 'magic number' 30 ... Was macht Die?

Leerzeilen in Maßen!!
Mehr als Eine 'am Stück' braucht kein Mensch.
STRG+T in der IDE rückt den Code auf Klammer-Ebene ein - man findet Klammer-Fehler wesentlich einfacher!
Auch sollte man sich eine einheitliche Klammersetzung angewöhnen, wobei hier die Meinungen auseinander gehen.

if (x==1){
  //tue irgend etwas
}else{
  //tue Etwas, wenn Das nicht zutrifft
}

Bei mir steht die eröffnende Klammer in der Zeile, Die den Block 'erzeugt'.
Auch stehen beide Klammern in der gleichen Zeile, wie das ELSE (oder else if) - wenn man den Kram auf 3 Zeilen ausüfern lässt, braucht man auch keine Leerzeilen mehr einsparen ... meiner Meinung nach - muß dann aber mit meiner Unlust leben, daß ich mir den Kram nur widerwillig ansehe und ... mit Schelte von mir rechnen.

MfG

So jetzt erst einmal etwas Ordnung geschaffen:

//test milles neu
// LED  4 Ausgänge
//Poti zum Takt einstellen
//Umschalter auf Eingang 2+3, 3 oder 4

//Taster+Umschalter
int tasterPin2 = 2;
//int tasterPin3 = 3;
//int tasterPin4 = 4;
//int tasterPin5 = 5;

// Poti
int myPin = A2;
int readVal;
float V2;

//millis1
unsigned long prevmilles1 = 0;
bool pause1 = LOW;
const long impuls1 = 1;

//millis2
unsigned long prevmilles2 = 0;
bool pause2 = LOW;
const long impuls2 = 2;

//millis3
unsigned long prevmilles3 = 0;
bool pause3 = LOW;
const long impuls3 = 3;

//millis4
unsigned long prevmilles4 = 0;
bool pause4 = LOW;
const long impuls4 = 4;

//millispuls
unsigned long pmsp = 0;
bool psp = LOW;
const long isp = 500;

// 4 LED Ausgänge
const int ledPin13 = 13;
int ledState13 = LOW;

const int ledPin12 = 12;
int ledStat12  = LOW;

const int ledPin11 = 11;
int ledStat11  = LOW;

const int ledPin10 = 10;
int ledStat10  = LOW;

//const int ledPin9 = 9;
//int ledStat9  = LOW;




void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  //Taster+Umschalter
  pinMode(tasterPin2, INPUT);
  // pinMode(tasterPin3, INPUT);
  // pinMode(tasterPin4, INPUT);
  // pinMode(tasterPin5, INPUT);

  // 4 LED Ausgänge
  pinMode(ledPin13, OUTPUT);
  pinMode(ledPin12, OUTPUT);
  pinMode(ledPin11, OUTPUT);
  pinMode(ledPin10, OUTPUT);

  //  pinMode(ledPin9, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

  //Poti auslesen
  readVal = analogRead(myPin);
  V2 = (1) * readVal;

  //anfang m1
  if (digitalRead (tasterPin2) == HIGH) {
    if (millis() - prevmilles1 >= (impuls1 * V2 + 30)) {
      prevmilles1 = millis();
      if (pause1) {
        pause1 = false;
      }
      else {
        pause1 = true;
      }
    }
  }
  digitalWrite(ledPin13, pause1);
  //ende m1

  //anfang m2
  if (millis() - prevmilles2 >= (impuls2 * V2 + 30)) {
    prevmilles2 = millis();
    if (pause2) {
      pause2 = false;
    }
    else {
      pause2 = true;
    }
  }
  digitalWrite(ledPin12, pause2);
  //ende m2

  //anfang m3
  if (millis() - prevmilles3 >= (impuls3 * V2 + 30)) {
    prevmilles3 = millis();
    if (pause3) {
      pause3 = false;
    }
    else {
      pause3 = true;
    }
  }
  digitalWrite(ledPin11, pause3);
  //ende m3

  //anfang m4
  if (millis() - prevmilles4 >= (impuls4 * V2 + 30)) {
    prevmilles4 = millis();
    if (pause4) {
      pause4 = false;
    }
    else {
      pause4 = true;
    }
  }
  digitalWrite(ledPin10, pause4);
  //ende m4




}

Muss noch nachschauen, warum der Ausgang 13 immer den Zustand behält, je nachdem, wann der Taster losgelassen wurde?
Muss noch Widerstände einlöten, damit ich andere Eingänge benutzen kann...
(hab nicht immer Zeit dafür)

Kleiner Tipp: Für Pins genügt byte anstelle von int und für Zustände (an/aus, HIGH/LOW, true/false) bool (abgebildet auf byte).

Gruß Tommy

Ich setzt jetzt mal diese Quelle als Beispiel rein, weil, wie soll ich was lernen, wenn ich ständig auf Sachen korrigiert werde, die ich selbst von anderen Quellen so übernommen habe?

Merke: Nicht alles, was in irgendwelchen Beispielen steht, muss der Weisheit letzter Schluss sein.

Aber wenn der Herr sich beleidigt fühlt, weil er Tipps zur Verbesserung erhält, können wir uns ja weitere Antworten sparen.

Gruß Tommy

wie soll ich was lernen, wenn ich ständig auf Sachen korrigiert werde, die ich selbst von anderen Quellen so übernommen habe?

  1. du lernst deine Quellen besser auszuwählen.
  2. Nobody is perfect, und selbst der nicht zu 100%
  3. so wirst du besser als alle deine Vorkauer
  4. du lernst die Prinzipien aus solchen Tutorials heraus zu destilieren und in deinen eigenen Stil zu integrieren

Ordnung ist gut!
Übersicht auch.
Jeder Schritt in diese Richtung ist ein guter Schritt.
Aber meist nicht der Letzte.
Also nicht geknickt fühlen, sondern weiter gehen.

//millis1

unsigned long prevmilles1 = 0;
bool pause1 = LOW;
const long impuls1 = 1;

//millis2
unsigned long prevmilles2 = 0;
bool pause2 = LOW;
const long impuls2 = 2;

//millis3
unsigned long prevmilles3 = 0;
bool pause3 = LOW;
const long impuls3 = 3;

//millis4
unsigned long prevmilles4 = 0;
bool pause4 = LOW;
const long impuls4 = 4;

//millispuls
unsigned long pmsp = 0;
bool psp = LOW;
const long isp = 500;

// 4 LED Ausgänge
const int ledPin13 = 13;
int ledState13 = LOW;

const int ledPin12 = 12;
int ledStat12  = LOW;

const int ledPin11 = 11;
int ledStat11  = LOW;

const int ledPin10 = 10;
int ledStat10  = LOW;

//const int ledPin9 = 9;
//int ledStat9  = LOW;

Das nenne ich "Wiederholungsgruppen".
Meist macht es Sinn diese in Strukturen/Klassen zu stopfen und dann in Arrays zusammenzufassen.

Damit erledigt sich auch das Fehlerträchtige Copy&Paste von Programmstrecken und das unsägliche durchnummerieren von Variablen, Konstanten und Pins automatisch gleich mit.

Tommy56:
Merke: Nicht alles, was in irgendwelchen Beispielen steht, muss der Weisheit letzter Schluss sein.

Aber wenn der Herr sich beleidigt fühlt, weil er Tipps zur Verbesserung erhält, können wir uns ja weitere Antworten sparen.

Gruß Tommy

Nein, ganz im Gegenteil, falls du das falsch verstanden hast. Ich bin wirtlich dankbar für jede Hilfe, die ich hier bekomme. Eher bin ich etwas unschlüssig wegen der anderen Quellen. Also macht weiter so!

//test milles neu ohne delay
//jedes millis anderer Takt
// LED  4 Ausgänge +1
//Poti zum Takt einstellen
//Umschalter auf Eingang 2, 3, 4, 5

//Taster+Umschalter
byte tasterPin2 = 2;
byte tasterPin3 = 3;
byte tasterPin4 = 4;
byte tasterPin5 = 5;

// Poti
int myPin = A2;
int readVal;
float v2;

//millis1
unsigned long prevmilles1 = 0;
bool pause1 = LOW;
bool blink1 = LOW;
const long impuls1 = 1;

//millis2
unsigned long prevmilles2 = 0;
bool pause2 = LOW;
bool blink2 = LOW;
const long impuls2 = 2;

//millis3
unsigned long prevmilles3 = 0;
bool pause3 = LOW;
bool blink3 = LOW;
const long impuls3 = 3;

//millis4
unsigned long prevmilles4 = 0;
bool pause4 = LOW;
bool blink4 = LOW;
const long impuls4 = 4;

//millispuls
unsigned long pmsp = 0;
bool psp = LOW;
const long isp = 500;

// 4 LED Ausgänge
const byte ledPin13 = 13;
bool ledState13 = LOW;

const byte ledPin12 = 12;
bool ledStat12  = LOW;

const byte ledPin11 = 11;
bool ledStat11  = LOW;

const byte ledPin10 = 10;
bool ledStat10  = LOW;

const byte ledPin9 = 9;
bool ledStat9  = LOW;




void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  //Taster+Umschalter
  pinMode(tasterPin2, INPUT);
  pinMode(tasterPin3, INPUT);
  pinMode(tasterPin4, INPUT);
  pinMode(tasterPin5, INPUT);

  // 4 LED Ausgänge
  pinMode(ledPin13, OUTPUT);
  pinMode(ledPin12, OUTPUT);
  pinMode(ledPin11, OUTPUT);
  pinMode(ledPin10, OUTPUT);

  pinMode(ledPin9, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

  //Poti auslesen
  readVal = analogRead(myPin);
  v2 = (1) * readVal;

  //anfang m1
  if (millis() - prevmilles1 >= (impuls1 * v2 + 30)) {
    prevmilles1 = millis();
    if (pause1) {
      pause1 = false;
    } else {
      pause1 = true;
    }
  } else {
    digitalWrite(ledPin13, LOW);

    //Serial.println(pause1);

    //ende m1

    //anfang m2

    if (millis() - prevmilles2 >= (impuls2 * v2 + 30)) {
      prevmilles2 = millis();
      if (pause2) {
        pause2 = false;
      } else {
        pause2 = true;
      }
    } else {
      digitalWrite(ledPin12, LOW);
    }

    // digitalWrite(ledPin12, pause2);
    //ende m2

    //anfang m3
    if (millis() - prevmilles3 >= (impuls3 * v2 + 30)) {
      prevmilles3 = millis();
      if (pause3) {
        pause3 = false;
      } else {
        pause3 = true;
      }
    } else {
      digitalWrite(ledPin11, LOW);
    }
    //   digitalWrite(ledPin11, pause3);
    //ende m3

    //anfang m4
    if (millis() - prevmilles4 >= (impuls4 * v2 + 30)) {
      prevmilles4 = millis();
      if (pause4) {
        pause4 = false;
      } else {
        pause4 = true;
      }
    } else {
      digitalWrite(ledPin10, LOW);
    }
  }
  // digitalWrite(ledPin10, pause4);
  //ende m4

  if (digitalRead (tasterPin2) == HIGH) {
    digitalWrite(ledPin9, HIGH);
  } else {
    digitalWrite(ledPin9, LOW);
  }

  //Auswertung1
  if (digitalRead (tasterPin2) == HIGH) {
    digitalWrite(ledPin13, pause1);
  }
  //Auswertung2
  if (digitalRead (tasterPin3) == HIGH) {
    digitalWrite(ledPin12, pause2);
  }
  //Auswertung3
  if (digitalRead (tasterPin4) == HIGH) {
    digitalWrite(ledPin11, pause3);
  }
  //Auswertung4
  if (digitalRead (tasterPin5) && (pause1) == HIGH) {
    digitalWrite(ledPin10, pause4);
  }
}

So, letzter Versuch, Taster schalten jetzt LEDs mit Takt, alles ohne delay und mit einstellbarem Takt.
Thema Array dann beim nächsten Versuch mit Lichterkette und einem neuen Thema, wenn ich so weit bin, was noch etwas dauern wird...

Darf ich?

if (pause2) {

pause2 = false;
      } else {
        pause2 = true;
      }

Tipp:

pause2 = not pause2;

// oder 
pause2 = !pause2;

combie:
Darf ich?

Tipp:

pause2 = not pause2;

// oder
pause2 = !pause2;

Danke, hab ich noch eingegefügt:

//test milles neu ohne delay
//jedes millis anderer Takt
// LED  4 Ausgänge +1
//Poti zum Takt einstellen
//Umschalter auf Eingang 2, 3, 4, 5

//Taster+Umschalter
byte tasterPin2 = 2;
byte tasterPin3 = 3;
byte tasterPin4 = 4;
byte tasterPin5 = 5;

// Poti
int myPin = A2;
int readVal;
float v2;

//millis1
unsigned long prevmilles1 = 0;
bool pause1 = LOW;
bool blink1 = LOW;
const long impuls1 = 1;

//millis2
unsigned long prevmilles2 = 0;
bool pause2 = LOW;
bool blink2 = LOW;
const long impuls2 = 2;

//millis3
unsigned long prevmilles3 = 0;
bool pause3 = LOW;
bool blink3 = LOW;
const long impuls3 = 3;

//millis4
unsigned long prevmilles4 = 0;
bool pause4 = LOW;
bool blink4 = LOW;
const long impuls4 = 4;

//millispuls
unsigned long pmsp = 0;
bool psp = LOW;
const long isp = 500;

// 4 LED Ausgänge
const byte ledPin13 = 13;
bool ledState13 = LOW;

const byte ledPin12 = 12;
bool ledStat12  = LOW;

const byte ledPin11 = 11;
bool ledStat11  = LOW;

const byte ledPin10 = 10;
bool ledStat10  = LOW;

const byte ledPin9 = 9;
bool ledStat9  = LOW;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  //Taster+Umschalter
  pinMode(tasterPin2, INPUT);
  pinMode(tasterPin3, INPUT);
  pinMode(tasterPin4, INPUT);
  pinMode(tasterPin5, INPUT);

  // 4 LED Ausgänge
  pinMode(ledPin13, OUTPUT);
  pinMode(ledPin12, OUTPUT);
  pinMode(ledPin11, OUTPUT);
  pinMode(ledPin10, OUTPUT);

  pinMode(ledPin9, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

  //Poti auslesen
  readVal = analogRead(myPin);
  v2 = (1) * readVal;

  //anfang m1
  if (millis() - prevmilles1 >= (impuls1 * v2 + 30)) {
    prevmilles1 = millis();
    pause1 = not pause1;
  } else {
    digitalWrite(ledPin13, LOW);
    //ende m1
  }
  //anfang m2

  if (millis() - prevmilles2 >= (impuls2 * v2 + 30)) {
    prevmilles2 = millis();
    pause2 = not pause2;
  } else {
    digitalWrite(ledPin12, LOW);
  }
  // digitalWrite(ledPin12, pause2);
  //ende m2

  //anfang m3
  if (millis() - prevmilles3 >= (impuls3 * v2 + 30)) {
    prevmilles3 = millis();
    pause3 = not pause3;
  } else {
    digitalWrite(ledPin11, LOW);
  }
  //   digitalWrite(ledPin11, pause3);
  //ende m3

  //anfang m4
  if (millis() - prevmilles4 >= (impuls4 * v2 + 30)) {
    prevmilles4 = millis();
    pause4 = not pause4;
  } else {
    digitalWrite(ledPin10, LOW);
  }

  // digitalWrite(ledPin10, pause4);
  //ende m4

  if (digitalRead (tasterPin2) == HIGH) {
    digitalWrite(ledPin9, HIGH);
  } else {
    digitalWrite(ledPin9, LOW);
  }

  //Auswertung1
  if (digitalRead (tasterPin2) == HIGH) {
    digitalWrite(ledPin13, pause1);
  }
  //Auswertung2
  if (digitalRead (tasterPin3) == HIGH) {
    digitalWrite(ledPin12, pause2);
  }
  //Auswertung3
  if (digitalRead (tasterPin4) == HIGH) {
    digitalWrite(ledPin11, pause3);
  }
  //Auswertung4
  if (digitalRead (tasterPin5) && (pause1) == HIGH) {
    digitalWrite(ledPin10, pause4);
  }
}