LM75 liefert immer -3.0

Hy ich hab einen LM75 in Betrieb genommen und er liefert mir immer nur den Wert -3.00 zurück, zuerst dacht ich vl ist SDA und SCL vom I²C vertauscht doch wenn man ein Kabel aussteckt liefert er immer 36.0(dürfte vl ein Standart Fehler wert sein)
Daher meine Frage hat jemand eine Ahnung was bei mir falsch sein könnte, hab schon alles was mir eingefallen ist ausprobiert. Und ich muss eben den
LM75 bis morgen zum laufen bringen und ich finde den Fehler nicht.
Noch kurz zur Schaltung: Es wird auf ein Infrarot Signal gewartet anschließend wird die Temp. gemessen und per IR(RC5) zurück gesendet.

#include <IRremote.h>
#include <Wire.h>

#define SENSORADDRESS 0x48
#define RECV_PIN 4

char recvVal;
IRrecv irrecv(RECV_PIN);
IRsend irsend;
decode_results results;

int led = 10;
//Initialisierung
void setup()
{
  Wire.begin();
  pinMode(led, OUTPUT);
  irrecv.enableIRIn(); //Start the receiver for IR-Code
}

void loop()
{
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000); 
  if (irrecv.decode(&results)){
    
    if (results.decode_type == RC5) {
      
      sendIRString("-s\r\n");
      
      recvVal = (char) results.value;
      if(recvVal == 'r'){
        
        sendIRString("-r\r\n");
        
        int curLM75Temp = getTemperature();
        double curRealTemp = (double) (curLM75Temp >> 8);
        if((curLM75Temp&0xFF) != 0) {
        curRealTemp += 0.5;
        }
      
        char sendBuffer[10];
        
        sprintf(sendBuffer, "%f°C\r\n", curRealTemp);
        sendIRString(sendBuffer);
        
      }
      
    }
    irrecv.resume();
  }
  
}

void sendIR(int data){
  delay(100);
  irsend.sendRC5(data, 12);
  irrecv.enableIRIn();
}

int getTemperature(){
  int temperature = 0;
  Wire.beginTransmission(SENSORADDRESS);
  Wire.requestFrom(SENSORADDRESS, 2);
  while(Wire.available()){
    temperature = (temperature << 8) | Wire.read();
  }
      Wire.endTransmission();
      return temperature;
}

void sendIRString(char text[]){
  delay(100);
  int textCnt = 0;
  while(text[textCnt] != 0) {
    delay(10);
    irsend.IRsend::sendRC5(text[textCnt], 12); //send byte
    textCnt++;
  }

  irrecv.enableIRIn(); // restart the receiver
}

Hallo,

das 'Wire.endTransmission();' gehört vor 'Wire.requestFrom(SENSORADDRESS, 2);'!

Du kannst Daten erst empfangen, wenn die Datenübermittlung an die Slaves beendet ist.

Hast Du Pullup-Widerstände (je z.B. 4K7) von SDA auf 5V und SCL auf 5V in Deiner Schaltung?

Gruß

Martin

Kannst ja hier mal gucken:

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

Eventuell hilft das ja.

Ansosnten das hier ob der LM75 sich so ansprechen läßt.

 // Anschluß eines I2C-Temperatursensor mit LM75 von Horter & Kalb an Arduino
// Bei den meisten Arduinos befindet sich der SDA (data line) an Analog Bin 4 und SCL (Clock line) an Analog Bin 5,
// bei Arduino Mega SDA an digital Pin 20 und SCL an digital Pin 21
// I2C wird über die Wire Library abgewickelt. Der angegebene Code ist für die Version 1.0 des Arduino Compilers (nächste nach 23)
// In dieser Version wurde durch Vererbung von Streams.h die Funktion Wire.send durch die Funktion Wire.write ersetzt.
// Darauf ist zu achten, wenn man in einer älteren Version compiliert.
// Es wurden alle Funktionen eingebaut und als Beispiel angeführt.
// Liest man nur die Temperatur aus, so kann auf den Großteil verzichtet werden.

