Go Down

Topic: zählerfunktion ? (Read 1 time) previous topic - next topic

peter_pan

ich hoffe, ihr könnt meinem verständniss etwas auf die sprünge helfen.
wie im unteren skript ersichtbar ist, wird ja durch das PotiPos einer der 4 schritte ausgeführt.
ich möchte jetzt noch ein drittes poti hinzu fügen, mit dem ich regeln kann, wie weit die Pin1 bis Pin4 durchlaufen werden.
also ob nur Pin1 angesprochen wird, oder es nur bis z.B. Pin3 durchläuft und dann wieder zurück zu Pin1 gesprungen wird.

ich hoffe, das ist einigermaßen verständlich und ich bin euch für jeden denkanstoß dankbar.


Code: [Select]
int Pin1 = 10;
int Pin2 = 11;
int Pin3 = 12;
int Pin4 = 13;

int Poti1 = 2;        // Poti als 4 fach Switch
int PotiPos = 0;

int Poti2 = 1;        // Poti für die clock
int Potentiometer = 0;




void setup()
{
 pinMode(Pin1, OUTPUT);
 pinMode(Pin2, OUTPUT);
 pinMode(Pin3, OUTPUT);
 pinMode(Pin4, OUTPUT);
}


void loop()
{
 PotiPos = analogRead(Poti1);
 PotiPos /= 4;

 Potentiometer = analogRead(Poti2);

 if (PotiPos < 65)
 {
   digitalWrite(Pin1, HIGH);
   delay(50);
   digitalWrite(Pin1, LOW);
   delay(Potentiometer);
   digitalWrite(Pin2, LOW);
   delay(50);
   digitalWrite(Pin2, LOW);
   delay(Potentiometer);
   digitalWrite(Pin3, HIGH);
   delay(50);
   digitalWrite(Pin3, LOW);
   delay(Potentiometer);
   digitalWrite(Pin4, LOW);
   delay(50);
   digitalWrite(Pin4, LOW);
   delay(Potentiometer);
 }

 if ((PotiPos > 65) && (PotiPos < 131))
 {
   digitalWrite(Pin1, HIGH);
   delay(50);
   digitalWrite(Pin1, LOW);
   delay(Potentiometer);
   digitalWrite(Pin2, HIGH);
   delay(50);
   digitalWrite(Pin2, LOW);
   delay(Potentiometer);
   digitalWrite(Pin3, LOW);
   delay(50);
   digitalWrite(Pin3, LOW);
   delay(Potentiometer);
   digitalWrite(Pin4, LOW);
   delay(50);
   digitalWrite(Pin4, LOW);
   delay(Potentiometer);
 }

 if ((PotiPos > 131) && (PotiPos < 187))
 {
   digitalWrite(Pin1, LOW);
   delay(50);
   digitalWrite(Pin1, LOW);
   delay(Potentiometer);
   digitalWrite(Pin2, LOW);
   delay(50);
   digitalWrite(Pin2, LOW);
   delay(Potentiometer);
   digitalWrite(Pin3, HIGH);
   delay(50);
   digitalWrite(Pin3, LOW);
   delay(Potentiometer);
   digitalWrite(Pin4, HIGH);
   delay(50);
   digitalWrite(Pin4, LOW);
   delay(Potentiometer);
 }

 if (PotiPos > 187)
 {
   digitalWrite(Pin1, HIGH);
   delay(50);
   digitalWrite(Pin1, LOW);
   delay(Potentiometer);
   digitalWrite(Pin2, HIGH);
   delay(50);
   digitalWrite(Pin2, LOW);
   delay(Potentiometer);
   digitalWrite(Pin3, HIGH);
   delay(50);
   digitalWrite(Pin3, LOW);
   delay(Potentiometer);
   digitalWrite(Pin4, LOW);
   delay(50);
   digitalWrite(Pin4, LOW);
   delay(Potentiometer);
 }
}


Otacon2k

Wenn du die Pin-Namen so wie sie jetzt sind beibehalten willst, könntest du z.B. noch mehr if-Klauseln verwenden, also so (Poti_2_Pos wäre jetzt das neue Poti):

