La Crosse TX23

Hi to all

i'm searching support to read data from La Crosse TX23 wind sensor. I tried to use the following link

http://www.rd-1000.com/chpm78/lacrosse/Lacrosse_TX23_protocol.html http://www.rd-1000.com/chpm78/lacrosse/Receive_Lacrosse_TX23_data_2.html

and this post http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1284720711/all

but I receiver yer not correct data, I see the binary data change for wind direction but (in wrong way too) but the anemometer data are always zero

11011 1110 000000000 000 1110 0001 111111111 111 11011 1010 000000000 000 1010 0101 111111111 111

Like you see there is header, and wind direction (inverted too, but is not correct) ... and the wind speed is always zero..

Please help .. i'm becoming foul !! :fearful:

The data looks good except that the wind speed is reading 0. Was the wind blowing? Could there be a hardware fault in your wind speed sensor?

this is the second sensor, the first one was replaced by the seller for other reason, but the result is the same.

Reading the binary I see change the wind direction bits, but are wrong, not corresponding to reference, so I’m sure it’s a software problem.

This is the source code i used, tell me if there is something wrong, i imagine I make mistake “pulling signal down”, and from there start my wrong data.

I’m sure for this because using a procedure to calculate the bit length using the header “11011” (like the example in one of my link) I have the zero bit time length the same or greater than the first two “11”. At begin i thniked to a my bug to calculate it, but now i’m sure is wrong the start procedure. May be I had not understood as well the pinMode and LOW and HIGHT concept.

Please help… :disappointed_relieved:

int dataPin = 8;
int bitlenght = -1;
char data[41];
  
  
void setup() {
  Serial.begin(9600);
  Serial.print("\n\nInitializing...\n");
  Serial.print("startpin:");
  Serial.println(digitalRead(dataPin));
  pinMode(dataPin, INPUT);
}

void loop() {
  collectdata3();
  delay(1000);   
}


int collectdata3(void){
   if (bitlenght <0){
      bitlenght = 1220;//getbitlenght2();

   }
  
  pinMode(dataPin, OUTPUT);

  digitalWrite(dataPin, HIGH);
  delay(100);
  digitalWrite(dataPin, LOW );
  delay(500);
  pinMode(dataPin, INPUT);


  while(digitalRead(dataPin) == LOW){
  }  
  //wait slave start signal
  while(digitalRead(dataPin) == HIGH){
  }
  while(digitalRead(dataPin) == LOW){
  }
  


  

  for (int i=0 ; i<42 ; i++){

    data[i] = (digitalRead(dataPin) == LOW)? 48 : 49 ;
    delayMicroseconds(bitlenght);
  }

  showdatasimple();
  return 0;
}


void showdatasimple(){
  Serial.println("");

//HEAD
  for (int i =0 ; i< 5 ; i++){
    Serial.print( ((data[i] == 48)? 0 : 1) );
  }
  
  Serial.print(" ");
  
//WINDDIR
  for (int i =5 ; i< 9 ; i++){
    Serial.print( ((data[i] == 48)? 0 : 1) );
  }
  

  
  Serial.print(" ");
  
//WIND SPEED
  for (int i =9 ; i< 18 ; i++){
    Serial.print( ((data[i] == 48)? 0 : 1) );
  }
  
  Serial.print(" ");
  
//WIND SPEED+3
  for (int i =18 ; i< 21 ; i++){
    Serial.print( ((data[i] == 48)? 0 : 1) );
  }  
  
  Serial.print(" ");
  
  //CC
  for (int i =21 ; i< 25 ; i++){
    Serial.print( ((data[i] == 48)? 0 : 1) );
  }
  
  Serial.print(" ");
  
  //WIND DIR  NEGATEIVE
  for (int i =25 ; i< 29 ; i++){
    Serial.print( ((data[i] == 48)? 0 : 1) );
  }
  
    Serial.print(" ");
  
  //WIND SPEED NEGATIVE
  for (int i =29 ; i< 38 ; i++){
    Serial.print( ((data[i] == 48)? 0 : 1) );
  }
   
   Serial.print(" ");
    
    //WIND SPEED NEGATIVE+3
  for (int i =38 ; i< 41 ; i++){
    Serial.print( ((data[i] == 48)? 0 : 1) );
  }
}

