vic_20
October 9, 2014, 4:36pm
1
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();
}
system
January 16, 2015, 3:53pm
3
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)
system
February 9, 2015, 10:17am
6
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
vic_20
March 29, 2015, 7:50pm
7
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