#include <Wire.h>
#define SensorAdresse 0x48 // Basisadresse für ersten Temperatursensor

// Registerparameter fuer get_LM75_temperature
#define TEMP 0  // Temperaturregister anwählen
#define UNTEN 2 // Register für den unteren Schaltwert anwählen
#define OBEN 3  // Register für den oberen Schaltwert anwählen

// LM75 Configuration Register Registeradresse: 1
// Bit 0: Stromsparmodus, bei 1 geht Temperatursensor in den Stromsparmodus (keine Messung, aber aktive Steuerung) Ausgang wird auch abgeschaltet
//                        bei 0 geht Temperatursensor aus dem Stromsparmodus (Messung) Ausgang wird wieder freigegeben  
// Bit 1: Interrupt Modus, bei 1 schaltet der Ausgang sowohl bei oberen als auch unteren Schwellwert ein, wird zurückgesetzt durch Auslesen des Registers
//                         bei 0 schaltet der Ausgang bei oberen Schaltpunkt ein und bei unteren aus (default 80°C / 75°C)
// Bit 2: OS-Pin bei 1 wird das Verhalten des Ausgangs invertiert, Ausgang ist eingeschalten innerhalb der Schwellwerte
//               bei 0 Ausgang schaltet bei überschreiten der eingestellten Schwellwerte
// Bit 3 und 4: Wert 0-3, besagt wieviele Messzyklen abgewartet wird, bis Ausgang aktiv/inaktiv wird, wenn die Bedingung erfüllt ist (verhindert Flattern des Ausgangs)
// Bit 5-7 müssen 0 sein
// Byte: 7 6 5 4 3 2 1 0

char dataString[7]; // gelesene Temperatur als String aufbereitet: (-xx)x.x
double temp; // gelesene Temperatur als double

void setup() {
  Wire.begin();
  Serial.begin(9600);
  delay(1000);
}

void loop()  
{  
// Temperatur aus LM75 auslesen
  temp = get_LM75_temperature(0, TEMP); //(Device)Wert vom 1. Temperatursensor lesen (0-7, je nach Jumperstellung am Board, 2. Parameter wie oben definiert)
  dtostrf(temp, 4, 1, dataString); //dtostrf(floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf); (standard avr-libc function)
  Serial.print("Gemessene Temperatur: ");
  Serial.println(dataString);
 
// LM75 Konfigurationsregister auslesen: Device
  Serial.print("Konfigurations-Register: ");
  Serial.println(get_LM75_config(0), HEX);
 
// LM75 Konfigurationsregister setzen: Device, Wert siehe oben
  set_LM75_config(0, 0);
 
// LM75 Schaltwerte setzen: Device, Register, Wert als double
  set_LM75_schaltwert(0, UNTEN, 26);
  set_LM75_schaltwert(0, OBEN, 28.5);
 
// LM75 Schaltwerte auslesen: Device, Register
  temp = get_LM75_temperature(0, UNTEN);
  Serial.print("UNTEN: ");
  Serial.println(temp, 1);
  temp = get_LM75_temperature(0, OBEN);
  Serial.print("OBEN: ");
  Serial.println(temp,1);
  delay(5000);
}

// LM75 Temperatur auslesen. Device = 0-7, regx = TEMP, OBEN, UNTEN (Registerauswahl)  
double get_LM75_temperature(int device, int regx)
{
  int8_t msb;
  int8_t lsb;
  int8_t msb1;
  Wire.beginTransmission(SensorAdresse + device);
  Wire.write(regx);
  Wire.endTransmission();
  Wire.beginTransmission(SensorAdresse + device);
  Wire.requestFrom(SensorAdresse + device, 2);
  if (Wire.available()) {
     msb1 = Wire.read();
     msb = msb1 << 1; // Vorzeichenbit entfernen, verbliebener Wert ist nun doppelt so groß
     lsb = Wire.read();
  }
  // hächstes bit von lsb sagt aus, ob 0,5 Grad dazu addiert werden sollen
  lsb = (lsb & 0x80 ) >> 7; // nun ist lsb = 0 oder 1
  Wire.endTransmission();
  if (msb1 < 0x80) { // Positiver Wert?
    return double(msb + lsb)/2; // positiver Wert
  }  
  else {
    return double(msb + lsb)/2 - 128; // negativer Wert
  }  
}

