Show Posts
Pages: 1 2 [3]
31  International / Deutsch / Re: Auswertung Impulse Volkswindmesser on: April 08, 2013, 12:03:12 pm
Was ich jetzt irgendwie noch nicht ganz verstanden habe ist:

In loop werte ich dann die Zeiten aus, welche ich in der Interrupt-Routine an mein Array m übergeben habe und berechne die Zeit zwischen der jetztigen und dem vorherigen Interrupt, oder?

Auf der einen Seite, dem Interrupt, speicher ich die jeweilige Zeit in der der Interrupt kam. Auf der anderen Seite, im loop werte ich die Zeiten aus. Wie kann ich es nun realisieren, dass ich mir quasi einen Mittelwert über alle Zeiten (Periodendauern) die innerhalb einer Sekunde aufgetreten sind, ausgeben lasse, durch den ich dann, pro Sekunde eine mittlere Frequenz habe?

Da komm ich gerad irgendwie nicht weiter.
32  International / Deutsch / Re: Auswertung Impulse Volkswindmesser on: April 07, 2013, 04:42:51 am
Die Sache mit der gemessenen und im Anschluss gemittelten Periodendauer pro Sekunde um hieraus die "gemittelte" Frequenz zu berechnen, schien mir irgendwie logisch. Daher habe ich versucht das ganze über den Weg der Periodendauermessung zu beschreiten.

Ich habe den Code jetzt in Richtung Interrupt angepasst. Jetzt bekomm ich aber gar keinen Wert mehr ausgegeben smiley-grin. Was habe ich hier falswch gemacht?

Code:
int AnemometerPin = 2;
int Messintervall = 1000;
int StartZeit = 0;
int EndZeit = 0;
int i = 0;
int j = 0;
int k = 0;
int Periodendauer;
int PinStatus;
int Anzahl;
int last;
float SummePulsdauer = 0;
float Mittelwert = 0;
float pulsearray[99];
unsigned long m;
unsigned long v;


void setup()
{
  Serial.begin(9600);
  pinMode(AnemometerPin, INPUT);
  attachInterrupt(0,UebergangHighLow, RISING);
}

void loop()
{
  for (k = 0; k < 100; k++)
  {
    pulsearray[k]=0;
  }
 
  StartZeit = EndZeit;
 
  i = 0;

  Mittelwert = 0;
 
  SummePulsdauer = 0;

  while (EndZeit-StartZeit < Messintervall)
  {
   
    pulsearray[i]=Periodendauer;
   
    i++;
   
    EndZeit = millis(); 
   
    Anzahl = i;
  }
  for (j=0; j<=Anzahl; j++){
 
  SummePulsdauer = SummePulsdauer + pulsearray[j];
  }
 
  Mittelwert = SummePulsdauer / Anzahl;
 
  Serial.print("Pulsdauer Mittelwert:  ");
  Serial.println(Mittelwert);
}

void UebergangHighLow()
{
  detachInterrupt(0);                         // Interrupt ausschalten damit er uns nicht
  m = millis();                               // Millisekundenzähler auslesen
  v = m - last;                               // Differenz zum letzten Durchlauf berechnen
  if (v > 10) {                               // ignorieren wenn <= 10ms (Kontaktpreller)
  Periodendauer = v;                          // Wert in Periodendauer übernehmen
  last = m;                                   // und wieder den letzten Wert merken
  }
  attachInterrupt(0, UebergangHighLow, RISING );
}

Ich messe hierbei die Zeit vom Übergang HIGH zu LOW bis dieser wieder auftaucht. Das müsste ja genau der Periodendauer entsprechen, oder? Dieser Wert der Periodendauer wird dann in das Array geschrieben, die Anzahl der Array-Elemente gezählt und im Anschluss der Mittelwert gebildet und ausgegeben. Trotzdem muss ich mich hier irgendwo verhaspelt haben, da ich momentan gar keine Ausgabe mehr bekomme.

Gruß Alex
33  International / Deutsch / Re: Auswertung Impulse Volkswindmesser on: April 06, 2013, 08:37:49 pm
Hi Leute,

ich habe mir einen ersten Code erarbeitet, bei dem momentan die Periodendauern (HIGH + LOW) in einem großen Array gespeichert werden. Nach dem Messintervall werden alle Werte des Arrays addiert, sowie im Anschluss durch die Periodenanzahl geteilt, sodass ich einen Mittelwert bekomme.
Der Code funktioniert noch nicht richtig, ist aber denk ich erstmal eine gute Grundlage.
Ich bin hierbei davon ausgegangen, dass wenn ein "HIGH-Signal" anliegt und ich dessen Länge messe, hiernach direkt ein LOW-Signal folgen muss, welches die erste Messung beendet und die Messung der Länge des LOW-Signals startet, und umgekehrt.

