mikrocontroller.net

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


Autor: Benjamin W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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-Superregenerat...
,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!
// Sender-Code:
#include <RCSwitch.h>
 
RCSwitch mySwitch = RCSwitch();
int taster1 = 13;
int taster2 = 12;
 
void setup()
{
  mySwitch.enableTransmit(10);  // verwende Pin #10
  pinMode(taster1, INPUT);
  pinMode(taster2, INPUT);
}
 
void loop()
{
  taster1 = digitalRead();
  taster2 = digitalRead();

  if(taster1 == LOW);
  mySwitch.send("0");

  if(taster1 == HIGH);
  mySwitch.send("1");

  if(taster2 == LOW);
  mySwitch.send("2");

  if(taster2 == HIGH);
  mySwitch.send("3");

  delay(1000); //Ende Sendercode
}



//Empfänger-Code

#include <RCSwitch.h>
 
RCSwitch mySwitch = RCSwitch();
int counter = 0;
int buzzer = 10;
 
void setup()
{
 
  Serial.begin(9600);
  mySwitch.enableReceive(0);
  pinMode(buzzer, OUTPUT);
}
 
void testtone()
{
 
  for (int c = 0; c < 6; c++){
      digitalWrite(buzzer, HIGH);
      delay(30);
      digitalWrite(buzzer, LOW);
      delay(20);
  }
}
 
void loop()
{
    int value = mySwitch.getReceivedValue();
 
    if (value == 0 || value == 2)
    {
      Serial.print("Unknown encoding");
    }
    if(value == 1 || value == 3)
     {
      Serial.print("Received:  ");
      Serial.print( mySwitch.getReceivedValue() );
      Serial.print(" / ");
      Serial.print( mySwitch.getReceivedBitlength() );
      Serial.print("bit ");
      Serial.print("Protocol: ");
      Serial.println( mySwitch.getReceivedProtocol() );
      testtone();
     }
    mySwitch.resetAvailable(); //Ende Empfängercode
}

Autor: Ulrich F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht 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/

: Bearbeitet durch User
Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
}

Autor: Gerhard O. (gerhard_)
Datum:

Bewertung
0 lesenswert
nicht 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-Ard...

: Bearbeitet durch User
Autor: Manfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht 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:
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.

Autor: Andreas (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
digitalWrite(LED, HIGH); //An dieser Stelle würde das Relais einschalten
      delay(2000); //...Sekunden warten -(1 sec.=1000 - 10 sec.=10000)
      digitalWrite(LED, LOW); //Und wieder ausschalten
      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?
byte ledPin = 13;                 // LED liegt am (digitalen) Pin 13
boolean value = LOW;              // Startwert der LED
unsigned long previousMillis = 0; // speichert wie viele Sek. seit derletzten Änderung vergangen sind
unsigned long interval = 2000;    // Interval zwischen zwei Änderungen  

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht 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-ardui...
https://www.baldengineer.com/blink-without-delay-e...
https://forum.arduino.cc/index.php?topic=328241.0
http://stefanfrings.de/mikrocontroller_buch/Einsti... 
Kapitel 11.3 und dann:
http://stefanfrings.de/mikrocontroller_buch/Einsti... 
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/

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.