AT Befehl (AT+CSQ) Ausgabe auf einer SD Karte speichern

Hey Leute,

sitze jetzt seit paar Tagen an meinem Programm und komme nicht wirklich weiter.
Ich will von meinem GSM Modul die Signalstärke auf einer SD Karte speichern.

habe ein kleines Programm geschrieben, was aber nicht fertig ist, bzw. weiß ich einfach nicht wo es hackt.

ich zeige euch mal kurz den Code und erkläre wo das Problem ist, bzw. was meine Idee ist:

#include <SoftwareSerial.h>  //include library code
#include <SD.h>
#include <SPI.h>
//********************************************
SoftwareSerial GPSmodul(2, 3);//RX, TX
//**********************************************
File outFile;
int pinCS = 53;
int Data;
String filename = "GSMdaten.txt";
int index = 0;
void setup()
{
GPSmodul.begin(9600);   
Serial.begin(9600);  
pinMode(10, OUTPUT);
if (SD.begin())
{
 Serial.println("SD Karte konnte erfolgreich geladen werden");
}
else 
{
 Serial.println("SD Karte konnte NICHT geladen werden!");
 return;
}
Serial.println("GSM-Modul Signalstärke Test");    
GPSmodul.println("AT");  
delay(1000);
}
long letztecmd = millis ();

void loop()
{
if (GPSmodul.available())             // warten auf Daten vom Modul
  Serial.write(GPSmodul.read());      // schreibe die Daten auf den seriellen Bildschirm
if (Serial.available())               // warten auf Kommandos vom seriellen Bildschirm
 GPSmodul.write(Serial.read());      // Kommandos aufs Modul schicken
if (millis() - letztecmd > 3000)      // Messung alle 5 Sekunden vornehmen 
{ letztecmd = millis();               // neue Zeit setzen
GPSmodul.println("AT+CSQ");
Data = GPSmodul.write("AT+CSQ");;
   outFile = SD.open(filename, FILE_WRITE);
   if (outFile)
     {Serial.println("Schreiben von Daten auf die SD Karte");
      outFile.print(++index);
      outFile.print(",");
      outFile.println(Data);         // Signalqualitätinfo einholen
      outFile.println("");
      outFile.close();
        }
        else
         {
          Serial.println("Fehler beim öffnen der Datei.");
         }
} 

}

Auf dem seriell Monitor wird alles super angezeigt. Ich weiß jetzt aber nciht wie ich die angezeigten Werte auf meine SD Karte bringe.

Hoffe jemand hat eine Idee…

Dankeschön

Setze Deinen Code bitte in Codetags (</>-Button im Forumseditor), dann ist er von allen gut lesbar.

Du solltest die Zeichen nach der Befehlausgabe in einer Schleife auf die SD schreiben oder in Deinem if (GPSmodul.available()) in ein Char-Array einlesen.

Gruß Tommy

ohhh sry daran habe ich nicht gedacht.
hoffe so ist das besser.

Kannst du mir vielleicht kurz erklären was genau du mit Char-Array meinst?

#include <SoftwareSerial.h>  //include library code
#include <SD.h>
#include <SPI.h>
//********************************************
SoftwareSerial GPSmodul(2, 3);//RX, TX
//**********************************************
File outFile;
int pinCS = 53;
int Data;
String filename = "GSMdaten.txt";
int index = 0;
void setup()
{
GPSmodul.begin(9600);   
Serial.begin(9600); 
pinMode(10, OUTPUT);
if (SD.begin())
{
  Serial.println("SD Karte konnte erfolgreich geladen werden");
}
else
{
  Serial.println("SD Karte konnte NICHT geladen werden!");
  return;
}
Serial.println("GSM-Modul Signalstärke Test");   
GPSmodul.println("AT"); 
delay(1000);
}
long letztecmd = millis ();

void loop()
{
if (GPSmodul.available())             // warten auf Daten vom Modul
   Serial.write(GPSmodul.read());      // schreibe die Daten auf den seriellen Bildschirm
if (Serial.available())               // warten auf Kommandos vom seriellen Bildschirm
  GPSmodul.write(Serial.read());      // Kommandos aufs Modul schicken
if (millis() - letztecmd > 3000)      // Messung alle 5 Sekunden vornehmen
{ letztecmd = millis();               // neue Zeit setzen
GPSmodul.println("AT+CSQ");
Data = GPSmodul.write("AT+CSQ");;
    outFile = SD.open(filename, FILE_WRITE);
    if (outFile)
      {Serial.println("Schreiben von Daten auf die SD Karte");
       outFile.print(++index);
       outFile.print(",");
       outFile.println(Data);         // Signalqualitätinfo einholen
       outFile.println("");
       outFile.close();
         }
         else
          {
           Serial.println("Fehler beim öffnen der Datei.");
          }
}

}

Dann sieh mal hier
https://www.arduino.cc/reference/en/language/variables/data-types/array/

was ich nicht so richtig verstehe ist, wie ich einen Wert auslese, den der Code ja gar nicht hat. Also der wird ja nur vom Modul zurück geschickt und ist auf dem Bildschirm dann zu sehen.

