Forum: Mikrocontroller und Digitale Elektronik Arduino mit Sender und Empfänger


von Benjamin W. (Gast)


Lesenswert?

Hallo,
ich möchte mal fragen, wie ich werte von einem Taster mit einem Arduino 
sende und mit einem anderen Arduino empfange.
Zum einsatz kommen diese Module:

http://www.amazon.de/Empf%C3%A4nger-Superregeneration-Raspberry-Wireless-Transmitter/dp/B00M0XTP4W/ref=sr_1_1?ie=UTF8&qid=1416401459&sr=8-1&keywords=arduino+sender+empf%C3%A4nger
,sowie zwei Taster.
Jezt zur Frage:
Da ich das Sende-Empfänger-Modul noch nicht bekommen habe (noch im 
Versand), möchte ich fragen, ob die nachfolgenden Codes richtig sind.
Ich möchte: mit dem Sende-Modul die Zahlen 0 oder zwei senden, wenn der 
1. oder der 2. Taster auf LOW steht.
Die zahlen 1 und 3 möchte ich ausgeben, wenn der Taster 1 oder der 
Taster 2 auf HIGH steht.
Und dann noch diese ganzen Zahlen empfangen.
Sollte es Fehler geben, dann schreibt es mir bitte!
Danke schon im Voraus!
1
// Sender-Code:
2
#include <RCSwitch.h>
3
 
4
RCSwitch mySwitch = RCSwitch();
5
int taster1 = 13;
6
int taster2 = 12;
7
 
8
void setup()
9
{
10
  mySwitch.enableTransmit(10);  // verwende Pin #10
11
  pinMode(taster1, INPUT);
12
  pinMode(taster2, INPUT);
13
}
14
 
15
void loop()
16
{
17
  taster1 = digitalRead();
18
  taster2 = digitalRead();
19
20
  if(taster1 == LOW);
21
  mySwitch.send("0");
22
23
  if(taster1 == HIGH);
24
  mySwitch.send("1");
25
26
  if(taster2 == LOW);
27
  mySwitch.send("2");
28
29
  if(taster2 == HIGH);
30
  mySwitch.send("3");
31
32
  delay(1000); //Ende Sendercode
33
}



1
//Empfänger-Code
2
3
#include <RCSwitch.h>
4
 
5
RCSwitch mySwitch = RCSwitch();
6
int counter = 0;
7
int buzzer = 10;
8
 
9
void setup()
10
{
11
 
12
  Serial.begin(9600);
13
  mySwitch.enableReceive(0);
14
  pinMode(buzzer, OUTPUT);
15
}
16
 
17
void testtone()
18
{
19
 
20
  for (int c = 0; c < 6; c++){
21
      digitalWrite(buzzer, HIGH);
22
      delay(30);
23
      digitalWrite(buzzer, LOW);
24
      delay(20);
25
  }
26
}
27
 
28
void loop()
29
{
30
    int value = mySwitch.getReceivedValue();
31
 
32
    if (value == 0 || value == 2)
33
    {
34
      Serial.print("Unknown encoding");
35
    }
36
    if(value == 1 || value == 3)
37
     {
38
      Serial.print("Received:  ");
39
      Serial.print( mySwitch.getReceivedValue() );
40
      Serial.print(" / ");
41
      Serial.print( mySwitch.getReceivedBitlength() );
42
      Serial.print("bit ");
43
      Serial.print("Protocol: ");
44
      Serial.println( mySwitch.getReceivedProtocol() );
45
      testtone();
46
     }
47
    mySwitch.resetAvailable(); //Ende Empfängercode
48
}

von Ulrich F. (Gast)


Lesenswert?

Öhmm....
Kenne deine RCSwitch Lib nicht, würde aber meinen, dass du das einfach 
ausprobieren könntest.

AusgangsPin und EingangsPin der Arduinos verbinden. (GND natürlich auch)
Vielleicht noch einen Panikwiderstand dazwischen, falls du Mist gebaut 
haben solltest.

von Andreas (Gast)


Lesenswert?

//Empfänger-Code

Hallo, wo muss ich etwas verändern damit der Ablauf von 6 Schleifen 
vorzeitig unterbrochen wird, ich benutze eine Fernbedienung mit 4 Tasten 
als Sender, ich würde gerne die schleife vorzeitig stoppen nur wie?

Starten kann ich da ich die "value == 1" gegen denn Code der FB 
ausgetauscht habe "value == 7341"

Danke für die Hilfe

von Stefan F. (Gast)


Lesenswert?

