CW Telemetriesender (Wetterstation – Bake)

Im September 2016 konnten wir wieder erfolgreich einen Wetterballon starten. Mit an Board war ein 70cm Sender, der die Wetterdaten per Sprachausgabe zur Erde funkte. Ein weiteres Funkgerät sendete den aktuellen Standort per APRS zum Boden. Der 70cm Sender hatte eine Leistung von 1 Watt. APRS sendete mit 5 Watt. Dementsprechend musste eine leistungsfähige Stromversorgung mitfliegen. So hatte die Nutzlast insgesamt ein Gewicht von 1,5 kg.

Im folgenden möchte ich eine Studie mit einem CW Telemetriesender beschreiben. Es kommen nur einfachste Baugruppen zum Einsatz, so dass das gesamte Equipment sehr leicht ist. Sollte es zu einem Flug mit einem Ballon kommen, so kann ein wesentlich kleinerer Ballon eingesetzt werden. Das verursacht weniger Kosten für den Ballon und natürlich auch für das Gas.

Basis des Equipments ist ein Arduino UNO. Auch ein Nano kann verwendet werden, der das Gewicht noch einmal um 20g verringern würde. Der Arduino wurde mit zwei Sensoren bestückt, die ich noch von ersten Experimenten für unser Ballonprojekt vorrätig hatte.

Zur Messung der Luftfeuchtigkeit und der Temperatur wird ein DHT 11 verwendet. Der Luftdruck wird mit einem BMP 180 gemessen. Beide Sensoren sind für Wetterballons natürlich ungeeignet. Der BMP 180 kann nur bis runter zu 300 hPa den Luftdruck messen. Der Einsatz wäre damit nur bis zu einer Höhe von etwa 9 km möglich. Der DHT 11 misst Temperaturen nur bis hinunter zu -40° Celsius. In der Stratosphäre sind aber Temperaturen von -55° Celsius und kälter zu erwarten. Wie gesagt, es geht hier nur um eine Studie. Bei einem realen Flug müssen daher andere Sensoren z.B. ein MS5611 zur Messung des Luftdruckes eingesetzt werden. Für die Temperaturmessung in der Stratosphäre eignet sich ein DS18S20.

Für die Funkseite kommt bei meiner Studie ein kleiner ISM-Sender zum Einsatz, wie er auch in Funk-Thermometern oder Funksteckdosen zum Einsatz kommt. Mein Sender arbeitet bei einer Frequenz von 433,910 MHz. Als Antenne habe ich einfach ein kurzes Stück Draht verwendet. Bei einem möglichen Ballonstart sollte sicherlich eine selbstgebaute Groundplane zum Einsatz kommen. Das Beitragsbild zeigt die Zusammenschaltung aller Komponenten und die Pin-Belegung am Arduino.

In Morsetelegrafie werden dann die Temperatur, die Luftfeuchtigkeit und der Luftdruck in folgendem Format ausgesendet:

t 13,2 f 85 d 1024 dl0mes

Dabei markiert t die Temperatur, f die Luftfeuchtigkeit und d den Luftdruck. Am Ende dann noch, wie sich für Funkamateure gehört das Rufzeichen. Hier Beispielhaft DL0MES.

Nachfolgend der Sketch dazu:

/*================================================================================
  Programm zur Ausgabe der Temperatur, der Luftfeuchtigkeit und des Luftdruckes
  in Morsetegrafie mit einem kleinen ISM-Sender auf 433 MHz.
  Als Sensoren werden ein DHT11 für die Temperatur und die Luftfeuchtigkeit
  und ein BMP180 zu Messung des Luftdruckes eingesetzt.
  Programmautor Josef Sommer DL8DBN
==================================================================================*/

#include <Wire.h>                                          // Library für den I2C Bus
#include <string.h>                                        // Library für die String-Bearbeitung
#include <stdio.h>                                         // Library für die Stndardfunktinen
#include <DHT.h>                                           // Library für den DHT11/22 Feuchtesensor
#include <BMP180.h>                                        // Library von Sparkfun für den BMP180 Luftdrucksensor

#define DHTPIN 2                                           // Digitaler Pin an dem der DHT angeschlossen ist
#define DHTTYPE DHT11                                      // Type des Sensors der angeschlossen ist hier: DHT11  
DHT dht(DHTPIN, DHTTYPE);                                  // Instanz des DHT-Sensors erzeugen
BMP180 barometer;                                          // Instanz des BMP180-Sensors erzeugen

int laenge;
int laenge1;
int i;
int x;
int y;
String h_text;
String t_text;
String l_text;
char temp[1];
char charzeichen[1];
String temp1;
String zeichen;
String temp2;
int SenderPin = 12;                                      // Pin an dem der Sender angeschlossen ist
int tempo = 100;                                         // Zeichengeschwindigkeit
float seaLevelPressure = 101325;                         // Aktueller Luftdruck bezogen auf NN am aktuellen Stndort

String text = "t 13,2 f 85 d 1024 dl0mes";               // So wird der Text später beispielhaft aussehen

char* woerterbuch[] = {"a", ".-", "b", "-...", "c", "-.-.", "d", "-..", "e", ".", "f", "..-.", "g", "--.",
                     "h", "....", "i", "..", "j", ".---", "k", "-.-", "l", ".-..", "m", "--", "n", "-.",
                     "o", "---", "p", ".--.", "q", "--.-", "r", ".-.", "s", "...", "t", "-", "u", "..-",
                     "v", "...-", "w", ".--", "x", "-..-", "y", "-.--", "z", "--..", ".", ".-.-.-",
                     ",", "--..--", "/", "-..-.", "-", "-....-", "0", "-----", "1", ".----", "2", "..---",
                     "3", "...--", "4", "....-", "5", ".....", "6", "-....", "7", "--...", "8", "---..",
                     "9", "----."};
                     
 