Was sagt ihr dazu? Wo sollte ich noch Veränderungen am Code vornehmen und wie kann man ihn noch besser machen, sodass er auch bei langsamen Windgeschwindigkeiten richtig funktioniert?

Bin ich vielleicht mit dem Code auch auf dem totalen Holzweg? Lasst euch aus darüber smiley!

Code:
int AnemometerPin = 2;
int Messintervall = 1000;
int StartZeit = 0;
int EndZeit = 0;
int i = 0;
int j = 0;
int k = 0;
int HIGHZeit = 0;
int LOWZeit = 0;
int Periodendauer;
int PinStatus;
int Anzahl;
float SummePulsdauer = 0;
float Mittelwert = 0;
float pulsearray[99];


void setup()
{
  Serial.begin(9600);
  pinMode(AnemometerPin, INPUT);
 
}

void loop()
{
  for (k = 0; k < 100; k++)
  {
    pulsearray[k]=0;
  }
 
  StartZeit = EndZeit;
 
  i = 0;

  Mittelwert = 0;
 
  SummePulsdauer = 0;

  while (EndZeit-StartZeit < Messintervall)
  {
   
    PinStatus = digitalRead(AnemometerPin);
   
    if (PinStatus == HIGH)
    {
      HIGHZeit = pulseIn(AnemometerPin, HIGH);
      LOWZeit = pulseIn(AnemometerPin, LOW);
    }
    else if (PinStatus == LOW)
    {
      LOWZeit = pulseIn(AnemometerPin, LOW);
      HIGHZeit = pulseIn(AnemometerPin, HIGH);
    }
    Periodendauer = HIGHZeit + LOWZeit;
   
    pulsearray[i]=Periodendauer;
   
    i++;
   
    EndZeit = millis(); 
   
    Anzahl = i;
  }
  for (j=0; j<=Anzahl; j++){
 
  SummePulsdauer = SummePulsdauer + pulsearray[j];
  }
 
  Mittelwert = SummePulsdauer / Anzahl;
 
  Serial.print("Pulsdauer Mittelwert:  ");
  Serial.println(Mittelwert);
}

Vielen Dank schonmal für eure vielen tollen Antworten zu diesem Thema, die bisher kamen und hoffentlich noch weiter kommen smiley!
34  International / Deutsch / Re: Auswertung Impulse Volkswindmesser on: April 05, 2013, 10:02:34 am
Danke schonmal für die tolle ausführliche Antwort! Damit komm ich schonmal ein ganzes Stück weiter smiley!

Fragen treten ja leider immer erst auf, wenn man sich dran setzt und alles in die Tat umsetzen will.

Meine letzte Frage die mir momentan noch aufkommt ist, ich hab ja die beiden Funktionen, einmal das Messen der Pulsdauer und einmal die Errechnung der Windgeschwindigkeit. Wenn sich jetzt die Pulsdauer innerhalb der Sekunde ändert, muss ich das doch in der Windgeschwindigkeit wiederspiegeln, oder?

Dort hängt es momentan gedanklich noch bei mir, also wenn ich aus der Pulsdauer die Windgeschwindigkeit berechne, dann müsste ich ja quasi für alle Windgeschwindigkeiten die ich im Messintervall umgerechnet habe, einen Mittelwert bilden und diesen dann nach der Sekunde ausgeben, oder?

So würde das gerad für mich Sinn ergeben smiley.

Vielen vielen Dank schonmal für die tollen Antworten!!
35  International / Deutsch / Re: Auswertung Impulse Volkswindmesser on: April 05, 2013, 08:29:40 am
Hey Leute,

ich merke gerade, dass ich bei folgendem Problem nicht weiter komm:

Ich möchte gern die WIndgeschwindigkeit (welche in meinem Fall abhängig von der Frequenz ist, s.o.) messen. Somit muss ich die Frequenz im mit dem Arduino ermitteln. Hierzu habe ich jetzt versucht die Dauer zwischen 2 Impulsen zu messen. Dies ist mir mit der Funktion PulseIn() auch gelungen, indem ich hiermit die Zeit gemessen habe, in der kein Signal am Pin anliegt (LOW).

