Forum

Einloggen | Registrieren | RSS  

volvodidi(R)

Bonn / Medevi,
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

volvodidi(R)

Bonn / Medevi,
15.09.2021,
20:56

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

Hej Bastelix,
hab mir gerade nochmal den original Sketch angesehen, er gibt einen float an die Konsole aus, ich gebe einen Wert zwischen 0 und 255 aus für alle 4 Bereiche also + oder - und 0-25,5°C und 25,6-51,2°C seriell aus. Die Zeiten für die Signalerkennung hab ich an meinen Geber angepasst. Hab ich vorher mit einem anderen Sketch ausgelesen.
Das sieht dann etwa so aus: (das auslese Protokoll ist jetzt nicht von dem Geber den ich jetzt verwende)
Start Bit L: 176320 H: 52
Data Bits: 36
L: 984 1972 1968 1968 984 1956 984 1968 1972 988 988 988 984 980 988 996 1960 996 988 1956 1948 1968 1976 988 1956 1960 1956 1956 988 984 1960 1968 1972 1972 988 992
H: 480 468 472 472 472 488 484 472 472 468 484 468 488 472 488 464 480 476 464 484 488 492 468 464 484 480 484 480 488 468 484 480 472 468 468 480
011101011000000010011110111100111100
Gruß
Dieter

volvodidi(R)

Bonn / Medevi,
15.09.2021,
06:24
(editiert von volvodidi
am 15.09.2021 um 16:40)


@ bastelix

Arduino Problem, von SD File lesen und in int ablegen

Hej Bastelix,
die Quelle wo ich den Sketch her habe finde ich nicht mehr, da gibt es jede Menge.
Ich habe solange mit diversen Sketchen und verschiedenen Funkgebern rumprobiert bis ich was gefunden hatte mit dem ich halbwegs zurecht kam.
Bei diesem Sketch konnte ich die vorher ausgelesenen Pulslängen definieren, womit das auslesen sauber funktioniert hat (die Funktion ganz unten im Sketch).
Der Sketch war ursprünglich für einen ganz anderen Geber gedacht. An der Stelle wo die Werte an die Konsole ausgegeben wurden, hab ich dann das was ich benötige an die serielle Schnittstelle rausgeschickt. Und in der vorletzten Funktion lese ich dann von dem bitstrom aus was ich benötige um auf dem Mega die Werte zu verarbeiten.

Hab das Original doch noch gefunden im mikrocontroller.net/topic/252922



Gruß
Dieter

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

bastelix(R)

14.09.2021,
23:23

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

Hi Dieter,

» Auch hab ich das Return ganz unten rausgeschmissen, laut
» Kompilerfehlermeldung liefert das Return ohne Wertangabe einen float
» zurück. Könnte auch eine Ursache sein für das Problem.
Das "return ((unsigned int)x);" ist mir auch aufgefallen. Das ist für mich im Moment noch eine Stelle wo ich mir nicht sicher bin ob da jemand etwas extrem geniales oder etwas furchtbar dummes gemacht hat ;-) So genau hab ich den Code noch nicht nachvollzogen. Darum auch die Frage nach der Quelle für den ursprünglichen Code.

Der cast eines unsigend int nach unsigned int ist überflüssig aber das unsigned int nach float ist zwar unsauber aber solange ich nicht nachvollzogen habe wie die Messwerte decodiert und umgewandelt werden will ich das noch nicht als fehler bezeichnen.

Gruß
Bastelix

volvodidi(R)

Bonn / Medevi,
14.09.2021,
17:51
(editiert von volvodidi
am 14.09.2021 um 17:52)


@ bastelix

Arduino Problem, von SD File lesen und in int ablegen

Hej Bastelix,
» Das hab ich absichtlich noch nicht erwähnt um nicht zu viel auf einmal
» rumzumeckern ;-)

hab jetzt noch weiter in der Funktion aufgeräumt. Die 4 Tempabfragen brauch ich nich,t nur je eine für - und für + Bereich.
Auch hab ich das Return ganz unten rausgeschmissen, laut Kompilerfehlermeldung liefert das Return ohne Wertangabe einen float zurück. Könnte auch eine Ursache sein für das Problem.
Gruß
Dieter

