Wetterstation mit Funk

Hallo,

ich habe mir eine kleine Wetterstation gebaut die auch für mich gut fuktioniert. Einmal die Anzeige am PC-BS und einmal auf einem kleinen 0,96" Display auf dem Board.
Nun würde ich gerne dieses Board auf den Balkon stellen und per Funk übertragen. Der Beispielsketch oder Demosketch fuktioniert ja auch. Aber bei der Umsetzung meiner 10 Zahlendaten zu übertragen komme ich einfach nicht auf einen grünen Zweig. Ich konnte auch weder hier noch über Google nichts für mich brauchbares finden. Erschwerend kommt noch hinzu dass ich so gut wie kein englisch kann.
Hat hier einer eventuell Lust mir zu helfen?
Ich füge mal meinen bisherigen Sketch ein.

// 0,96" Display
//===============
// IMPORTANT NOTE: The following list is incomplete. The complete list of supported 
// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);	// I2C / TWI 

//Uhrenmodul
//===========
#include "Wire.h"
#include "RTClib.h"
RTC_DS1307 RTC;

// Temperatur und Feuchte Sensor
//===============================
#include "DHT.h"
#define DHTPIN 2     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302
DHT dht(DHTPIN, DHTTYPE);

// Luftdruck
//===========
#include <SFE_BMP180.h>
SFE_BMP180 pressure;
#define ALTITUDE 295.0 // 295.0 für Ludwigsburg
                       //1655 Altitude of SparkFun's HQ in Boulder, CO. in meters
double x,y;
int z;

//  EB - 315MHz_RF_Transmitter
//============================
#include <VirtualWire.h>
float myWetter[9];             //Array Wetter


//----------------------------------------------------------------
void setup(void) {
 
  vw_set_ptt_inverted(true); // VirtualeWire setup
  vw_setup(2000); // Transmission speed in bits per second.
  vw_set_tx_pin(5); // Setup transmit pin
  
   Serial.begin(9600);
   Wire.begin();
   RTC.begin(); 
   RTC.adjust(DateTime(__DATE__, __TIME__));  
   dht.begin();
      
    if (pressure.begin())
    Serial.println("BMP180 init success");
    else
    {
      Serial.println("BMP180 init fail (disconnected?)\n\n");
    while(1);
   }
}   

void draw(void)
{
//-----------Zeiterfassung------------
  DateTime now = RTC.now();
//---------Ende Zeiterfassung----------

//----------Temperatur und Feuchtesensor------------
  // Read Feuchte %
  float h = dht.readHumidity();
  // Read temperature as Celsius
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit
  float f = dht.readTemperature(true);
//----------Ende Temp+Feuchte---------  
  {
  //------Luftdrucksensor----------  
  char status;
  double T,P,p0,a;

  status = pressure.startTemperature();
  if (status != 0)
    {
    delay(status);
    status = pressure.getTemperature(T);
    if (status != 0)
      {
      y = T;
      status = pressure.startPressure(3);
      if (status != 0)
        {
        delay(status);
        status = pressure.getPressure(P,T);
        if (status != 0)
          {
          x = P;
          }
        else Serial.println("error retrieving pressure measurement\n");
      }
      else Serial.println("error starting pressure measurement\n");
    }
    else Serial.println("error retrieving temperature measurement\n");
  }
  else Serial.println("error starting temperature measurement\n");
}  //----------Ende Luftdruck------------------

  //  ---------Ausgabe auf kleines 0,96" Display----------
  // graphic commands to redraw the complete screen should be placed here 
  //u8g.setFont(u8g_font_6x13B); 
  //u8g.setFont(u8g_font_unifont);
   u8g.setFont(u8g_font_7x13);
  //u8g.setFont(u8g_font_ncenB08);
        
    u8g.setPrintPos(0, 8);  
    u8g.print("Wetterstation   ");  
    u8g.setPrintPos(0, 22); 
    u8g.print("Feucht (%): ");
    u8g.print((float)h, 2); 
    u8g.setPrintPos(0, 36);  
    u8g.print("Temp (oC): "); 
    u8g.print((float)t, 2);
    u8g.setPrintPos(0, 64);  
    u8g.print(now.day());
    u8g.print('.');
    u8g.print(now.month());
    u8g.print('.');
    u8g.print(now.year());
    u8g.print(' ');
    u8g.print(now.hour());
    u8g.print(':');
    u8g.print(now.minute());
    u8g.print(':');
    u8g.println(now.second());
    u8g.setPrintPos(0, 50);  
    u8g.print("Luftd. ");
    u8g.setPrintPos(47, 50); 
    u8g.print(x,2); 
    u8g.print("  "); 
    u8g.print(y);
    
  //  ---------mit EB - 315MHz_RF_Transmitter senden-----------  
  myWetter[0] = (float)h;
  myWetter[1] = (float)t;
  myWetter[2] = (now.day());
  myWetter[3] = (now.month());
  myWetter[4] = (now.year());
  myWetter[5] = (now.hour());
  myWetter[6] = (now.minute());
  myWetter[7] = (now.second());
  myWetter[8] = (x);
  myWetter[9] = (y);
  
  
  vw_send ((uint8_t *) Wetter1CharMsg, strlen(Wetter1CharMsg))
 vw_wait_tx(); // Wait until the whole message is gone
  delay(2000);
  
  //  ----------Ausgabe auf PC-Bildschirm----------
  /*
    Serial.println("Wetterstation");
    Serial.print("Feuchte %: ");  
    Serial.println((float)h);
    Serial.print("Temp (oC): "); 
    Serial.println((float)t);
    Serial.print("Luftd. ");
    Serial.print(x);
    Serial.print("  ");
    Serial.println(y);
    Serial.print(now.day());
    Serial.print('.');
    Serial.print(now.month());
    Serial.print('.');
    Serial.print(now.year());
    Serial.print(' ');
    Serial.print(now.hour());
    Serial.print(':');
    Serial.print(now.minute());
    Serial.print(':');
    Serial.println(now.second());
    Serial.println();
    delay(1);  // 1000 wenn Pc-BS an
    */
   }