Jetzt meine Frage: Ich will die Windgeschwindigkeit im Messintervall von einer Sekunde messen. Wie lässt sich das mit dem Arduino und der Frequenzmessung in Einklang bringen?

Vielen Dank für eure Antworten!
36  International / Deutsch / Re: Auswertung Impulse Volkswindmesser on: April 05, 2013, 06:49:40 am
Ich möchte, wenn genug Wind an der Stelle weht, wo das Anemometer jetzt hinkommt, ein vertikales Windrad zur Stromerzeugung aufstellen. Daher brauche ich die Erfassung jeder kleinen Windböe um quasi ein "Referenzjahr" an Winddaten aufzuzeichnen.

Mein Problem ist jetzt noch, wenn ich die Zeit zwischen zwei Impulsen messe und damit die Frequenz heraus bekomm und diese dann einordne in die Tabelle (s.o.), wie komm ich dann auf mein Messintervall?

Gruß Alex
37  International / Deutsch / Re: Auswertung Impulse Volkswindmesser on: April 04, 2013, 07:17:11 pm
In die Richtung wollte ich auch schon gehen, bin dann aber irgendwie nicht weiter gekommen.
Wenn ich die Zeit zwischen zwei Impulsen messe, inwiefern werte ich dann die Windgeschwindigkeit im Messintervall von einer Sekunde aus?

Irgendwie steh ich da auf dem Schlauch.
38  International / Deutsch / Re: Auswertung Impulse Volkswindmesser on: April 04, 2013, 06:16:37 pm
Stimmt, da lag mein Denkfehler.
Das bedeutet also, das ich folgende Frequenzen für die einzelnen Windgeschwindigkeiten zur Verfügung habe:
m/s   Hz (6 Imp.)   Hz (1 Imp.)
1   2,1            0,35
2   4,6            0,77
3   7,0         1,17
4   10,0     1,67
5   12,5     2,08
6   15,0     2,50
7   18,2     3,03
8   20,9     3,48
9   24,3     4,05
10   27,2     4,53
11   30,5     5,08
12   34,0     5,67
13   36,7     6,12
14   39,7     6,62
15   43,2     7,20
16   46,2     7,70
17   49,6     8,27
18   52,5     8,75
19   56,4     9,40
20   59,6     9,93

Jetzt steht für mich noch die Frage im Raum, wie genau die Messung wird. Ich denk dort immernoch an den Fahrradcomputer der auch auf einem Reed-Kontakt beruht und konstant die aktuelle Geschwindigkeit anzeigt. Dies müsste doch hier auch möglich sein, um dabei die "durchschnittliche" Windgeschwindigkeit in einer Sekunde zu messen, oder?

Wie könnte man das hierbei mit dem Arduino Uno realisieren?
39  International / Deutsch / Auswertung Impulse Volkswindmesser on: April 04, 2013, 05:26:16 pm
Hi Leute,