I also bought a TX23 last friday. And had some time yesterday. But I think the communication is a little bit different then the TX20.

For the wind speed readings you will need a extra pause/ delay of appr. 2000mS.
I connected the DTR pin to a digital input and simply send a HIGH and LOW every 2000mS, does the trick.

The wind speed is a 12 bit value. You need to invert and endianness swap this bits.
The bit represents a value in units of 0.1 metre/sec. The 3 MSBs always are 000 so only 9 bits are used.
This value is max. 511 and with a simple calculation you get 51.1 meter per second or 183.96 km/h

This is the source from the updated version, this will light up a LED or in my example 8 old fashioned lightbulbs via a FETs.
Still needs some tweaking, and microdelay seems to be a problem, had this problem before a already had a work-a-round (see source)

Youtube: http://www.youtube.com/watch?v=vIQbHNrPSfg

#include <SoftPWM.h>

void setup();
void delay2(unsigned long ms);
void loop();
int collectdata(void);
void showdatasimple();
int dataPin = 12;
int bitlenght = -1;
char data[43];
String Wind_Direction;

uint8_t lightbulbs[8] = {2, 3, 4, 5, 6, 7, 8, 9};

void setup() {
  Serial.begin(9600);
  Serial.print("\n\nInitializing...\n");
  Serial.print("Data Pin: ");
  Serial.println(digitalRead(dataPin));
  pinMode(dataPin, INPUT);
  
  // Initialize  
  SoftPWMBegin();  
  
  for (int i = 0; i < 8; i++) 
    SoftPWMSet(lightbulbs[i], 0);
  
  SoftPWMSetFadeTime(ALL, 500, 500);
  
}

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

void loop() {
  collectdata();
}


int collectdata(void){
   if (bitlenght <0){
      bitlenght = 1230;//getbitlenght2() 1230;
   }
  
  pinMode(dataPin, OUTPUT);
  digitalWrite(dataPin, HIGH);
  delay(100);
  
  digitalWrite(dataPin, LOW );
  delay(500);
  
  pinMode(dataPin, INPUT);


  while(digitalRead(dataPin) == LOW){
  }  
  while(digitalRead(dataPin) == HIGH){
  }
  while(digitalRead(dataPin) == LOW){
  }

  for (int i=0 ; i<42 ; i++){

    data[i] = (digitalRead(dataPin) == LOW)? 48 : 49 ;
    delay2(bitlenght);
  }

  showdatasimple();
  return 0;
}

void showdatasimple(){
  Serial.println("");
  
  String Wind_Dir_PatternStr = "b";
  String Wind_Dir_DescStr = "";
  for (int i =8 ; i> 4 ; i--){
    Wind_Dir_PatternStr += ((data[i] == 48)? 0 : 1);
  }

  Serial.print(Wind_Dir_PatternStr);
  Serial.print(" = ");
  
  if (Wind_Dir_PatternStr == "b0000") { Wind_Dir_DescStr="N"; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[0], 255); }
  if (Wind_Dir_PatternStr == "b0001") { Wind_Dir_DescStr="NNO"; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[0], 255); }
  if (Wind_Dir_PatternStr == "b0010") { Wind_Dir_DescStr="NO"; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[1], 255); }
  if (Wind_Dir_PatternStr == "b0011") { Wind_Dir_DescStr="ONO"; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[2], 255);}
  if (Wind_Dir_PatternStr == "b0100") { Wind_Dir_DescStr="O"; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[2], 255);}
  if (Wind_Dir_PatternStr == "b0101") { Wind_Dir_DescStr="OZO"; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[2], 255);}
  if (Wind_Dir_PatternStr == "b0110") { Wind_Dir_DescStr="ZO"; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[3], 255);}
  if (Wind_Dir_PatternStr == "b0111") { Wind_Dir_DescStr="ZZO"; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[4], 255);}
  if (Wind_Dir_PatternStr == "b1000") { Wind_Dir_DescStr="Z"; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[4], 255);}
  if (Wind_Dir_PatternStr == "b1001") { Wind_Dir_DescStr="ZZW"; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[4], 255);}
  if (Wind_Dir_PatternStr == "b1010") { Wind_Dir_DescStr="ZW"; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[5], 255);}
  if (Wind_Dir_PatternStr == "b1011") { Wind_Dir_DescStr="WZW"; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[6], 255);}
  if (Wind_Dir_PatternStr == "b1100") { Wind_Dir_DescStr="W"; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[6], 255);}
  if (Wind_Dir_PatternStr == "b1101") { Wind_Dir_DescStr="WNW"; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[6], 255);}
  if (Wind_Dir_PatternStr == "b1110") { Wind_Dir_DescStr="NW"; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[7], 255);}
  if (Wind_Dir_PatternStr == "b1111") { Wind_Dir_DescStr="NNW"; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[0], 255);}

  Serial.println(Wind_Dir_DescStr); 
  

  Serial.println("");

//HEAD
  for (int i =0 ; i< 5 ; i++){
    Serial.print( ((data[i] == 48)? 0 : 1) );
  }
  
  Serial.print(" ");
  
//WINDDIR
  for (int i =8 ; i> 4 ; i--){
    Serial.print( ((data[i] == 48)? 0 : 1) );
  }
  

  
  Serial.print(" ");
  
//WIND SPEED
  for (int i =17 ; i> 8 ; i--){
    Serial.print( ((data[i] == 48)? 0 : 1) );
  }
  
  Serial.print(" ");
  
//WIND SPEED+3
  for (int i =20 ; i> 17 ; i--){
    Serial.print( ((data[i] == 48)? 0 : 1) );
  }  
  
  Serial.print(" ");
  
  //CC
  for (int i =24 ; i> 20 ; i--){
    Serial.print( ((data[i] == 48)? 0 : 1) );
  }
  
  Serial.print(" ");
  
  //WIND DIR  NEGATEIVE
  for (int i =28 ; i> 24 ; i--){
    Serial.print( ((data[i] == 48)? 0 : 1) );
  }
  
    Serial.print(" ");
  
  //WIND SPEED NEGATIVE
  for (int i =37 ; i> 28 ; i--){
    Serial.print( ((data[i] == 48)? 0 : 1) );
  }
   
   Serial.print(" ");
    
    //WIND SPEED NEGATIVE+3
  for (int i =40 ; i> 37 ; i--){
    Serial.print( ((data[i] == 48)? 0 : 1) );
  }
}

Hi people, I am a newbie to this Forum and honestly I am not even an Arduino maker; I only play with Microchip, sorry :)

I just received today a TX23, my very first anemometer. In the last days I spent quite some time in finding info on this product (connections and protocol) so I was sure to know almost everything needed to start immediately the new project. But... I connected the TX23 using this indication found in a post:

4 - serial I/O 3 - 3.3V VCC 2 - Chip Enable 1 - GND

(pins on RJ11 connector, reversed into the TX)

I also found that pin 2, Chip Enable, should be forced to ground to have the sensor transmitting data (it should send measures every 2 seconds as long as pin 2 is low).

I found instead that pin 2 is indifferent (any state does not change anything); the idle state is low (or High Z). The only way to see some data out on pin 4 (I/O) is to temporary connect it to ground through a some Kilohms resistor (10K); as soon as the pin is released, I see activity on the scope. Connecting it directly to ground 'freezes' everything. Again, this happens with pin Chip Enable both high or low.

This is very surprising since it appears as the sensor uses a kind of 1-wire procotol, but I never found any indication in this sense. And what about the Chip Enable pin usage?

I would ask your suggestion, especially from Velzend who uses this sensor. Thanks

Hello, I am trying to implement your code on one of my projects but the wind speed seems to always be zero, do you know what the issue could be?

velzend:
I also bought a TX23 last friday. And had some time yesterday. But I think the communication is a little bit different then the TX20.

For the wind speed readings you will need a extra pause/ delay of appr. 2000mS.
I connected the DTR pin to a digital input and simply send a HIGH and LOW every 2000mS, does the trick.

The wind speed is a 12 bit value. You need to invert and endianness swap this bits.
The bit represents a value in units of 0.1 metre/sec. The 3 MSBs always are 000 so only 9 bits are used.
This value is max. 511 and with a simple calculation you get 51.1 meter per second or 183.96 km/h

This is the source from the updated version, this will light up a LED or in my example 8 old fashioned lightbulbs via a FETs.
Still needs some tweaking, and microdelay seems to be a problem, had this problem before a already had a work-a-round (see source)

Youtube: http://www.youtube.com/watch?v=vIQbHNrPSfg

#include <SoftPWM.h>

void setup();
void delay2(unsigned long ms);
void loop();
int collectdata(void);
void showdatasimple();
int dataPin = 12;
int bitlenght = -1;
char data[43];
String Wind_Direction;

uint8_t lightbulbs[8] = {2, 3, 4, 5, 6, 7, 8, 9};

void setup() {
 Serial.begin(9600);
 Serial.print("\n\nInitializing…\n");
 Serial.print("Data Pin: ");
 Serial.println(digitalRead(dataPin));
 pinMode(dataPin, INPUT);
 
 // Initialize  
 SoftPWMBegin();  
 
 for (int i = 0; i < 8; i++)
   SoftPWMSet(lightbulbs[i], 0);
 
 SoftPWMSetFadeTime(ALL, 500, 500);
 
}

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

void loop() {
 collectdata();
}

int collectdata(void){
  if (bitlenght <0){
     bitlenght = 1230;//getbitlenght2() 1230;
  }
 
 pinMode(dataPin, OUTPUT);
 digitalWrite(dataPin, HIGH);
 delay(100);
 
 digitalWrite(dataPin, LOW );
 delay(500);
 
 pinMode(dataPin, INPUT);

while(digitalRead(dataPin) == LOW){
 }  
 while(digitalRead(dataPin) == HIGH){
 }
 while(digitalRead(dataPin) == LOW){
 }

for (int i=0 ; i<42 ; i++){

data[i] = (digitalRead(dataPin) == LOW)? 48 : 49 ;
   delay2(bitlenght);
 }

showdatasimple();
 return 0;
}

void showdatasimple(){
 Serial.println("");
 
 String Wind_Dir_PatternStr = “b”;
 String Wind_Dir_DescStr = “”;
 for (int i =8 ; i> 4 ; i–){
   Wind_Dir_PatternStr += ((data[i] == 48)? 0 : 1);
 }

Serial.print(Wind_Dir_PatternStr);
 Serial.print(" = ");
 
 if (Wind_Dir_PatternStr == “b0000”) { Wind_Dir_DescStr=“N”; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[0], 255); }
 if (Wind_Dir_PatternStr == “b0001”) { Wind_Dir_DescStr=“NNO”; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[0], 255); }
 if (Wind_Dir_PatternStr == “b0010”) { Wind_Dir_DescStr=“NO”; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[1], 255); }
 if (Wind_Dir_PatternStr == “b0011”) { Wind_Dir_DescStr=“ONO”; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[2], 255);}
 if (Wind_Dir_PatternStr == “b0100”) { Wind_Dir_DescStr=“O”; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[2], 255);}
 if (Wind_Dir_PatternStr == “b0101”) { Wind_Dir_DescStr=“OZO”; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[2], 255);}
 if (Wind_Dir_PatternStr == “b0110”) { Wind_Dir_DescStr=“ZO”; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[3], 255);}
 if (Wind_Dir_PatternStr == “b0111”) { Wind_Dir_DescStr=“ZZO”; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[4], 255);}
 if (Wind_Dir_PatternStr == “b1000”) { Wind_Dir_DescStr=“Z”; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[4], 255);}
 if (Wind_Dir_PatternStr == “b1001”) { Wind_Dir_DescStr=“ZZW”; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[4], 255);}
 if (Wind_Dir_PatternStr == “b1010”) { Wind_Dir_DescStr=“ZW”; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[5], 255);}
 if (Wind_Dir_PatternStr == “b1011”) { Wind_Dir_DescStr=“WZW”; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[6], 255);}
 if (Wind_Dir_PatternStr == “b1100”) { Wind_Dir_DescStr=“W”; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[6], 255);}
 if (Wind_Dir_PatternStr == “b1101”) { Wind_Dir_DescStr=“WNW”; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[6], 255);}
 if (Wind_Dir_PatternStr == “b1110”) { Wind_Dir_DescStr=“NW”; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[7], 255);}
 if (Wind_Dir_PatternStr == “b1111”) { Wind_Dir_DescStr=“NNW”; SoftPWMSet(ALL, 0); SoftPWMSet(lightbulbs[0], 255);}

Serial.println(Wind_Dir_DescStr);

Serial.println("");

//HEAD
 for (int i =0 ; i< 5 ; i++){
   Serial.print( ((data[i] == 48)? 0 : 1) );
 }
 
 Serial.print(" ");
 