Andreas schrieb:
> Hallo, wo muss ich etwas verändern damit der Ablauf von 6 Schleifen
> vorzeitig unterbrochen wird, ich benutze eine Fernbedienung
> mit 4 Tasten als Sender, ich würde gerne die schleife vorzeitig
> stoppen nur wie?

Ist das nicht offensichtlich? Mach aus der 6 eine 4. Irgendwie ist mir 
der Zusammenhang zu der Anzahl der Tasten nicht klar. Zeige doch mal 
dein Programm!

Ich würde Dir empfehlen, die Grundlagen der Programmiersprache C zu 
lernen. Am einfachsten geht das auf einem PC mit Anleitungen wie dieser: 
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/

von Andreas (Gast)


Lesenswert?

Stefanus F. schrieb:
> Ist das nicht offensichtlich? Mach aus der 6 eine 4. Irgendwie ist mir
> der Zusammenhang zu der Anzahl der Tasten nicht klar. Zeige doch mal
> dein Programm!

Es ist doch ganz einfach, ich habe eine FB und diese hat 4 Tasten A, B, 
C und D - wenn ich die Taste "A" gedrückt habe startet ein Zyklus mit 20 
Wiederholungen und bei Taste "B" mit 50 Wiederholungen, mein Problem ist 
jetzt, ich möchte bei Taste A oder B nach 10 Wiederholungen das stoppen 
oder wechseln von A auf B oder von B auf A ohne das ich die schleife bis 
zum ende abwarten muss.


//Empfänger-Code

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();
int Funk = 0;
int Relais = 6;
int LED_Test = 13;

void setup()
{

  Serial.begin(9600);
  mySwitch.enableReceive(0);  //Empfänger ist an Interrupt-Pin "0" - Das 
ist der Pin2
  pinMode(Relais, OUTPUT);  //Der Pin mit der Relais (Pin6) ist jetzt 
ein Ausgang.
}

void RelaisStart()
{

  for (int c = 0; c < 20; c++){   //Wiederholungsanzahl
      digitalWrite(Relais, HIGH); //An dieser Stelle würde das Relais 
einsschalten
      delay(250);     //...xxx Sekunden warten - (1 sec.=1000 - 10 
sec.=10000)
      digitalWrite(Relais, LOW);  //Und wieder ausschalten
      delay(250);     //...xxx Sekunden warten - (1 sec.=1000 - 10 
sec.=10000)
  }
}

void ledtest()
{

  for (int c = 0; c < 30; c++){   //Wiederholungsanzahl
      digitalWrite(LED_Test, HIGH); //An dieser Stelle würde das Relais 
einsschalten
      delay(100);     //...xxx Sekunden warten - (1 sec.=1000 - 10 
sec.=10000)
      digitalWrite(LED_Test, LOW);  //Und wieder ausschalten
      delay(100);     //...xxx Sekunden warten - (1 sec.=1000 - 10 
sec.=10000)
  }
}

void loop()
{
    int value = mySwitch.getReceivedValue();


    if (value == 4436)                 //24 bit Code der Fernbedienung / 
Handsender Taste B
    {
      Serial.print("LED:  ");          //Ausgabe Serial Monitor (Strg + 
Umschalt + M)
      Serial.print( mySwitch.getReceivedValue() );
      Serial.print(" / ");
      Serial.print( mySwitch.getReceivedBitlength() );
      Serial.print("bit ");
      Serial.print("Protocol: ");
      Serial.println( mySwitch.getReceivedProtocol() );
      ledtest();
    }


    if (value == 4433)                  //24 bit Code der Fernbedienung 
/ Handsender Taste A
     {
      Serial.print("Relais:  ");        //Ausgabe Serial Monitor (Strg + 
Umschalt + M)
      Serial.print( mySwitch.getReceivedValue() );
      Serial.print(" / ");
      Serial.print( mySwitch.getReceivedBitlength() );
      Serial.print("bit ");
      Serial.print("Protocol: ");
      Serial.println( mySwitch.getReceivedProtocol() );
      RelaisStart();
     }

     mySwitch.resetAvailable();          //Ende Empfängercode
}

von Gerhard O. (gerhard_)


Lesenswert?

Als Alternative schlage ich vor die Arduino Bibliotheken für diese Art 
von Radio Modulen zu studieren und ausprobieren. Ich kaufte mir vor ein 
paar Jahren auch solche Module zum rumspielen. Mit einer Arduino 
Bibliothek funktionierten die Dinger zuverläßig auf Anhieb um ein 
MAX31856 Thermometer fern zu übertragen.

