Frage zu einem Array

Guten Abend zusammen,

ich habe ein Problem mit der Erstellung eines Arrays.

Wenn ich die if lux > **** abfrage verwende dann klappt es und das Display zeit mir einen Balken in abhängigkeit vom gemessenen Licht in Lux.#

Es soll von 0 bis 40 ein Array mit Zahlen von 30 bis 65500 gelesen werden

Mit dem Array klappt das leider noch nicht.
Ich habe aber auch keine Literatur dazu gefunden..

Könnte mir jemand helfen bei dem Array?

Grüße Stefan

Hausbus_31102016.ino (4.88 KB)

Luxmeter.ino (3.45 KB)

Hallo,

keine Literatur gefunden ... hust ... :blush:
Erste Anlaufstelle hier auf der Seite oben unter Learning > Reference
Oder man gibt im Browser Suchbegriffe wie "C array" ein oder ähnliches.

Ein kleines Bsp.

unsigned int lux[] = {11, 22, 33};  // 3 Werte auf Indexzähler 0, 1 und 2

if (lux[2] > 30) {  // lux mit Wert 33 > 30 ?
	dann mach ...
}

Den Indexzähler vom Array kann man auch mit einer for Schleife durchlaufen lassen und darin abfragen wenn das zum Problem passen sollte.

Was klappt denn mit dem array nicht? Du musst genau so jeden Wert einzelnd vergleichen, aber da das mit einer Schleife geht, wird es viel einfacher.
So ungefähr:

werte_array = [1,2,3,4];
array_laenge = 4;

byte wert_in_lux(unsigned int lux) {                                        // Luxwerte mit Tabelle abgleichen
 for(int i = 0; i < (array_laenge - 1); i++ ){
 if (lux > werte_array[i] ) {
   return i;
 } 
 }
}

Hallo,
auch über Arrays gibt es sehr viel Dokumentationen.
Z.B. Arrays (Felder) | C-HowTo oder
http://michaelkipp.de/processing/08%20arrays.html

Hallo und Guten Morgen!

Genau danach habe ich gesucht!
Die Lösung mit den Vergleichswerten von Genosse scheint die richtige zu sein.
Ich hatte das Programm schon mit 41 if Abfragen lauffähig aber so währe es bestimmt eleganter.
Auch die Literatur Hinweise sind klasse. Habt alle vielen vielen Dank !

Grüße und einen schönen Tag noch

Stefan

Guten Abend !

Ich versuche noch immer die Nuss zu knacken mit dem Array ..
Was mein Ziel ist das ist ein Array von 40 Speicherstellen lux[0] .. lux[39]

ist ist damit möglich an die Werte für z.b lux 0 zu gelangen wenn der Messwertwert vom BH1750 z.b
36 ist dann liegt dieser bei 0 oder 893 bei 4 .. mein ziel ist es mit den Werten von 0 bis 39 einen Bargraph
zu erhalten in abhängigkeit von Messwert den der BH1750 liefert.
Geht das mit einem Array ?

void luxtable(void) {
  lux[0] = 30;                              //40  tablearrays.
  lux[1] = 200;
  lux[2] = 478;
  lux[3] = 567;
  lux[4] = 890;
  lux[5] = 1034;
  lux[6] = 1500;
  lux[7] = 2000;
  lux[8] = 3000;
  lux[9] = 4000;
  lux[10] = 5000;
  lux[11] = 6000;
  lux[12] = 7000;
  lux[13] = 8000;
  lux[14] = 9000;
  lux[15] = 10000;
  lux[16] = 12000;
  lux[17] = 13000;
  lux[18] = 15000;
  lux[19] = 18000;
  lux[20] = 20000;
  lux[21] = 24000;
  lux[22] = 26000;
  lux[23] = 30000;
  lux[24] = 35000;
  lux[25] = 38000;
  lux[26] = 40000;
  lux[27] = 45000;
  lux[28] = 48000;
  lux[29] = 50000;
  lux[30] = 52000;
  lux[31] = 52336;
  lux[32] = 55000;
  lux[33] = 57000;
  lux[34] = 59000;
  lux[35] = 60000;
  lux[36] = 61000;
  lux[37] = 62000;
  lux[38] = 64000;
  lux[39] = 65300;
  
}