Code: [Select]
 if (PotiPos < 65)
 {
   if (Poti_2_Pos < 65)
   {
     digitalWrite(Pin1, HIGH);
     delay(50);
     digitalWrite(Pin1, LOW);
     delay(Potentiometer);
   }
   if ((Poti_2_Pos > 65) && (Poti_2_Pos < 131))
   {
     digitalWrite(Pin2, LOW);
     delay(50);
     digitalWrite(Pin2, LOW);
     delay(Potentiometer);
   }
   if ((Poti_2_Pos > 131) && (Poti_2_Pos < 187))
   {
     digitalWrite(Pin3, HIGH);
     delay(50);
     digitalWrite(Pin3, LOW);
     delay(Potentiometer);
   }
   if (Poti_2_Pos > 187)
   {
     digitalWrite(Pin4, LOW);
     delay(50);
     digitalWrite(Pin4, LOW);
     delay(Potentiometer);
   }
 }


Wenn du die Pins in ihrer Reihenfolge in einem Array speicherst, dann kannst du auch über Zahlen auf sie zugreifen, dann wäre etwas in der Art möglich:

Code: [Select]
if (PotiPos < 65)
 {
   for(int i = 0; i < ((analogRead(Poti_2_Pos)/256)+1); i++)
   {
     digitalWrite(Pins_Array[i], HIGH);
     delay(50);
     digitalWrite(Pins_Array[i], LOW);
     delay(Potentiometer);
   }
 }


Mit der for()-loop hättest du es dann aber schwer, wenn du verschiedene delays zwischen den verschiedenen Pins einsetzen willst, da ja alle über die gleiche "Funktion" laufen.

Mit einer while().loop und break könntest du auch Erfolg haben, dann musst du nur sicherstellen, dass für alle Gegebenheiten ein break zur Verfügung steht, sonst endet das ganze in einer Endlosschleife...

Code: [Select]
 while (PotiPos < 65)
 {
   digitalWrite(Pin1, HIGH);
   delay(50);
   digitalWrite(Pin1, LOW);
   delay(Potentiometer);
   if (Poti_2_Pos < 65)
     break;
   digitalWrite(Pin2, LOW);
   delay(50);
   digitalWrite(Pin2, LOW);
   delay(Potentiometer);
   if (Poti_2_Pos > 65) && (Poti_2_Pos < 131))
     break;
   digitalWrite(Pin3, HIGH);
   delay(50);
   digitalWrite(Pin3, LOW);
   delay(Potentiometer);
   if ((Poti_2_Pos > 131) && (Poti_2_Pos < 187))
     break;
   digitalWrite(Pin4, LOW);
   delay(50);
   digitalWrite(Pin4, LOW);
   delay(Potentiometer);
   if (Poti_2_Pos > 187)
     break;
 }


Ach übrigens, der Einfachheit halber wird Poti_2_Pos in allen Beispielen oben genau so behandelt wie PotiPos, also

Code: [Select]
Poti_2_Pos = analogRead(Poti3);
Poti_2_Pos /= 4;


Lies mal in der Reference einfach noch mal alle o.g. Funktionen genau durch, da lässt sich sicherlich noch was finden... Funktionsgewähr ist übrigens ausgeschlossen, habe den Code gerade nur frei Schnauze geschrieben, ohne zu probieren, ob der Compiler damit einverstanden wäre ;)

Hoffe geholfen zu haben, Otacon2k

peter_pan

danke Otacon2k für die super beschreibung.

ich hab das ganze jetzt mal mit der "while" funktion probiert.
dock leider bekomme ich da einen fehler !
vielleicht reicht ein kurzer blick und ihr könnt mir sagen was falsch ist.


Code: [Select]
int Pin1 = 10;
int Pin2 = 11;
int Pin3 = 12;
int Pin4 = 13;

int Poti1 = 2;        // Poti als 4 fach Switch
int PotiPos = 0;

int Poti2 = 1;        // Poti für die clock
int Potentiometer = 0;

int Poti3 = 3;        // Poti für step-länge
int Poti_2_Pos = 0;




void setup()
{
 pinMode(Pin1, OUTPUT);
 pinMode(Pin2, OUTPUT);
 pinMode(Pin3, OUTPUT);
 pinMode(Pin4, OUTPUT);
}



