Forum

Einloggen | Registrieren | RSS  

volvodidi(R)

23.02.2020,
13:33
 

Arduino Problem, von SD File lesen und in int ablegen (Elektronik)

Hallo,
hab ein Arduino Problem, da sich hier auch einige damit auskennen, denke ich, ich versuche hier mal eine Lösung zu finden. Die Arduino Foren sind leider nicht sehr hilfreich....
Zum Problem. Habe eine Zeichenkette auf die SD geschrieben (File: ON.TXT) die Zeichenkette in der Datei sieht folgendermaßen aus:

3208,9868,576,1532,532,492,524,524,544,516,528,1552,528,492,548,504,524,508,524,508,524,508,528,504,528,496,544,500,544,1548,528,512,500,532,528,508,524,508,
520,1540,524,508,496,540,496,544,496,544,496,536,524,508,524,1532,548,1536,528,516,524,

Es handelt sich hierbei um Zeiten, in µsec Komma getrennt, die ich von SD einlesen will, und in eine Variable (int) speichern muss, um dann den Code über eine IR-Diode, an die Klima zu senden. Dazu muss der Code genauso, wie er auf der SD abgelegt ist, in die Variable geschrieben werden.
Mein Sketch unten gibt mir auf der Konsole das aus:

3208,9868,576,1532,532,492,524,524,544,516,528,1552,528,492,548,504,524,508,524,508,524,508,528,504,528,496,544,500,544,1548,528,512,500,532,528,508,524,508,
520,1540,524,508,496,540,496,544,496,544,496,536,524,508,524,1532,548,1536,528,516,524,

Wenn ich dann die Variable AC_irSignalON, außerhalb der geschweiften Klammer ein 2. Mal abfrage, kommt nur noch das letzte Komma.
Ich versuche seit Tagen die Variable aus der SD zu füllen, komme aber auf keinen grünen Zweig.
Meine letzte Hoffnung ist, das hier vielleicht jemand eine idee hat.
Im Anhang der Sketch ohne Smilies :-).
Dieter

[code]
#include <SPI.h>
#include <SD.h>
#include <IRremote.h> //IR Pin 9

File myFile;
IRsend irsend; //Pin 9
//const unsigned int AC_irSignalON[] PROGMEM = {3208,9868,576,1532,532,492,524,524,544,516,528,1552,528,492,548,504,524,508,524,508,524,508,528,504,528,496,544,500,544,1548,528,512,500,532,528,508,524,508,520,1540,524,508,496,540,496,544,496,544,496,536,524,508,524,1532,548,1536,528,516,524,}; //AnalysIR Batch Export (IRremote) - RAW

unsigned int AC_irSignalON;


void setup() {
// Open serial communications and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}


Serial.print("Initializing SD card...";);

if (!SD.begin(53)) {
Serial.println("initialization failed!";);
while (1);
}
Serial.println("initialization done.";);

// re-open the file for reading:
myFile = SD.open("ON.TXT";);

if (myFile) {
Serial.println("ON.TXT:";);

// read from the file until there's nothing else in it:
while (myFile.available())

{

AC_irSignalON=(myFile.read());
Serial.write(AC_irSignalON);
}
Serial.println();
Serial.write(AC_irSignalON);
sendRAW_Flash(AC_irSignalON, sizeof(AC_irSignalON)/sizeof(int),38); //send AC signal #On @ 38kHz
myFile.close();
}

else {
// if the file didn't open, print an error:
Serial.print("error opening ON.TXT";);
}



}


void loop() {
// nothing happens after setup
}

void sendRAW_Flash(unsigned int * signalArray, unsigned int signalLength, unsigned char carrierFreq) {

irsend.enableIROut(carrierFreq); //initialise the carrier frequency for each signal to be sent

for (unsigned int i=0;i<signalLength;i++){
if (i & 1) irsend.space(signalArray[i]);
else irsend.mark(signalArray[i]);
}
irsend.space(1);//make sure IR is turned off at end of signal

}
[/code]

https://www.elektronik-kompendium.de/forum/upload/20200223133230.txt

Gast

23.02.2020,
14:13

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

In einem Arduionforum wäre die Frage sicher sinnvoller. In zweien bin ich unterwegs, habe deine Frage da aber noch nicht gelesen.
Das Forum hier ist da weniger geeignet, was du schon daran erkennst, dass es hier keinen Codeblock gibt.
Und download? Echt jetzt?

