Temperatursensor MCP9808

Der Temperartursensor MCP9808 gibt im kontinuierlichen Messmodus die gemessene Umgebungstemperatur als Rohwert über I2C-Schnittstelle aus. Der Einsatzbereich des Sensors erstreckt sich dabei maximal von -40 °C bis +125 °C. Die Auflösung des Sensors kann auf 0,5 °C,  0,25 °C,  0,125 °C oder 0,0625 °C eingestellt werden, die Anzahl der Messungen betragen dabei 33 (bei niedrigster Auflösung), 15, 7 oder 4 (bei höchster Auflösung) Messungen pro Sekunde. Um z.B. bei Batteriebetrieb den Energieverbrauch zu senken, kann der Sensor in den Schlafmodus gebracht werden (Stromverbrauch im Schlafmodus < 2 µA). Der Sensor hat auch einen programmierbaren Alarmausgang (open collector).

Das Datenblatt des Sensors ist hier zu finden: ww1.microchip.com/downloads/en/DeviceDoc/25095A.pdf


I2C-Adresse:

Die I2C-Adresse ist hardwaremäßig über die Adresseingänge A0-A2 am Sensor von 0x18 bis 0x1F einstellbar. Ohne Beschaltung liegen die Adresseingänge durch interne Pulldown-Widerstände auf logisch Null, daher ist für die Adresse 0x18 keine Beschaltung erforderlich.


Bild 1: Temperatursensor MCP9808 auf Breakout Board von Adafruit


Testaufbau:

Verwendete Bauteile:

  • 1 Arduino Uno
  • 1 MCP9808 auf Breakout Board

Optional:

  • 2 Widerstände 10 kOhm  1)



1)  Pullup-Widerstände für den I2C-Bus befinden sich häufig (immer?) auf den erhältlichen MCP9808 Breakout-Boards


Library MyMCP9808

Für Arduino und Attiny habe ich eine Library mit folgenden Funktionen geschrieben, so dass eine schnelle Einbindung in einen Sketch möglich ist:


  • Abfrage, ob der Sensor über I2C ansprechbar ist (Auslesen der Chip-Identifikationsnummer, welche 0x04 ist)
  • Vorgabe der Temperatur-Auflösung und Wandlungszeit
  • Auslesen des Temperaturrohwertes und Berechnung der Temperatur
  • Setzen des Sensors in den Schlafmodus oder in den kontinuierlichen Messmodus


Auf die Möglichkeit der Nutzung des Alarmausganges des Sensors habe ich in der Library bewusst verzichtet, da ich eine eventuelle Messwertüberwachung lieber im Anwendungsprogramm realisiere.

Eine Anwendung der Library findet ihr z.B. bei meinem Projekt Funkübertragung: Messwerte übertragen


Die Library kann hier heruntergeladen werden:

Version 2.1

MyMCP9808.cpp.txt 

MyMCP9808.h.txt 

keywords.txt

Leider kann ich hier keine "cpp"- oder "h"-Files hochladen, daher zum Verwenden der Library ".txt" aus den Dateinamen entfernen und in einem neuen Verzeichnis mit dem Namen "MyMCP9808" dort speichern, wo eure anderen Libraries gespeichert sind.


Zur Auflistung der Funktionen der Libraries geht es hier: Funktionen


Programmbeispiel MyMCP9808 für Arudino

Beispiel 1 gibt bei niedrigster Auflösung (0,5 °C) und höchster Messrate (ca. 33 Messungen pro Sekunde) die gemessene Temperatur am Seriellen Monitor aus.

//Testprogramm 1 für Temperatursensor MCP9808
//Code fuer Arduino
//Author Retian
//Version 1.2


#include <MyMCP9808.h>
MyMCP9808 Tmp(0x18);


float temp;


void setup()
{
  Serial.begin(115200);
  if (Tmp.isReady())
  {
    Tmp.setResolution(MCP9808_LOWEST_RESOLUTION); //Niedrigste Auloesung, hoechste Messrate

    Serial.println("Temp.fuehler ok");
  }
  else
  {
    Serial.println("Temp.fuehler Fehler");
    while (1); //Hier geht's nicht weiter
  }
}


void loop()
{
  temp = Tmp.readTemp();
  Serial.println(temp);
  delay(20);
}


Programmbeispiel MyMCP9808 für Attiny

Das Beispiel 2 für Attiny gibt die gemessene Temperatur auf einer 4-stelligen 7-Segmentanzeige aus. Dafür nutze ich eine Anzeige mit HT16K33-Chip. Nach der Ausgabe des Messwertes geht der Sensor für 10 Sekunden in den Schlafmodus. Dabei kann die Stromaufnahme des Sensors im Schlafmodus gemessen werden. Die Messwerte liegen im Bereich von < 1 µA.

Zur Speicherplatzeinsparung gebe ich den gemessenen Float-Messwert als Integer-Zahl mit einer fixen Kommastelle aus. Daher wird der Float-Wert vor der Umwandlung auf einem Integer-Wert mit 10 multipliziert.

Neben der Library MyMCP9808 werden noch folgende Libraries benötigt:

  • MyHT16K33_7Seg: Meine Library für die 7-Segmentanzeige kann hier heruntergeladen werden: 7-Segm.anz. HT16K33
  • TinyWireM: Zur I2C-Kommunikation für Attiny, ein Link dazu ist hier zu finden: Fremd-Libraries


//Testprogramm 2 für Temperatursensor MCP9808
//Code fuer Attiny45/85
//Author Retian
//Version 1.2


#include <MyHT16K33_7Seg.h>
#include <MyMCP9808.h>


MyMCP9808 Tmp;
MyHT16K33_7Seg Seg7(0x70);


float temp;


void setup()
{
  Seg7.init();
  Seg7.sendBlank();
  delay(1000);
}


void loop()
{
  delay(500); //Warte bis Sensor Messungen durchgefuehrt hat
  temp = Tmp.readTemp(); //Lese Temperatur-Rohwert ein und ermittle Temperatur
  //Zur Speicherplatzeinsparung bei Attiny:
  //Ausgabe der Float-Temperatur als Integerwert mit fixer Kommastelle
  Seg7.sendFixedVal((int)(temp * 10), 1, 1);
  Tmp.setModus(MCP9808_SLEEP_ON); //Setze Senor in den Schlafmodus
  delay(10000); //Warte im Schlafmodus -> Strommessung am Sensor moeglich
  Tmp.setModus(MCP9808_SLEEP_OFF); //Setze Sensor in den Messmodus
}