Auswertung Impulse Volkswindmesser

BigBangTheory:
Kann es sein das dies daran liegt, weil der Y-Draht nicht abgeschirmt ist?

Oder hat jemand noch eine bessere Idee dazu?

Ja, nicht abgeschirmte Kabel, oder welche an denen die Abschirmung nicht geerdet ist, wirken als Antenne und nehmen Funkwellen auf, auch die bei einem Gewitter entstehenden. Da kommt es darauf an, wie stark Deine PullUp- oder PullDown-Widerstände sind, inwieweit die entgegenwirken.

Ich bin jetzt in diesem vierseitigen Thread nicht drin, was verwendest Du denn zur Auswertung des Reed-Signals am Pin:

  • den internen PullUp-Widerstand?
  • einen externen PullUp- oder PullDown-Widerstand? Welchen Wert hat der Widerstand?

Im Zweifelsfall mal einen niedrigeren Wert probieren, also z.B. 1K statt 10K Pulldown-Widerstand.

Das mit den Funkwellen dacht ich mir schon fast. Wenn früher bei nem alten Radio die Antenne ab war, haben wir auch nen Stück blanken Kupferdraht genommen und den zu ner Antenne gebogen :).

Ich hab da momentan nen 12K Widerstand dran.

Wieso würde denn ein kleinerer Widerstand hier helfen?

Es könnte aber auch ein Überlauf sein, weil das WindRad zu schnell dreht.
Ich habe jetzt nicht den Code im Kopf oder unter der Hand um ihn analysieren zu können.

Grüße Uwe

BigBangTheory:
Ich hab da momentan nen 12K Widerstand dran.

Wieso würde denn ein kleinerer Widerstand hier helfen?

Wenn durch den PullDown-Widerstand höhere Ströme fließen müssen, um zu einer Spannungsänderung am Arduino-Pin zu führen, dann ist für Störungen eine höhere eingekoppelte Energie notwendig, damit der Arduino-Pin auf HIGH gezogen wird.

Ein kleinerer PullDown-Widerstand wirkt also eingekoppelten Störungen auf der Zuleitung entgegen. Je länger eine Zuleitung ist, desto mehr Störungen fängt sie auf. Und daher verwendest Du bei einer längeren Zuleitung besser 1K Pulldown-Widerstände als 12K.

Wie Uwe schreibt, kann aber auch die Software-Auswertung fehlerhaft sein.
Welchen Sketch verwendest Du denn jetzt dafür?

Hey Leute,

momentan verwende ich folgenden Sketch:

#include <SPI.h>
#include <SD.h>

const int chipSelect = 4; // Chip Select, Signal SS (Slave Select)
unsigned long kimpuls = 0;
unsigned long limpuls = 0;
unsigned long periode = 0;
unsigned long Zeitscheibe = 0;
unsigned long i = 0;
unsigned long j = 0;
unsigned long abstand = 0;
int Sekunden = 00;
int Minuten = 54;
int Stunden = 16;
float wind = 0;
float frequenz = 0;

void setup() {
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
  //-------------------------------------------------SD-Card - Anfang
  Serial.print("Initialisierung SD-Card...");
  pinMode(10, OUTPUT); // SPI Chip Select als Ausgang setzen, auch wenn nicht genutzt
  if (!SD.begin(chipSelect)) { // Prüfen, ob SD-Card bereit für Initialisierung
    Serial.println("SD-Card nicht bereit oder fehlend");
    return; // nichts weiter zu tun
  }
  Serial.println("SD-Card initialisiert");
//-------------------------------------------------SD-Card - Ende
//  Serial.println("hh:mm:ss;   Windgeschwindigkeit");
  
  
  attachInterrupt(0,Interrupt,RISING);
}

void Interrupt()
{
  noInterrupts();  
  i = micros();
  interrupts();
}

