Hallo Zusammen,
ich habe ein wirklich relativ unkompliziertes (zumindest für Euch) Projekt:
Ich habe auf der einen Seite einen 5 Ghz-Radarsensor, der Bewegung erkennen soll. Der ist angeschlossen an ein Arduino Nano Every. Außerdem habe ich hier ein RF-Modul (433 Mhz), da ich bei erkannter Bewegung gerne über Funk an ein Arduino Uno R3 übertragen möchte, sodass an diesem Gerät z.B. eine Leuchte angeht.
Ich habe für exakt dieses Projekt ein YouTube-Video gefunden. Der feine Herr im Video nutzt die RadioHead-Library, die nur leider offensichtlich nicht mit dem Nano Every kompatibel ist.
Also habe ich die Library TinyRF geladen und die Beispielcodes in meinen Code integriert. Das sieht dann so aus:
Transmitter:
#include "TinyRF_TX.h"
const int RadarPin = 5;
const int StatusLed = 6;
const int MotionLed = 7;
void setup() {
setupTransmitter(); // transmitter default pin is pin #2. You can change it by editing Settings.h
delay(2000);
Serial.begin(115200);
Serial1.begin(115200);
pinMode(RadarPin, INPUT);
pinMode(StatusLed, OUTPUT);
pinMode(MotionLed, OUTPUT);
byte command1[] = { 0x58, 0xd2, 0x02, 0x14, 0x00, 0x40, 0x01 }; //DELTA
int command1Length = sizeof(command1);
for (int i = 0; i < command1Length; i++) {
Serial1.write(command1[i]); // Befehl über Serial1 (HardwareSerial) senden
}
delay(1500);
byte command2[] = { 0x58, 0x02, 0x01, 0x19, 0x74, 0x00 }; //DISTANZ
int command2Length = sizeof(command2);
for (int i = 0; i < command2Length; i++) {
Serial1.write(command2[i]); // Befehl über Serial1 (HardwareSerial) senden
}
delay(1500);
byte command3[] = { 0x58, 0x04, 0x02, 0x01, 0x00, 0x5F, 0x00 }; //Leuchte 1s
int command3Length = sizeof(command3);
for (int i = 0; i < command3Length; i++) {
Serial1.write(command3[i]); // Befehl über Serial1 (HardwareSerial) senden
}
delay(1500);
Serial.println("");
Serial.println("Empfangene Werte in Hex:");
while (Serial1.available()) {
byte receivedByte = Serial1.read();
Serial.print("0x");
Serial.print(receivedByte, HEX);
Serial.print(", ");
}
delay(200);
digitalWrite(StatusLed, HIGH);
}
void loop() {
int radar5Value = digitalRead(RadarPin);
if (radar5Value == HIGH) {
digitalWrite(MotionLed, HIGH);
Serial.println("Bewegung erkannt - 5 GHz");
const char* msg = "Bewegung erkannt";
send((byte*)msg, strlen(msg));
delayMicroseconds(TX_DELAY_MICROS);
} else {
digitalWrite(MotionLed, LOW);
}
delay(200);
}
Receiver:
#include "TinyRF_RX.h"
// the pin which will be connected to receiver module
// this pin has to support EXTERNAL interrupts
// on Arduino and similar boards this is pin 2 & 3
// on Digispark pro it's pin 3 & 9
// on ESP it's all GPIO pins except GPIO16, but using a pin that doesn't have an
// alternate function such as pin 12-14 is recommended
uint8_t rxPin = 2;
void setup(){
Serial.begin(115200);
//make sure you call this in your setup
setupReceiver(rxPin);
}
void loop(){
const uint8_t bufSize = 30;
byte buf[bufSize];
uint8_t numLostMsgs = 0;
uint8_t numRcvdBytes = 0;
// number of received bytes will be put in numRcvdBytes
// if sequence numbering is enabled the number of lost messages will be put in numLostMsgs
// if you have disabled sequence numbering or don't need number of lost messages you can omit this argument
uint8_t err = getReceivedData(buf, bufSize, numRcvdBytes, numLostMsgs);
// the receiver has a circular FIFO buffer
// if getReceivedData() isn't called frequently enough then older messages will get overwritten
// so make sure the frequency at which you send messages in your tx code is slower than the frequency
// at which you call getReceivedData() in your rx code to prevent that
// specially when you are using sendMulti()
// duplicate messages that are sent using sendMulti() will stay in the buffer until you read the first one
// you can change the buffer size in settings.h
if(err == TRF_ERR_NO_DATA){
return;
}
if(err == TRF_ERR_BUFFER_OVERFLOW){
Serial.println("Buffer too small for received data!");
return;
}
if(err == TRF_ERR_CORRUPTED){
Serial.println("Received corrupted data.");
return;
}
// if sequence numbering is enabled and you use the sendMulti() function for sending a message
// multiple times then getReceivedData() will return TRF_ERR_SUCCESS only once
// all the duplicate messages will be automatically ignored
// this means all you need to do is check if the return code is TRF_ERR_SUCCESS
// these are non-repeated, crc-valid messages
if(err == TRF_ERR_SUCCESS){
Serial.print("Received: ");
for(int i=0; i<numRcvdBytes; i++){
Serial.print((char)buf[i]);
}
Serial.println("");
if(numLostMsgs>0){
Serial.print(numLostMsgs);
Serial.println(" messages were lost before this message.");
}
}
}
Hier ist noch der Link zum RF-Modul (Transmitter und Receiver)
Nun komme ich zum Problem:
Ich habe die Module jeweils mit GND und +5V verbunden und den Data-Pin auf D2 gelegt (auf beiden Boards).
Die LED am Sender/Radarsensor leuchtet bei Bewegung korrekt auf, im Seriellen Monitor wird mir "Bewegung erkannt - 5 GHz" angezeigt. Jedoch bekomme ich keine Ausgabe im Seriellen Monitor des Arduino Uno.
Habe ich etwas übersehen? Ich hoffe ihr könnt mir helfen. Erstmal Danke für's Lesen.
Und berücksichtigt bei Euren Antworten bitte, dass ich absolute Nulpe auf dem Gebiet hier bin.
Viele Grüße