bastelix(R)

23.02.2020,
19:42

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

Hallo,

du schreibst N werte in eine Variable vom Typ unsigned int. Da ist aber nur Platz für eine vorzeichenlose Ganzzahl. Damit überschreibst du bei jedem Schleifendurchlauf den Wert der zuvor in der Variablen gespeichert war. Wenn du alle Werte im Speicher halten willst, musst du ein Array verwenden und die Werte an die verschiedenen Position im Array speichern.

Ist die Anzahl der Werte immer gleich, oder ist deren Länge veränderlich? Was ist eigentlich die größtmögliche Zahl die du speichern willst?

volvodidi(R)

23.02.2020,
20:20

@ bastelix

Arduino Problem, von SD File lesen und in int ablegen

@bastelix,
wie du schreibst, überschreibe ich die Werte, und der letzte bleibt übrig. Ich versuche seit Tagen die Werte hintereinander in die Variable zu schreiben. In der Ausgabe auf der Konsole, kommt aber immer nur der letzte Wert.
Die Anzahl der Werte sind bei der LG Klima immer 59, der größte Wert wird nicht größer wie 9999 werden.
Einen unsigned int brauche ich nicht zwingend, habe die Werte mal fest in einen int geschrieben und gesendet, was funktioniert hat.
Die einzelnen Werte müssen aber mit Komma getrennt in der Variable stehen.
Ich wäre sehr dankbar für eine Idee wie.
Sinn und Zweck des Ganzen, ist eine Schaltuhr, die zu eingestellten Zeiten die Klima an und beim nächsten Schaltpunkt aus schaltet. Bisher habe ich die Fernbedienung mit einem Uno und ir Receiver ausgelesen, und dann die Werte in den Schaltuhrsketch von Hand eingetragen, der beim Kompileren den Code in den Programmspeicher geschrieben hat auf einem Mega.Das ist aber sehr umständlich, wenn ich etwas an der Klimaeinstellung ändern will. Ich habe einen Sketch mit dem ich die FB einlesen kann, und den Code auf SD schreibe (jeweils ON.TXT und OFF.TXT), den will ich in den Schaltuhrsketch einbauen um auf Tastendruck (4x4 Keypad) den Ein und Aus Code auf SD abzulegen.
Die Schaltuhr soll dann die jeweilige Datei auslesen und senden. Damit wäre die Schaltuhr dann autark einsetzbar.
Aber zur Zeit scheitere ich eben am schreiben der Variable von der SD.
Gruß
Dieter

bastelix(R)

24.02.2020,
00:16

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

» wie du schreibst, überschreibe ich die Werte, und der letzte bleibt übrig.
» Ich versuche seit Tagen die Werte hintereinander in die Variable zu
» schreiben.
Das geht so nicht! Eine Variable vom Typ unsigned int (oder int) ist ein 32 Bit großer Speicherbereich in den ein *einziger* 32 Bit großer Wert geschrieben werden kann.
Was du da mit dem "const unsigned int AC_irSignalON[] ..." gemacht hast, ist ein Array vom Typ unsigned int zu verwenden. Beachte die eckigen Klammern hinter dem Variablen-Namen, das macht aus einem 32-Bit Speicherplatz viele 32-Bit große Speicherplätze.

Ich versuch das mal mit etwas Arduino-Code zu erklären: https://www.elektronik-kompendium.de/forum/upload/20200223235843.ino
(Vorsicht, das Script verwendet 9600 baud statt deinen 115200 baud - du musst also entweder den Code oder deine Serielle Konsole anpassen)

Wenn du den Code ausführt siehst du folgendes in deiner Konsole.

Array variablen demo
===================================
Write 10 values to singleInt
singleInt = 0
singleInt = 1
singleInt = 2
singleInt = 3
singleInt = 4
singleInt = 5
singleInt = 6
singleInt = 7
singleInt = 8
singleInt = 9