//WINDDIR
 for (int i =8 ; i> 4 ; i–){
   Serial.print( ((data[i] == 48)? 0 : 1) );
 }

Serial.print(" “);
 
//WIND SPEED
 for (int i =17 ; i> 8 ; i–){
   Serial.print( ((data[i] == 48)? 0 : 1) );
 }
 
 Serial.print(” “);
 
//WIND SPEED+3
 for (int i =20 ; i> 17 ; i–){
   Serial.print( ((data[i] == 48)? 0 : 1) );
 }  
 
 Serial.print(” “);
 
 //CC
 for (int i =24 ; i> 20 ; i–){
   Serial.print( ((data[i] == 48)? 0 : 1) );
 }
 
 Serial.print(” “);
 
 //WIND DIR  NEGATEIVE
 for (int i =28 ; i> 24 ; i–){
   Serial.print( ((data[i] == 48)? 0 : 1) );
 }
 
   Serial.print(” “);
 
 //WIND SPEED NEGATIVE
 for (int i =37 ; i> 28 ; i–){
   Serial.print( ((data[i] == 48)? 0 : 1) );
 }
 
  Serial.print(” ");
   
   //WIND SPEED NEGATIVE+3
 for (int i =40 ; i> 37 ; i–){
   Serial.print( ((data[i] == 48)? 0 : 1) );
 }
}

hi all,

finally got my TX23 today, branded from TechnoLine Ltd. Germany (not LaCrosse or Garni).

my final goal is antonomous weather station using Arduino UNO and GPRS shield which i already have + some power management (car traction battery? + solar panel).

i'm good in programming, but not so good in electronics. i read somewhere that TX23 is for 3V but i have only 5V Arduinos (2x UNO, 2x Nano, so i don't want to buy another...). do i have to use some voltage conversion, or can i connect TX23 to Arduino directly? and can i power TX23 from Arduino's onboard 3.3V regulator (max 50mA)?

thank you for your help!

Deleted your duplicate post kitemonkee.

I know this is an older post but I am hoping that someone could help shed some light on Wind Speed Sensor issue. I like many others am experiencing no readings from the wind speed sensor. My wind direction is outputting correctly and so is the header line (11011). I am on my second wind meter now because I tore apart the first one thinking the issue was something broken in the sensor, however with a brand new unit the code still is not registering the wind speed.

I have seen some discussion about adding an additional delay to the loop lasting 2000 microseconds. I am not sure about the time because I have seen some places quote 20 milliseconds, 2000 microseconds 2 seconds, all of which do not equal one another.

I have attached my code below, it is very similar to the versions floating around on the internet that claim work but I just can’t seem to. Also here is a picture of how I am setup.

Yellow Wire = TXD (Brown)
Green = Vcc (Red)
Black = Ground (Yellow)

void setup();
void loop();
int collectdata(void);
void showdatasimple();
int dataPin = 12;
int bitLength = -1;
int data[42];

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() {
  collectData();
}


int collectData(void){
   if (bitLength < 0){
      bitLength = 1230;// length of bit is equal to approx 1230 micro seconds;
   }
  
  pinMode(dataPin, OUTPUT);
  digitalWrite(dataPin, HIGH);
  delay(100);
  
  digitalWrite(dataPin, LOW );
  delay(500);
  
  pinMode(dataPin, INPUT);

  while(digitalRead(dataPin) == LOW){
  }  
  while(digitalRead(dataPin) == HIGH){
  }
  while(digitalRead(dataPin) == LOW){
 }

delayMicroseconds(bitLength/2);  // To identify start frame

  for (int i=0 ; i<42 ; i++){

    data[i] = (digitalRead(dataPin) == LOW)? 0:1;
   delayMicroseconds(bitLength);
  }

  outputResults();
}
  
void outputResults()
{
  Serial.println();
  
  char windDirection[16][4] = { "N","NNE","NE", "ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW" };

  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();

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

  Serial.print("\t");

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

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

  Serial.print("\t");

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

  Serial.print("\t");

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

  Serial.print("\t");

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

  Serial.print("\t");

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

  Serial.print("\t");

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

Please if someone could take a look at what I have (Code, setup, logic, etc) and let me know if they can see what the issue might be, I would greatly appreciate it.

Sean