TMP36 über EthernetShield zeigt hohe Temperaturen an

Hallo Bastler,
vor kurzem habe ich mir einen Arduino Uno mitsamt Ethernet Shield gekauft, damit ich die Temperatur meines Aquariums daheim messen kann.
Ich verwende für meinen Aufbau ein EthernetShield HANRUN HR91115A, einen Arduino UNO sowie den Temperatursensor TMP36. Zur Verknüpfung der Komponenten verwende ich M/M Kabel und ein Breadboard.

Ich habe mir aus verschiedenen Sketches einen eigenen erstellt, der nichts anderes machen soll, als die Temperatur auszulesen und über das Shield (welches ich per LAN an den heimischen Router angeschlossen habe) an eine Website in meinem Netz auszugeben.
Funktioniert soweit einwandfrei, lediglich die übermittelten Temperaturwerte sind viel zu hoch.
Mir werden Werte im >200°C Bereich ausgegeben.

Da ich absoluter Neuling auf dem Gebiet des Programmierens bin, hoffe ich nun hier die Lösung meines Problems finden zu können.

#include <Wire.h>                                
#include <SPI.h>
#include <Ethernet.h>

int TMP36 = A0;                                
int sensorwert;
int temperatur = 0;

byte mac[] = {
 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };           // MAC Adresse des Arduino Boards !WICHTIG! MAC Adresse darf nur einmal im Heimnetz vorkommen
byte ip[] = {
 192, 168, 2, 177 };                             // IP Adresse des Arduino Boards  !WICHTIG! IP Adresse muss manuell im Netzwerk vergeben werden, i.d.R. 192.168.x.xxx 
byte gateway[] = {
 192, 168,2, 1 };                                // Gateway Fritzbox               !WICHTIG! Auszulesen über Start -> "cmd" -> "ipconfig" -> Standardgateway
byte subnet[] = { 
 255, 255, 255, 0 };                             // Subnet Maske (optional)

 
EthernetServer server(80);                       // Port Einstellung (Standard für HTML : 80)

void setup() {
    Wire.begin();                                   // I2C als Master-BUS
    Ethernet.begin(mac, ip);                        // Ethernet initialisieren
    server.begin();                                 // Auf Clients warten

}


void loop() {
  
   sensorwert=analogRead(TMP36);                                                              // Auslesen des Sensorwertes.
   temperatur= map(sensorwert, 0, 410, -50, 150);                                             // Umwandeln des Sensorwertes mit Hilfe des "map" Befehls. 
 delay(500);
   EthernetClient client = server.available();                                                // Prüfen, ob Client Seite aufruft

      if (client) {                                                                           // Seitenaufruf durch User


 

       server.print("HTTP/1.0 200 OK\r\nServer: arduino\r\nContent-Type: text/html\r\n\r\n"); // Ausgabe in HTML
       server.print("<HTML><HEAD><TITLE>");
       server.print("Arduino Board");
       server.print("</TITLE>");
       server.print("</HEAD><BODY>");
       server.print("<h2 align=center><font size=7><b>Funduino Thermometer </b></font></h2>");
       server.print("<center><font size=5><b>Die Temperatur betr&aumlgt </font>");
       server.print(temperatur);
       server.print("<font size=5> Grad Celsius. </font");
  
       delay(10);                                                                             // Kurzer Delay, um Daten zu senden
       client.stop();                                                                         // Verbindung mit dem Client trennen
 }
 
}

Mit freundlichem Gruß

Ich verwende für meinen Aufbau ein EthernetShield HANRUN HR91115A

Diese Typenbezeichnug ist nur der RJ45 Stecker nicht ein Modell eines Ethernetshields.

Verwende die interne 1,1V ADC Referenz des Arduino.

temperatur= map(sensorwert, 0, 410, -50, 150);

Wie kommst Du auf diese Werte?

Grüße Uwe

Hallo, entschuldigt den Fehler :confused:
Ich verwende für meine Aufbau ein W1500 Ethernet Shield.
MfG

temperatur= map(sensorwert, 0, 410, -50, 150);

Wie kommst Du auf diese Werte?

Grüße Uwe

Ich habe diese Werte aus einer Anleitung übernommen.

Genau erklären kann ich ihn jedoch nicht. Kann man die Werte auch anders umwandeln, bzw. müssen die Werte überhaupt umgewandelt werden?

Hallo,

die Werte aus dem TMP36 müssen in der Tat umgerechnet werden. Ohne jetzt ins Datenblatt zu schauen meine ich mich erinnern zu können, dass dieser Baustein 1 mV/°C liefert. Dazu habe ich vor einiger Zeit eine Routine geschrieben, die genau diese Umrechnung vornimmt:

word  sens  = 0;
word  left  = 0;
word  right = 0;
float volt  = 0.0;
float temp  = 0.0;

sens  = analogRead( A0 );
volt  = ( sens /1024.0 ) *5.0;
temp  = ( volt -0.5 ) *100;
left  = floor(temp) +1;
right = round((temp -(long)temp) *10);

"left" und "right" beinhalten nach der Messung den Wert vor und (gerundet) nach dem Komma. Für welche Ausgabe-Einheit auch immer. Alternativ könnte man je nach Anforderung lediglich den ganzen °C-Wert ausgeben lassen:

void callTemp()
{
  float volt  = 0.0;
  float temp  = 0.0;
  word  sens  = 0;
  byte  left  = 0;
  byte  b     = 0;
 
  sens  = analogRead( A0 );                                           //  Sensor einlesen
  volt  = ( sens /1024.0 ) *5.0;                                      //  mV-Wert auf 5V hochrechnen
  temp  = ( volt -0.5 ) *100;                                         //  Float-Temperatur 
  left  = round(temp) +tofs[0];                                       //  Runden +Temp.Offset
  
  b = left %10;                                                       //  Wert MOD-10: Einer-Stelle
  tmpr[2] = b;  
  b = left /10;                                                       //  Wert DIV-10: Zehner-Stelle
  tmpr[3] = b;
}

"tmpr[2]" und "tmpr[3]" sind hier zwei Stellen in einem größeren (globalen) Buffer, der später an ein gemultiplextes 7-Segment-Display weitergereicht wird. Der Ausgabewert ist jedoch in diesem Fall ohne Nachkomma zu verstehen.

LG, Rudi

EDIT:
Der Wert "tofs[0]" ist ein von mir hinzugefügter Offset, weil mein Sensor im vorliegenden Fall nahe an einer kalten Hauswand steht. Das ergab immer 2..3 °C abweichende Daten. Den habe ich einfach hinzuaddiert und habe "nachvollziehbare" Messungen...

Deine Erinnerung ist verschwommen.
Der TMP36 liefert 10 mV pro °C und einen Offset von 500mV bei 0°C

Grüße Uwe

Okay, Asche auf mein Haupt :wink: aber dennoch passen die Formeln oben, denn die habe ich aus dem Handbuch zum "Starterkit" - und funktionieren optimal.