2021
HOME

Arduino Pro Mini schreibt serielle Daten auf microSD
RTTY-Recorder Arduino
Datalogger für den Deutschen Wetterdienst und anderes auf der RX-Leitung

Funktionsblock SD-RecorderDer vom Arduino-RTTY-Decoder gezeigte Text und die empfangenen Wettermeldungen des DWD Pinneberg sind flüchtig, wenn sie nur am Bildschirm mitgelesen werden. Soll zu einem späteren Zeitpunkt die Wetterlage gelesen werden, so ist ein Datalogger erforderlich. Zur Zeit dieser Niederschrift ist das Speichermedium SD-Karte sehr verbreitet und preiswert.

Der Prototyp deines RTTY-Decoders liefert seinen empfangenen Text aus dem Baudot-Decoder oder dem seriellen Eingang an das Display und zusätzlich an den seriellen Ausgang TX. Die dort laufende Software ist im Beitrag RTTY-Decoder Arduino Software beschrieben.

Das SD-Modul, wie oben als Funktionsblock dargestellt, verfügt über zwei LED-Anzeigen.

  • LED rot zeigt eine Aufzeichnung (REC) an
  • LED grün zeigt den Empfang der Zeichenfolge RYRY an

Die Textdaten erhält das Modul am Eingang RX, die sofort an den Ausgang TX zwecks möglicher weiterer Verarbeitung geleitet werden.

Beides wird mit mit 3,3 Volt bzw. Lipo-Akku betrieben, wie der Prototyp des RTTY-Decoders.


Funktionsweise Datalogger-Meldungen/Hardware
Ein Datalogger schreibt einlaufende Daten in eine Datei. In diesem Fall wird die Datei RTTY.TXT mit Textdaten gefüttert. Die Datei wächst bei 50 Baud nur sehr gemächlich und bei der hier verwendeten 4GB-Karte lassen sich viele Wettermeldungen speichern. Die Hardware besteht aus
  • Arduino Pro Mini 5V/16MHz
  • microSD-Karten Adapter 3,3V SPI
  • LiPo-Akku 3,7 V

Beide Komponenten arbeiten direkt am Akku, wie der RTTY-Decoder selbst auch, um möglichst störungsfreien HF-Empfang zu erhalten. Die Verschaltung ist wie folgt:

SD Reader Arduino Uno/Mini
3,3V

3,3V
CS

4 (wählbar)
MOSI

11
CLK

13
MISO

12
Gnd

Gnd

Eine Aufzeichnung beginnt, wenn die Zeichenfolge ZCZC am Eingang erkannt wird und endet mit der Zeichenfolge NNNN. Dies sind Anfang und Ende einer üblichen Wettermeldung. Da die Zeichenfolgen durch Empfangsstörungen zerrissen sein können, wird die Aufzeichnung auch beendet, wenn RYRY detektiert wird. Dies soll die unnütze Aufzeichnung von DWD-Testschleifen unterbinden.

Ist die Hardware entsprechend der Tabelle verschaltet und mit Software gefüllt, wie weiter unten angegeben, gibt es am seriellen Ausgang TX und an der LED Rec folgende Ausgaben:

Ohne SD-Karte:

  • SD card module DWD:
  • RX to file RTTY.TXT (ZCZC start NNNN stop)
  • SD card init...failed
  • RTTY.TXT not found

LED an MESSAGE-PIN(9) - aka REC - blinkt 10x hell, danach schwach leuchtend

Mit SD-Karte, ohne Datei RTTY.TXT:

SD card module DWD:

  • RX to file RTTY.TXT (ZCZC start NNNN stop)
  • SD card init...done
  • RTTY.TXT not found

LED an MESSAGE-PIN schwach leuchtend

Schreibtest mit Arduinos Serial Monitor und folgendem Ablauf:

  1. 9600 Baud, CR und LF einstellen
  2. Senden von „ZCZC“ (ohne Anführungszeichen):
  3. LED an MESSAGE-PIN hell leuchtend
  4. Senden von “Hallo Welt!” (ohne Anführungszeichen)
  5. Senden von „NNNN“ (ohne Anführungszeichen):
  6. LED an MESSAGE-PIN aus
  • SD card module DWD:
  • RX to file RTTY.TXT (ZCZC start NNNN stop)
  • SD card init...done
  • RTTY.TXT not found
  • ZCZC
  • Hallo Welt!
  • NNNN
  • ----

Nach einem Reset wird der gesamte Inhalt der Datei RTTY.TXT seriell ausgegeben. Dabei ist die MESSAGE-LED angeschaltet bis zum Dateiende:

  • SD card module DWD:
  • RX to file RTTY.TXT (ZCZC start NNNN stop)
  • SD card init...done
  • RTTY.TXT:
  • ZCZC
  • Hallo Welt!
  • NNNN
  • ----

Software SD-Recorder-Routinen

In Anlehnung an das Arduino-Beispiel unter SD/Datalogger entsteht der folgende Sketch aus drei Routinen.

Die Initialisierung bindet die umfangreiche SD-Bibliothek ein, die wegen ihrer Größe nicht mit dem RTTY-Decoder und der Display-Ansteuerung zusammen in einen Arduino-Speicher passt. Definitionen definieren die verwendeten Anschlüsse an SD-Reader und LED am Arduino.

Der Dateiname der Textdatei für die Wetterdaten ist mit RTTY.TXT festgelegt. Fünf Bytes werden für die Zeichensuche im einlaufenden Text reserviert. Die globale Variable mes ist wahr, wenn gerade eine Meldung läuft.

