Temperaturmessung mit dem Sensor DS18B20

Date: 9. Juli 2016 Posted by: owerner In: Informatik, Physik

In dem Sunfounder-Kasten befindet sich auch der 1-Wire Sensor DS18B20.
Der Sensor soll an D9 angeschlossen werden, dazu habe ich einen entsprechenden Stecker mit Bauteilen von Conrad konfektioniert.
Dieser Sensor muss über ein Benutzer-Kommando angesteuert werden, dass heißt man muss die Firmware des Boards modifizieren.

Eine Anleitung findet man [hier].
Da die Tutorials manchmal etwas unklar sind, werde ich hier noch mal meine Erfahrungen dokumentieren, um vielleicht anderen Neulingen etwas Zeit zu ersparen.

  • Ich habe die Firmware gemäß Anleitung erzeugt.
  • Als ich das Beispiel für den Leonardo mit der IDE versucht habe, zu kompilieren, gab es Fehlermeldungen.
    Zunächst habe ich die Leonardo und die SerialListener-Bilbliotheken gezippt und mit der IDE eingebunden.
    (Vielleicht ein Anfängerfehler) Aber die Datei wurde erst ordentlich compiliert, als ich die im Ordner enthaltenen Bibliotheken gelöscht habe.
  • Wenn man nun das Beispiel normal auf den Leonarde lädt, ist es auch schon die für LabVIEW notwendige Firmware… so einfach geht das!
  • Nun habe ich die Bibliotheken für den Sensor eingebunden, die man sich aus dem Arduino repository nachladen kann:
/****************************************************************************************	
**  This is example LINX firmware for use with the Arduino Uno with the serial 
**  interface enabled.
**
**  For more information see:           www.labviewmakerhub.com/linx
**  For support visit the forums at:    www.labviewmakerhub.com/forums/linx
**  
**  Written By Sam Kristoff
**
**  BSD2 License.
****************************************************************************************/
 
//Include All Peripheral Libraries Used By LINX
 
#include <EEPROM.h>
#include <Servo.h>
#include <Wire.h>
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LinxArduinoLeonardo.h>
#include <LinxSerialListener.h>
 
 
//Include Device Specific Header From Sketch>>Import Library (In This Case LinxChipkitMax32.h)
//Also Include Desired LINX Listener From Sketch>>Import Library (In This Case LinxSerialListener.h)
 
 
 
//Create A Pointer To The LINX Device Object We Instantiate In Setup()
LinxArduinoLeonardo* LinxDevice; 
#define ONE_WIRE_BUS 9  // zunächst mal auf Pin 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
//Initialize LINX Device And Listener
void setup()
{
  //Instantiate The LINX Device
  LinxDevice = new LinxArduinoLeonardo();
 
  //The LINXT Listener Is Pre Instantiated, Call Start And Pass A Pointer To The LINX Device And The UART Channel To Listen On
  LinxSerialConnection.Start(LinxDevice, 0);  
  sensors.begin();
}
 
void loop()
{
  //Listen For New Packets From LabVIEW
  LinxSerialConnection.CheckForCommands();
  LinxSerialConnection.AttachCustomCommand(0x01, readTemp);
  //Your Code Here, But It will Slow Down The Connection With LabVIEW
}
 
int readTemp(unsigned char numInputBytes, unsigned char* input, unsigned char* numResponseBytes, unsigned char* response)
{
    byte high_byte;
    byte low_byte;
    int myTemp;
    byte sign;
    sensors.requestTemperatures();
    myTemp=sensors.getTempCByIndex(0)*10;
    if (myTemp<0)
      {sign=1;
       myTemp=myTemp*(-1);  
    }
    else
    {sign=0;}
     high_byte=highByte(myTemp);
    low_byte=lowByte(myTemp);
    response[0]=sign;
    response[1]=low_byte;
    response[2]=high_byte;
    *numResponseBytes = 3;
    return 0;
    }

 

Die Temperatur wird als Float mit einer Nachkommastelle gemessen.
Ich habe also die gemessene Temperatur mit 10 multipliziert und in eine Integer gewandelt.
Danach habe ich überprüft, ob die Temperatur negativ ist und mir dann für dass Vorzeichen 1 oder 0 gemerkt.
zum Schluss habe ich die Temperatur in highByte und  lowByte aufgeteilt und in das Rückgabe-Array geschrieben.

In LabVIEW muss man aus den Array Werten nun nur noch die Temperatur zurückrechnen (ich habe dies in ein extra VI gepackt):

Temperaturberechnung

 

Das eigentliche VI zur Messung sieht dann so aus:

Messung VI

Und hier zum Abschluss noch das Frontpanel:

bedienfeld

Aufgabe:

Ändern Sie das Projekt dahingehend ab, dass z.B. alle 30 Sekunden eine Temperatur in ein Array gespeichert  und dieses Array dann als Signalgraph ausgegeben wird.

Hier die VIs (mit Lösung):

Dallas Sensor

2 thoughts on “Temperaturmessung mit dem Sensor DS18B20

  • Simo Simo sagt:

    Hallo,

    könnten Sie mir bitte sagen bzw. erlätern, wie ich mein Arduino mit dem NI USB-8451 anschließen kann, damit ich die Temperaturen durch 1 Wire Sensoren DS18B20 messen kann.

    Vielen Dank im Voraus

    Freundliche Grüße

    • owerner sagt:

      Hallo Simo Simo,
      Der USB-8541 von NI ist eine standalone Lösung von NI, der die Funktionalität eines Arduinos enthält. d.h. Sie könnten den DS18B20 direkt anschliessen, müssten allerdings das Kommunikationprotokoll demäß Datenblatt selbst als virtuelles Instrument implementieren (bzw. im Internet geeigneten Code finden)
      Wenn sie mit dem Arduino kommunizieren möchten, wäre das z.B, über das I2C-Protokoll möglich, das auch der USB-8541 unterstützt.Mein Arduino wird über LINX direkt vom Rechner aus gesteuert, auf dem LabView läuft.
      B.G.
      ROOT

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.