void loop() 
{
  abstand = i-j;
  j=i;
  if (abstand >= 1000)
  {
   limpuls=abstand;
  }
  else
  {
   kimpuls=abstand;
  }
  periode = kimpuls + limpuls;
  frequenz = 1000000.0 / periode;
  wind = 2.58 * (pow(frequenz,0.8927));
  
  if (millis() > Zeitscheibe )    
  { 
    detachInterrupt(0); 
    Zeitscheibe  = millis()+1000;
    Sekunden++;
//-------------------------------------------------Zeit Berechnung - Anfang  
  if (Sekunden==60){
   Minuten++;
   Sekunden=0;
  }
  if (Minuten==60){
    Stunden++;
    Minuten=0;
  }
  if (Stunden==24){
    Stunden = 0;
  }
//-------------------------------------------------Zeit Berechnung - Ende    
    if (micros()-i > 4311965 )
    {
     wind = 0; 
    }
    if (periode == 0){
      wind = 0;
    }
    
//-------------------------------------------------Speicherung auf SD-Karte - Anfang    
 File dataFile = SD.open("wind.csv", FILE_WRITE);
  if (dataFile) {
    dataFile.print(Stunden);
    dataFile.print(" ; ");
    dataFile.print(Minuten);
    dataFile.print(" ; ");
    dataFile.print(Sekunden);
    dataFile.print(" ;   ");
    dataFile.print(wind);
    dataFile.print(" ; m/s;   ");
    dataFile.print(i);
    dataFile.println(" ;   Zeitpunkt des Interrupts in Mikrosekunden");
    dataFile.close();
    }  
  // kann die Datei auf der SD-Karte nicht geöffnet werden, wird folgende Fehlermeldung angezeigt
  else {
    Serial.println("error opening wind.csv");
  }
//-------------------------------------------------Speicherung auf SD-Karte - Ende
// Ausgabe der Werte auch auf dem Serialmonitor:

    Serial.print(Stunden);
    Serial.print(" ; ");
    Serial.print(Minuten);
    Serial.print(" ; ");
    Serial.print(Sekunden);
    Serial.print(" ;   ");
    Serial.print(wind);
    Serial.println(" ; m/s;   ");
//    Serial.print(i);
//  Serial.println(" ;   Zeitpunkt des Interrupts in Mikrosekunden");

    attachInterrupt(0,Interrupt,RISING);
  }
}

Ich habe, auch wenn das Windrad stand, beim Gewitter, aber auch wenn ich ein Netzteil an den Arduino angeschlossen habe, sehr große Werte bekommen. Ich tippe da dann doch eher auf die Störsignal-Variante.

Ich würde auch gern zur festen Installation des Windmessers ein Koaxialkabel verwenden, welches ja abgeschirmt sein müsste, oder?

Mir stellt sich da nun jedoch die Frage, wie ich es an den Arduino anschließen kann. Der Innenleiter ist ja easy, aber wie mach ich es mit dem Außenleiter? Ich Stück vom Kabel zurückschneiden und den Außenleiter verdrillen zum anschließen?

Werd das ganze mal mit nem kleineren Widerstand ausprobieren :).

Habe den Code nur kurz angesehen.

Du hast in der main Loop dies:

 attachInterrupt(0,Interrupt,RISING);

Im Setup auch, so soll es auch sein, aber warum auch in der main Loop ?

BigBangTheory:
momentan verwende ich folgenden Sketch:

unsigned long i = 0;

void Interrupt()
{
noInterrupts();
i = micros();
interrupts();
}

Also erstmal zum Sketch: Der weist einige extrem merkwürdige Fehler auf.
Das ständige attachInterrupt in der loop hat rudirabbit bereits angesprochen.

Weiterhin können Interrupts gar nicht von anderen Interrupts unterprochen werden, daher ist das Sperren und Freigeben von Interrupts in der Interrupt-Behandlungsroutine völlig überflüssig. Es reicht daher vollkommen:
void Interrupt()
{
i = micros();
}

ABER: Variablen, auf die sowohl von normalem Code aus als auch von Interrupt-Code aus zugegriffen wird, müssen zwingend mit dem Attribut "volatile" deklariert werden, also:

volatile unsigned long i = 0;

Ich schau mir das nochmal näher an, was der Code machen soll und poste ggf. mal Alternativ-Code.

BigBangTheory:
Ich habe, auch wenn das Windrad stand, beim Gewitter, aber auch wenn ich ein Netzteil an den Arduino angeschlossen habe, sehr große Werte bekommen. Ich tippe da dann doch eher auf die Störsignal-Variante.

Ja, die Beschreibung klingt schwer nach Störungen.
Der PullDown-Widerstand ist wirklich korrekt angeschlossen?
Das Netzteil ist wohl ein sogenanntes "Schaltnetzteil"?
Hat das irgendwelche Prüfzeichen drauf, TÜV, GS, VDE, oder ist das Chinaware ohne alles?

