Hallo,
ich habe 2 billige RF 433MHz Funksets, bestehend jeweils aus Empfänger und Sender.
Ich habe an 2 Arduinos je einen Empfänger und Sender angehängt und möchte ein Signal senden und dessen Empfang zurück bestätigen.
Zusätzlich je 2 LEDs zur sende/Empfangsanzeige und beim Hauptsender ein Button zum Senden.
Aktuell verwende ich "VirtualWire". Mein Sketch funktioniert nicht richtig. Es funktioniert, jedoch nicht immer!
Beim Tastendruck wird von A1 ein "hallo welt" gesendet. A2 empfängt dieses und sendet "empfangen" zurück.
Um sich nicht in die Quere zu kommen, musste ich ein delay(100) eher delay (1000) einbauen. Somit sinkt die maximale Sendeleistung enorm. bei delay =1 Sekunde kann ich nur noch 1x pro Sekunde ein Signal verschicken.
Letztendlich möchte ich 6stellige Zahlen schicken. die ersten vier Stellen als "ID" des EmpfängerArduinos und die letzten beiden Stellen als Kanalnummer. Damit schalte ich per Funk LEDs ein und wieder aus. Die SchaltFrequenz soll bei hundertstel Sekunden, bzw so schnell wie möglich, liegen!
Der Taster ist nur für erste Tests gedacht. In weiterer Folge wird er entfernt.
ich habe jeweils eine Sende und Empfangsfunktion erstellt.
Im Loop prüfe ich den Taster und rufe die Funktionen auf. Damit es funktioniert habe ich im loop das DELAY einbauen müssen.
Anfangs wollte ich den Taster per Interrupt steuern, das geht nicht, da VirtualWire offensichtlich schon beide Interrupts nutzt.
Damit kann ich meine senden() und empfangen() auch nicht durch Interrupts steuern.
Meine Programme funktionieren, solange ich den Taster nur sehr kurz drücke. Drücke ich zu lange, funktioniert es nicht mehr. Die 2 LEDs zeigen mir Sendung und Empfang an.
Da meine Lösung nicht zuverlässig funktioniert, suche ich eine andere Lösung
Wie kann ich gleichzeitig "ordentlich" und zuverlässig senden und empfangen? Gibt es bessere/andere Bibliotheken? (das China RX Set ist natürlich auch nicht das beste, für erste Tests jedoch ausreichend)
Wie kann ich ohne Interrupts zwei Aktionen gleichzeitig ausführen? also senden und empfangen?
Letztendlich soll ein Signal nochmals gesendet werden, wenn es nicht bestätigt wird.
Der Arduino wird jedoch auch anderes zu tun haben, somit sind delay() Befehle nicht erwünscht.
Hat jemand eine Idee oder Link zu einem beispiel, wie man gleichzeitig senden und empfangen, vernünftig programmiert?
Sender
// VirtualWire 433MHz Sender
// Daten > D7
// 2x LED auf PIN 4 und 6
// Sendetaster auf PIN 3
#include <VirtualWire.h>
char *msg = "Hallo Welt";// Nachricht
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
int led = 4;
int led1 = 6;
volatile int taster = 3;
int taststate = LOW;
int tmp;
void setup() {
Serial.begin(38400);
pinMode(5, INPUT);
pinMode(7, OUTPUT);
pinMode(led, OUTPUT);
pinMode(led1, OUTPUT);
pinMode(taster, INPUT);
vw_setup(5000); // Bits pro Sekunde
vw_set_tx_pin(7); // Datenleitung TX
vw_set_rx_pin(5); // Datenleitung RX
vw_rx_start(); // Empfänger starten
}
void loop() {
taststate = digitalRead(taster);
if (taststate == HIGH) {
delay(100);
senden();
}
}
void senden() {
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx(); // warten bis alles übertragen ist
digitalWrite(led, !digitalRead(led)); //LED ändern
Serial.println("sending...");
empfangen ();
}
void empfangen () {
if (vw_get_message(buf, &buflen)) { // überprüfen ob eine Nachricht eingegangen ist
for (int i = 0; i < buflen; i++) {
Serial.print((char)buf[i]); // Nachricht aus buf ausgeben
}
Serial.println("");
digitalWrite(led1, !digitalRead(led1)); //LED ändern
}
}
Empfänger (und Bestätigungssender)
// Data > D5
#include <VirtualWire.h>
char *msg = "Empfangen";// Nachricht
int i;
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
int led=4;
int led1=6;
void setup() {
Serial.begin(38400);
pinMode(5, INPUT);
pinMode(led,OUTPUT);
pinMode(led1,OUTPUT);
pinMode(7,OUTPUT);
vw_setup(5000); // Bits pro Sekunde
vw_set_rx_pin(5); // Datenleitung RX
vw_set_tx_pin(7); // Datenleitung TX
vw_rx_start(); // Empfänger starten
}
void loop () {
empfangen();
}
void empfangen () {
if (vw_get_message(buf, &buflen)) { // überprüfen ob eine Nachricht eingegangen ist
for (i=0;i< buflen;i++) {
Serial.print((char)buf[i]); // Nachricht aus buf ausgeben
}
Serial.println("");
digitalWrite(led, !digitalRead(led)); //LED ändern
delay(100);
senden();
}
}
void senden() {
digitalWrite(led1, !digitalRead(led1)); //LED ändern
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx(); // warten bis alles übertragen ist
Serial.println("ready to send...");
}