void loop(void) 
{
  // picture loop
  u8g.firstPage();  
  do {
    draw();
  } while( u8g.nextPage() );
  
  // rebuild the picture after some delay
  delay(5);  //500
    
}

Das kleine Display soll auch weiterhin auf dem Bord bleiben mit samt der Uhrenanzeige. Ein zweites soll dann auf dem Empfangsboard seinen Dienst tun.

der Lokgeist

Hallo,

Das Hauptproblem ist, die Daten auf der Emfangsseite wieder auseinanderzudröseln ohne groß parsen zu müssen.

Ich sende am Anfang eines Datensatzes ein 'S' dann high und low Byte Nutzdaten(1) dann ein '#' dann
dann high und low Byte Nutzdaten(2) und wieder ein '#' usw.

Auf der Empfangsseite mit vw_get_message und der bekannten messagelänge die Daten in ein Char array einlesen.
Das 'S' suchen, bzw abfragen ob Index 0 ein 'S' ist. (davon auszugehen das es immer an Index 0 steht ist nicht sauber, ich mache es aber trotzdem so)
Wenn du den Startindex hast:
Parse den Rest des Arrays mit strtok und dem Zeichen '#' in einer Schleife.

Funktioniert bei mir prima, wie gesagt ob es optimal gelöst ist weiß ich nicht.

Hallo rudirabbit,

wenn das so schwierig ist, werde ich das wohl nie hin bekommen.
Ich dachte da an eine Schleife um die 10 Werte aus einem Array nacheinander zu senden. Dann eine Pause und das Ganze von forne.
Desgleichen auf der Empfangsseite die 10 Werte gleich wieder in ein Array von wo ich das Display mit Daten versorgen kann.
Aber trotzdem, danke.

Kennt eventuell jemand etwas ähnliches wo ich mir für meine Zwecke etwas rauslesen könnte? Oder ein Beispiel oder ein Demo Sketch. Möglichst leider auch noch auf deutsch.

Tschüß
Lokgeist

wenn das so schwierig ist, werde ich das wohl nie hin bekommen.
Ich dachte da an eine Schleife um die 10 Werte aus einem Array nacheinander zu senden. Dann eine Pause und das Ganze von forne.

Ob Endezeichen oder Pause schwieriger sind, ist eigentlich Geschmackssache.
Deine zeitsynchronisierte Übertragung mit sofortiger Auswertung der Einzelteile beim Lesen geht auch.
Musst halt beachten, dass du nur einen begrenzten Eingangspuffer hast (64 Zeichen normal), der aber auch nicht sofort alle Daten hat, je nach Übertragungsgeschwindigkeit. ( 9600 Bd = 1 Zeichen / ms )

Das beste nach meinem Geschmack ( leider auf englisch ) ist in Nick Gammon's Gammon Forum : Electronics : Microprocessors : How to process incoming serial data without blocking, insbesondere How to send and receive numbers

Hallo Michael_x,

ich glaube mit deinem Link müsste ich wohl klarkommen. Habe mal versucht durchzusteigen und bin guter Hoffnung.

Aber im Moment plagt mich ein Problem mit der Übertragung das ich vorab in Ordnung bringen sollte.
Meine Funkstrecke läuft. Vorerst mal nur mit dem "Hallo" senden. Aber wenn ich nun noch mein Feuchte und Temperaturmodul DHT22 auf (A5) einstecke wird der Funk auf (A2) blockiert.
EDIT: nicht A2 und A5 sondern D2 und D5. Entschuldigung.

Hat jemand einen Rat dafür?

Tschüß
Lokgeist

Sowohl das Display als auch das Funkmodul haben eine serielle Schnittstelle? Und auf dem Zweitgerät möchtest du das gleiche Display benutzen?

Dann sende doch die fürs Display aufbereiteten Daten einfach unverändert ebenso per Funkmodul. Dann gibts auch auf der Empfängerseite nicht viel zu parsen, sondern kann direkt ins Display eingespeist werden.

Evtl. solltest du die Init-Sequenz fürs Display nicht nur einmalig beim Einschalten senden, sondern öfters mal, falls mal ein Paket nicht richtig ankommt (damit muss man bei Funk rechnen) , stimmt die Anzeige spätestens im nächsten Zyklus wieder ...

Hallo qualidat,

auf das Display habe ich ja schon verzichtet. Es geht hauptsächlich jetzt um das Einlesen von dem Feuchte und Temperatursensor und dem Senden der Daten.
Als Test habe ich nur im Moment das Senden auf D5 des Wortes "Hallo" alle Sekunde. Sobald ich nun den Feuchtesensor nur auf D2 einstecke geht keine Übertragung mehr.
Der Feuchtesensor gibt aber seine Daten schon aus (provisorisch auf den Bildschirm) sobald er eingesteckt ist.

Was nun?

Der Lokgeist