Hallo Leute,
ich bräuchte mal Starthilfe...
wahrscheinlich ist das ganz einfach, aber ich habe keine Idee.
Alle Schleifen, die ich mir ausdenke, bringen nicht das gewünschte Ergebnis...
Ich hoffe ihr könnt mir helfen.
Ich habe ein Array das 7 Werte aus einem Analogpin ausgelesen hat.
Jetzt möchte ich die Werte in ein neues Array mit 14 Werten schreiben und zwar so, dass jeder Wert zweimal ins neue Array geschrieben wird.
Also:
Array1 Wert1 -> Array2 Wert 1 und Wert 2
Array1 Wert2 -> Array2 Wert 3 und Wert 4
oder alternativ gleich beim Auslesen die 7 Werte in ein Array mit 14 Werten nach dem beschrieben Muster schreiben. Die Schleife muss genau 7x durchlaufen. Eine darin verschachtelte Schleife ist natürlich möglich.
liebe Grüße
Thomas
Wenn du uns deinen bisherigen Code zeigst, ist es für uns einfacher.
Ich vermute du liest aus und zählst eine Variable hoch.
Dieser addierst du eine 1 beim Speichern im Array, ich glaube so kann es gehen.
zum Beispiel so:
int j = 0;
for (int i = 0; i<7; i++){
array2[j] = array1[i]; // Wert in Array2 übertragen.
j++; // zähler für Array2 Laufvariable erhöhen.
array2[j] = array1[i]; // Wert nochmal in Array2 übertragen.
}
Aber vielleicht ist es sinnvoller, an der Stelle, an du den Wert später brauchst, zweimal das Array auszulesen?
In Gunthers Code fehlt ein „j++;“. So klappt’s:
int j = 0;
for (int i = 0; i<7; i++){
array2[j] = array1[i]; // Wert in Array2 übertragen.
j++; // zähler für Array2 Laufvariable erhöhen.
array2[j] = array1[i]; // Wert nochmal in Array2 übertragen.
j++;
}
Gruß
Gregor
Oder auch ohne zweiten Index:
for (int i = 0; i<7; i++){
array2[ i * 2 ] = array1[i]; // Wert in Array2 übertragen.
array2[(i * 2) + 1] = array1[i]; // Wert nochmal in Array2 übertragen.
}
// oder für schlecht optimierende Compiler
for (int i = 0; i<7; i++){
array2[ i << 1 ] = array1[i]; // Wert in Array2 übertragen.
array2[(i << 1) + 1] = array1[i]; // Wert nochmal in Array2 übertragen.
}
Ulli
gregorss:
In Gunthers Code fehlt ein „j++;“.
Du hast recht, danke für den Hinweis!
Whow seid ihr schnell...
ich habs ja geahnt: es ist so einfach.
Ganz herzlichen Dank Gunther, Gregor und Ulli.
Hab wieder was gelernt und kann das gut gebrauchen.
Ich hab mich auch drüber gefreut, keine abwertende oder anmaßenden Spüche a la "mach mal C Grundkurs" oder "kauf Dir ein Buch und übe" zu bekommen. Alles sehr sachlich und freundlich.
eine neue Frage ist dabei aufgetaucht: was macht << ?
Hab im Netz auf die Schnelle nix gefunden.
guntherb:
Aber vielleicht ist es sinnvoller, an der Stelle, an du den Wert später brauchst, zweimal das Array auszulesen?
Das habe ich zuerst versucht, das funktionierte noch schlechter. Ich hatte ja fast das gewünschte Ergebnis mit dem Umschreiben des Arrays, nur hab ich mir immer ein oder zwei Werte wieder überschrieben oder es fehlte einer...
Aber mit Euren Vorschlägen komme ich weiter.
Wenn der Sketch wie gewünscht läuft, poste ich ihn hier. Sieht nämlich schon mit dem aktuellen Array geil aus.
Danke nochmal
Thomas
Hallo,
<< ist ein Shift Operator.
Einmal nach links schieben ist Multiplizieren mit 2. Schieben nach rechts ist eine Division durch 2. Das ist vor allem auf Controllern die nur sehr umständlich oder gar nicht Multiplizieren/Dividieren können sehr praktisch. Oder wenn man absolut sicher sein muss, dass es schnell geht. Hier ist das aber vorauseilende Optimierung.
Doc_Arduino:
http://www.netzmafia.de/skripten/hardware/Arduino/Arduino_Programmierhandbuch.pdf
Das kannte ich noch nicht. Liest sich Anfängergeeignet.
Beim Überfliegen ist mir eine Sache aufgefallen: Auf Seite 18 unten steht, dass millis() nach ca. 9 Stunden überläuft. 2^32/16000 (4 Byte-Integer durch 16 MHz) ergibt aber reichlich mehr als 9 Stunden. Liegt der Text falsch oder ich?
Gruß
Gregor
nö. ist etwas mehr als 49 tage.
aber Du irrst Dich auch ein wenig. millis sind tausendstel sekunden, das hat nichts mit dem prozessortakt zu tun.
3^32 / 1000 = zeit in sekunden bis zum überlauf
gruß stefan
Serenifly:
Einmal nach links schieben ist Multiplizieren mit 2. Schieben nach rechts ist eine Division durch 2. Das ist vor allem auf Controllern die nur sehr umständlich oder gar nicht Multiplizieren/Dividieren können sehr praktisch. Oder wenn man absolut sicher sein muss, dass es schnell geht. Hier ist das aber vorauseilende Optimierung.
Das ist mal schön erklärt!
Hab ich mir dank des Links zur Referenz angesehen.
und auch hier nochmals: DANKE
Eine Optimierung ist in meinem Fall nicht nötig. Ich hab weder Speicher-, noch Geschwindigkeitsprobleme.
Ich hab nen Arduino Nano V3 Klon um damit zwei MSGEQ7 (Audio rechts und links) auslesen und einreihig auf 28 Neopixeln darzustellen. Der MSGEQ7 gibt 7 Frequenzbereiche einer Audioquelle aus. Das ist ein kleiner, recht einfacher Sketch.
Mit 7 LEDs pro Kanal funktioniert das schon gut, ist mir aber zu kurz/klein.
mit 2x14 LEDs plus ein oder zwei LEDs in der Mitte als sagen wir mal andersfarbig leuchtender Trennabstand zwischen den Kanälen komme ich auf 1 Meter. Es leuchten dann pro Frequenzbereich 2 LEDs. Das sieht dann ziemlich gut aus. Das Endergebnis ist dann eine Mischung aus Spectrumanalyzer und VU-Meter.
Foto oder Video folgt dann, wenns fertig ist.
Eisebaer:
aber Du irrst Dich auch ein wenig. millis sind tausendstel sekunden, das hat nichts mit dem prozessortakt zu tun.
3^32 / 1000 = zeit in sekunden bis zum überlauf
3/32*1000+Pi ergibt aber 96.,89159265 
SCNR
Gregor
Hallo,
das mit millis() und nur 9 Tage stimmt nicht. Sind ca. 50 Tage. Vielleicht war das in der IDE Anfangszeit mal so und wurde geändert. Anfangsbug vielleicht gewesen. Keine Ahnung.
Zu Eurer lustigen Rechnung. 
Wieviele ms hat ein Tag?
24h * 60 * 60 * 1000 = 86.400.000 ms pro Tag
2^32 (unsigned long) durch 86.400.000 = 49,7 Tage