Pages: 1 2 [3] 4   Go Down
Author Topic: Zählung von Impulsen  (Read 3703 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

was für einen Rückgabewert hab ich bei der PulseIn Funktion ?

bzw. welche größe hat dieser?

Was passiert bei z.b. duration = pulseIn(pin, HIGH,1000); ?

Er speichert quasi auf "duration" die Länge des High Impulses  ... was ist aber wenn ich mehrere Highimpulse in diesen 1000mikrosekunden hab? werden diese zusammenaddiert?
« Last Edit: February 07, 2012, 03:16:07 pm by kawa-racer » Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 263
Posts: 21601
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Der Rückgabewert ist die Zeit das Impulses (vom L-H Wechsel bis zum H-L Wechsel) des ersten Impulses nach dem Funktionsaufrufs plus eine gewissen verzögerung.
Du kannst Auch die Pause zwischen 2 Impulsen messen:
duration = pulseIn(pin, LOW,1000);
Grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Also sollte ich in der Zeit 2 mehrer High-Signale haben, so wird dennoch nur der erste High-Pegel übernommen?
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 263
Posts: 21601
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

In welcher Zeit?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

in den 1000 mikrosekunden ... zum Beispiel ...
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 263
Posts: 21601
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das ist die Timeout-zeit. Die Zeit, die pulseIn() höchstens auf einen Impuls wartet.

Wieso stellst Du immer wieder die gleichen Fragen? Liest Du die Antworten nicht?   smiley-confuse smiley-confuse
http://arduino.cc/forum/index.php/topic,89368.msg674800.html#msg674800
Grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Doch doch ... jedoch habe ich das so verstanden, dass in dieser Zeit die Impulse gemessen werden.
Jetzt habs ich aber verstanden...

Er beginnt das Messen sobald der High Impuls da is und hört auf sobald er auf Low ist (je nach dem wie ichs halt einstelle)... und die Zeit von z.B. 1000 mikrosekunden sagt nur, dass er maximal eben so lang auf ein Signal wartet... Das gleiche kann ich dann auch machen für das Low-Signal... und wenn ich beide summiere erhalte ich somit meine Periodendauer von z.b. 500 Mikrosekunden. Diese werden dann als Zahl 500 in meine definierte Variable gespeichert...

Hoffe ich habs etz richtig verstanden.

Die Variable wird somit auch bei jedem Schleifendurchlauf überschrieben ...

ok ... ich versuch morgen einfach mal ein Programm fertig zu schreiben und Poste es mal ...


Sorry ... bin bissi neben der Kappe smiley-sad
« Last Edit: February 07, 2012, 06:15:11 pm by kawa-racer » Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 263
Posts: 21601
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja jetzt müßte es stimmen (soweit ich es um fast 1 Uhr in der Nacht beurteilen kann).
Schlafenszeit!!
Grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi hier mal ein kleiner Auszug zu dem ich ne Frage hab

sensorHIGH = pulseIn(pin1, HIGH,1000);
sensorLOW = pulseIn(pin1, LOW,1000);
  T = (sensorHIGH + sensorLOW);
 Hz = (1/T);
 
 
  if(Hz > 160){
    digitalWrite(pin,HIGH);


Was für eine Größe hat eigentlich T also die Periodendauer in der Variable?  Ist das jetzt dann 0,0005 oder steht da 500 mikrosekunden?
Weil egal ob ich Hz= (1/T) oder Hz= (1000000/T) mache ... die LED geht nicht an ...
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 263
Posts: 21601
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Laß die Umwandlung von Zeit (Periode T) zu Frequenz weg und kontrolliere gleich die Periodendauer. Das spart reichlich an Speicherplatz und Zeit.
Oder besser und einfacher: Benutze wie ich Dir vorgeschlagen hatte map. so bekommst Du gleich die anzahl der eingeschaltenen LED für die Balkenanzeige.

Grüße Uwe
« Last Edit: February 09, 2012, 02:34:50 pm by uwefed » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok Fehler hab ich gefunden ^^... hab für Hz ein unsigned char verwendet (bei einer Zahl die größer ist als 256)...

Mit der Frequenz hätte ich doch eigentlich aber nen größeren Bereich den ich abfragen könnte ... somit würden Schwankungen nichtso auffallen...

ich mach jetzt mal alles fertig und dann können wir mal gucken was verbesserungsfähig ist ;-)

Map hätte ich nämlich jetzt mit der Frquenz gmacht ... aber ich versuch gern beide Seiten
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

So, hier mal die Beta vom Programm....
Dieses wurde mit Hilfe eines netten Menschen übers Internet erstellt... dieser hat halt paar Feinheiten noch ergänzt...

int LED[10]={2,3,4,5,6,7,8,9,10,11};         
int signalPin = 12;                                   
int sensorHIGH, sensorLOW, wert, t, i;     

void setup()
{
   pinMode(signalPin, INPUT);

   for (i = 0; i < 10; i++)               
   {
      pinMode(LED, OUTPUT);
   }
}

void loop()
{
       sensorHIGH = pulseIn(signalPin, HIGH,1000);
       sensorLOW = pulseIn(signalPin, LOW,1000);

       t=(sensorHIGH + sensorLOW);

       t = constrain(t, 90, 215);   //90 ist die untere, 215 die obere Grenze. Diese beiden Werte muss ich noch etwas anpassen!

       wert= map(t, 94, 213, 0, 9); 

       for (i=0; i<=wert;i++)
       {
         digitalWrite(LED,HIGH);
       }
}



Jetzt ne Option die ich gern für dieses Projekt noch mit einbinden würde ... und zwar ist der Sensor selber jetzt ca. 25 cm lang und is in 10 Bereiche unterteilt. Jetzt würde ich gern einen Knopf nutzen der mir z.B. erlaubt einen längeren Sensor zu nehmen um z.b. ein größeres Gefäß und eben mithilfe des Knopfes einen neuen Referenzpunkt zu setzten... ist das überhaupt möglich ohne die Werte (Kapazität) zu kennen?

Momentan hab ich nämlich noch das Problem, dass die Periodendauer pro Bereich sehr klein ist... was ich damit meine... ich habe z.B. bis zum 3 Teilstrich ( 30%) Flüssigkeit eingefüllt ... jedoch zeigt mir die Anzeige schon 50 % an ...`wie könnte man das umgehen?
Wäre es vll. besser, für jeden Bereich die Periodendauer in den Scatch zu übernehmen und dann anhand dieser die LEDs zu steuern? Weil jetzt berechnet er sich anhand des Scatches ja die Bereiche mithilfe der MAP- Funktion ja selber ...

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@ Uwe ... was sagst du dazu :-)
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 263
Posts: 21601
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Auf die schnelle sage ich mal daß Du die LED nicht nur einschalten sondern auch ausschalten mußt ansonsten siehst Du nicht dass der Pegel abnimmt.

"pinMode(LED, OUTPUT);" fehlt der INDEX desw Arrays.
"digitalWrite(LED,HIGH);" fehlt wieder der Index des Arrays.

ansonsten müßte es richtig sein (soweit ich das umr 23h 36 abens sagen kann wobei ich müde bin und Venedig heute saukalt war.)

Grüße Uwe
« Last Edit: February 12, 2012, 05:48:11 pm by uwefed » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

int LED[10]={2,3,4,5,6,7,8,9,10,11};         
int signalPin = 12;                                   
int sensorHIGH, sensorLOW, wert, t, i;     

void setup()
{
   pinMode(signalPin, INPUT);

   for (i = 0; i < 10; i++)               
   {
      pinMode(LED, OUTPUT);
   }
}

void loop()
{
       sensorHIGH = pulseIn(signalPin, HIGH,1000);
       sensorLOW = pulseIn(signalPin, LOW,1000);

       t=(sensorHIGH + sensorLOW);

       t = constrain(t, 90, 215);   //90 ist die untere, 215 die obere Grenze. Diese beiden Werte muss ich noch etwas anpassen!

       wert= map(t, 94, 213, 0, 9); 

       for (i=0; i<=wert;i++)
       {
         digitalWrite(LED,HIGH);
       }

 for (j=9; j>wert; j--)
       {
         digitalWrite(LED[j],LOW);
       }

}


Index sollte jetzt richtig sein (lustigerweise is es im Programm richtig... hats sich aber net übernommen ... hmmm)....
Wegen dem Ausschalten muss ich nochmal gucken ... stimmt das hab ich total vergessen... muss nur schauen wie ich das jetzt genau anstelle ... ;-)


EDIT: Das Ausschalten der LEDs sollte jetzt funktionieren ...hoffe ich ^^...
« Last Edit: February 12, 2012, 06:38:51 pm by kawa-racer » Logged

Pages: 1 2 [3] 4   Go Up
Jump to: