Anemometro La Crosse TX20 e Arduino

Buon giorno a tutti, sto cercando di capire bene, raggruppando un po di notizie in merito ad un anemometro modello La Crosse tx 20.

Tramite il solito Google ho trovato un po di info su alcuni progetti sia eseguiti con Arduino che con raspberry.
Chiedo il vostro aiuto per poter chiarirmi meglio le idee, ed evitare soprattutto di distruggere il sensore.

queste sono le info che ho trovato in giro

http://forum.arduino.cc/index.php?topic=62753.0

protocollo tx20

https://www.john.geek.nz/2011/07/la-crosse-tx20-anemometer-communication-protocol/

Raspberry Anemometro

Bene, adesso vedo di riassumere quello che ho capito in merito....

Per non friggere nulla collego il sensore a 3,3 volt, in alcuni post lo collegano anche a 5, io non vorrei rischiare, voi che dite??

collego il pin TxD ad un pin digitale di Arduino, per il protocollo non dovrei avere grossi problemi basta smanettare bene con i dati ricevuti le stringhe ecc.

Altro dubbio che mi sorge in uno degli schemi viene inserita una R da 8 o 10 K sul pin dgt e l'alimentazione ( per inciso nello schema per la connessione con il raspberry ) , nel post italiano di arduino invece viene detto di collegare il tutto in questo modo:

http://forum.arduino.cc/index.php/topic,36580.0.html

Tx-20 <-------------------------> Arduino
1 - serial I/O - Resistenza 8K - Pin Digitale
2 - VCC 3.3v ------------------- 3.3V
3 - Reg. CE -(to gnd)-
4 - GND ------------+----- GND

quale e il metodo corretto ?

So che come post e un po scarso ma sono veramente in confusione soprattutto nello schema di collegamento tra sensore e Arduino.

a presto

Vic

Not sure what you said, but here is my test program and it works for me.

//void setup();
//void loop();
//int collectdata(void);
//void showdatasimple();

int dataPin = 10;
int bitLength = -1;
int data[45];
int gooddata = 1;
int timeout;
int loops = 0;
int spd[8];
int i = 0;
int j = 0;
char windDirection[16][4] = {
  "N","NNE","NE", "ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"};

void setup() {
  Serial.begin(9600);
  Serial.print("\n\nInitializing...\n");
  //  Serial.print("Data Pin: ");
  //  Serial.println(digitalRead(dataPin));
  //  pinMode(dataPin, INPUT);
}

//void delay2(unsigned long ms){
//	unsigned long start = micros();
//	while (micros() - start <= ms);
//}

void loop() {
  Serial.println("Start");
  gooddata = 1;
  collectData();
  if (gooddata == 1) {
    rawdump();
    outputResults();
    TheData();
  }
  else {
    Serial.println ("READ ERROR");
  }
  Serial.println(++loops);
  Serial.println();
  delay(15000);
}

int collectData(void) {
  if (bitLength < 0){
    bitLength = 1230; // length of bit is equal to approx 1230ms - adjust as needed
  }
  Serial.print("A");

  pinMode(dataPin, OUTPUT);
  digitalWrite(dataPin, HIGH);
  delay(100);
  Serial.print("B");

  digitalWrite(dataPin, LOW );
  delay(500);
  Serial.print("C");

  pinMode(dataPin, INPUT);
  Serial.print("D");

  timeout = 2500;
  while(digitalRead(dataPin) == LOW){
    timeout--;
    if (timeout == 0) {
      gooddata = 0;
      break;
    }
    delayMicroseconds(1);
  }  // signal starts low
  Serial.print("E");

  timeout = 2500;
  while(digitalRead(dataPin) == HIGH){
    timeout--;
    if (timeout == 0) {
      gooddata = 0;
      break;
    }
    delayMicroseconds(1);
  }  // wait signal goes high
  Serial.print("F");

  timeout = 2500;
  while(digitalRead(dataPin) == LOW){
    timeout--;
    if (timeout == 0) {
      gooddata = 0;
      break;
    }
    delayMicroseconds(1);
  }
  Serial.println("G");

  delayMicroseconds(bitLength/2);  // wait till middle of next pulse time

  for (int i=0 ; i<41 ; i++) {
    data[i] = (digitalRead(dataPin) == LOW)? 0:1; // read and save either a 0 or 1
    delayMicroseconds(bitLength);
  }
}

int TheData() {
  Serial.println("TheData");
  int i, idx = 0, idy = 0;
  for (i=8; i>4; i--) {
    idx = idx *2 + data[i];
  }

  //  Serial.print("idx: ");
  //  Serial.println(idx, DEC);
  Serial.print("Wind: ");
  Serial.println(windDirection[idx] );

  for (i=17; i>8; i--) {
    idy = idy * 2 + data[i];
  }

  Serial.print("Speed: ");
  Serial.print(idy, DEC);
  Serial.println (" m/s read");

  float idz = idy/10.0;
  Serial.print("Speed: ");
  Serial.print(idz);
  Serial.println (" m/s real");

  float KMH = idz * 3.6;
  Serial.print("Speed: ");
  Serial.print(KMH);
  Serial.println (" kmh");

  float MPH = KMH * 0.621371192;
  Serial.print("Speed: ");
  Serial.print(MPH);
  Serial.println (" mph");
  /*
float wc, dp;
   wc = windchill((float) temperature / 100, (float) Wind * 0.36);
   dp = dewpoint((float)temperature / 100, (float) humidity);
   */
}