https://andreasrohner.at/posts/Electronics/New-Arduino-library-for-433-Mhz-AM-Radio-Modules/

: Bearbeitet durch User
von Manfred (Gast)


Lesenswert?

Gerhard O. schrieb:
> Als Alternative schlage ich vor die Arduino Bibliotheken für diese Art von Radio 
Modulen zu studieren

Ändert nichts an der unbrauchbaren Programmstruktur:

> void ledtest() {
>   for (int c = 0; c < 30; c++){
>     digitalWrite(LED_Test, HIGH);
>     delay (100);

Die Routine "ledtest" mit delay dauert so lange wie sie läuft, 
währenddessen kann keine Abfrage der Tasten erfolgen - so wird das nie.

Aus den Grundlagen "blink ohne delay" durcharbeiten und anstatt delay 
Timer setzen und sofort wieder zurück in die Hauptschleife.

von Stefan F. (Gast)


Lesenswert?

Andreas schrieb:
> ich möchte bei Taste A oder B nach 10 Wiederholungen das stoppen
> oder wechseln von A auf B oder von B auf A ohne das ich die
> schleife bis zum ende abwarten muss.

Dann würde ich eine Variable "anzahl" benutzen, die bestimmt, wie viele 
Schleifen-Wiederholungen gewünscht sind.

Sagen wir, Taste A setzt die Variable auf 20, und Taste B setzt sie auf 
50. Dann lautet die Wiederholschleife etwa:
1
for (int i=0; i<anzahl; i++) { ... }

Zwei Herausforderungen entstehen nun:

a) Was soll passieren wenn du nach Druck auf die Taste B (50) bereits 
mehr als 29 Schleifendurchläufe erreicht hat und dann jemand Taste A 
(20) drückt?

b) Da deine Wiederholschleife blockierenden Code enthält, fehlt Dir die 
Möglichkeit, gleichzeitig die Tasten abzufragen. Zwei Lösungsvorschläge:

b1) Du fragst die Tasten regelmäßig in einem Timer-Interrupt ab.

b2) Du beschäftigst Dich mit "Endlichen Automaten" (=Zustandsautomaten) 
um zu lernen, wie man ausbaufähiges Multi-Tasking implementiert.

Ich würde Die Methode b2 empfehlen. Das dauert zwar etwas länger, aber 
du wirst davon auch in anderen Projekten profitieren können. Und du 
wirst merken, dass das Arduino Framework dazu ideal geeignet ist.

von Andreas (Gast)


Lesenswert?

Stefanus F. schrieb:
> Zwei Herausforderungen entstehen nun:
>
> a) Was soll passieren wenn du nach Druck auf die Taste B (50) bereits
> mehr als 29 Schleifendurchläufe erreicht hat und dann jemand Taste A
> (20) drückt?
>
> b) Da deine Wiederholschleife blockierenden Code enthält, fehlt Dir die
> Möglichkeit, gleichzeitig die Tasten abzufragen. Zwei Lösungsvorschläge:
>
> b1) Du fragst die Tasten regelmäßig in einem Timer-Interrupt ab.
>
> b2) Du beschäftigst Dich mit "Endlichen Automaten" (=Zustandsautomaten)
> um zu lernen, wie man ausbaufähiges Multi-Tasking implementiert.
>
> Ich würde Die Methode b2 empfehlen. Das dauert zwar etwas länger, aber
> du wirst davon auch in anderen Projekten profitieren können. Und du
> wirst merken, dass das Arduino Framework dazu ideal geeignet ist.


ZU a) dann soll die Schleife Stoppen und die andere sofort anfangen

ZU b1) und b2) wie müsste der Code aussehen, ich möchte es so einfach 
wie möglich erst mal damit ich es verstehen kann.

von Andreas (Gast)


Lesenswert?

Manfred schrieb:
> Die Routine "ledtest" mit delay dauert so lange wie sie läuft,
> währenddessen kann keine Abfrage der Tasten erfolgen - so wird das nie.
>
> Aus den Grundlagen "blink ohne delay" durcharbeiten und anstatt delay
> Timer setzen und sofort wieder zurück in die Hauptschleife.

*** anstatt delay Timer setzen ***
mit der Timer Funktion habe ich aber keine Möglichkeit die Intervalle zu 
bestimmen oder?

2 Sec. / 15 Sec.
1
digitalWrite(LED, HIGH); //An dieser Stelle würde das Relais einschalten
2
      delay(2000); //...Sekunden warten -(1 sec.=1000 - 10 sec.=10000)
