Xbee Pro serie 1 + Sensore di temperatura DS18b20

Allora, come già alcune persone sanno, in questi giorni mi sto cimentando nella sperimentazione di moduli xbee pro series 1.

La cosa che volevo provare oggi era stampare il valore di temperatura datomi da un sensore DS18b20!

Ho scritto un programma che funziona perfettamente quando devo scrivere solo sul serial monitor, mentre appena collego sull'arduino la xbee shield con relativo modulo xbee pro, il programma smette di funzionare, anzi...il sensore, in quanto il programma funziona , mi spiego meglio...

Il programma in questione fa queste cose:

se io digito H dal serial monitor di arduino da un pc a cui è collegato un altro modulo xbee pro (uguale al precedente), il LED 13 dell'arduino remoto si accende. Se digito L si spegne.

E fin qui funziona tutto bene!!!

Se invece digito T dovrebbe uscire scritto:

The temperature is:VAL Celsius degrees! Dove VAL è il valore di temperatura!!!

Però a me esce scritto sempre: [u]The temperature is:0 Celsius degrees![/u]

Non riesco a capire il perchè...devo cambiare qualche configurazione di qualche pin, quando metto l'xbee shield sull'arduino? Molto probabilmente è un problema legato ad xbee perchè stampando su serial monitor con arduino attaccato al pc funziona tranquillamente!!!

GRAZIE

p.s. Il codice del loop è il seguente (il resto è un pò scocciante, per questo non lo posto, se ce ne sarà bisogno lo farò):

void loop(void) {
  myData = Serial.read();
        if(myData == 'H'){
            Serial.print(myData,BYTE); //Stampa il carattere H sul serial monitor
            digitalWrite(LED,HIGH);
        }
        else if (myData == 'L'){
            Serial.print(myData, BYTE); //Stampa il carattere L sul serial monitor
            digitalWrite(LED,LOW);
        }
        else if (myData == 'T'){
          //Non commentare la linea seguente se si vuole provare l'entrata nell'else if
                                   //Serial.print(myData,BYTE); 
                                   Serial.print("The temperature is:");                      
                                   Serial.print(getTemp()); //Stampa la temperatura!!!
                                   Serial.println(" Celsius degrees!");
                             }
           }

Direi che l'errore è nella funzione getTemp() che restituisce sempre 0. Prova a postare il codice

hai risolto col post http://arduino.cc/forum/index.php/topic,52329.0.html?

Nono, la funzione getTemp() funziona tranquillamente quando non collego l’Xbee !!!

Comunque questo è il codice intero:

#define LED 13
#include <OneWire.h>
char myData;

OneWire  ds(8);        // ds18b20 pin #2 (middle pin) to Arduino pin 8

byte i;
byte present = 0;
byte data[12];
byte addr[8];
  
int HighByte, LowByte, SignBit, Whole, Fract, TReading, Tc_100, FWhole;

void setup(void) {
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  
  if ( !ds.search(addr)) {
      Serial.println("No more addrs");
      delay(1000);
      ds.reset_search();
      return;
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {

      Serial.println("CRC not valid!");
      delay(1000);
      return;
  }
}

int getTemp() {
  int foo, bar;
  
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);

  for ( i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
  
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  
  if (SignBit) {
    TReading = -TReading;
  }
  Tc_100 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25
  Whole = Tc_100 / 100;          // separate off the whole and fractional portions
  Fract = Tc_100 % 100;
  if (Fract > 49) {
    if (SignBit) {
      --Whole;
    } else {
      ++Whole;
    }
  }

  if (SignBit) {
    bar = -1;
  } else {
    bar = 1;
  }
  foo = ((Whole * bar) * 18);      // celsius to fahrenheit conversion section
  FWhole = (((Whole * bar) * 18) / 10) + 32;
  if ((foo % 10) > 4) {            // round up if needed
       ++FWhole;
  }
  return Whole;
}

void printTemp(void) {
  Serial.print("Temp is: ");
    if (SignBit) {  
     Serial.println("-");
  }
  Serial.print(Whole);
  Serial.print(" C / ");
  Serial.print(FWhole);
  Serial.println(" F");
}

void loop(void) {
  myData = Serial.read();
        if(myData == 'H'){
            Serial.print(myData,BYTE); //Stampa il carattere H sul serial monitor
            digitalWrite(LED,HIGH);
        }
        else if (myData == 'L'){
            Serial.print(myData, BYTE); //Stampa il carattere L sul serial monitor
            digitalWrite(LED,LOW);
        }
        else if (myData == 'T'){
          //Non commentare la linea seguente se si vuole provare l'entrata nell'else if
                                   //Serial.print(myData,BYTE); 
                                   Serial.print("The temperature is:");                      
                                   Serial.print(getTemp()); //Stampa la temperatura!!!
                                   Serial.println(" Celsius degrees!");
                             }
           }

@lesto: non ho capito cosa mi hai chiesto?!

Grazie a tutti!

pensavo avessi già risolto con l'altra discussione (che ti ho linkato)

Sei sicuro che il pin che usi sull'arduino non sia usato anche dall'xbee?

lesto: Sei sicuro che il pin che usi sull'arduino non sia usato anche dall'xbee?

non so, ma non penso perchè questo pin è lasciato completamente libero dalla xbee shield poggiata sull'arduino!!! :(

Forse devo provare in modalità parassita perchè l'arduino non riesce a dare i 5V al sensore di temperatura e la relativa alimentazione alla shield xbee???

Provo e vi faccio saperE!!!

è possibile che ho bruciato il sensore connettendolo al contrario? Perchè non mi da più segni di vita!!! :(

per quel che ne so connettere le cose al contrario è il modo più veloce per farle fuori...

eh... lo sapevo anche io..un attimo di distrazione e di non precisione del datasheet (a mio avviso) e ho rotto il sensore... vabbè domani se ho tempo provo con un termistore da 4.7K!!!! ;)

Prova questo, usa le librerie DallasTemperature, ed è ridotto all’osso:

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 10

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// arrays to hold device address
DeviceAddress insideThermometer;

void setup(void)
{
  Serial.begin(9600);
  sensors.begin();
  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0"); 
  sensors.setResolution(insideThermometer, 12);
}


void printTemperature(DeviceAddress deviceAddress) // function to print the temperature for a device
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.println(tempC);
}

void loop(void)
{ 
  sensors.requestTemperatures(); // Send the command to get temperatures
  printTemperature(insideThermometer); // Use a simple function to print out the data
  
  delay(1000);
}

Se più tardi posso fare una prova, ti dico come funziona con i moduli serie 2