Setup() gibt Informationen zum Sketch seriell mit 9600 Baud aus und initialisiert die Anschlüsse, sowie die SD-Schnittstelle. Ein Fehler wird mit Text und Blink angezeigt. Danach wird versucht den Inhalt der Textdatei seriell zu übertragen. Das kann bei längeren Aufzeichnungen einige Minuten dauern… Schließlich wird die Message-LED ausgeschaltet. Bei nicht vorhandener Datei glimmt diese LED zunächst dunkel.

Loop() als Hauptschleife ist kurz. Nur wenn ein Zeichen am RX-Eingang vorliegt wird dieses Zeichen in ch gelesen und sofort an TX seriell weitergeleitet. Damit können weitere Module auf die dekodierten Daten zugreifen. (ESP-Term, HC-06). Bei geöffneter Datei speichert die Routine das Zeichen auch auf der SD-Karte. Das Zeichen wird an die vorhandene Daten angehängt, so dass RTTY.TXT immer weiter anwächst, was aber bei 50 Baud und Gigabyte-Karte nicht sehr bedrohlich erscheint. Die Routine filecheck bietet dazu eine einfache Möglichkeit zum Löschen an. In der Vaiablen dect sind die letzten vier empfangenen Zeichen global gespeichert, um diese in der Routine filecheck entsprechend auszuwerten.

Filecheck() überprüft die einlaufenden Daten auf das Vorkommen der Folgen RYRY, ZCZC, NNNN und KILL. Das Auftreten der Zeichenfolge RYRY bewirkt, dass die entsprechende LED eingeschaltet wird. Das kann dazu dienen die Abstimmung am Empfänger oder am Tondetektor zu kontrollieren. DWD sendet zwischen den Meldungen eine solche Testschleife. Außerdem wird ein „NNNN“ vorgegaukelt, so dass auf jeden Fall eine weitere Aufzeichnung unterbunden wird, auch wenn durch Empfangsstörungen das Meldungsende nicht richtig dekodiert werden konnte.

Mit ZCZC wird der Beginn einer Meldung angezeigt und die Aufzeichnung initiiert indem die Datei geöffnet wird. Das Gegenteil ist die Zeichenfolge NNNN für Meldungsende. Damit wird die Datei geschlossen und damit die Protokollierung wieder beendet. Schließlich wird die Meldungs-LED entsprechend geschaltet. Mit der Zeichenfolge KILL kann die Datei RTTY.TXT gelöscht werden. Dazu muss zusätzlich der Analogeingang A0 mit der Betriebsspannung Vcc verbunden sein.


Software SD-Recorder-Sketch
#include <SD.h>
#include <SPI.h>
//---------- SD READER --------------------
#define SCLK    13  
#define MISO    12
#define MOSI    11
#define CS       4
//----------- LED DETECT ------------------
#define MESSAGE  9  //5  ZCZC on, NNNN off
#define RYRY     8  //6  RYRY on
char dect[5];       // ZCZC NNNN RYRY
//----------- FILE ------------------------
File myFile;
#define FILENAME "RTTY.TXT"
boolean mes = false;  //is message 
//--------------------------------------

void filecheck()
{if(!strncmp(dect,"RYRY",4) || !strncmp(dect,"YRYR",4))
 {digitalWrite(RYRY,1);if(mes)strncpy(dect,"NNNN",4);}
  else digitalWrite(RYRY,0);
 if(!strncmp(dect,"ZCZC",4))
 {mes=true;
  myFile=SD.open(FILENAME,FILE_WRITE);
  myFile.print("\n\rZCZC ");
 }
 if(!strncmp(dect,"NNNN",4))
 {const char *s="\r\n----";
  mes=false;Serial.println(s);myFile.print(s);
  myFile.close();
 }     
 if(digitalRead(MESSAGE)!=mes)digitalWrite(MESSAGE,mes);
 if(!strncmp(dect,"KILL",4) && analogRead(A0)==1023)
 {SD.remove(FILENAME); Serial.println("\n\nFile removed!");}
}
  
void setup() 
{Serial.begin(9600); 
 Serial.println("\nSD card module DWD:");
 Serial.print("RX to file ");
 Serial.print(FILENAME);
 Serial.println(" (ZCZC start NNNN stop)");  
 pinMode(RYRY, OUTPUT); // RYRY
 pinMode(MESSAGE, OUTPUT); // MESSAGE START STOP
 //SD 
 Serial.print(("SD card init..."));
 if (!SD.begin(CS))
 {Serial.println(("failed"));
  for(int i=1;i<10;i++)
  {digitalWrite(MESSAGE,1),delay(500);
   digitalWrite(MESSAGE,0),delay(500); 
  }
 }
 else Serial.println(("done"));
 analogWrite(MESSAGE,1);
 myFile = SD.open(FILENAME);  
 if(myFile)
 {Serial.print(FILENAME);Serial.println(":\n\n");
  digitalWrite(MESSAGE,1);
  while(myFile.available())Serial.write(myFile.read());
  digitalWrite(MESSAGE,0);
  myFile.close();
 }
 else 
 {Serial.print(FILENAME);
  Serial.println(" not found");
 }
}

void loop()
{char ch;
 if(Serial.available() > 0)
 {ch = Serial.read();
  Serial.print(ch); if(myFile)myFile.print(ch);
  for(int i=0;i<3;i++)dect[i]=dect[i+1];
  dect[3]=ch; 
  filecheck();
 }
}

Mehr zum Thema
Arduino Morse-Decoder
Arduino RTTY-Decoder
Arduino RTTY-Recorder
Tondetekor XR2211
TA7642-LW/MW-Radio
DCF-Funkuhr mit dem Radio
Mit 200 mW um die Welt
Eigener Mittelwellensender

.
Startseite Bücher Software Digital RTV Musik Kontakt

Für Inhalt und weitere Verzweigung externer Links sind die Betreiber der dortigen Seiten verantwortlich - H.-J. Berndt