Kenne Arrays nur als direkte Eingabe im Code, so dass man daraus dann was ziehen kann.

Wisst Ihr was ich meine?

GPSmodul.println("AT+CSQ");
Data = GPSmodul.write("AT+CSQ");;

Müßte es nicht read anstelle write heißen?

GPSmodul.println("AT+CSQ");
Data = GPSmodul.read();

ja das war schon ein verzweifelter Versuch irgendwas zu machen. Hatte erstmal read

Kirkos:
... ein verzweifelter Versuch ...

Da ist systematisches Probieren erfolgreicher.

GPSmodul.println("AT+CSQ");
// Data = GPSmodul.write("AT+CSQ");
Data = 555;

Landet diese Zahl auf der SD-Karte?

Ja die 555 landen auf der SD. Mit Index hinterlegt.

Füge mal ein BIld mit rein was eigentlich dort landen sollte:

sollte.PNG

agmue:
Müßte es nicht read anstelle write heißen?

GPSmodul.println("AT+CSQ");

Data = GPSmodul.read();

Sollte man dem Modul nicht ein bisschen Zeit geben, und mehr als nur ein Zeichen einlesen?

Kirkos:
Ja die 555 landen auf der SD. Mit Index hinterlegt.

Dann geht es ja nur darum, da den richtigen Wert hinzubringen.

michael_x:
Sollte man dem Modul nicht ein bisschen Zeit geben, und mehr als nur ein Zeichen einlesen?

Auf jeden Fall, dafür gibt es ja GPSmodul.available(). Und GPSmodul.read() steht an zwei Stellen, der Integerwert besteht aus zwei Bytes …

Mache bitte weiter, Du hast das Thema :slight_smile:

nur den richtigen Wert hinzubringen...

hahah genau da scheitert es leider bei mir...
Komme echt nicht weiter >:(

Was schickt Dein GPS-Modul denn als Signalstärkewert? Was wäre der kleinste, was der größte Wert?

der kleinste wäre 0 und der größte 99.

Bezugnehmend auf #2 (ungetestet):

void loop()
{
  if (GPSmodul.available())             // warten auf Daten vom Modul
  {
     char c = GPSmodul.read();          // lese ein Zeichen
     Serial.print(c, HEX);              // schreibe die Daten auf den seriellen Bildschirm
     Serial.print(' ');                 // zur besseren Lesbarkeit
  }
  if (Serial.available())               // warten auf Kommandos vom seriellen Bildschirm
     GPSmodul.write(Serial.read());      // Kommandos aufs Modul schicken
}

Was wird Dir beim Signalstärkewert angezeigt?

Bezogen auf #4: In c hast Du jetzt übrigens den Code.

Was wird Dir beim Signalstärkewert angezeigt?

Vermutlich mehr als ein bis zwei Byte zwischen "0" und "99",
sondern (lt. Anhang "sollte.PNG" in einer vorigen Antwort) ein langer Text, der mit "+CSQ:" anfängt, mit "OK" aufhört und ausserdem Leerzeichen, Zeilenvorschub, Komma usw. enthält.

agmue's Test im vorigen Beitrag zeigt auch, ob nach dem "OK" nochmal ein Zeilen-Ende kommt, was natürlich auch weggelesen werden muss.

Da Wenn es nur drum geht, die Antwort auf SD zu speichern, braucht der Arduino eigentlich gar keinen Decodier-Aufwand zu betreiben:

char* readResponse(Stream s) {
   // Es wird 1 ms auf jedes Zeichen gewartet (9600 Bd)
   // Alles nach der ersten Antwortzeile wird gelesen, aber nicht gespeichert
   static char buffer[20];
   char* p=buffer;
   bool ersteZeile = true;
   delay(5); // mit etwas Zeitpuffer 
   while(s.available()) {
      char c = s.read();
      delay(1);
      if ( c == '\r' || c == '\n') ersteZeile = false; 
      if (ersteZeile)  *p++ = c; // Zeichen speichern
   }
   *p = 0;
   return buffer;
}

Könnte man evtl. so verwenden:

  GPSmodul.println("AT+CSQ");    // Signalqualitätinfo einholen
  char* response = readResponse(GPSmodul);

   outFile = SD.open(filename, FILE_WRITE);
   if (outFile) {
      Serial.print("Schreibe auf die SD Karte: ");
      Serial.println(response);
      outFile.print(++index);
      outFile.print(": ");
      outFile.println(response);       
      outFile.close();
   } else {
       Serial.println("Fehler beim Öffnen der Datei.");
   }

ich probiere es morgen noch mal aus und mlede mich dann noch mal. Erstmal danke

muss ich readResponse irgendwie deklarieren?

  char* response = readResponse(GPSmodul);

muss ich readResponse irgendwie deklarieren?

  1. Wenn es vor Verwendung (also im Code oberhalb) definiert wird, nicht
  2. Bei Arduino in einer .ino Datei überhaupt nicht

ich habe ja den Code jetzt von hier und somit readResponse noch nicht benutzt. Wenn ich jetzt kompiliere dann zeigt er mir einen Fehler an. Muss deklariert werden.