Sieht jetzt so aus. Tut mir leid, aber die Formatierung im Code wird nicht dargestellt.

float decodeTemp(
String bitstream) { // Hier wird aus dem Bitstrom die Geberkennung, das Vorzeichen, der Tempbereich, die Temp. und das Vorzeichen gelesen

unsigned int x = 0;

//Geberkennung
for (int i = 1; i < 4; i++) { // Geberkennung aus Bit 1 bis 3 holen
if (bitstream[i] == '1') {
bitSet(chk, (3 - i));
}
}

if (chk == 5) { // Geberkennung 5 geht fuer Pearl NC-7159

//Vorzeichen +/- lesen
for (int i = 16; i < 18; i++) { // Vorzeichen aus Bit 16 bis 18
if (bitstream[i] == '1') {
vorz = 2; // fuer -
}
if (bitstream[i] == '0') {
vorz = 4; // fuer +
}
}

//Temperaturbereich aus Bit 19 auslesen
if (bitstream[19] == '1' && vorz == 2 || bitstream[19] == '0' && vorz == 4){ // 0 bis -25,5 || ab +25,5
toben = 2;
}
if (bitstream[19] == '0' && vorz == 2 || bitstream[19] == '1' && vorz == 4) { // ab -25,6 || 0 bis +25,5
toben = 4;
}

// Temperatur auslesen (minus Temp invertierte Bitfolge)
if (vorz == 2 && chk == 5) { // minus Bereich
for (int i = 20; i < 28;
i++) { // Extrahiert Bit 20 - 28 und packt es als integer in "x"
if (bitstream[i] == '0') {
bitSet(x, (27 - i));
}
}
}
if (vorz == 4 && chk == 5) { // plus Bereich
for (int i = 20; i < 28;
i++) { // Extrahiert Bit 20 - 28 und packt es als integer in "x"
if (bitstream[i] == '1') {
bitSet(x, (27 - i));
}
}
}
return ((unsigned int)x);
}
else { // Signal gehoert nicht zu den Gebern
chk = 0;
Atemp = 0;
}
}

bastelix(R)

14.09.2021,
00:15

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

Hi Dieter,

» du weist doch ich bin copy and past `er :-) , das hab ich aus dem
» Ursprungssketch der für einen anderen Funktempgeber war genommen, soweit
» hab ich den Sketch noch nicht richtig verstanden. Jetzt wo du es schreibst
» sehe ich was du meinst (Zeile drunter bitstream(i)).
Und du hast sogar noch die if-Blöcke zusammengefasst. :ok:
Das hab ich absichtlich noch nicht erwähnt um nicht zu viel auf einmal rumzumeckern ;-)

» Du weist doch wenn der Kompiler nicht meckert muss das i.O. sein, und wenn
» es dann noch funktioniert......
Ja, aber du hast soeben gezeigt, dass du doch mehr drauf hast ;-)
Und du hast mich zu einer neuen Lerneinheit inspiriert - muss ich dann Morgen ausarbeiten. Bin mal gespannt wie meine Azubis darauf reagieren. (Ja, man lässt mich seit diesem Ausbildungsjahr auf Azubis los :lookaround: Macht echt Spaß, ist aber auch eine Herausforderung. Ich will ja keine Code-Monkeys unterweisen, ich will den Grundstein für die nächste Generation von Haecksen und Hacker legen.)

Wenn du mal eine halbe Stunde Zeit hast, schau dir den Vortrag an https://www.youtube.com/watch?v=zIKZKkPtmNs
Ich muss den Vortrag auch noch in den Ausbildungsplan einarbeiten, irgendwann bevor sie auf Produktivsysteme losgelassen werden aber nachdem sie aus dem Vortrag einen Mehrwert ziehen können - jetzt abseits von reiner Unterhaltung, weil den Vortrag finden auch Menschen großartig die mit Programmieren nichts zu tun haben ;-)

» So hab es jetzt mal bereinigt denke das sollte passen.
Auf den ersten Blick viel besser, genaueres Code-Review folgt voraussichtlich am Wochenende.
Ach und hast du noch einen Link zum Code den du für den Funksensor als Vorlage verwendest hast?

Gruß
Bastelix

volvodidi(R)

Bonn / Medevi,
13.09.2021,
06:35
(editiert von volvodidi
am 13.09.2021 um 16:27)


@ bastelix

Arduino Problem, von SD File lesen und in int ablegen

Moin Bastelix,

» » Mit int i=19 frage ich die 19. Position des Bitstream (besteht aus 36
» » Bit) ab.
» Dann schreibt doch einfach bitstream[19] ;-) dann versteht das auch jemand
» anders :-D :-D :-D

du weist doch ich bin copy and past `er :-) , das hab ich aus dem Ursprungssketch der für einen anderen Funktempgeber war genommen, soweit hab ich den Sketch noch nicht richtig verstanden. Jetzt wo du es schreibst sehe ich was du meinst (Zeile drunter bitstream(i)).
Du weist doch wenn der Kompiler nicht meckert muss das i.O. sein, und wenn es dann noch funktioniert......

