Go Down

Topic: PWM-Signal auswerten (Read 9 times) previous topic - next topic

Bluetruck

#60
Jul 23, 2013, 09:31 pm Last Edit: Jul 23, 2013, 10:03 pm by uwefed Reason: 1
1) Wieso kein delay: über pulseIn() kommt kontinuierlich aller 2ms ein neuer Wert. Wenn ich jetzt immer 10ms Pause mache, wird doch einfach nur jeder 5. Wert abgefragt. Damit wird aber nicht ausgeschlossen, dass er falsch (Tasterprellen) ist. Ich muss ergänzen, dass die 10% maximale Abwichung zu viel wäre, 1-2% reichen.

2) Kannst du mir das mit dem return nochmal erklären? Ich versteh das nicht ganz. Also return als einzelne Funktion versteh ich schon, aber den Unterschied zwischen return false und return true. bzw. return 1 und return 0 nicht.

3)Bei dem Link, den TWERI gepostet hast, versteh ich nur Bahnhof...;) Das ist (hoffentlich nur vorerst) zu hoch für mich. Es gibt schon einen Multiswitch für 20€ zu kaufen, der nach dem selben Prinzip arbeitet (wetteringer-modellbauforum, hab keinen konkreten Link mehr). dummerweise hab ich den erst entdeckt, als ich mir den Arduino schon gekauft habe...Jetzt hat der Bastlerwille gesiegt, sowas selber zu machen ;)


Hier nochmal mein Sketch, bei dem halt besagtes Problem aufgetreten ist....Dem möchte ich nun die "Funktion" fürs Tastenentprellen davorsetzen.
Code: [Select]
void setup ()
{
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (3, INPUT);
}

void loop (){
  int a = pulseIn(3,HIGH,24000);//Ließt Eingangssignal
  boolean vLED1 = false;//Hilfsvariable wird zusammen mit der LED auf "true" gesetzt, wenn if-Bedingung erfüllt wurde. Am Ende des loop-teils werden, wenn das Einganssignal in der "Mittelstellung" ist, alle Hilfsvariablen wieder auf "false" gesetzt. Somit kann die LED wieder umgeschaltet werden.
  boolean vLED2 = false;//
  int iLED1 = digitalRead(5);//Ließt Status von LED1
  int iLED2 = digitalRead(6);

  //if-Bedinung für LED1
  if (a>1220 && a<1245 && iLED1==LOW && vLED1 == false){//Wenn Eingangssignal zwischen 1228 und 1242, Ausgang an LED1 aus und der Status des Ausgangs in diesem loop-durchgang noch nicht verändert wurde, dann
    digitalWrite (5,HIGH);//schalte Ausgang an
    vLED1 = true;//Setze Hilfsvariable auf true. Nächste if-bedinung stimmt somit nicht mehr (bis Eingangssingal in "Mittelstellung" und die LED bleibt an.
  }
  if (a>1220 && a<1245 && iLED1==HIGH &&  vLED1 == false){//Gleich wie oben, bloß umgekehrt zum ausschalten der LED
   digitalWrite (5,LOW);
   vLED1 = true;
  }
    //if-Bedinung für LED2
  if (a>910 && a<940 && iLED2==LOW && vLED2 == false){
    digitalWrite (6,HIGH);
    vLED2 = true;
  }
  if (a>910 && a<940 && iLED2==HIGH &&  vLED2 == false){
   digitalWrite (6,LOW);
   vLED2 = true;
  }
      //if-Bedinung zum Zurücksetzen der Hilfsvariablen bei Mittelstellung des Eingangssignals
  if (a>1485 && a<1510){
    vLED1 = false;
    vLED2 = false;
  }                     
}

Serenifly


2) Kannst du mir das mit dem return nochmal erklären? Ich versteh das nicht ganz. Also return als einzelne Funktion versteh ich schon, aber den Unterschied zwischen return false und return true. bzw. return 1 und return 0 nicht.

Funktionen habe Rückgabe-Werte die in C alle elementaren Datentypen oder Pointer sein können:

void func() <--- kein Rückgabe Wert (siehe setup() oder loop())
int func() <--- gibt einen Integer zurück
byte func() <--- gibt ein Byte zurück
bool func() <---- gibt einen Bool/Boolean zurück

Das ist eine ganz grundlegende Sache, die dir mal ansehen solltest: z.B. wenn man zwei Zahlen addieren will:
Code: [Select]

int summe(int x, int y)
{
    return x + y;
}

int summe = summe(2, 3);


Wenn du eine Funktion aufrufst kannst du dann deren Rückgabe-Wert speichern. z.B.

int ret = func();

Dann schreibt er dir den Rückgabe-Wert der Funktion in ret. Aber man kann der Wert auch direkt in einer if-Abfrage o.ä. verarbeiten:

Code: [Select]
if(func() == 1)
{
}


Das ist das gleiche wie:
Code: [Select]

int ret = func();

if(ret == 1)
{
}



Wenn du dann so eine verschachtelte Funktion wie bei dir hast und du vorzeitig abbrechen willst, kann man über den Rückgabe-Wert feststellen wo der Abbruch war. Eben indem man einfach für jeden Zweig ein anderen Wert zurück gibt. Bool kann "true" oder "false" sein, also zwei Zustände. Wenn mehr gebraucht werden kann man byte oder int nehmen.


Überlege aber mal ob die nicht eventuell mit einer while-Schleife besser bedient bist. Also solange die Pulse-Länge messen, bis eine bestimmte Bedingung eintritt:

Code: [Select]

wert = messung();

while(wert != gewünschter Wert)
{
     wert = messung();
}


Ich glaube das geht eher in die Richtung die du willst

Go Up