void rawdump() {
  Serial.print("Raw: ");
  for (int i=0 ; i<41 ; i++) {
    Serial.print (data[i]);
    if (i == 4) {
      Serial.print (" ");
    }
    if (i == 8) {
      Serial.print (" ");
    }
    if (i == 17) {
      Serial.print (" ");
    }
    if (i == 20) {
      Serial.print (" ");
    }
    if (i == 24) {
      Serial.print (" ");
    }
    if (i == 28) {
      Serial.print (" ");
    }
    if (i == 37) {
      Serial.print (" ");
    }
  }
}

void outputResults() {
  Serial.println();

  int idx =0;
  for (int i=8 ; i> 4 ; i--)
  {
    idx = idx *2 + data[i];  // data[i] == 0/1.. see prev post.  //
  }

  Serial.print("idx: ");
  Serial.println(idx, DEC);
  Serial.print("Wind: ");
  Serial.println(windDirection[idx] );
  //  Serial.println();

  Serial.print("Swapped: ");

  //HEAD
  for (int i =0 ; i< 5 ; i++)
  {
    Serial.print(data[i]);  // it contains 0 or 1
  }

  Serial.print(" ");

  //WINDDIR
  for (int i =8 ; i> 4 ; i--)
  {
    Serial.print(data[i]);
  }
  Serial.print(" ");

  //WIND SPEED
  for (int i =17 ; i> 8 ; i--)
  {
    Serial.print(data[i]);
  }

  Serial.print(" ");

  //WIND SPEED+3
  for (int i =20 ; i> 17 ; i--)
  {
    Serial.print(data[i]);
  }

  Serial.print(" ");

  /*
  // Checksum
   for (iCounter=0;iCounter<4;iCounter++)
   {
   checksum |= (TX23_DATA_GET_BIT << iCounter);
   delayTargetuSec += bitLength;
   TX23_DoDelay;
   }

   //Calculate Checksum
   unsigned int checksumCalc = 0;
   checksumCalc += (winddir & 15);
   checksumCalc += ((windspeed >> 8) & 15);
   checksumCalc += ((windspeed >> 4) & 15);
   checksumCalc += (windspeed & 15);
   */

  // Checksum
  for (int i =24 ; i> 20 ; i--)
  {
    Serial.print(data[i]);
  }

  Serial.print(" ");

  //WIND DIR NEGATEIVE
  for (int i =28 ; i> 24 ; i--)
  {
    Serial.print(data[i]);
  }

  Serial.print(" ");

  //WIND SPEED NEGATED
  for (int i =37 ; i> 28 ; i--){
    Serial.print(data[i]);
  }

  Serial.print(" ");

  //WIND SPEED NEGATED +3
  for (int i =40 ; i> 37 ; i--){
    Serial.print(data[i]);
  }
  Serial.println();
  //  Serial.println();
  //  Serial.println();
}

sei riuscito a fare il progetto con il tx-20 ed arduino? io sono in alto mare

Ho usato gli anemometri della Davis, senza nessun "protocollo", per il semplice fatto che lo trovo assurdo se poi lo devo collegare ad un Arduino.
Erano tre fili: un comune, un contatto pulito e una uscita potenziometro.

Infatti, l'anemometro è un contatto pulito da reed, quindi ogni giro / min. so che velocità di vento ho !

Per la direzione del vento utilizzano un potenziometro: leggo la resistenza e so la posizione.

Poi in generale anche io, se posso, monto le librerie in arduino: ma in questo caso proprio non lo farei.

Il resistore tra la linea TxD ed i +Vcc serve solo come pull up e non è critico: 10k vanno benissimo.

Per l'alimentazione, l'autore dell'articolo (John Geek) da cui derivano anche gli altri articoli, dichiara di averlo usato a +5V senza problemi.

Ti faccio notare che l'altro articolo fa riferimento al TX23.

Per rilevare il segnale puoi usare l'istruzione pulseIn(pin, value, timeout)

Se può interessare ho decodificato il protocollo del TX20 con un arduino-uno, usando interrupt e timer.

decoding La Crosse TX20 Anemometer data with Arduino

Ragazzi devo chiedere scusa a tutti, ma per vari motivi, ho dovuto abbandonare il progetto, e mi sono completamente dimenticato del forum.
Scusate.

Bello pero il progetto di zlabs, da tenere in considerazione, visto che un anemometro in più mi avanza.

scusate ancora