Potigesteuerte Lichtreihe

Hallo

Ich habe mir gestern eine über einen Poti steuerbare Lichtreihe aus 8 LEDs und einem Arduino Uno zusammengebaut. Je weiter man den Poti aufdreht, desto mehr LEDs leuchten und umgekehrt.

Die LEDs habe ich an die digitalen Ausgänge 3 bis 10 vom Arduino ausgeschlossen und folgendes Programm geschrieben.

int i = 0;       // Zähler
int PIN = 3 ;    // Ausgang für erste LED
int potpin = 0;  // Analog-PIN vom Poti
int val;         // Wert vom Poti


void setup(){
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
pinMode(4, OUTPUT);
pinMode(3, OUTPUT);
  
}


void loop(){
  val = analogRead(potpin);
  val = map(val, 0, 1023, 0, 8);
  {
  while(i<val){
    digitalWrite(PIN,HIGH);
    PIN++; 
    i++;
  }
  while(i>=val){
    digitalWrite(PIN,LOW);
    PIN--; 
    i--;
  }
  } 
}

Alles funktioniert zwar wie gewünscht, aber mein Konstrukt aus 2 while Schleifen und ++ und -- gefällt mir nicht besonders. Und nachvollziehen, was da beim Drehen am Poti so alles im Arduino vor sich geht, kann ich auch nur mit Mühe.

i 0   val 0   Alle LEDs aus
i 0   val 1   PIN 3 an
i 1   val 2   PIN 4 an
i 2   val 3   PIN 5 an
i 3   val 4   PIN 6 an
i 4   val 5   PIN 7 an
i 5   val 6   PIN 8 an
i 6   val 7   PIN 9 an
i 7   val 8   PIN 10 an
i 8   val 8   Alle LEDs an

i 8   val 7   PIN 10 aus
i 7   val 6   PIN 9 aus
i 6   val 5   PIN 8 aus
i 5   val 4   PIN 7 aus
i 4   val 3   PIN 6 aus
i 3   val 2   PIN 5 aus
i 2   val 1   PIN 4 aus
i 1   val 0   PIN 3 aus
i 0   val 0   PIN 2

Kann man das Ganze auch eleganter programmieren?

Gruß
Atalanttore

pin[] = {10,9,8,7,6,5,4,3};
...
for (i=0;i<val;i++)
{
digitalWrite(PIN[i],HIGH);
}
for (i=val;i<8;i++)
{
digitalWrite(PIN[i],LOW);
}

Das müßte das gleiche machen.
Grüße Uwe

Und nachvollziehen, was da beim Drehen am Poti so alles im Arduino vor sich geht, kann ich auch nur mit Mühe.

Um zu sehen was passiert wenn du an dem Poti drehst kannst du dir ja die Werte mal
auf der Seriellenconole anzeigen lassen.

void setup()
{
Serial.begin(9600);
}
void loop()
{
// dein code ...

Serial.println(val, DEC);
}

Der analogRead() Befehl konvertiert die Eingangsspannungsweite, von 0 - 5 Volt, zu einem digitalen Wert
zwischen 0 und 1023. Dies geschieht mit einer internen Schaltung im Arduino - analog-to-digital converter (ADC). Analog-Digital-Umsetzer – Wikipedia

Damit du die 1024 Zustände am analogen Eingang nicht auswärten brauchst, mapst du sie ja schon.

pin[] = {10,9,8,7,6,5,4,3};
...
for (i=0;i<8;i++)
{
digitalWrite(PIN[i],(i<val));
}

Habs nicht ausprobiert, also bitte mit Vorsicht.

digitalWrite(PIN[i],(i<val));

Uwe kannst du mir bitte den Schnippsel Code erklären?

p.s.: Dein Code funktioniert, echt erstaunlich, hab gestern in einem tutorial eigentlich das gleiche Programm geschrieben und es ging über 30 zeilen oder so ...

Knauf:

digitalWrite(PIN[i],(i<val));

Uwe kannst du mir bitte den Schnippsel Code erklären?

p.s.: Dein Code funktioniert, echt erstaunlich, hab gestern in einem tutorial eigentlich das gleiche Programm geschrieben und es ging über 30 zeilen oder so ...

