[Gelöst/Solved] RF 433Mhz Aufbau - wo liegt der Fehler?

Hallo zusammen,

mein erster Beitrag und mein erstes richtiges Projekt mit dem Arduino :wink:

Und zwar habe ich vor, per Funk ein Relai anzusteuern, welches die Zimmerbeleuchtung anschaltet (nicht elegant aber ein Anfang…)
Dazu habe ich mir folgende Komponenten bei Watterott bestellt:

RF-Sender: http://www.watterott.com/de/RF-Link-Sender-434MHz
RF-Empfänger: http://www.watterott.com/de/RF-Link-2400bps-Empfaenger-434MHz

Verkabelung erfolgte nach dem Schaltplan: https://www.sparkfun.com/datasheets/RF/KLP_Walkthrough.pdf
Zum Test wird ein Arduino Duemilanove (A) und Arduino UNO (B) ein verwendet:

Der Testaufbau sieht wie folgt aus: Arduino A soll bei Knopfdruck Arduino B die LED anschalten.
Die Kommunikation zwischen den Geräten funktioniert soweit. Nur habe ich das Problem, dass die LED pulsiert und bei Knopfdruck ausgeht. (GIF Animation)

Irgendwie habe ich das Gefühl, dass es sich um die RX/TX Signale in die LED(Pin 8 ) einschleichen, denn wenn ich die Baudrate umstelle pulsiert die LED schneller/langsamer.

Könnt Ihr mir vielleicht weiterhelfen, habe ich einen Fehler gemacht? Anbei der Code:

Sender:

// 26. Maerz 2013 RF 433MHZ SENDER - BamXP

#include <VirtualWire.h>

void setup()
{
    Serial.begin(9600);
    Serial.println("Arduino startet...");

    // RF Modul Einstellungen
    vw_set_ptt_inverted(true);
    vw_setup(2000);
      vw_set_tx_pin(3);
      Serial.println("RF Verbindung gestartet");

    // Anschluesse definieren
    pinMode(8, INPUT);

    digitalWrite(8, HIGH);

}

void loop()
{
  char *msg;
  
  if(digitalRead(8) == LOW){
    char *msg = "1";
      digitalWrite(13, true); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(13, false);}

  }

Empfänger:

// 26. Maerz 2013 RF 433MHZ EMPFAENGER - BamXP

#include <VirtualWire.h>

void setup()
{
    Serial.begin(9600);  
    Serial.println("Arduino startet...");
    
    // RF Modul Einstellungen
    vw_setup(2000);    
    vw_set_rx_pin(3); 
    vw_rx_start();
    Serial.println("RF Verbindung gestartet");

    // Anschluesse definieren
    pinMode(8, OUTPUT); // LED

}

void loop()
{
    // Ausgang AUS
    digitalWrite(8, LOW);
  
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen)) // Non-blocking
    {
    int i;

    digitalWrite(13, true); // Flash a light to show received good message
    // Message with a good checksum received, dump it.
    Serial.print("Empfangen: ");
    
    for (i = 0; i < buflen; i++)
    {
        Serial.print(buf[i]);
        if(buf[i] == '1'){digitalWrite(8, HIGH); }
        Serial.print(" ");
    }
    Serial.println("");
        digitalWrite(13, false);
   }
}

Der Code stammt aus dem Sparkfun Example http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Wireless/General/RFASK_Example_Code.pde

Danke schonmal und einen schönen Abend
Benni

BamXP: Irgendwie habe ich das Gefühl, dass es sich um die RX/TX Signale in die LED(Pin 8 ) einschleichen, denn wenn ich die Baudrate umstelle pulsiert die LED schneller/langsamer.

Irgendwie habe ich das Gefühl, Du willst ganz was anderes machen als Du tatsächlich programmiert hast. Deine Empfangsroutine in verkürzter Form:

void loop() { digitalWrite(8, LOW); // LED geht aus if (Seltenes_Ereignis) { Serial.print("Empfangen: "); // schnarchlangsame Ausführung, wenn der Serial-Puffer erstmal voll ist // LED ist bis hier immer noch aus digitalWrite(8, HIGH); // JETZT geht die LED an } // Und die loop ist schon zuende }

D.h. gegen Ende der Loop schaltest Du zwar die LED an, aber dann ist die Loop auch schon zuende, startet neu, und die LED geht aus.

Nabend,

erstmal Danke jurs für deine Antwort.
Habe erstmal was gefuttert und Kaffee Pegel aufgefüllt… :% und das Problem nun gelöst, keine Ahnung was ich mir dabei gedacht habe :slight_smile:

Hier der Überarbeitete Code:

Sender:

// 26. Maerz 2013 RF 433MHZ SENDER - BamXP

#include <VirtualWire.h>

int txPin = 3;
int pushButton = 8;
int pushCount= 0;

void setup()
{
    Serial.begin(9600);
    Serial.println("Arduino startet..."); // Debug

    // Anschluesse definieren
    pinMode(pushButton, INPUT);
    
    // RF Modul Einstellungen
    vw_setup(2000);
    vw_set_tx_pin(txPin);
    Serial.println("RF Verbindung gestartet"); // Debug
}

void loop()
{
    // Status des Tasters auslesen
    int buttonState = digitalRead(pushButton);
    Serial.println(buttonState); // Debug
    delay(10); // entprellen
 
    char *msg;
  
    if((buttonState == 1)&&(pushCount == 0))
    {
        pushCount = 1;
        char *msg = "1";
        vw_send((uint8_t *)msg, strlen(msg));
        vw_wait_tx(); // Warten bist die Nachricht uebertragen wurde
    }

    if((buttonState == 0)&&(pushCount == 1))
    {
        pushCount = 2; 
    }
    
      if((buttonState == 1)&&(pushCount == 2))
    {
        pushCount = 3;
        char *msg = "2";
        vw_send((uint8_t *)msg, strlen(msg));
        vw_wait_tx(); // Warten bist die Nachricht uebertragen wurde
    }

    if((buttonState == 0)&&(pushCount == 3))
    {
        pushCount = 0; 
    }
}

Empfänger:

// 26. Maerz 2013 RF 433MHZ EMPFAENGER - BamXP

#include <VirtualWire.h>

int ledPin = 8;
int rxPin = 3;

void setup()
{
    Serial.begin(9600);  
    Serial.println("Arduino startet..."); // Debug
    
    // Anschluesse definieren
    pinMode(ledPin, OUTPUT);

    // RF Modul Einstellungen
    vw_setup(2000);    
    vw_set_rx_pin(rxPin); 
    vw_rx_start();
    Serial.println("RF Verbindung gestartet"); // Debug
}

void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen)) //if1
    {   
        int i;

    for (i = 0; i < buflen; i++)
    {
        if(buf[i] == '1')
        {
            digitalWrite(ledPin, HIGH); 
        }
        else {
            digitalWrite(ledPin, LOW);
       }

        if(buf[i] == '2')
        {
          digitalWrite(ledPin, LOW);
        } 

    }
     
   }
}