Werte, (bytes) aus Datei lesen....

Ich bastel ja gerade an meinem LED Projekt mit ESP8266 und FastLED…

Mein Gedankengang, Effekte / Scenen aus einem PC Programm im ESP abzuspeichen bzw. auf einer SD Karte die am ESP hängt.
Im Endeffekt brauch man ja nur die RGB Werte.
Also als Beispiel, ich erstelle eine Datei
Inhalt

6b 6b 6b 70 70 70 7f 7f 7f 93
5b 5b 5b 51 51 51 42 42 42 32
db f4 f4 f4 60 60 60 00 00 00

das sind 10 Werte Hex. pro Zeile

  1. Frage, als Hex oder als Zahl speichern? also z.B. 133 255 0 0 255 0 255 128 255 0 255 0
  2. Frage mit oder ohne Trennzeichen?

Meine ersten Gehversuche mach ich mit dem internen SPIFFS des ESP. Ich denke mal das es keinen großen Unterschied zu SD Karte auslesen macht? Weiß ich nicht…
Ich hab die Datei so hochgeladen und lese mit folgendem Code aus.

#include "FS.h"
char data[512];

void setup() {
  Serial.begin(115200);
  Serial.println("\nVery basic Spiffs ");
  SPIFFS.begin();
}

void loop() {
  File f = SPIFFS.open("/1.txt","r");

f.readBytes((char *)data, 10);  
for (int i = 0 ; i < 10 ; i++)
  {
Serial.println(data[i]);
//Serial.print(" ");
  }
Serial.println("");
  delay(30000);
}

Ausgabe

6
b
6
b
6
b
7
0
7
0

Also er erkennt das nicht als Byte, was mach ich falsch, wo ist mein Denkfehler? Er liest Zeichen für Zeichen, ich brauch eigentlich Byte für Byte also
6b
6b
6b
70
usw…

Hoffe ihr könnt mir folgen.

Danke Heiko

Du moppelst doppelt, Du wandelst ein Byte in Hex um, schreibst für Hex 2 Bytes auf die SD und liest die 2Bytes wieder ein und konvertierst diese zu 1 Byte.

1 Char kann 0-255 darstellen.. quasi müssten 10 Zeichen jede Zeile genügen.

  1. Der Controller bzw PC speichert Daten binär, Dezimal oder Hex oder oktal sind nur Darstellungsvarianten für den Menschen. Also es ist egal ob Du dezimal oder Hex daten schreibst.
  2. Hängt von Deinen Sketch ab. Ohne ist die Datei kleiner und schneller gelesen.

Du brauchst atoi, Schreib deine Zahl in ein array (2 Zeichen und ein 0 danach) und wandle sie in INT.

Grüße Uwe

1 Char kann 0-255 darstellen.. quasi müssten 10 Zeichen jede Zeile genügen

versteh ich nicht, wenn ich
255 128 255 0 255 usw... in die Datei schreibe
Ausgabe
2
5
5
1
2
8usw....

Du brauchst atoi, Schreib deine Zahl in ein array (2 Zeichen und ein 0 danach) und wandle sie in INT

klingt technich, versteh ich auch nicht, gibts ein Beispiel dazu, das ich mal sehen kann was ihr meint?

Danke

kollimann:
Im Endeffekt brauch man ja nur die RGB Werte.
Also als Beispiel, ich erstelle eine Datei
Inhalt

6b 6b 6b 70 70 70 7f 7f 7f 93
5b 5b 5b 51 51 51 42 42 42 32
db f4 f4 f4 60 60 60 00 00 00

das sind 10 Werte Hex. pro Zeile

Warum zehn Werte? Ist das nur ein unglückliches Beispiel?

Konvertieren würde ich nicht, sondern immer LED-Anzahl*3 Bytes direkt an die richtige Stelle lesen.

  1. Frage, als Hex oder als Zahl speichern? also z.B. 133 255 0 0 255 0 255 128 255 0 255 0
  2. Frage mit oder ohne Trennzeichen?

Zu 1: Egal, beides, nur wenn es auch für Menschen lesbar sein soll.
Zu 2: Trennzeichen, nur, wenn du Trennzeichen brauchst

Warum zehn Werte? Ist das nur ein unglückliches Beispiel?

Als Beispiel zu sehen !! Ist ja egal ob 10, 5 oder 512, ich muss es verstehen…

Am Ende 5*512 Werte…

Aber was ich nun genau machen muss konnt ich noch nicht erlesen.

1.Frage und 2.Frage soweit klar verstanden, ist mir überlassen wie ich das mache…

kollimann:
Als Beispiel zu sehen !! Ist ja egal ob 10, 5 oder 512, ich muss es verstehen.....

Am Ende 5*512 Werte.....

Das sind alles keine Vielfachen von 3, aber mach mal.

170 Pixel * 3 Werte pro Pixel = 510 Werte/Bytes pro Universum, und 5 Universen.

So jetzt, um es ganz genau zu machen.

hi,

heiko, das ist ein grundsätzliches verständnisproblem, das wir hier immer wieder haben.

Du denkst, Du schreibst 255, aber Du schreibst eine 2, eine 5 und noch eine 5. Du mußt aber EIN BYTE mit dem WERT 255 schreiben. ich hab’ hier zwei dateien angelegt. in der ersten steht

111 255 156, für menschen einfach lesbar

was wirklich in der datei steht, zeigt Dir ein hex-edidor:

ASCII.gif

das sind die ASCII-werte für 1, 1, 1, leerzeichen, 2, 5, 5, leerzeichen, 1, 5, 6. die datei ist 11 bytes groß.

in einer zweiten datei steht auch 111 255 156, allerdings als werte in bytes. im hex-editor:

HEX.gif

dateigröße 3 bytes. so mußt Du denken.

gruß stefan

@Eisebaer

Danke für die ausführliche Erklärung !
Damit erklärt sich so einiges für mich, da muss ich die Idee anders lösen. Da benötige ich erstmal “etwas” was die “richtigen” Bytes in die Datei schreibt und nicht die “Menschlich lesbaren Werte”.

Danke, da bin ich mal am grübeln…

Bei Arduino sind das zB
Serial.print()
und
Serial.write()

In der Programmiersprache die Du auf dem PC verwenden willst weiß ich es nicht.
Grüße Uwe

kollimann:
Danke, da bin ich mal am grübeln.......

Der Arduino kann sowohl auf Buchstaben basierende Dateien (Stefans erstes Beispiel) verarbeiten wie auch direkte Werte (Stefans zweites Beispiel).

Tabellenkalkulationen können csv-Dateien exportieren, die enthalten Buchstaben, wobei die Zahlen mittels Trennzeichen, meist ein Semikolon, getrennt werden. Das hat den Vorteil der einfachen Lesbarkeit mit einem Editor. Der Arduino liest sowas Zeichen für Zeichen in einen Puffer. Wenn ein Semikolon erkannt wird, wird der Puffer mit dem von Uwe erwähnten atoi (ASCII to Integer) in eine Zahl verwandelt und im Feld gespeichert. Anregungen kannst Du Dir beim Thema HILFE !!! Cocktailmaschine mit Arduino Uno holen, da habe ich das ungefähr so gemacht. Beispiele findest Du auch bei den Programmbibliotheken SD und SdFat.

Wie Uwe schon schrieb, kommt darauf an, wie Du die Werte auf dem PC erzeugen möchtest.

Werd'ich heute oft zitiert :slight_smile: :slight_smile:
Oder gibt es mehrere Uwe's? :wink: :wink: :wink:

Du bist unser einziger und bester Uwe.
(andere und bessere kenne ich nicht)

:-[ :-[

combie:
Du bist unser einziger und bester Uwe.
(andere und bessere kenne ich nicht)

Ich kenne noch einen anderen, aber bezogen auf dieses Forum stimme ich zu :slight_smile:

So...da bin ich wieder, kurze Projekt Zwangspause gehabt.

Also erstmal DANKE für eure Tips und Ratschläge !!! DANKE

Da Problem aus meiner Sicht ist die Datei, wie erstellen etc. Ich hab jetzt erstmal eine SD Karte an den ESP gehängt das ich wirklich testen kann, lesen klappt.

Meine Idee wäre ja, das man garkeine Datei selbst erstellt, sondern die fseq Datei aus XLIGHTS nimmt und sich da die Daten rausnimmt die man benötigt. In dieser Datei müsste ja alles drinn stehen, nur wie .......

Anscheinend hat es hier jemand gemacht.
http://doityourselfchristmas.com/forums/showthread.php?43345-Using-SD-cards-with-ESP8266-s

Nur versteh ich mit meinem sehr schlechten Englich nur sehr wenig.

Weiterhin gibts den Falcon Player der fseq Datein abspielen kann, dazu brauch es aber einen Rasberry...

Das wollte ich eigentlich nicht.
Der könnte die fseq Sequencen dann per Artnet oder E131 an meinen ESP senden, der hat ja eine Playlist, wäre aber mehr Aufwand.
OK Damit wäre mein ESP entlastet, denn das kann er ja schon vom PC aus XLights heraus.

Der Falcon Player ist ja OpenSource, da gibts auch die Stelle wo das mit der fseq Datei einlesen ist, nur versteh ich C auch nur sehr gering. Wenn man das Umsetzen könnte nach Arduino.........

da in der Sequence.h da ist das mit der Struktur der fseq Datei.

Wäre Cool wenn das jemand übersetzen könnte............

1000Dank Heiko

Mh, ich weiß auch nicht wie ich zu Lösung komme, ich schreibe erstmal mit dem Hernn aus dem 1. Link evtl kann er helfen, er hat es ja irgendwie gemacht.

Fraglich ist auch ob das überhaupt vom timing her gehen könnte. Evtl hat ja jemand Erfahrung wie lange ein ESP braucht um 512Byte von SD Karte zu lesen, am Ende mach ich mir ein Kopf und es geht von der Geschwindigkeit garnicht. Ist warscheinlich der 1. Ansatz oder?

So ....Rückmeldung, ich hab beide Varianten zum Laufen gebracht ! :slight_smile:

Die eigentliche Problemstellung mit den Bytes in der Datei........wenn man es mit Arduino in die Datei schreibt, tut es
"File.write", nicht "File.print"..........

die 2. Variante mit dem decodieren/lesen der orginal Datei aus Xlights............der nette Herr aus dem Forum siehe letzter Post hatte da in diesem Forum noch etwas anderes Veröffentlicht, wo es um das lesen der .fseq Datei ging, das hat er mir gezeigt, und siehe da, funktioniert tadellos.

Also ich nutze jetzt natürlich die Variante, das ich direkt die XLights / .fseq Datei von SD Karte lese an meinem ESP und der die Pixel mit den Werten aus der Datei ansteuert.

Danke für eure Hilfe, wieder etwas dazu gelernt. SUPER !

Grüße Heiko