So hab es jetzt mal bereinigt denke das sollte passen.

Gruß
Dieter

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

bastelix(R)

12.09.2021,
20:39

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

Hi Dieter,

» Mit int i=19 frage ich die 19. Position des Bitstream (besteht aus 36
» Bit) ab.
Dann schreibt doch einfach bitstream[19] ;-) dann versteht das auch jemand anders :-D :-D :-D

» Ich hab den Sketch mal sauber dokumentiert. Hab ihn dir per mail
» geschickt.
Grad überflogen, da muss ich mich nochmal etwas intensiver mit befassen. Ich baue dir dann auch eine Fehlerbehandlung für die Zeile 140 ein.

» Ich hoffe du kommst mit meinen wirren Erklärungen zurecht.
Ich denke, ansonsten frage ich per Mail nach und schlimmstenfalls müssen wir halt mal kurz telefonieren.

Gruß
Bastelix

volvodidi(R)

Bonn / Medevi,
12.09.2021,
12:24
(editiert von volvodidi
am 12.09.2021 um 16:11)


@ bastelix

Arduino Problem, von SD File lesen und in int ablegen

Hej bastelix,
» 1. "if (int i = 19)" ist IMMER true, das kann man eigentlich weg lassen.

Mit int i=19 frage ich die 19. Position des Bitstream (besteht aus 36 Bit) ab.

» 2. In Zeile 140 wird die Methode verlassen ohne einen Wert zurückzugeben,
» die Methode decodeTemp hat eigentlich einen float als Rückgabewert. Der
» Rückgabewert von decodeTemp wird in Zeile 50 verwendet. Was bei dem return;
» zurückgegeben wird ist nicht definiert.

Das ist noch aus dem alten Sketch drin geblieben. Ob ich das wirklich brauche weiß ich nicht, er soll da rausspringen wenn die Geberkennung nicht passt.

» 3. In der Methode decodeTime(int) ab Zeile 144 wird nicht immer ein
» Rückgabewert zurückgegeben (analog Punkt 2 ;-) )
» Wenn der Übergebene Wert < 1800 oder > 10000 ist, wird 'X' zurückgegeben.
» Aber wenn der Wert z.B. 2100 ist, dann wird nix zurückgegeben, also ist der
» Rückgabewert wieder undefiniert.

Hier wird geprüft ob das Signal im angegebenen Zeitfenster liegt 1800 - 10000, wenn dann wird danach geschaut, ob das Signal 1 oder 0 ist, und ob das Fenster für die Startsequenz passt. Da steht doch ein und "&&" und kein oder.

Ich hab den Sketch mal sauber dokumentiert. Hab ihn dir per mail geschickt.
Ich hoffe du kommst mit meinen wirren Erklärungen zurecht.
Gruß
Dieter



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

bastelix(R)

11.09.2021,
23:31

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