Write 10 values to arrayInt
arrayInt = 1,0,0,0,0,0,0,0,0,0,
arrayInt = 1,2,0,0,0,0,0,0,0,0,
arrayInt = 1,2,3,0,0,0,0,0,0,0,
arrayInt = 1,2,3,4,0,0,0,0,0,0,
arrayInt = 1,2,3,4,5,0,0,0,0,0,
arrayInt = 1,2,3,4,5,6,0,0,0,0,
arrayInt = 1,2,3,4,5,6,7,0,0,0,
arrayInt = 1,2,3,4,5,6,7,8,0,0,
arrayInt = 1,2,3,4,5,6,7,8,9,0,
arrayInt = 1,2,3,4,5,6,7,8,9,10,

Daran solltest du den Unterschied zwischen einer einfachen Single-Value-Variablen und einem Array erkennen können. Wenn nicht, spiel mal etwas mit dem Code rum und wenn dir was unklar ist frag einfach nochmal nach.

» Die Anzahl der Werte sind bei der LG Klima immer 59, der größte Wert wird
» nicht größer wie 9999 werden.
Dann sollte uint16_t arrayInt[59] = {0}; reichen.

» Ich habe einen Sketch mit dem ich die FB einlesen kann, und den Code auf SD schreibe (jeweils ON.TXT und OFF.TXT), den will ich in den Schaltuhrsketch einbauen um auf Tastendruck (4x4 Keypad) den Ein und Aus Code auf SD abzulegen.
Kannst du mal die ON.TXT hochladen? So wie du das beschreibst ist das eher keine Text-Datei sonder etwas binäres. Macht für deinen Anwendungsfall aber keinen Unterschied, würde mich aber interessieren ;-)

volvodidi(R)

24.02.2020,
08:47

@ bastelix

Arduino Problem, von SD File lesen und in int ablegen

ok, vielen Danke, damit werde ich mich heute mal beschäftigen ob ich das hintereinander bekomme.
Die "const unsigned int AC_irSignalON[] PROGMEM = {3208...." ist Altlast aus dem orig. sende Sketch. Den hab ich nur zum Vergleich mit der Konsolenausgabe drin gelassen.
Hier hab ich den gelesenen FB Code reinkopiert, damit er beim kompilieren in den Programmspeicher geschrieben wird (umständlich).
Im Anhang die ON.TXT so wie sie vom Empfängersketch auf der SD abgelegt wird.
Gruß
Dieter

https://www.elektronik-kompendium.de/forum/upload/20200224084608.txt

volvodidi(R)

24.02.2020,
10:46
(editiert von volvodidi
am 24.02.2020 um 13:35)


@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

Demnach hätte ich mit
int AC_irSignalON[] = {3208,9868,576,1532,532,492,524,524,544,516,528,1552,528,492,548,504,524,508,524,508,524,508,528,504,528,496,544,500,544,1548,528,512,500,532,528,508,524,508,520,1540,524,508,496,540,496,544,496,544,496,536,524,508,524,1532,548,1536,528,516,524,}
ein gefülltes Array erstellt. Richtig?
Dieter

Hansen(R)

24.02.2020,
17:16

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

» Demnach hätte ich mit
» int AC_irSignalON[] =
» {3208,9868,576,1532,532,492,524,524,544,516,528,1552,528,492,548,504,524,508,524,508,524,508,528,504,528,496,544,500,544,1548,528,512,500,532,528,508,524,508,520,1540,524,508,496,540,496,544,496,544,496,536,524,508,524,1532,548,1536,528,516,524,}
» ein gefülltes Array erstellt. Richtig?
» Dieter

Hallo Dieter,

probiere mal so:

int AC_irSignalON[Anzahl_der_Werte] = { 3208,9868,576, usw. };

Gruß
Jörg

volvodidi(R)

24.02.2020,
18:44

@ Hansen

Arduino Problem, von SD File lesen und in int ablegen

Hi Jörg,
das array hatte ich in meinem "nur" sende Sketch eingesetzt, um zu sehen ob das senden auch daraus funktioniert, oder nur wenn die Daten im Programmspeicher liegen.
Das senden aus dem array geht, auch wenn ich, wie du vorgeschlagen hast die arraylänge mit 59 angebe.
Mein Hauptproblem ist das einlesen von SD.
Im Moment versuche ich noch mit dem Vorschlag von bastelix das komplette array aufzurufen. Einzelne Positionen kann ich aufrufen, aber nicht das ganze array auf einmal.

