Go Down

Topic: Zählung von Impulsen (Read 4131 times) previous topic - next topic

kawa-racer

#30
Feb 07, 2012, 08:03 pm Last Edit: Feb 07, 2012, 09:16 pm by kawa-racer Reason: 1
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?

uwefed

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

kawa-racer

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

uwefed


kawa-racer

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

uwefed

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?   :~ :~
http://arduino.cc/forum/index.php/topic,89368.msg674800.html#msg674800
Grüße Uwe

kawa-racer

#36
Feb 08, 2012, 12:13 am Last Edit: Feb 08, 2012, 12:15 am by kawa-racer Reason: 1
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 :(

uwefed

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

kawa-racer

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 ...

uwefed

#39
Feb 09, 2012, 08:32 pm Last Edit: Feb 09, 2012, 08:34 pm by uwefed Reason: 1
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

kawa-racer

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

kawa-racer

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 ...


kawa-racer

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

uwefed

#43
Feb 12, 2012, 11:39 pm Last Edit: Feb 12, 2012, 11:48 pm by uwefed Reason: 1
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

kawa-racer

#44
Feb 13, 2012, 12:15 am Last Edit: Feb 13, 2012, 12:38 am by kawa-racer Reason: 1
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 ^^...

Go Up