system
February 15, 2011, 10:33am
1
Ragazzi sto cercando di utilizzare il famoso sensore di temperatura della Dallas Semiconductor, ho visto in rete, tante cose ...librerie Dallas e One wire ma il sensore non riesco a farlo funzionare, allora ho provato senza nessuna libreria, uploadando questo sketch su Arduino:
#define temp 8
void setup(){
Serial.begin(9600);
pinMode(temp,INPUT);
}
void loop(){
delay(1000);
Serial.print("Temperature is: ");
Serial.println(digitalRead(temp));
}
Dovrebbe funzionare se ho collegato una resistenza di 4.6K al pin di segnale e poi questo pin al pin digitale 8, e il GND del sensore al GND di arduino!!!
Invece mi esce sempre :
Temperature is : 0
Potete aiutarmi? Dove sbaglio?
GRAZIE
system
February 15, 2011, 10:51am
2
Ciao,
non puoi utilizzare direttamente il sensore di temperatura Dallas senza utilizzare le librerie che permettano la comunicazione col sensore stesso (protocollo di comunicazione 1-Wire).
Utilizza la libreria DallasTemperature (che a sua volta utilizza la libreria OneWire o OneWire 2).
Trovi le librerie qui:
http://milesburton.com/wiki/index.php?title=Dallas_Temperature_Control_Library#Introduction
Qui come collegarlo:
http://blog.lampugnani.org/arduino/ds18b20-sensore-di-temperatura-digitale/
Ciao,
Marco.
system
February 15, 2011, 2:42pm
3
Ah okey, credevo potesse funzionare come un normale sensore digitale...!!! Già avevo visto queste librerie, ora le studio meglio e vi faccio sapere!!!
system
February 15, 2011, 3:55pm
4
Sono riuscito a fare funzionare il sensore con il codice seguente:
#include <OneWire.h>
int backLight = 13; // pin 13 will control the backlight
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(backLight, OUTPUT);
digitalWrite(backLight, HIGH); // turn backlight on. Replace 'HIGH' with 'LOW' to turn it off.
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;
}
}
void 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;
}
}
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) {
getTemp();
printTemp();
delay(1000);
}
Però non capisco come fare per farlo funzionare in modalità parassita??
Ho provato a collegare così i pin del sensore:
PIN1------------------GND
PIN2-------4.6K----------PINDIGITAL8
Ma non funziona!!!
Ciao,
il pin3 deve essere a massa
Saluti
system
February 15, 2011, 4:30pm
6
Grazie marchino!!! ora provo ad interfacciare tutto con Xbee.... chissà!!!
system
February 15, 2011, 6:58pm
7
CHE VOI sappiate è possibile che ho bruciato il sensore avendolo connesso nella maniera opposta?
Ma devo seguire la figura in cui si vede il sensore di faccia o la bottom view, perchè se seguo una ho una cosa, se seguo l'altra l'opposto!!
Fatemi sapere!!!