(i<val) liefert TRUE wenn i kleiner val und FALSE wenn nicht.
TRUE und FALSE sind equivalent zu HIGH und LOW.

Da war MaFu schneller. 8)
und wie Du siehst, hab ich auch 2 Anläufe gebraucht.
Grüße Uwe

So, endlich mal wieder etwas Zeit zum basteln.

uwefed:

pin[] = {10,9,8,7,6,5,4,3};

...
for (i=0;i<val;i++)
{
digitalWrite(PIN[i],HIGH);
}
for (i=val;i<8;i++)
{
digitalWrite(PIN[i],LOW);
}



Das müßte das gleiche machen.

Mein Programm sieht damit nun so aus:

int i = 0;       // Zähler
int PIN = 3 ;    // Ausgang für erste LED
int potpin = 0;  // Analog-PIN vom Poti
int val;         // Wert vom Poti
int pin[] = {10,9,8,7,6,5,4,3};


void setup(){
}


void loop(){
  for (i=0;i<val;i++)
  {
    digitalWrite(PIN[i],HIGH);
  }
  for (i=val;i<8;i++)
  {
  digitalWrite(PIN[i],LOW);
  }
}

Leider gibt es beim Kompilieren ein paar Fehlermeldungen:

Potigesteuerte_Lichtreihe.cpp: In function ‘void loop()’:
Potigesteuerte_Lichtreihe.cpp:19:19: error: invalid types ‘int[int]’ for array subscript
Potigesteuerte_Lichtreihe.cpp:23:19: error: invalid types ‘int[int]’ for array subscript

Bei deinem zweiten Vorschlag

uwefed:

pin[] = {10,9,8,7,6,5,4,3};

...
for (i=0;i<8;i++)
{
digitalWrite(PIN[i],(i<val));
}



Habs nicht ausprobiert, also bitte mit Vorsicht.

erscheint wieder der gleiche Fehler:

Potigesteuerte_Lichtreihe.cpp: In function ‘void loop()’:
Potigesteuerte_Lichtreihe.cpp:18:19: error: invalid types ‘int[int]’ for array subscript

Woran hakt es und was ist eigentlich mit "subscript" gemeint?

Gruß
Atalanttore

Du definierst:
int PIN = 3
int pin[] = {10,9,8,7,6,5,4,3};
und greifst in Schleife auf ein nicht definiertes Array zu:
digitalWrite(PIN*,HIGH);*
Array ist in Kleinschreibung definiert!
Es ist immer ungünstig, in einem Programm so die Namen zu wählen, wäre das sauber, wäre der Fehler nicht passiert.

OK, vielen Dank. Also die Variablennamen von Arrays immer klein schreiben.

So sieht mein in Teilen von uwefed übernommenes Programm aus:

int i = 0;       // Zähler
int potpin = 0;  // Analog-PIN vom Poti
int val;         // Wert vom Poti
int pin[] = {10,9,8,7,6,5,4,3};


void setup(){
}


void loop(){
  for (i=0;i<val;i++)
  {
    digitalWrite(pin[i],HIGH);
  }
  for (i=val;i<8;i++)
  {
  digitalWrite(pin[i],LOW);
  }
}

Oder noch kürzer so:

int i = 0;       // Zähler
int potpin = 0;  // Analog-PIN vom Poti
int val;         // Wert vom Poti
int pin[] = {10,9,8,7,6,5,4,3};


void setup(){
}


void loop(){
  for (i=0;i<8;i++)
  {
  digitalWrite(pin[i],(i<val));
  }
}

Bei beiden Programmen gibt es jetzt keine Fehler beim Kompilieren mehr. Allerdings tut sich bei meinem Aufbau auch nichts mehr. Ich kann am Poti drehen wie ich will, aber die LEDs bleiben aus.

Gruß
Atalanttore

wo ist die Belegung
val = analogRead(potpin);
? oder ist das nicht das ganze Listing?
Im Setup fehlt auch die Definition der Output PINs
(so ganz auf die Schnelle...)

geht auch noch kürzer:

pin[] = {10,9,8,7,6,5,4,3};
...
for (i=0;i<val;i++)
  digitalWrite(pin[i],HIGH);

for (i=val;i<8;i++)
  digitalWrite(pin[i],LOW);