Hallo,
ich beschäftige mich seit einer Woche damit, zwei Arduino Nanos mit jeweils einem Sender- und Empfangsmodul (433MHz) miteinander kommunizieren zu lassen. Ich habe eine feste Station, die über ein Relais zwei Steckdosen ansteuert, und ein Funksender. Soweit hat alles gut geklappt, die Steckdosen lassen sich ferngesteuert ein- und ausschalten. Jetzt habe ich einen neuen Sender gebaut, der kompakter ist (lediglich ein Arduino Nano mit Sender/Empfänger und 6 Taster). 3 Taster sind auf die digitalen Pins 6, 7 und 8, die anderen 3 auf die analogen Pins 0, 1 und 2 gelegt. Auf dem neuen Sender läuft das gleiche Programm wie gewohnt wie auf dem Alten, mit einer Ausnahme: wenn ich einen Taster auf einem digitalen Pin betätige, reagiert der Nano zwar auf den Tastendruck, sendet aber kein Signal bzw. es wird kein Signal empfangen (bei keinem Empfänger den ich getestet habe). Wenn ich auf einen der an einem analogen Pin angeschlossenen Taster drücke, läuft alles ganz normal.
Frage: Warum wird kein Signal gesendet bzw. empfangen, wenn ich einen an einem digitalen Pin angeschlossenen Taster drücke?
Der Code des Empfängers funktioniert einwandfrei mit dem alten Sender.
Hier sind die Quellcodes:
Sender:
#include <RCSwitch.h>
RCSwitch snd = RCSwitch();
int val[] = {0, 0, 0, 0}; // 2: low > high, 1: high, 0: low, -1: high > low
int wert[] = {0, 0, 0, 0}; // 1: Taster gedrückt, 0: Taster nicht gedrückt
void setup() {
snd.enableTransmit(3);
snd.setProtocol(1);
snd.setPulseLength(433);
snd.setRepeatTransmit(10); // Sender einstellen
Serial.begin(9600);
}
void loop() {
wert[0] = digitalRead(8);
wert[1] = digitalRead(7);
wert[2] = analogRead(0)>1000?1:0;
wert[3] = analogRead(2)>1000?1:0; // Pins auslesen
String txt = "";
for(int i=0;i<4;i++) {
if (wert[i] == 1) {
if (val[i] == 2) val[i] = 1;
if (val[i] < 1) val[i] = 2;
} else if (wert[i] == 0) {
if (val[i] == -1) val[i] = 0;
if (val[i] > 0) val[i] = -1;
}
if (val[i] == 2) snd.send((3 << 9) | i, 12); // Senden, wenn Taster gedrückt wurde
txt += String(wert[i]);
}
Serial.println(txt); // Über Serial ausgeben
delay(100);
}
Empfänger:
#include <RCSwitch.h>
RCSwitch rec = RCSwitch();
RCSwitch snd = RCSwitch();
int r[] = {0, 0}; // Relais (0: Aus, 1: An)
boolean t[] = {false, false}; // aktuelle Tasterstellung
boolean talt[] = {false, false}; // alte Tasterstellung, zum Vergleichen
int active = 0;
const int led1 = 6; // LED für Relais 1
const int led2 = 5; // LED für Relais 2
const int tas1 = 3; // Lokaler Stationstaster für Relais 1
const int tas2 = 4; // Lokaler Stationstaster für Relais 2
const int prec = 2; // Pin des Empfängermoduls
const int psnd = 9; // Pin des Sendemoduls
const int rel1 = 8; // Pin für Relais 1
const int rel2 = 7; // Pin für Relais 2
void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(tas1, INPUT);
pinMode(tas2, INPUT);
pinMode(psnd, OUTPUT);
pinMode(rel1, OUTPUT);
digitalWrite(rel1, HIGH);
pinMode(rel2, OUTPUT);
digitalWrite(rel2, HIGH);
pinMode(13, OUTPUT);
rec.enableReceive(0);
rec.setProtocol(1);
snd.enableTransmit(psnd);
snd.setRepeatTransmit(5);
snd.setPulseLength(433);
snd.setProtocol(1);
Serial.begin(9600);
}
void loop() {
t[0] = digitalRead(tas1)==HIGH;
t[1] = digitalRead(tas2)==HIGH; // Lokale Taster auslesen
if (rec.available()) {
long val = rec.getReceivedValue(); // Empfangenes speichern
rec.resetAvailable();
if ((val >> 9) == 3) {
int data = val & 7; // Hinteren 3 Bits ausschneiden
if (data == 4) {
int b = (val >> 5) & 7;
snd.send(((b==0?5:b) << 9) | (r[0] << 1) | r[1], 12); // aktuelle Stati zurücksenden
} else {
digitalWrite(13, HIGH);
r[data>>1] = data & 1; // neue Einstellung speichern ...
active = (data >> 1) + 1; // ... und später aktualisieren lassen
}
}
}
for(int i=0;i<2;i++) {
if (talt[i] != t[i]) {
if (t[i]) {
r[i] = 1-r[i];
digitalWrite(i==0?rel1:rel2, 1-r[i]);
digitalWrite(i==0?led1:led2, r[i]);
}
delay(20);
}
talt[i] = t[i];
if (active == i+1) { // Aktualisierung
active = 0;
digitalWrite(i==0?rel1:rel2, 1-r[i]); // Relais ist LOW-aktiv
digitalWrite(i==0?led1:led2, r[i]);
digitalWrite(13, LOW);
}
}
}
Danke im Voraus für Vorschläge und Lösungsansätze für mein Problem