Forum: Mikrocontroller und Digitale Elektronik Zu doof für While Schleife? Arduino


von Frank B. (susefreax)


Lesenswert?

Hallo zusammen,

ich bin wohl einfach zu doof.

Ich Versuche folgendes:
Von einem 433MHz Empfänger wird abgefragt ob eine bestimmte Taste 
gedrückt wird. Ist dies der Fall soll ein Ausgang so lange einen 
bestimmten Wert haben wie die Taste gedrückt wird.
Mein Problem: Sobald ich in der While-Schleife bin, komme ich da nicht 
mehr raus? Ich habe wohl Tomaten auf den Augen.
1
#include <RCSwitch.h>
2
RCSwitch mySwitch = RCSwitch();
3
4
5
int LEDr = 11;
6
int RCWert = 0;
7
int menu = 0;
8
int m1 = 0;
9
int m2 = 0;
10
11
12
int RCauslesen()
13
{
14
    if (mySwitch.available()) {
15
    
16
    RCWert = mySwitch.getReceivedValue();
17
18
19
    mySwitch.resetAvailable();
20
  }
21
}
22
23
24
25
void setup()
26
27
{ 
28
pinMode(LEDr, OUTPUT);
29
mySwitch.enableReceive(0);
30
   Serial.begin(9600);
31
32
33
}
34
35
void loop()
36
  { 
37
    RCauslesen();
38
        while(RCWert == 5393)
39
          {            
40
          analogWrite(LEDr, 110);
41
          RCauslesen();
42
          }
43
          digitalWrite(LEDr, HIGH);
44
          delay(250);
45
          Serial.println(RCWert);
46
  }
Solange ich nicht in der Schleife bin zeigt mir das serial.print 
wunderbar alle Tastencodes an. Sobald ich aber in der Schleife bin ist 
RCWert immer gleich? Wie kann ich denn dieses (wahrscheinlich mega 
einfache) Problem lösen?

Er soll die While-Schleife verlassen sobald der RC-Wert sich ändert. Es 
kommt mir aber so vor als würde er gar nicht mehr in die Routine 
"RCauslesen();" rein kommen?

Bin für jeden Tipp dankbar.

von J. (Gast)


Lesenswert?

volatile

von Bernd (Gast)


Lesenswert?

Funktioniert mySwitch.available()?

von Max H. (hartl192)


Lesenswert?

J. schrieb:
> volatile
Oder die globale Variable ganz weglassen und RCWert als Rückgabewert der 
Funktion RCauslesen().

von Karl H. (kbuchegg)


Lesenswert?

Sicher, dass der ResetAvailable hier
1
int RCauslesen()
2
{
3
    if (mySwitch.available()) {
4
    
5
    RCWert = mySwitch.getReceivedValue();
6
7
8
    mySwitch.resetAvailable();
9
  }
10
}
notwendig ist?

Ich geh mal davon aus, dass du von deinem Gerät nicht ständig über den 
Tastenstatus informiert wirst, sondern nur dann, wenn sich da was 
ändert.
Und tja, wenn man mutwillig aus dem Kommunikationskanal mit Bausch und 
Bogen einfach rauslöscht, dann sollte man sich nicht wundern, wenn dabei 
auch derartige Benachrichtigungen verloren gehen.
In a Nutshell: Es ist fast NIE eine gute Idee, derartige Eingangspuffer 
einfach komplett zu löschen.

Wenn da nicht das Problem besteht, dann spick halte mal die Funktion mit 
zusätzlichen Serial.println. Das ist ja schliesslich nicht verboten, 
dass du dir hier ein paar Debug-Ausgaben einbaust

von Frank B. (susefreax)


Lesenswert?

Ohje so viel auf einmal. Also um es vlt klarer zu machen folgendes.

Das Beispiel in der Bibliothek sieht so aus:
1
#include <RCSwitch.h>
2
3
RCSwitch mySwitch = RCSwitch();
4
5
void setup() {
6
  Serial.begin(9600);
7
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2
8
}
9
10
void loop() {
11
  if (mySwitch.available()) {
12
    
13
    int value = mySwitch.getReceivedValue();
14
    
15
    if (value == 0) {
16
      Serial.print("Unknown encoding");
17
    } else {
18
      Serial.print("Received ");
19
      Serial.print( mySwitch.getReceivedValue() );
20
      Serial.print(" / ");
21
      Serial.print( mySwitch.getReceivedBitlength() );
22
      Serial.print("bit ");
23
      Serial.print("Protocol: ");
24
      Serial.println( mySwitch.getReceivedProtocol() );
25
    }
26
27
    mySwitch.resetAvailable();
28
  }
29
}

Heißt vor der letzten } hat man immer eine "0" außer es wird eine Taste 
gedrückt. Ich habe für meinen kleinen Test einfach die prints raus 
genommen und eine Routine draus gemacht.
Und genau diese 0 wollte ich mir für die While-Schleife zu nutze machen. 
Aber das klappt nicht. Solange ich die Taste (nennen wir sie A+) nicht 
drücke, aber jede x-Beliebige zeigt er mir die taste an, dann wieder 0. 
Außer ich habe die A+ einmal gedrückt. Ab diesem Zeitpunkt ändert sich 
der Wert RCWert nicht mehr. Der bleibt dann bei dem Code der Taste A+

von Frank B. (susefreax)


Lesenswert?

Max H. schrieb:
> J. schrieb:
>> volatile
> Oder die globale Variable ganz weglassen und RCWert als Rückgabewert der
> Funktion RCauslesen().

Sorry das verstehe ich nicht. Wie meinst du das?

von Karl H. (kbuchegg)


Lesenswert?

Frank B. schrieb:
> Max H. schrieb:
>> J. schrieb:
>>> volatile
>> Oder die globale Variable ganz weglassen und RCWert als Rückgabewert der
>> Funktion RCauslesen().
>
> Sorry das verstehe ich nicht. Wie meinst du das?
1
int foo()
2
{
3
  return 5;
4
}
5
6
void bar()
7
{
8
  int j;
9
10
  j = foo();
11
}

so wie man halt mit dem Returnwert von Funktionen arbeitet.

Das wäre zwar eleganter, aber dein Problem hat damit erst mal nichts zu 
tun.

von Holger L. (max5v)


Lesenswert?

Schmeiß in der while - Schleife einfach mal das "analogWrite(LEDr, 
110);" heraus, die PWM-Funktion stört eventuell das auslesen deines 
Empfängers.

Die While - Schleife wird nicht verlassen weil RCWert sich nicht ändert, 
das sollte bedeuten das RCauslesen(); nicht mehr ausgeführt wird. Da in 
der while nur eine weitere Anweisung steht sollte es nahe liegen das es 
an ihr liegt.
Eventuell wird ein Timer für die PWM sowie das Empfangsmodul verwendet, 
Abhilfe könnte eventuell auch einfach ein anderer Pin für die Led 
schaffen, bei einem Arduino mit ATmega168/328 zum Beispiel Pin 5/6 oder 
Pin 9/10.

: Bearbeitet durch User
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.