// LM75 Konfigurationsregister setzen, Werte wie oben definiert
void set_LM75_config(int device, byte value)
{
  Wire.beginTransmission(SensorAdresse + device);
  Wire.write(1); // Select Konfigurationsregister
  Wire.write(value);
  Wire.endTransmission();
}

// LM75 Konfigurationsregister auslesen, device = 0-7
byte get_LM75_config(int device)
{
  byte reg;
  Wire.beginTransmission(SensorAdresse + device);
  Wire.write(1); // Select Konfigurationsregister
  Wire.endTransmission();
  Wire.requestFrom(SensorAdresse + device, 1);
  if (Wire.available()) {
     reg = Wire.read();
  }
  Wire.endTransmission();
  return reg;
}

// LM75 Schaltwerte setzen, device = 0-7, regx = Wert, Grad als double
void set_LM75_schaltwert(int device, byte regx, double grad)
{
  int8_t msb;
  int8_t lsb = 0;
  uint8_t y = 0;
  boolean neg = false;
  if (grad < 0) {
    msb = abs(int(grad))+128;
  }
  else {  
    msb = abs(int(grad));
  }
  if (grad - abs(int(grad)) > 0) {
    lsb = 0x80;
  }
  Wire.beginTransmission(SensorAdresse + device);
  Wire.write(regx); // Selektiere oberes oder unteres Register
  Wire.write(msb);
  Wire.write(lsb);
  Wire.endTransmission();
}

Micky

Hallo,
ich habe mal eine LM75 Library geschrieben, die ich jetzt auf Arduino >1.0 umgeschrieben habe, vielleicht kommst du damit weiter.
(ich hoffe es funktioniert alles noch)
Gruß
Reinhard

LM75.zip (5.73 KB)

Warum eigentlich dieser LM75? Ist relativ ungenau und als SMD Ausführung nicht gerade toll zu verdrahten. Und nimmt dann auch noch relativ viel Platz in Anspruch.

Micky

@Micky

Warum eigentlich dieser LM75? Ist relativ ungenau und als SMD Ausführung nicht gerade toll zu verdrahten. Und nimmt dann auch noch relativ viel Platz in Anspruch.

Alternative? aber dann bitte auch mit gleichem Funktionsumfang.

Reinhard

DS18B20 vielleicht?

Gibts als fertiges Modul und Library ist auch vorhanden. Gibt ein Digitalsignal aus, kann als Bus ausgeführt werden und in Grenzen sogar mit nur zwei Leitungen betrieben werden, da er Strom von der Datenleitung nehmen kann.

Serenifly:
DS18B20 vielleicht?
Mixed-signal and digital signal processing ICs | Analog Devices

Gibts als fertiges Modul und Library ist auch vorhanden. Gibt ein Digitalsignal aus, kann als Bus ausgeführt werden und in Grenzen sogar mit nur zwei Leitungen betrieben werden, da er Strom von der Datenleitung nehmen kann.

Ich nehme die DS18S20.

Micky

aber dann bitte auch mit gleichem Funktionsumfang

Und was ist mit Hysterese und Interrupt-Ausgang? Und nicht zu vergessen den Shutdown Modus.

Was die Genauigkeit angeht gebe ich dir vollkommen recht.

Reinhard

Also ich messe nur die Temperatur. Und das möglichst genau. Mehr brauche ich nicht.

Micky