BigBangTheory:
Werd das ganze mal mit nem kleineren Widerstand ausprobieren :).

Genau, erstmal den kräftigeren PullDown-Widerstand mit dem kleineren Ohm-Wert testen, 1K statt 12K an der langen Reed-Sensorzuleitung.

BigBangTheory:
Ich würde auch gern zur festen Installation des Windmessers ein Koaxialkabel verwenden, welches ja abgeschirmt sein müsste, oder?

Koaxkabel haben heute oft sogar eine zweifache Abschirmung und kosten ganz gut Geld.
Aber selbst einfaches Telefon-Verlegekabel ist mit so einer Art hauchfeiner Alufolie abgeschirmt. Kann man aber nicht Löten, die Folien-Abschirmung muss wohl per Schraubanschluss angeschlossen werden.

BigBangTheory:
Mir stellt sich da nun jedoch die Frage, wie ich es an den Arduino anschließen kann. Der Innenleiter ist ja easy, aber wie mach ich es mit dem Außenleiter? Ich Stück vom Kabel zurückschneiden und den Außenleiter verdrillen zum anschließen?

Die Abschirmung müßte irgendwo an eine Erdung angeschlossen werden, mindestens an einem Ende.
Normalerweise würde der Windmesser wohl auf einem geerdeten oder mit Blitzableiter geschützten Mast montiert werden. Dann würde die Abschirmung auf der Sensorseite an die Erdung des Mastes angeschlossen werden. Und auf der Arduino-Seite an den Schutzleiter des Stromnetzes. Oder ein Wasser- oder Heizungsrohr (falls die Heizungsanlage Metallrohre hat) im Haus.

Also erstmal zum Sketch: Der weist einige extrem merkwürdige Fehler auf.
Das ständige attachInterrupt in der loop hat rudirabbit bereits angesprochen.

Das "attachInterrupt(0,Interrupt,RISING);" habe ich im loop, weil ich ein Stück davor im loop ein "detachInterrupt(0);" eingebaut habe, damit meine Ausgabe, welche jede Sekunde einmal statt findet, nicht von einem Interrupt zerschossen wird.

Die Interrupt-Routine und die Variablenbezeichnung "volatile unsigned long i = 0;" habe ich abgeändert :).

Ja, die Beschreibung klingt schwer nach Störungen.
Der PullDown-Widerstand ist wirklich korrekt angeschlossen?
Das Netzteil ist wohl ein sogenanntes "Schaltnetzteil"?
Hat das irgendwelche Prüfzeichen drauf, TÜV, GS, VDE, oder ist das Chinaware ohne alles?

Das Netzteil das ich verwende ist ein Festspannungs-Schaltnetzteil von Conrad Elektronik. Hier der Link dazu:

http://www.conrad.de/ce/de/product/514209/VOLTCRAFT-FPPS-9-6W-Steckernetzteil-Steckernetzgeraet-Festspannungs-Schaltnetzteil-9V-660mA-6-Watt

Koaxkabel haben heute oft sogar eine zweifache Abschirmung und kosten ganz gut Geld.
Aber selbst einfaches Telefon-Verlegekabel ist mit so einer Art hauchfeiner Alufolie abgeschirmt. Kann man aber nicht Löten, die Folien-Abschirmung muss wohl per Schraubanschluss angeschlossen werden.

Mal ne doofe Frage, aber...ich will Kabelkanäle verwenden, durch die ich mein Y-Kabel ziehe. Was ist, wenn ich um das Y-Kabel Alufolie Wickel (1-2 Lagen, Klebestreifen dran und fertig. Das wär doch dann auch ne Abschirmung und vor allem günstiger als nen Koax-Kabel, oder?

Das mit dem Widerstand wird morgen ausprobiert :).

Gruß

F-Stecker <-> BNC/F Adapter <-> BNC Buchse wäre ne Möglichkeit für Koaxkabel. Letztere gibt es zum Löten und mit Klemmen

Das hört sich gut an. Also könnte ich dafür bspw. folgendes Koaxialkabel verwenden?

http://www.conrad.de/ce/de/product/285137/Twin-SAT-Koaxialkabel-75-dB-Weiss

Gruß :slight_smile:

Ja, und ich habe gerade gesehen, dass es auch F-Buchsen zum Löten gibt:
http://www.conrad.de/ce/de/product/290024/F-Stecker-Einbaubuchse-Einbau-Tiefe-bis-12-mm
http://www.conrad.de/ce/de/product/739774/F-Einlochbuchse-Loeten-75-

Also kannst du dir den Ausflug über BNC sparen.

BigBangTheory:
Das hört sich gut an. Also könnte ich dafür bspw. folgendes Koaxialkabel verwenden?

Möchtest Du wirklich zwei Koax-Kabel zum Sensor hinlegen?
Oder warum Koax?

Koax hat nur einen einpoligen Draht und eine Abschirmung.

Du benötigst aber:

  • eine Ader hin zum Sensor
  • eine Ader zurück vom Sensor
  • Abschirmung

Das macht man normalerweise immer mit einem mehrpoligen Kabel mit Abschirmung, und nicht mit zwei nebeneinander verlegten einpoligen Kabeln.

Super :).

Dann steht einem abgeschirmten Signal ja nichts mehr im Weg :slight_smile:

Das Twin Sat Kabel beinhaltet ja quasi 2 abgeschirmte Koax-Kabel, oder lieg ich da gerade falsch?

Also sollten es ja 2 Adern sein, oder?

BigBangTheory:
Das Twin Sat Kabel beinhaltet ja quasi 2 abgeschirmte Koax-Kabel, oder lieg ich da gerade falsch?

Also sollten es ja 2 Adern sein, oder?

Stimmt, Du hast Recht. Ich habe nur das Bild gesehen und zwei nebeneinander liegende Leiter gesehen.
Tatsächlich ist das ein Doppelleiter, also zwei Koaxkabel nebeneinander.

Mir fällt da ein Ethernet Kabel ein, ist geschirmt hat genug Adern und teuer ist es auch nicht.

Hi Leute,

seitdem mein Windmesser nun seit Mitte Juli seine Dienste verrichtet und fleißig Daten sammelt ist mir bei einer ersten Auswertung (an einem Windstillen Tag) aufgefallen, dass auch wenn kein Wind weht, hin und wieder ein extrem hoher Wert angezeigt wird (bspw...über Sekunden 0 m/s und dann auf einmal 34,..m/s), was rein logisch nicht sein kann.

Kann dieses Phänomen daran liegen, dass die Entfernung zwischen Arduino und Windmesser relativ lang ist? Zur Info, zwischen Arduino und Windmesser sind 60m Kabel...d.h. 60m hin und 60m zurück, also 120m.

Wenn dies so ist, würde ich gern im nächsten Jahr den Windmesser an einem anderen Ort aufstellen (mit womöglich auch besseren Windbedingungen) und wollte gern wissen, wie viele 9V-Blockbatterien müsste ich in Reihe schalten, um den Arduino mit seiner Windmess-und Speichertätigkeit 1 Jahr lang zu betreiben?

Vielen Dank schonmal für Eure Antworten!!!

Gruß

Arduino an Batterie kannst du vergessen. Alleine die Zusatzbeschaltung (Spannungsregler, LEDs und USB-Konverter) braucht ca. 35mA. Da ist die Batterie gleich leer.

Für sowas muss man einen nackten Atmega nehmen. Den kann man dann schlafen legen und ab und zu mal aufwecken um zu messen.

Der Arduino braucht je nach Beschaltung zwischen 20 und 50mA. Ein 9V Block hat ca. 500mA -> 10Stunden.
1 Jahr sind 8760 Stunden, also brauchst du ca. 876 9V Blocks. :~ 8)

BigBangTheory:
... dass auch wenn kein Wind weht, hin und wieder ein extrem hoher Wert angezeigt wird ...

Du wirst, auch mit bester Schirmung, nicht verhindern können, dass hin und wieder Störer durchkommen.
Da hilft nur "Entprellen" über Software: Wenn plötzlich eine stark abweichende Drehzahl erkannt wird, erst prüfen, ob nach einer gewissen Zeit (1sek?) die immer noch anliegt, dann erst auf "gültig" schalten.

Apropos geschirmtes Kabel: Wenn ich mich richtig erinnere, hat das Ding einen Reed-kontakt.
Hast du ein Kabel auf GND und ein Kabel auf einen Pin mit Pullup? Dann reicht dir ein normales einadrig geschirmtes Kabel.
Schirm = GND, Innendraht = Signal.