void loop()
{
 PotiPos = analogRead(Poti1);
 PotiPos /= 4;

 Potentiometer = analogRead(Poti2);
 
 Poti_2_Pos = analogRead(Poti3);
 


 while (PotiPos < 65)
 {
   digitalWrite(Pin1, HIGH);
   delay(50);
   digitalWrite(Pin1, LOW);
   delay(Potentiometer);
   if (Poti_2_Pos < 65)
     break;
   digitalWrite(Pin2, LOW);
   delay(50);
   digitalWrite(Pin2, LOW);
   delay(Potentiometer);
   if (Poti_2_Pos > 65) && (Poti_2_Pos < 131))    // HIER KOMMT DIE FEHLERMELDUNG
     break;
   digitalWrite(Pin3, HIGH);
   delay(50);
   digitalWrite(Pin3, LOW);
   delay(Potentiometer);
   if ((Poti_2_Pos > 131) && (Poti_2_Pos < 187))
     break;
   digitalWrite(Pin4, LOW);
   delay(50);
   digitalWrite(Pin4, LOW);
   delay(Potentiometer);
   if (Poti_2_Pos > 187)
     break;
 }

 while ((PotiPos > 65) && (PotiPos < 131))
 {
   digitalWrite(Pin1, LOW);
   delay(50);
   digitalWrite(Pin1, LOW);
   delay(Potentiometer);
   if (Poti_2_Pos < 65)
     break;
   digitalWrite(Pin2, LOW);
   delay(50);
   digitalWrite(Pin2, LOW);
   delay(Potentiometer);
   if (Poti_2_Pos > 65) && (Poti_2_Pos < 131))
     break;
   digitalWrite(Pin3, HIGH);
   delay(50);
   digitalWrite(Pin3, LOW);
   delay(Potentiometer);
   if ((Poti_2_Pos > 131) && (Poti_2_Pos < 187))
     break;
   digitalWrite(Pin4, HIGH);
   delay(50);
   digitalWrite(Pin4, LOW);
   delay(Potentiometer);
   if (Poti_2_Pos > 187)
     break;
 }

 while ((PotiPos > 131) && (PotiPos < 187))
 {
   digitalWrite(Pin1, HIGH);
   delay(50);
   digitalWrite(Pin1, LOW);
   delay(Potentiometer);
   if (Poti_2_Pos < 65)
     break;
   digitalWrite(Pin2, HIGH);
   delay(50);
   digitalWrite(Pin2, LOW);
   delay(Potentiometer);
   if (Poti_2_Pos > 65) && (Poti_2_Pos < 131))
     break;
   digitalWrite(Pin3, HIGH);
   delay(50);
   digitalWrite(Pin3, LOW);
   delay(Potentiometer);
   if ((Poti_2_Pos > 131) && (Poti_2_Pos < 187))
     break;
   digitalWrite(Pin4, HIGH);
   delay(50);
   digitalWrite(Pin4, LOW);
   delay(Potentiometer);
   if (Poti_2_Pos > 187)
     break;
 }

 while (PotiPos > 187)
 {
   digitalWrite(Pin1, HIGH);
   delay(50);
   digitalWrite(Pin1, LOW);
   delay(Potentiometer);
   if (Poti_2_Pos < 65)
     break;
   digitalWrite(Pin2, LOW);
   delay(50);
   digitalWrite(Pin2, LOW);
   delay(Potentiometer);
   if (Poti_2_Pos > 65) && (Poti_2_Pos < 131))
     break;
   digitalWrite(Pin3, HIGH);
   delay(50);
   digitalWrite(Pin3, LOW);
   delay(Potentiometer);
   if ((Poti_2_Pos > 131) && (Poti_2_Pos < 187))
     break;
   digitalWrite(Pin4, HIGH);
   delay(50);
   digitalWrite(Pin4, LOW);
   delay(Potentiometer);
   if (Poti_2_Pos > 187)
     break;
 }
}




fehlermeldung ist = In function 'void loop()':
error: expected identifier before '(' toke


fehlermeldungszeile :
Code: [Select]
if (Poti_2_Pos > 65) && (Poti_2_Pos < 131))




volvodani

Richtig wäre:
if (Poti_2_Pos > 65 && Poti_2_Pos < 131){
"hier die Funktion"
}
;)
"Komm wir essen Opa!" - Satzzeichen retten Leben!

peter_pan

funktioniert jetzt wunderbar !
hab nur mal wieder ne klammer vergessen  ::)

danke euch beiden.

Go Up