Serial.print(arrayInt[5]); // wenn ich hier 1-9 eingebe, erhalte ich jeweils eine 1

Man könnte das array mit einer schleife aufrufen, das kann ich dann aber nicht senden, da ich die ganze Kette am Stück brauche.
Zur Zeit besteht das array aus 10 1er Werten.
Gruß
Dieter

unsigned int arrayInt[10] = {0};
void setup() {
Serial.begin(115200);
//Serial.println("Write 10 values to arrayInt";);
for(uint8_t i = 0; i < 10; ++i) {
arrayInt[i] = 1;
//Serial.print("arrayInt = ";);
for (uint8_t j = 0; j < 10; ++j) {
//Serial.print(arrayInt[j]);
//Serial.print(",";);
}
}
Serial.print(arrayInt[5]); // wenn ich hier 1-9 eingebe, erhalte ich jeweils eine 1
}


void loop() {
// nothing to do here...
}

bastelix(R)

24.02.2020,
23:27

@ Hansen

Arduino Problem, von SD File lesen und in int ablegen

» probiere mal so:
»
» int AC_irSignalON[Anzahl_der_Werte] = { 3208,9868,576, usw. };
Dann muss man Anzahl_der_Werte und das Array zum initialisieren anpassen, wenn sich was ändert. Macht keinen Sinn. Entweder man definiert die Größe des Arrays oder man initialisiert das Array.

bastelix(R)

24.02.2020,
23:34

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

» Demnach hätte ich mit
» int AC_irSignalON[] =
» {3208,9868,576,1532,532,492,524,524,544,516,528,1552,528,492,548,504,524,508,524,508,524,508,528,504,528,496,544,500,544,1548,528,512,500,532,528,508,524,508,520,1540,524,508,496,540,496,544,496,544,496,536,524,508,524,1532,548,1536,528,516,524,}
» ein gefülltes Array erstellt. Richtig?
Ja, aber du willst die Daten ja aus einer Textdatei auslesen. Also solltest du die Größte festlegen, statt das Array zu initialisieren.

int AC_irSignalON[59]; oder int AC_irSignalON[59] = {0};
Letzteres initialisiert jede Stelle im Array mit 0, das macht das debuggen einfacher.

bastelix(R)

25.02.2020,
00:19

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

» Mein Hauptproblem ist das einlesen von SD.
Jupp. Ich habe mir nochmal deinen Code angeschaut. Da ist noch ein Problem, aber lass uns zuerst mal dein aktuelles Programm durchgehen:

Du erstellt ein Array mit zehn Stellen (Speicherplätzen) und initialisierst alle Stellen mit 0.
» unsigned int arrayInt[10] = {0};
» void setup() {
» Serial.begin(115200);
In der schleife zählst du die variable i von 0 bis 9 hoch
» for(uint8_t i = 0; i < 10; ++i) {
Hier schreibst du an die Position i im Array die Zahl eins. Und das für jeden Wert den i annimmt. Damit ist klar, dass an Stelle fünf im Array auch eine eins steht. Du schreibst ja an jede Stelle im Array eine eins ;-)
Versuch mal arrayInt[i] = i; dann steht im Array 1,2,3,4,5,6,7,8,9 oder du nimmst arrayInt[i] = i * 2; dann füllst du dein Array mit den Werten 0,2,4,6,8,10,12,14,16,18
» arrayInt[i] = 1;
» for (uint8_t j = 0; j < 10; ++j) {
Hier hast du anscheinend mal versucht das Array nach jedem Schreibvorgang auszugeben. Gute Idee!
» //Serial.print(arrayInt[j]);
» //Serial.print(",";);
» }
» }
» Serial.print(arrayInt[5]); // wenn ich hier 1-9 eingebe, erhalte ich
» jeweils eine 1
» }

Soweit verstanden?