So ich hab mir mal den Code kurz angeschaut, nachdem ich ihn neu formatieren ließ ;-)

Vorerst mal nur den Pro Mini, hier frisch formatiert: https://www.elektronik-kompendium.de/forum/upload/20210911224854.ino

Da ist mir einiges aufgefallen was ein Gschmäckle hat. Bevor das nicht glatt gezogen ist macht eine weitere Fehlersuche in dem Code wenig Sinn.

1. "if (int i = 19)" ist IMMER true, das kann man eigentlich weg lassen.

Eventuell soll damit geprüft werden ob die Variable i in der for-Schleife (Zeile 70) auf den Wert 19 hochgezählt wurde. Aber das wird nie Passieren, da zum einen das Abbruchkriterium i < 18 ist und zum anderen die Variable i nur innerhalb der Schleife definiert ist. Was möchtest du mit dem Konstrukt genau bezwecken?

2. In Zeile 140 wird die Methode verlassen ohne einen Wert zurückzugeben, die Methode decodeTemp hat eigentlich einen float als Rückgabewert. Der Rückgabewert von decodeTemp wird in Zeile 50 verwendet. Was bei dem return; zurückgegeben wird ist nicht definiert. Hab das eben mal auf meinem PC ausprobiert, da ist der Rückgabewert immer 0, was aber nicht heißen muss, dass sich das auf einem Arduino auch so verhält.
Eigentlich sollte das der Compiler garnicht erlauben, ich musste meinem g++ explizit sagen, dass er das trotzdem compilieren soll. Anscheinend haben die Arduino-Leute da ein andere Ansicht von Clean Code als ich ;-)

3. In der Methode decodeTime(int) ab Zeile 144 wird nicht immer ein Rückgabewert zurückgegeben (analog Punkt 2 ;-) )
Wenn der Übergebene Wert < 1800 oder > 10000 ist, wird 'X' zurückgegeben. Aber wenn der Wert z.B. 2100 ist, dann wird nix zurückgegeben, also ist der Rückgabewert wieder undefiniert.

Den Code solltest du zuerst aufräumen und testen, dann schauen wir weiter ;-)

Gruß
Bastelix

volvodidi(R)

Bonn / Medevi,
10.09.2021,
20:53
(editiert von volvodidi
am 11.09.2021 um 15:44)


@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

Hab nochmal in Ruhe durchgeschaut, und ein paar Fehler gefunden, die aber nix mit dem Problem zu tun haben.
Hier die bereinigte Version:

Schaltuhr
https://www.elektronik-kompendium.de/forum/upload/20210910205334.txt
Funkgeber auslesen Mini Pro
https://www.elektronik-kompendium.de/forum/upload/20210911154403.txt

volvodidi(R)

Bonn / Medevi,
10.09.2021,
06:29
(editiert von volvodidi
am 10.09.2021 um 08:15)


@ bastelix

Arduino Problem, von SD File lesen und in int ablegen

