Ich habe ein DEBO 433 RX/TX Sender und Empfänger, das Sender Programm funktioniert soweit, jedoch mein Empfängerprogramm noch nicht. Ich habe einen Schalter bisher zum testen einfach zwischen die Spannungsversorgung des Senders gehängt (als Öffner). Aktuell funktioniert das Programm so: Wenn Signal kommt wird an meiner Dot-Matrix (4x 8x8 mit MAX7219) kein Signal ausgegeben, wenn das Signal weg ist wird solange ein Durchlauftext "Test" ausgegeben bis das Signal wieder kommt, dieses kann jedoch nur nach vollständigen durchlaufen des Textes wieder erkannt werden. Ich möchte jetzt, sobald ich den Schalter los lasse (Sprich wieder ein Signal kommt) die Dot-Matrix gelöscht haben, während diese durchläuft. Dafür muss ich aber irgendwie während dem Ablauf das Signal durchbringen, dafür habe ich aber leider zu wenig wissen über z.B. millis. Codes sehen wie folgt aus:
Sender
#include <VirtualWire.h>
void setup()
{
Serial.begin(9600);
vw_set_tx_pin(12);
vw_setup(8000);
}
void loop()
{
sendString("message", true);
delay(100);
}
void sendString(String message, bool wait)
{
byte messageLength = message.length() + 1;
char charBuffer[messageLength];
message.toCharArray(charBuffer, messageLength);
vw_send((uint8_t*)charBuffer, messageLength);
if (wait)vw_wait_tx();
Serial.println("sent:" + message);
}
Empfänger
#include <VirtualWire.h>
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
byte message[VW_MAX_MESSAGE_LEN];
byte messageLength = VW_MAX_MESSAGE_LEN;
unsigned long lastReceiveTime = 0;
bool isMessageReceived = false;
// Uncomment according to your hardware type
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
//#define HARDWARE_TYPE MD_MAX72XX::GENERIC_HW
// Defining size, and output pins
#define MAX_DEVICES 4
#define CS_PIN 10
// Create a new instance of the MD_Parola class with hardware SPI connection
MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
void setup() {
Serial.begin(9600);
vw_set_rx_pin(12);
vw_setup(8000);
vw_rx_start();
// Intialize the object
myDisplay.begin();
// Set the intensity (brightness) of the display (0-15)
myDisplay.setIntensity(7);
// Clear the display
myDisplay.displayClear();
myDisplay.displayScroll("Test", PA_CENTER, PA_SCROLL_LEFT, 100);
}
void loop() {
if (vw_get_message(message, &messageLength)) {
Serial.print("Received: ");
for (int i = 0; i < messageLength; i++) {
Serial.write(message[i]);
}
Serial.println();
isMessageReceived = true;
lastReceiveTime = millis();
}
while((isMessageReceived && (millis() - lastReceiveTime > 1000))&&myDisplay.displayAnimate())
{
myDisplay.displayReset();
}
}
Hoffe meine Erklärung war verständlich genug ansonsten stehe ich natürlich gerne für Fragen offen!!!
Für mich leider nicht. Ich habe dein Problem nicht verstanden.
Nur eins als Info zu deiner Baudrate für die Funkverbindung. Da sind 8000 deutlich zu viel. VirtualWire ist mit 2000 spezifiziert. Alles darüber ist extrem unsicher.
Auch nach mehrmaligem Durchlesen wird es nicht deutlicher.
Und was genau hat dein Titel mit dem Problem zu tun ?
Mache es dir einfach und nehme den Sender und Empfänger ohne zusätzlichen Schnickschnack in Betrieb.
Deine while Schleife im Empfänger verstehe ich nicht. Daher sieht sie für mich sehr merkwürdig aus.
Nachdem einmal eine Message empfangen wurde soll er noch eine Sekunde eventuelle weitere Meldungen empfangen, dann displayAnimate() aufrufen und falls das true liefert abwechselnd
displayReset und displayAnimate ausführen?
Aber wenn displayAnimate() false liefert, werden eventuelle weitere Messages gelesen.
Selbst wenn du es so verzwickt haben willst, geht das einfacher ohne while.
Du könntest ja mal genauer auf die dir gestellte Frage eingehen.
Vielen dank erstmal für den hinweis
und zu deiner frage... ich habe unten eine while schleife und während diese läuft würde ich gerne meinen empfänger so einbinden könne, dass ich mitten unter dem, dass der text "Test" läuft diesen clearen kann. Dafür muss ich aber irgendwie während der laufenden while schleife ein signal erhalten, auslesen und dann die dot matrix clearen können!
Wäre mir ansich auch recht wenn du da einen bestimmten Vorschlag hättest. Ich bin noch relativ neu in dem ganzen Thema, daher hab ich den code hauptsächlich mit copy - paste zusammen gebaut und letztendlich ist das dabei raus gekommen. Aber das mit den mehreren nachrichten erhalten liegt wo möglich daran, dass der sender nicht durchrgehend ein signal liefert sonder in bestimmten abständen immer wieder ein signal ausgibt. Diese signale muss ich irgendwie aber als ein Durchgängiges signal auslesen, damit die dot-matrix den text durchgend und fortlaufend (solange signale kommen) anzeigen kann
Dennoch verstehe ich immer noch nicht, wozu du da eine While-Schleife hast.
Das kann doch alles in der loop abgewickelt werden.
@paulpaulson Das geht ja! Aber das will ich ja nicht deswegen ists ja so schwierig.
@HotSystems das kann gut sein bin wie gesagt eher neu. Also ursprünglich hat der code hald so funktioniert, dass man bei einem signal den text auf der dot-matrix gesehen hatte aber sobald er einmal durchgelaufen war aber immernoch keine signale gekommen sind er trotzdem dann nicht weiter gelaufen ist. Mit der while schleife (bzw. Geht natürlich auch eine if schleife) konnte ich dieses ,,Problem" beheben. Sprich jetzt läuft der text immer wieder von neuem durch solange keine signale kommen.
Es gibt keine if-Schleife. Deshalb würde es mit einer if-Abfrage und einer Zeitsteuerung der Laufschrift über millis auch funktionieren, da dann immer die Abfrage dran kommt, ob etwas empfangen wurde. Du musst dafür nur Dein Konzept etwas umstellen.
Gruß Tommy
@Tommy56 oh da hast du natürlich recht, erstmal danke für den Hinweis! Aber was genau meinst du mit Konzept ändern? Also klar anstatt einer While SCHLEIFE eine If-Bedingung einbauen, aber wie genau. Also einfach nur wechseln reicht logischer weise nicht also wie muss ich dann genau die if-Bedingung zusammen mit millis schreiben? Hab nämlich auch schon einiges damit probiert aber hat alles nicht funktioniert. Erst daraufhin bin ich ja hier rein gelangt, da ich nichtmehr weiter wusste wie ich da schreiben soll.
Du musst deine einzelnen Abläufe auch in Funktionen aufgliedern.
Also deine Laufschrift in eine Funktion und deinen Funkempfang in eine eigene Funktion.
Wenn dein Empfänger eine Meldung komplett empfangen hat kannst du diese Meldung in die Laufschrift übergeben.
Das wäre mein Tipp zu einem angepassten Konzept.
Neben der Aufteilung in Funktionen, die @HotSystems vorgeschlafen hat, würde ich das while aufteilen in 2 if
(teilweise Pseudocode)
aktualMillis = millis();
if (isMessageReceived) {
display.reset();
}
else if (aktualMillis - lastStep > stepTime) {
lastStep = aktualMillis;
schiebeSchrift1Schritt();
}
Gruß Tommy
@HotSystems das hört sich schonmal nicht schlecht an, ich probiers demnächst mal aus, ist aber aufjedenfall schonmal n guter anfang vorallem wirds dann übersichtlicher
@Tommy56 ich probiers demnächst aus aber danke erstmal 
Ok, wenn du mit den bisher genannten Infos klar kommst, mal eine Frage zu deinen Funkmodulen. Welche genau sind das (Link posten) und welche Entfernung möchtest du damit überbrücken ?
@HotSystems naja weiß ich noch nicht bin grad nicht zuhause wegen ostern aber nach den festtagen kann ich dann bescheid geben. Die entfernung ist nicht all zu weit so ca 5 meter ohne wand oä. dazwischen. Der link dafür ist: 433 Mhz Funk Modul RF Empfänger Sender für Arduino Raspberry Pi - Ard
Ok, auch dann können wir sicher weiter helfen.
Bei 5 Meter brauchst du doch keinen Funk, das geht doch noch mit Kabel.
Grundsätzlich würde ich dir von dem Empfänger abraten, aber bei der kurzen Entfernung sollte es noch klappen.
@HotSystems ne ist quer durch den garten so zu sagen und umgraben draf ich leider nicht 