Dann zurück zu deinem Datei auslesen. File.read() liest ein byte bzw. ein Zeichen ( https://www.arduino.cc/en/Reference/FileRead ) also "3" (als String) bzw. 51 als int und nicht die erwarteten 3208 bis zum Komma. (Siehe auch https://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange ). Du musst das Auslesen der Textdatei also auch etwas anders Programmieren um die gewünschten Werte in ein int Array zu schreiben.

Jetzt mal ganz ehrlich: Willst du programmieren lernen oder willst du einfach nur ein fertiges Programm das deine Klimaanlage steuert?
Ich helfe dir gerne bei beidem, ich will nur von Anfang an wissen was das Ziel ist.

volvodidi(R)

25.02.2020,
18:56

@ bastelix

Arduino Problem, von SD File lesen und in int ablegen

Hej bastelix,
zum programieren lernen fehlt mir einfach die Zeit. Die Schaltuhr hab ich bis zur 2. Version mit etwas überlegung, Tipps, und vor allem paste and copy zusammengesetzt. Hat bisher super geklappt. Die Uhr schaltet meine Klima, und per Funk den Deckenventilator an und aus, zur eingestellten Zeit. Nur das Ändern der Klimaeinstellung ist umständlich. Das wollte ich wenn es geht noch zum laufen bringen. Einen Sketch der den ir einliest und auf SD schreibt hab ich zusammengebaut, der funktioniert. Bevor ich den aber in die Schaltuhr einsetze wollte ich erstmal schauen ob das lesen von SD und senden über ir klappt. Und hier bin ich an die Grenzen von paste and copy gestoßen. Ich hab mir die Finger wund gesucht nach Anwendungen die in meine Richtung gehen, aber nix brauchbares (etwas wo ich hintersteigen kann) gefunden. Das einlesen sah erst ganz gut aus, hat aber was gedauert bis ich begriffen habe das das nur auf der Konsole gut aussieht. Ich weiß nicht wie ich es ablegen kann um es anschließend zu senden.
Die Geschichte mit dem Array ist an sich gut, aber ich hab es nicht geschafft, das am Ende gefüllte Array mit einem Aufruf komplett auszugeben. Wenn ich die Beschreibung zum Array richtig verstanden habe, kann ich das nicht einfach nehmen und komplett weiterverarbeiten. Sondern man muss wohl das Array mit einer Schleife der Reihe nach auslesen, dann muss ich es aber wieder irgendwo ablegen um es dem ir sende Sketch als Ganzes zu übergeben. Mit dem Programmspeicher funktioniert es, und auch als int, in dem der Code eingestzt ist. Gibt es ausser dem Progmem der ja nur beim kompilieren gefüllt wird eine Möglichkeit den Code abzulegen, oder gibt es doch eine Möglichkeit den Array am Stück auszulesen?
Gruß
Dieter

volvodidi(R)

25.02.2020,
20:28
(editiert von volvodidi
am 25.02.2020 um 20:35)


@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

Hi,
hier mal das ir signal was aus dem Code generiert wird, die Dauer des Signals ist 49000µsec. Am Anfang steht ein 1000µsec langes low deshalb sind es 60 Werte.
Die Gesamtlänge des Signals kann variieren, wenn mehr 4 stellige Signale dabei sind. Das ON hat zb. 6 low Zeiten mit mehr als 1000µsec, das OFF Signal hat 7. Bei anderen Einstellungen können es mehr oder weniger werden. Nur die Anzahl von 59 High`s and low`s bleibt.
Aufgezeichnet mit analysir und einem USB irToy.
Dieter

bastelix(R)

25.02.2020,
23:09

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

Servus,

» zum programieren lernen fehlt mir einfach die Zeit.
Was hältst du davon: Du stellst deinen aktuellen Code für die Zeitschaltuhr irgendwo bereit und ich hake dir dann in den nächsten Tagen das SD-Card-Feature rein? Das Programm zum loggen der IR-Codes könnte ich auch noch brauchen, dann verstehe ich wie die Datei genau geschrieben wurde.
Testen musst du das dann selber, da ich deine anzusteuernden Geräte nicht da habe.

Was hältst du davon?

volvodidi(R)

26.02.2020,
17:01
(editiert von volvodidi
am 26.02.2020 um 17:40)


@ bastelix

Arduino Problem, von SD File lesen und in int ablegen

Hej bastelix,
ich kann dir die Sketche per mail zusenden, oder hier im Thread einstellen.
Meine mailaddy dieter at volvodidi punkt deutschland.
Schick mir eine mail und ich sende dir dann alle Sketche zu.

@all und keine Angst, euch entgeht nix, werde das weiter dokumentieren, vielleicht braucht ja mal einer etwas ähnliches.

Gruß
Dieter