Doc_Arduino war so freundlich einen Lösungs Ansatz zu Posten..
Wenn ich diesen richtig Verstehe komme ich bei dieser Variante nicht um 40 if Abfragen herum - richtig?

Du must dein Array so aufbauen:

unsigned long lux[] = {30, 200, 478, usw.}

Den Zugriff auf die jeweilige Stelle bekommst du über den Index.

lux[0] entspricht dem Wert 30.

Wurde dir aber alles schon gezeigt und in den Links beschrieben.

stevie72:
Wenn ich diesen richtig Verstehe komme ich bei dieser Variante nicht um 40 if Abfragen herum - richtig?

Das sehe ich auch so.
if-Abfragen oder Switch/Case.

Gut - dann habe ich es verstanden. Dann verwende ich Switch/Case oder if ..

Genau das war meine Frage: ich hatte nicht verstanden, dass man nicht direkt an den
Index Wert lux [0] -> 0 oder lux [12] -> 12 kommt ..

Hallo,

um die 40 Abfragen kommste nicht drum herum, jedoch mit einer for Schleife eleganter

du definierst dein array. Bsp.

unsigned long lux[] = {30, 200, 478, 567}

und fragst in einer for Schleife einen Wertevergleich mittels Indexzähler ab. Den letzten ermittelten Index verarbeitest du sinnvoll weiter.

Bsp. ungetestet

int _Index;   // ggf. global definiert

int value = analogRead(  );

for (int i=0; i<41; i++) {   // geht die Indexwerte durch
  if ( value > lux[i] ) {    // vergleicht diese Arraywerte mit value
    _Index = i;              // bei einem Treffer wird Indexnummer gespeichert
    break;                   // und for vorzeitig verlassen
  }
}

unsigned int gesuchter_LuxWert = lux[_Index];  // mach sinnvolle Dinge

Ansonsten verschiedene Literatur lesen und damit experimentieren bis es Klick macht. :slight_smile:

Bei mir hat es bislang noch nicht mal in der Problemstellung richtig klick gemacht.

Und warum ist lux[31] so komisch?

stevie72:
Wenn ich diesen richtig Verstehe komme ich bei dieser Variante nicht um 40 if Abfragen herum - richtig?

Falsch :slight_smile: Es gibt Möglichkeiten, die Anzahl der Abfragen zu reduzieren:

  • Vergleich mit dem Wert in der Feldmitte, dann in der linken oder rechten Hälfte weitersuchen. 21 Vergleiche.
  • Vergleich mit dem Wert in der Feldmitte, dann linke oder rechte Hälfte erneut halbieren usw. Irgendwann landest Du bei fünf Elementen, die Du einzeln vergleichen kannst. Wenn meine Finger richtig zählen, 8 Vergleiche.
  • Du vergleichst mit einer Funktion anstelle der Wertetabelle, wozu die Funktion aber bekannt sein muß.

Wo hast Du die Werte für das Feld her? Sieht nach einer nichtlinearen Funktion aus, kennst Du die? Ein Sinus scheint es nicht zu sein, rote Linie.

NichtlineareFunktion.png

Eine ganz andere Frage ist die der Nützlichkeit für Dein Projekt. Aber möglicherweise soll Dein Bargraph ja mehr Striche erhalten.

ElEspanol:
Bei mir hat es bislang noch nicht mal in der Problemstellung richtig klick gemacht.

Bargraphdarstellung mit einer nichtlinearen Funktion.

ElEspanol:
Bei mir hat es bislang noch nicht mal in der Problemstellung richtig klick gemacht.

Hallo Spanier,

so wie ich das verstanden hatte, weiß/wußte er nicht, wie man ein Array anlegt und dann auf die darin gespeicherten Werte einzeln oder nacheinander zugreift bzw. mit einer anderen Variablen vergleicht. Das sagte mir meine Glaskugel. :wink:

Bargrafen, jetzt kann ich mir etwas darunter vorstellen. Das heißt, er sucht den Wert im RE und zeigt dann entsprechend dem index, wo er fündig wurde, die entsprechende Anzahl Blöcke als Bargraf an. und warum sagt er das nicht gleich so?