void setup() {
  pinMode(SummerPin, OUTPUT); 
  Serial.begin(9600);                                      // Seriellen Port öffen um Ausgaben zu ermöglichen mit 9600 bps:   
  dht.begin();                                             // initialisieren des DHT
  Wire.begin();                                            // initialisieren des I2C Busses für die Kommunikation mit BMP 180
  barometer.Initialize();                                  // initialisieren des BMP 180 Sensors
}
  
void loop() {
  float h = dht.readHumidity();                            // Einlesen der relativen Luftfeuchtigkeit in %
  float t = dht.readTemperature();                         // Einlesen der Außen-Temperatur in °C
  float Luftdruck = barometer.GetPressure()/100;           // aktuellen Luftdruck einlesen (Mess wert in Pa; /100 macht daraus hPa
  float Innentemp = barometer.GetTemperature();            // aktuelle Innentemperatur einlesen
  
   t_text = String(t, 1);                                  // String(float, Nachkommastellen) Wandelt Meßwert in String um
   h_text = String(h, 0);
   l_text = String(Luftdruck, 0);
   text = "t " + t_text + " f " + h_text + " l " + l_text + " dl0mes";     // Messwerte werden zu einer Zeichenkette für Morseausgabe zusammengestellt
  
  
laenge = text.length();                                    // Anzahl der Zeichen des auszugebdneden Textes
char chartext[laenge + 1];            
text.toCharArray(chartext, laenge+1);                      // Aus dem auszugebenden Text eine Array of Char erzeugen
for (i=0; i<laenge+1; i++){                                // Text Zeichen für Zeichen aufschlüsseln
    temp[1]= chartext[i];                                  // Aktuelles Zeichen aus dem Text der ausgegeben werden soll
    for (x=0; x<=80; x=x+2){                               // Aktuelles Zeichen im Wörterbuch suchen                
    temp2=woerterbuch[x];                                  // Das x-te Zeichen einer Zwischenvariablen zuweisen die ein String ist
    
    temp2.toCharArray(charzeichen, 2);                     // Aus der Zwischenvaiablen ein char machen
    if (chartext[i] == char(32))                           // bei Leerzeichen eine Wortpause ausgeben
    {
    wortende();
    break;
    }
    else
    {
      if (charzeichen[0] == chartext[i]){                  // Wenn Zeichen im Wörterbuch gefunden
      temp1 = woerterbuch[x+1];                            // dann ist nächster Eintrag das zugehörende Morsezeichen
      laenge1 = temp1.length();                            // Zeichenlänge des Morsezeichens ermitteln
      char chartemp1[laenge1+1];               
      temp1.toCharArray(chartemp1, laenge1+1);             // Aus dem Morsezeichen ein Array of Char erzeugen
        for(y=0; y<laenge1; y++){
        switch (chartemp1[y]) {                            // Für jeden Punkt ein "dit" ausgeben
          case '.':                                        // Für jeden Strich ein "dah" ausgeben
          dit();
          break;
          case '-':
          dah();
          break;
          }
        } 
       zeichenende();                                      //Wenn das Zeichen ausgegeben wurde, dann eine Pause der Länge "dah"
      }
    }
   }
  }
}
  
  void dit() {                                             // einen Punkt (dit) ausgeben
    digitalWrite(SenderPin, HIGH);
    delay(tempo);
    digitalWrite(SenderPin, LOW);
    delay(tempo);
  }
  
  void dah() {                                            // einen Strich (dah) ausgeben
    digitalWrite(SenderPin, HIGH);
    delay(3*tempo);
    digitalWrite(SenderPin, LOW);
    delay(tempo);
  }  
  
   void wortende() {                                      // Pause für Wortende
    digitalWrite(SenderPin, LOW);
    delay(6*tempo);
    digitalWrite(SenderPin, LOW);
    }  
    void zeichenende() {                                  // Pause für Zeichenende
    digitalWrite(SenderPin, LOW);
    delay(2*tempo);
    digitalWrite(SenderPin, LOW);
    }

Das nachfolgende Schaubild zeigt die Zusammenschaltung aller Komponenten:

wetter_morse_steckplatine

Ich habe den Telemetriesender hier über einen 9V Block mit Strom versorgt. Die Alkaline Version der 9V Batterie hat eine Kapazität von 500…600 mAh. Die Stromaufnahme der gesamten Anordnung beträgt 60mA. Somit sollte der Sender mindestens 8 Stunden laufen.

1 Kommentar


  1. Hallo Herr Sommer,

    im Rahmen meiner Facharbeit an der BSZ Dresden soll ich ein Funktionsfähigen Wetterballon Bauen mit APRS und CW Sender.
    Ich finde dieser CW Sender ist perfekt dafür.
    Gesendet werden diese Daten mit dem Rufzeichen des Ortsverein von der Schule „DL0IKT“.

    Ich habe es schon versucht nachzubauen mit dem Arduino UNO den ich noch hatte und die Sensoren habe ich bestellt aber leider war ich damit nicht so richtig erfolgreich.
    Das Problem liegt an dem Programm, ich habe immer Fehler beim Hochladen (vermutlich falsche Library´s).
    Könnten sie mir bitte mitteilen welche Library ich benötige oder wäre es möglich mir diese zu schicken?

    Vielen Dank

    Mfg

    Claudio Rusvai

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.