Hej, nur die Ruhe.
Kümmer dich erstmal um deine Pilze.
Die Uhr funktioniert ja.
Wunder dich nicht wegen Atemp und Btemp die beide den gleichen Wert haben. Das ist der Versuch von gestern zu prüfen, ob das was rein kommt über seriell auch wirklich eine Zahl ist. Wenn ich das byte direkt damit prüfe, kommt eine unbrauchbare Zahl raus. Ich hatte ein ähnliches Problem, beim Einsatz des GPS Empfängers. Dafür benötige ich die softseriell Lib, die verursacht aber Störungen beim auslesen des DHT22. Da kommt dann ab und an auf dem Display "nan" (not a number). Durch den Vergleich mit einem passenden Wertebereich konnte ich die nan`s rausfiltern. Deshalb der Versuch mit Atemp und Btemp.
Jetzt lass ich das Teil erstmal wieder in Ruhe laufen um zu sehen ob es was bringt.
Ich gehe davon aus, das der mini Pro da irgendeinen Müll liefert, vielleicht wegen Überlauf.

//Signal von Mini Pro
gelesen=0;
if (Serial2.available() > 0) { // Liest Temp. Bereich 0-25,5, 25,6-
toben=(Serial2.read());
}
if (Serial2.available() > 0) { // Liest den eingehenden Temp. Wert
Btemp=(Serial2.read());
}
if (Serial2.available() > 0) { // Liest das eingehende Wert für Vorzeichen
vorz=(Serial2.read());
gelesen=1;
}
if(Btemp >= 0 && Btemp <= 256) {
Atemp=Btemp;
}
Gruß
Dieter

bastelix(R)

10.09.2021,
00:24

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

Hi Dieter,

ok, da muss ich mich nochmal komplett neu einlesen, das ist für mich schon sehr lange her. Wie passen meldet sich genau jetzt der Timer, dass die Steinpilze jetzt trocken genug fürs verpacken sein sollten :-D
Ich schau mal, dass ich mir das am Wochenende anschauen kann. Hab im Moment recht viel um die Ohren, aber ich glaube du hast meine E-Mail-Adresse. Wenn du bis zum 26.09. nichts von mir gehört hast solltest du mir mal eine kleine Erinnerungsmail schreiben ;-)

Gruß
Bastelix

volvodidi(R)

Bonn / Medevi,
09.09.2021,
21:10
(editiert von volvodidi
am 09.09.2021 um 21:11)


@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

Hi bastelix,
ich glaub ich brauch nochmal einen Anschub.
Habe die Uhr im Sommer (erst) oben in S probieren können, und wie erwartet keinen brauchbaren DCF empfang.
Gut dann also GPS Empfänger rein. Das funktioniert wunderbar. GPS Empfang hab ich im ganzen Haus.
Ich hab dann noch einen Funktemperatursensor mit eingebunden den ich mit einem Arduino mini Pro auslese und per seriell vom Mega auslese und anzeige (alles in einem Gehäuse).
Dann hab ich noch für die Innen und Außentemp. einen min/max Speicher angelegt.
Das Funktioniert innen ohne Probleme, aber außen.
Es funktioniert ein paar Tage und dann hab ich plötzlich nix da stehen. Mal ist der max. Speicher leer mal der min. Ist leider nicht reproduzierbar.
Hatte erst die Idee mit isdigit zu kontrollieren ob ich wirklich eine Zahl habe, kann aber nur auf char angewendet werden. Ist aber ein int.
Dann hab ich eine Abfrage gesetzt die kontrolliert ob der Wert in einem bestimmten Bereich liegt, bringt aber auch nix.
Die serielle Übergabe aus dem mini Pro mach ich in 3 Teilen. Einmal der Bereich 0-25,5° und 25,6 bis 51,2°, den Wert selber, und das Vorzeichen + oder -.
Da ich seriell nur 1byte übertrage und das nur bis 255 geht, hab ich den Bereich über das 1. bit von den 9 als Bereich gesetzt. Bei Minustemperaturen werden die vom Funktempgeber gesendeten bits invertiert. Für die Verarbeitung auf dem Meg rechne ich damit bis es passt. Ich krieg es nicht hin 2 bytes zu senden und diese dann zusammenzusetzen. Es geht auch ohne :-).
Im Moment komme ich da nicht mehr weiter.
Ich hab das Gefühl das da irgendwas reinhaut was nicht Zahl ist, anders kann ich mir das im Moment nicht erklären.
Gruß
Dieter

Schaltuhr:
https://www.elektronik-kompendium.de/forum/upload/20210909211018.txt
Funkgeber auslesen:
https://www.elektronik-kompendium.de/forum/upload/20210909211106.txt

volvodidi(R)

Bonn / Medevi,
09.05.2021,
12:14

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

Und hier noch mal ein Update mit Absicherung zum Zeit holen per DCF, Anzeige, etc..
Gruß
Dieter


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

bastelix(R)

19.01.2021,
00:01

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

» Und weiter gehts mit Erweiterungen.
:ok: :ok: :ok:

Freut mich, dass es weiter geht und dass du deinen Code mit allen teilst :-)
» https://www.elektronik-kompendium.de/forum/upload/20210118194334.txt