ich habe mir den Volkswindmesser (Link:http://www.schubert-gehaeuse.de/anemometer.htm) zugelegt und möchte diesen gern über ein Arduino Uno + Ethernet Shield auswerten und die gewonnen Daten auf einer SD-Karte speichern.
Das Messintervall soll hierbei eine Sekunde betragen.
Das Anemometer erzeugt hierbei pro Umdrehung eine Schaltung mittels Reed-Kontakt.

Hierbei betragen die Datenpaare der Kennlinie:
m / s..........Hz
1                 2,1
2                 4,6
3                 7,0
4                10,0
5                12,5
6                15,0
7                18,2
8                20,9
9                24,3
10              27,2...usw.. Hier ist der Link dazu: http://www.schubert-gehaeuse.de/Anemometerbilder/VWM-Kennlinie1U_6Imp.jpg

Meine Frage ist jetzt hierbei, wie würdet ihr das ganze auswerten?

Meine Überlegungen hierzu waren:
1. Die Anzahl der Impulse pro Sekunde zählen und dann Anhand der Kennlinie auswerten. Dies würde bspw. bei 2 Impulsen bedeuten, dass 1 m/s Wind weht. Nach einer Vergleichsmessung heute mit einem Handwindmesser musste ich leider feststellen, dass das so nicht funktioniert. Bei 20 km/h (5,55 m/s) bekam ich genau 2 Impulse.

2. Wie bei einem Fahrradtacho. Ich habe den Umfang des Anemometers berechnet (meine Fahrradfelge). Nun messe ich die Zeit zwischen Impulsen und berechne Wegstrecke pro Zeit, was die Geschwindigkeit ergibt. Hier geht mir dann aber das Messintervall von einer Sekunde flöten, oder?

Wie würdet ihr das Problem lösen?

Vielen Dank schonmal für eure Antworten!

P.S. Vllt. hat von euch jemand ja auch den Volkswindmesser und kann mir mit seinen praktischen Erfahrungen weiterhelfen smiley.
40  International / Deutsch / Re: Wind Datenlogger zählt 2 mal bei einem Impuls on: March 25, 2013, 07:05:33 am
Genau, mir ist aufgefallen, dass wenn ich das Anemometer sehr sehr seeeehr langsam drehe, die LED mehrmals schaltet. Dies liegt dann wohl daran, dass der Reed-Kontakt bei sehr geringem Wind mehrmals schaltet. Da dies aber nur bei sehr sehr geringer Windgeschwindigkeit stattfindet und ich die Umdrehungen bzw. Impulse pro Sekunde messe, sind die Messabweichungen für meine Zwecke hier noch im Rahmen.

Meine Messgenauigkeit ist durch den einen verbauten Magneten sowie recht beschränkt. Eine Umdrehung pro Sekunde entspricht ca. 0,48 m/s, 2 Umdrehungen / s sind 0,95 m/s, usw...

Vielen Dank nochmal für die tollen, ausführlichen Antworten! Diese haben mir sehr geholfen!!!
41  International / Deutsch / Re: Wind Datenlogger zählt 2 mal bei einem Impuls on: March 24, 2013, 02:40:04 pm
Genau, es ist eine Konstruktion mit einem Reed-Kontakt.
Ich habe das ganze mit dem Beispiel-Sketch "Button" getestet, wobei die LED nur einmal pro Umdrehung, genau am Reed-Kontakt aufleuchtet.
Kann es sein, dass ich das Signal noch entprellen muss bzw. wie kann ich es hinbekommen, dass der Impulszähler nur um eins pro Umdrehung erhöht wird?
42  International / Deutsch / Wind Datenlogger zählt 2 mal bei einem Impuls on: March 24, 2013, 02:09:02 pm
Hi Leute,

ich habe meinen Code für einen Wind-Datenlogger insoweit geschrieben, dass vorerst die Anzahl der Impulse auf dem Serial Monitor angezeigt werden sollen, welche innerhalb einer Sekunde gezählt werden.
Leider zählt er nicht nur einmal bei einem Impuls, sondern 2 mal. Vielleicht habt ihr ja eine Idee, welche Änderung ich an meinem Code vornehmen müsse. Für eure Hilfe wäre ich euch sehr dankbar!
Code:
// konstante Variablen
const int AnemometerPin = 2; // Pin an dem das Anemometer am Arduino angeschlossen ist
const int ledPin =  13;      // Ausgabepin der LED
const int Messintervall = 1000; //das Messintervall beträgt eine Sekunde
// veränderliche Variablen
unsigned long StartRoutine;
unsigned long EndeRoutine = 0;
int Impulszaehler = 0;
int Impulsstatus = 0;
int ImpulsstatusAlt = 0;

void setup() {
  //serielle Kommunikation zwischen Arduino und PC herstellen
  Serial.begin(9600);
  //Information das die Messroutine startet
  Serial.println("Starte Messroutine Windgeschwindigkeit...");
  // der AnemometerPin an Pin 2 ist ein Input
  pinMode(AnemometerPin, INPUT);     
}

void loop()
{
  //Variable "StartRoutine" bekommt die Zeit, in der die Routine gestartet wurde
  StartRoutine=millis();
  //die Endzeit der Routine wird zu Beginn mit der Startzeit gleichgesetzt
  EndeRoutine=StartRoutine;
  //der Impulszaehler wird auf 0 gesetzt
  Impulszaehler=0;
  //der Impulsstatus ist LOW
  ImpulsstatusAlt=LOW;
  //solang die Routine das vorgegebene Messintervall nicht überschritten hat
  while(EndeRoutine-StartRoutine<=Messintervall) {
 // auslesen des Wertes des AnemometerPins
  Impulsstatus = digitalRead(AnemometerPin);
  // wenn sich der Status des AnemometerPins verändert hat
  if (Impulsstatus == HIGH && Impulsstatus != ImpulsstatusAlt){

    Impulszaehler++;
  }

    ImpulsstatusAlt=Impulsstatus;

    EndeRoutine=millis();
  }
  Serial.print("gezählte Impulse: ");
  Serial.println(Impulszaehler);
}
Pages: 1 2 [3]