Go Down

Topic: Virtual Wire oder char macht probleme (Read 540 times) previous topic - next topic

DeBran

Hallo zusammen,

Ich bastel seit einiger zeit mit ein Paar Arduino Nano's herum und habe gestern ein 433Mhz Sender und Empfänger bekommen welche ich über Virtual Wire ansteuer. Das Klappt soweit ganz gut, mein Sender sendet und der Empänger gibt den "Hallo Welt" satz über den Seriellen Monitor aus.

Jetzt zu meinem Problem:

Ich wollte den Text der versendet wird per Knopfdruck ändern z.b soll solange der Knopf gedrückt ist ein "a" versendet werden und wenn er nicht gerdrückt ist ein "b"

Die Empfängerseite soll darauf reagieren also bei "a" einen anderen Text als bei "b" in den Seriellen Monitor schreiben.

Empängerseitig klappt alles nur Senderseitig nicht, meine Char variable ändert sich nicht auf Knopfdruck. Mein Button funktioniert das Teste ich ebenfalls über den Seriellen Monitor.

Sender:

Quote
#include <VirtualWire.h>

 
const int buttonPin = 3;
int buttonState = 0;
char *msg = "a";// Nachricht



 
void setup() {
  pinMode(7, OUTPUT);
  vw_setup(5000);       // Bits pro Sekunde
  vw_set_tx_pin(7);     // Datenleitung
  Serial.begin(9600);
  pinMode(buttonPin, INPUT);
}
 
void loop(){
  
  // Auslesen des Buttonstatus
  buttonState = digitalRead(buttonPin);

  // ISt der Button gedrückt
  if (buttonState == HIGH) {
    char *msg = "a";        // Nachricht
  Serial.println("i.O");
  } else {
    char *msg = "b";        // Nachricht
    Serial.println("n.i.O");
  }
  
  vw_send((uint8_t *)msg, strlen(msg));
  vw_wait_tx();                         // warten bis alles übertragen ist
  delay(1000);
}
Empfänger:

Quote
#include <VirtualWire.h>

int i;
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;

void setup() {
  Serial.begin(38400);
  pinMode(5, INPUT);
  vw_setup(5000);       // Bits pro Sekunde
  vw_set_rx_pin(5);     // Datenleitung
  vw_rx_start();        // Empfänger starten
}
 
void loop() {
  if (vw_get_message(buf, &buflen)) { // überprüfen ob eine Nachricht eingegangen ist
    for (i=0;i< buflen;i++) {
    
      if (buf == 'a') {
    Serial.println("Button gerückt");
    }
    else {
      Serial.println("Finger zu dick zum drücken");
    }
    }
      
    }
    }
Hoffe ihr könnt mir helfen
Grüsse Dennis

HotSystems

#1
Mar 05, 2016, 05:22 pm Last Edit: Mar 05, 2016, 05:29 pm by HotSystems
Ohne jetzt großartig deinen Sketch zu betrachten, mit 5000 Bit/sek wird das mit den Funkmodulen nicht funktionieren. Nimm 2000, dan sollte das klappen.
Wenn der Sketch ok ist, da schau ich noch mal drüber.


Edit:
1. Anmerkung zum Sender. So wie der jetzt aufgebaut ist, machst du alle Sekunde eine Aussendung. Da bekommst du evtl. Probleme, weil du alles um dich herum störst.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

DeBran

Ohne jetzt großartig deinen Sketch zu betrachten, mit 5000 Bit/sek wird das mit den Funkmodulen nicht funktionieren. Nimm 2000, dan sollte das klappen.
Wenn der Sketch ok ist, da schau ich noch mal drüber.

Also Senden an sich Klappt ja nur der wechsel nicht.
Habe jetzt Trotzdem mal auf 2000Bit/sek runtergestellt leider ohne erfolg.

HotSystems

Also Senden an sich Klappt ja nur der wechsel nicht.
Habe jetzt Trotzdem mal auf 2000Bit/sek runtergestellt leider ohne erfolg.
Klar funktioniert das Senden, nur die Daten werden für die Technik zu schnell gesendet. Das schafft diese Technik nicht.
Hast du dich mal nach den Beispielen der Library orientiert?
Was möchtest du damit überhaupt erreichen?
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Serenifly

#4
Mar 05, 2016, 05:35 pm Last Edit: Mar 05, 2016, 05:37 pm by Serenifly
Ist auch völlig logisch dass das nicht geht. Du überdeckst mit deinen lokalen Variablen die globale! Deine lokalen Version von msg existieren nur in ihrem { } Block auf dem Stack! Die globale Version die du versendest wird nie geändert.

Deklariere das global als Array (2 Bytes da es terminiert sein muss). Und nicht als Zeiger:
Code: [Select]

char msg[2];

Das wird automatisch mit 0 initialisiert (lokal geschieht das nicht!)

Und schreibe lokal nur das erste Zeichen neu:
Code: [Select]

msg[0] = 'a';

...

msg[0] = 'b'



P.S.:
Für Code "code" nehmen und nicht "quote". Oder auf den </> Knopf klicken

HotSystems

Das mit den Variablen habe ich tatsächlich übersehen.
Allerdings frage ich mich immer noch, was du mit dieser Schaltfunktion erreichen möchtest.
Zum Schalten gibt es die RC-Switch, die dafür sehr viel effektiver ist.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

DeBran

#6
Mar 05, 2016, 06:03 pm Last Edit: Mar 05, 2016, 06:09 pm by DeBran
 Ja so klappt es danke schön werde mir das mit den Globalen und Lokalen variablen wohl mal genau durchlesen danke schön für die schnelle Hilfe!

HotSystems

Die Variablen im Sender und Empfänger sind doch von einander unabhängig.
Da solltest du kein Problem bekommen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Go Up