3
      digitalWrite(LED, LOW); //Und wieder ausschalten
4
      delay(15000); //...Sekunden warten - (1 sec.=1000 - 10 sec.=10000)

wie kann ich da HIGH und LOW für unterschiedliche Zeiten einbauen

nur die Möglichkeit 2 Sec. oder?
1
byte ledPin = 13;                 // LED liegt am (digitalen) Pin 13
2
boolean value = LOW;              // Startwert der LED
3
unsigned long previousMillis = 0; // speichert wie viele Sek. seit derletzten Änderung vergangen sind
4
unsigned long interval = 2000;    // Interval zwischen zwei Änderungen

von Stefan F. (Gast)


Lesenswert?

Andreas schrieb:
>> a) Was soll passieren wenn du nach Druck auf die Taste B (50) bereits
>> mehr als 29 Schleifendurchläufe erreicht hat und dann jemand Taste A
>> (20) drückt?

> ZU a) dann soll die Schleife Stoppen und die andere sofort anfangen

Kann man so machen. Aber dann hast du am Ende 49 Schleifendurchläufe für 
die Taste B gefolgt von A. Kommt mir wenig sinnvoll vor.

> ZU b1) und b2) wie müsste der Code aussehen, ich möchte es so einfach
> wie möglich erst mal damit ich es verstehen kann.

Benutze Google und suche nach "Arduino Tasten in Interrupt abfragen", 
"Arduino Endlicher Automat" und "Arduino Zustandsautomat". Es gibt schon 
viele Aufsätze dazu, macht wenig Sinn, diese hier nochmal zu 
wiederholen. Wie gesagt, das mit den Interrupts ist weniger ausbaufähig. 
Befasse Dich besser direkt mit den Automaten.

> mit der Timer Funktion habe ich aber keine Möglichkeit die
> Intervalle zu bestimmen oder?

Schau Dir die Tutorials an, da wird genau das erklärt. LEDs blinken 
lassen während noch etwas anderes passiert ist ein Klassiker.

Ich helfe Dir mal beim suchen:
https://learn.adafruit.com/multi-tasking-the-arduino-part-1/using-millis-for-timing
https://www.baldengineer.com/blink-without-delay-explained.html
https://forum.arduino.cc/index.php?topic=328241.0
http://stefanfrings.de/mikrocontroller_buch/Einstieg%20in%20die%20Elektronik%20mit%20Mikrocontrollern%20-%20Band%202.pdf 
Kapitel 11.3 und dann:
http://stefanfrings.de/mikrocontroller_buch/Einstieg%20in%20die%20Elektronik%20mit%20Mikrocontrollern%20-%20Band%203.pdf 
Kapitel 9.1 bis 9.1.4 für ein konkretes Beispiel mit LED Anzeigen.

Falls du mit Wissenschaftlicher Ausdrucksweise mehr anfangen kannst:
http://profhof.com/endliche-automaten/

von Andreas (Gast)


Lesenswert?

Schade das ich das Projekt so beenden muss.

ich wollte lediglich ein kleine Schaltung für eine Musikgruppe bauen, 
ich gebe Straßen Kindern kostenlos Musik Unterricht und wollte dafür 
diese Schaltung so günstig wie möglich bauen.
Manche Projekte sollen es eben nicht sein.

Danke trotzdem für die Hilfe.
Solle sich aber jemand bereit erklären die Schaltung mir so zu bauen 
würde ich sehr dankbar, die Hardware habe ich.

von Andreas (Gast)


Lesenswert?

Schade

von Uwe (Gast)


Lesenswert?

// Zum Empfangen des Codes in Dezimal

 #include <RCSwitch.h>
 #define Code_Taste_1_on  5688908
 #define Code_Taste_1_off 5694380
 RCSwitch mySwitch = RCSwitch();
 int LED = 13;

 void setup() {
   Serial.begin(9600);
   pinMode (LED, OUTPUT);
   mySwitch.enableReceive(0);  // Anschließen an Pin 2
 }

 void loop() {
   if (mySwitch.available())
  {

     unsigned long value = mySwitch.getReceivedValue();


     if (value == Code_Taste_1_on){
       Serial.println("Einschalten");
       // hier Code für Taste 1 betätigt einfügen
       digitalWrite (LED, HIGH);
     }

     if (value == Code_Taste_1_off){
       Serial.println("Ausschalten");
       // hier Code für Taste 1 betätigt einfügen
       digitalWrite (LED, LOW);
     }

     mySwitch.resetAvailable();
   }
 }

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.