Temperaturen messen mit Arduino

Das Arduino Board verfügt über diverse Ein- und Ausgänge. Wie einfach es ist einen Temperatursensor anzuschließen und auszulesen soll hier gezeigt werden.

Als Temperatursensor kommt ein Sensor vom Typ LM35 zum Einsatz. Dieses Bauteil ist beispielsweise bei Reichelt für 3,50 Euro unter der Bestellnummer LM35CZ erhältlich. Zusätzlich wird noch ein Widerstand mit 18 K-Ohm benötigt.

Der Anschluss des Sensors ist denkbar einfach: Der linke Pin des LM35 (siehe Grafik, abgeflachte Seite des Bauteils oben) wird mit einem der Ground (GND) Anschlüsse des Boards verbunden. Der rechte Pin wird mit dem 5V Anschluss des Boards verbunden. Der mittlere Pin wird einerseits mit dem Analog In Pin 5 verbunden, als auch über einen zwischengeschalteten 18 K Widerstand mit dem GND Pin.

Der folgende Beispielcode erlaubt das Auslesen des Temperatursensors und die Ausgabe per Serial Console. Um leichte Messschwankungen auszugleichen, werden für eine Ausgabe fünf Messungen (verstellbar über die Variable runs) mit einem Zeitabstand von jeweils 20ms (Variable waittime) vorgenommen. Nach dem Übertragen des Programms auf das Arduino Board kann die Temperatur per Serial Console angezeigt werden.

/*  Mats-Vanselow.de
Temperatur auslesen mit einem Sensor

Lizenz (Deutsch): creative commons Namensnennung - Keine kommerzielle Nutzung - Weitergabe unter gleichen Bedingungen 3.0 Unported - http://creativecommons.org/licenses/by-nc-sa/3.0/deed.de
Bei Verwendung und Weitergabe des Quellcodes muss ein Verweis auf den Autor und die Webseite erfolgen. In Begleitdokumentationen ist ebenfalls in angemessener Weise dieser Verweis anzubringen.

License (English): creative commons Attribution-Noncommercial-Share Alike 3.0 Unported - http://creativecommons.org/licenses/by-nc-sa/3.0/
When using and distributing this source code a reference to the author and the web page must take place. In accompanying documents this reference must also be attached.

Code by Mats Vanselow - http://www.mats-vanselow.de

*/

int inPin = 5;          // input pin 1
float inValTotal;
int i;
int runs = 5;          // Anzahl der Durchläufe
int waittime = 20;     // ms zwischen Durchläufen
int delayVal = 1000;   // Intervall für Serial Output


void setup() {
Serial.begin(9600);
}

void loop() {
  Serial.println(getTemperatur());
    delay(delayVal);
}

float getTemperatur() {

  inValTotal = 0;
  for(i = 0;i<runs;i++){
    inValTotal = inValTotal + analogRead(inPin);
    delay(waittime);
  }

  inValTotal = inValTotal / runs / 2;
  return(inValTotal);
}

Zur Verbesserung der Messergebnisse kann die Messung über drei Sensoren des Typs LM35 erfolgen. Dazu werden zwei weitere LM35 analog zu den oben vorgestellten Anschlussplan angeschlossen, wobei diese nicht mit Analog In Pin 5 sondern mit Analog In Pin 4 bzw. Analog In Pin 3 verbunden werden.

/*  Mats-Vanselow.de
 Temperatur auslesen mit drei Sensoren

Lizenz (Deutsch): creative commons Namensnennung - Keine kommerzielle Nutzung - Weitergabe unter gleichen Bedingungen 3.0 Unported - http://creativecommons.org/licenses/by-nc-sa/3.0/deed.de
Bei Verwendung und Weitergabe des Quellcodes muss ein Verweis auf den Autor und die Webseite erfolgen. In Begleitdokumentationen ist ebenfalls in angemessener Weise dieser Verweis anzubringen.

License (English): creative commons Attribution-Noncommercial-Share Alike 3.0 Unported - http://creativecommons.org/licenses/by-nc-sa/3.0/
When using and distributing this source code a reference to the author and the web page must take place. In accompanying documents this reference must also be attached.

Code by Mats Vanselow - http://www.mats-vanselow.de

*/

int inPin = 3;          // input pin 1
int inPin2 = 4;         // input pin 2
int inPin3 = 5;         // input pin 3
float inValTotal;
int i;
int runs = 5;          // Anzahl der Durchl&auml;ufe
int waittime = 20;     // ms zwischen Durchl&auml;ufen
int delayVal = 1000;   // Intervall f&uuml;r Serial Output


void setup() {
Serial.begin(9600);
}

void loop() {
  Serial.println(getTemperatur());
  delay(delayVal);
}

float getTemperatur() {

  inValTotal = 0;
  for(i = 0;i<runs;i++){
    inValTotal = inValTotal + analogRead(inPin) + analogRead(inPin2) + analogRead(inPin3);
    delay(waittime);
  }

  inValTotal = inValTotal / 3 / runs / 2;
  return(inValTotal);
}

Eine zusätzliche Erweiterung ist die Ausgabe des Temperaturwertes als eigenständige Website anstatt per Serial Console. Dafür ist es notwendig, dass ein Arduino Ethernet Shield auf das Arduino Board aufgesteckt ist. Mit Hilfe der Variablen mac kann die Mac-Adresse und mit ip die IP-Adresse des Arduino Boards festgelegt werden. Mit den voreingestellt Werten ist der Arduino Temperatur Webserver unter der IP-Adresse 192.168.0.99 aufrufbar. Dazu muss das Arduino Ethernet Shield mit dem Netzwerk verbunden und im Browser eines ebenfalls mit dem Netzwerk verbundenen Rechner die oben genannte IP in den Browser eingegeben werden.

#include <Ethernet.h>  

/*  Mats-Vanselow.de  
* Temperatur auslesen mit drei Sensoren  
* und darstellen per Webserver  

Lizenz (Deutsch): creative commons Namensnennung - Keine kommerzielle Nutzung -
Weitergabe unter gleichen Bedingungen 3.0 Unported - http://creativecommons.org/licenses/by-nc-sa/3.0/deed.de
Bei Verwendung und Weitergabe des Quellcodes muss ein Verweis auf den Autor und die Webseite erfolgen. In Begleitdokumentationen ist ebenfalls in angemessener Weise dieser Verweis anzubringen.

License (English): creative commons Attribution-Noncommercial-Share Alike 3.0 Unported - http://creativecommons.org/licenses/by-nc-sa/3.0/
When using and distributing this source code a reference to the author and the web page must take place. In accompanying documents this reference must also be attached.

Code by Mats Vanselow - http://www.mats-vanselow.de

*/

int inPin = 3;      // input pin 1
int inPin2 = 4;     // input pin 2
int inPin3 = 5;     // input pin 3
float inValTotal;
int i;
int runs = 5;      // Anzahl der Durchl&auml;ufe
int waittime = 20;  // ms zwischen Durchl&auml;ufen

// network configuration.  gateway and subnet are optional.
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 
  192, 168, 0, 99 };
//byte gateway[] = { 10, 0, 0, 1 };
//byte subnet[] = { 255, 255, 0, 0 };
Server server = Server(80);


void setup() {

  // initialize the ethernet device
  Ethernet.begin(mac, ip);//, gateway, subnet);
  // start listening for clients
  server.begin();
}

void loop() {
  Client client = server.available();
  if (client) {
    server.print("HTTP/1.0 200 OK\r\nServer: arduino\r\nContent-Type: text/html\r\n\r\n");
    server.print("<HTML><HEAD><TITLE>");
    server.print("Arduino Temperature");
    server.print("</TITLE>");
    server.print("<meta http-equiv='refresh' content='60'>");
    server.print("</HEAD><BODY>");
    server.print(getTemperatur());
    server.print("&deg;C");
    server.print("</BODY></HTML>");    
    delay(10);
    client.stop();//close the connection with the client

  }

}

float getTemperatur() {

  inValTotal = 0;
  for(i = 0;i<runs;i++){
    inValTotal = inValTotal + analogRead(inPin) + analogRead(inPin2) + analogRead(inPin3);
    delay(waittime);
  }

  inValTotal = inValTotal / 3 / runs / 2;
  return(inValTotal);
}

Der Hersteller des LM35 gibt die Präzision mit ca. + / – 0,5°C an. Trotzdem sollte zur Präzisierung der Temperaturwerte mit einem Thermometer die reale Temperatur gemessen werden und ggf. im Code durch Addition bzw. Subtraktion der eingelesene Wert entsprechend korrigiert werden.

Durch den Anschluss von drei Temperatursensoren und die Bildung eines Durschnittswertes soll die Genauigkeit weiter erhöht werden. Die einzelnen Sensoren sollten mit etwas Abstand voneinander platziert werden, um beispielsweise Einflüsse durch Zugluft u.ä. ausgleichen zu können.

Der eingelesene Temperaturwert kann für Weiterverarbeitungen genutzt werden. Beispielsweise könnten beim Unterschreiten eines bestimmten Schwellenwertes Schaltvorgänge durch das Arduino Board ausgelößt werden.

© Mats Vanselow - Impressum / Datenschutzerklärung