Arduino, MySQL – Temperatur-Sensoren über Webserver auslesen

In diesem Beitrag zeige ich wie man mit wenigen Mitteln einen Temperaturlogger mit Arduino basteln kann, der die ermittelten Temperaturwerte zweier ds18s20-Temperatursensoren über ein Ethernet-Shield in einer MySQL-Datenbank speichert. Außerdem zeige ich, wie man diese Werte anschließend über eine Website auslesen kann. Wie das Ganze in Aktion aussieht könnt ihr hier sehen. Ich habe für das Diagram die Charting Library von highcharts.com verwendet. Außerdem habe ich die Website über stylesheets  so angepasst dass die Ausgabe auf den verschiedenen Geräten wie PC, Tablet und iPhone angepasst dargestellt wird. Wie man Daten aus einer MySQL-Datenbank mit der HighChart Library als Chart ausgeben kann erfahrt ihr in diesem Beitrag.

Ich werde das ganze hier in mehrere Teile gliedern. Im ersten Teil zeige ich wie man die zwei Temperatursensoren mit dem Arduino verbindet und wie man den Arduino so programmiert, dass dieser die ermittelten Temperaturwerte in einem bestimmten Interval an ein php-Script übergibt. Im zweiten Teil erstellen wir die benötigte MySQL-Datenbank in der die Temperaturwerte gespeichert werden und das php-Script das durch den Arduino aufgerufen wird und das dafür zuständig ist, die vom Arduino übergebenen Temperaturwerte in der zuvor erstellten MySQL-Datenbank abgelegt  werden. Teil 3 enthält zwei kleine php-Scripts mit denen man die zuletzt gespeicherten Temperaturwerte und die Werte der letzten 12 Stunden gezielt wieder auslesen kann.

benötigte Hardware

  • 1 x Arduino
  • 1 x Ethernet-Shield
  • 2 x ds1820 Temperatursensoren
  • 1 x 4,7 kOhm Vorwiderstand für den ds18s20
  • 1 x Breadboard

Teil 1

Grundaufbau

Ich denke, hier kann ich mich kurz fassen, da dieses Thema in diesem Blog bereits behandelt wurde. (Arduino – Temperatur auslesen und auf Display ausgeben)
Wenn wir den ds18s20 Temperatursensor so halten, dass wir direkt auf die flache Seite schauen, dann wird das linke Bein mit GND und das rechte Bein mit +5V verbunden. Das rechte Bein, also +5V und das mittlere Bein, das zum digitalen Pin am Arduino geht, verbinden wir über den Vorwiderstand. Das mittlere Bein des ds18s20 wird mit Pin7 am Arduino verbunden. Der zweite Temperatursensor wird einfach dahinter angeschlossen ohne dass ein weiterer Vorwiderstand zum Einsatz kommt.

Pin-Belegung des DS1820 Temperatur-Sensors

Arduino-Sketch

/***************************************************************************************************************************            
  PROJEKT: Temperaturlogger                                                                                                 *
  Beschreibung:  Temperaturwerte von 2 ds1820 Temperatursensoren werden an ein php-Script gesendet,                         *
  dass diese Daten in eine MySQL-Datenbank schreibt,                                                                        *
                                                                                                                            *
                                                                                                                            *
  Folgende Werte müssen angepasst werden                                                                                    *
  --------------------------------------------------------------------------------------------------------------------------*
  Intervall = Zeitraum in welchen Abständen die Temperaturdaten vom Arduino zur Datenbank übertragen werden sollen,         *
  mac[] = MAC-Adresse des Ethernet Shields                                                                                  *
  ip[] = IP-Adresse über die der Arduino erreichbar sein soll.                                                              *
  server[] = IP-Adresse des Servers auf den die Daten übertragen werden sollen. herauszufinden mit ping www.domain.de       *
  host[] = Name der Domain zu der die Verbindung aufgebaut werden soll                                                      *
  url[] = Pfad und Name der Datei die für den Upload der übergebenen Daten zur Datenbank zuständig ist.                     *
  key[] = Kennwort dass mit dem Kennwort in der php-Datei übereinstimmen muss (Sicherheitsaspekt)                           *
*****************************************************************************************************************************/

#include <SPI.h>
#include <Ethernet.h>             // library for ethernet functions
#include <DallasTemperature.h>    // library for temperature sensors
#include <OneWire.h>              // library for the onewire bus

OneWire  ds(7);                         // pin für Temperatursensoren

//DeviceAdressen der einzelnen ds1820 Temperatursensoren.
DeviceAddress sensor1 = { 0x10, 0x98, 0x46, 0x57, 0x2, 0x8, 0x0, 0xF9 };
DeviceAddress sensor2 = { 0x10, 0x59, 0x4B, 0xC0, 0x1, 0x8, 0x0, 0x3E }; 

//ETHERNET-SETTINGS
byte mac[]     = { 0x5D, 0xA2, 0xFA, 0x2D, 0x76, 0x7C };    // MAC-Adresse des Arduino
//byte ip[]      = { 192, 168, 0, 99 };                     // IP-Adresse des Arduino
//byte gateway[] = { 192, 168, 178, 1 };                    // Gateway
//byte subnet[]  = { 255, 255, 255, 0 };                    // SubNet
byte server[]  = { 95, 143, 172, 134 };                     // IP-Adresse des Servers

EthernetClient client;
char host[]    = "ihrewaesche.de";	                    // Domain
char url[]     = "/ARDUINO/Temperatur/SaveTempToMySQL.php"; // Pfad zur PHP-Datei
char key[]     = "MEINPASSWORT123";	                    // Kennwort aus PHP-Datei
char c;                                                     // Variable für Rückgabe des Servers

long Interval  = 60;                                        // Upload-Interval in Minuten
DallasTemperature sensors(&ds);                                
int numSensors;                                             // Variable zum speichern der Anzahl der Temperatur-Sensoren

void setup()
{
  delay(1000);

  Serial.begin(9600); 
  Serial.flush();
  delay(200);

  Serial.println("Arduino TemperaturLogger");
  Serial.println("Ethernet initialisieren...");  

  Ethernet.begin(mac, ip);
  Interval = Interval * 1000 * 60;                            // Das in Minuten angegebene Interval in Millisekunden umrechnen
  delay(1000);	                                              // warten, bis Ethernet gestartet

  //Sensoren abfragen
  sensors.begin();
  Serial.println("Temperatur-Sensoren ermitteln...");

  numSensors = sensors.getDeviceCount();                      // Anzahl der angeschlossenen Sensoren in numSensors speichern

  if(numSensors > 0)                                          // Es wurde mindestens 1 Sensor gefunden                                        
  {
    Serial.print(numSensors);
    Serial.println( " Temperatur-Sensoren gefunden.");
  }          
  else                                                        // Es wurde kein Sensor gefunden
  {
    Serial.println("Keine Temperatur-Sensoren gefunden.");
  }
}

void loop()
{
  float temp1 = getTemperature(sensor1);                      // Temperatur von Sensor 1 ermitteln
  float temp2 = getTemperature(sensor2);                      // Temperatur von Sensor 2 ermitteln

  Serial.print("Temp1: ");
  Serial.println(temp1);
  Serial.print("Temp2: ");
  Serial.println(temp2);

  Daten_senden(temp1, temp2);                                 // Temperaturdaten an Server übertragen

  delay(700);

  byte maxReads = 10;	//Seconds
  while ((maxReads-- > 0) && client.connected())              // Antwort des Servers lesen
  {
    delay(1000);
    while (client.available())
    {
      char response = client.read();
      Serial.print(response);
    }
  }
  client.stop();
  Serial.println("Done.");
  client.flush();

  delay(Interval);
}

/******************************
                              *
  Daten an Server schickenn   *
                              *
*******************************/
void Daten_senden(float T1, float T2)
{
  if (client.connect(server, 80)) // Verbindung zum Server aufbauen
  {
    Serial.println("Verbunden, Sende Daten...");
    client.print("GET " + String(url));
    Serial.println("GET " + String(url));
    client.print("?T1=");
    Serial.print("?T1=");
    client.print(T1);
    Serial.println(T1);
    client.print("&T2=");
    Serial.print("&T2=");
    client.print(T2);
    Serial.println(T2);
    client.print("&key=" + String(key));
    Serial.print("&key=" + String(key));
    client.println(" HTTP/1.1");
    Serial.println(" HTTP/1.1");
    client.print("Host: " + String(host));
    Serial.print("Host: " + String(host));
    client.println();
    Serial.println();
    client.println("User-Agent: Arduino");
    Serial.println("User-Agent: Arduino");
    client.println("Connection: close");
    Serial.println("Connection: close");
    client.println();
    Serial.println();
  }
  else
  {
    Serial.println(" ***** VERBINDUNG KANN NICHT HERGESTELLT WERDEN *****");
  }
}

/*************************************
                                     *
  Temperatur der Sensoren auslesen   *
                                     *
*************************************/
void writeTimeToScratchpad(byte* address)
{
  ds.reset();
  ds.select(address);
  ds.write(0x44,1);
  delay(1000);
}

void readTimeFromScratchpad(byte* address, byte* data)
{
  ds.reset();
  ds.select(address);
  ds.write(0xBE);
  for (byte i=0;i<9;i++)
  {
    data[i] = ds.read();
  }
}

float getTemperature(byte* address)
{
  int tr;
  byte data[12];

  writeTimeToScratchpad(address);

  readTimeFromScratchpad(address,data);

  tr = data[0];

  if (data[1] > 0x80)
  {
    tr = !tr + 1; //two's complement adjustment
    tr = tr * -1; //flip value negative.
  }

   int cpc = data[7];
   int cr = data[6];

   tr = tr >> 1;

   return tr - (float)0.25 + (cpc - cr)/(float)cpc;
}

Bevor Sie dieses Sketch auf Ihren Arduino übertragen, denken Sie bitte daran, folgende Werte anzupassen.

  • Device-Adressen Ihrer ds18s20 Temperatursensoren. (DeviceAdressen ermitteln)
  • MAC-Adresse Ihres Ethernet-Shields.
  • IP des Webservers auf dem die MySQL-Datenbank läuft (kann mit ping www.adresse.de ermittelt werden)
  • host (Name der Domain auf der die MySQL-Datenbank installiert ist)
  • url (Pfad zur Datei SaveTempToMySQL.php)
  • key (Passwort das in der Datei SaveTempToMySQL.php als KEY angegeben wurde)

Die Werte für ip, gateway und subnet habe ich auskommentiert da diese in diesem Beispiel nicht benötigt werden. Wenn wir später einmal über die Website auf den Arduino zugreifen wollen um z.B. gezielt die aktuelle Temperatur anzufordern, brauchen wir die ip des Arduinos die man unter ip definieren kann.

Wenn Sie also alles angepasst und das Sketch zum Arduino übertragen haben, können wir uns an die Programmierung der php-Seite machen, die für das Speichern der Temperaturwerte in der MySQL-Datenbank vorgesehen ist. Am besten erstellen Sie einen neuen Ordner in dem Sie alle Daten die wir für dieses Projekt benötigen ablegen. In meinem Fall heißt der Ordner ARDUINO.

Teil 2

Anlegen der MySQL-Datenbanktabelle

Es gibt verschiedene Wege eine MySql-Datenbanktabelle anzulegen. Hier werde ich den Weg über phpmyadmin gehen da nicht jeder mit dem Terminal vertraut ist.

Öffnen Sie also phpmyadmin auf dem Server und vergewissern Sie sich dass Sie in der richtigen Datenbank sind, falls Sie mehr als eine Datenbank zur Verfügung haben. Sie können nun von Hand eine neue Datenbanktabelle anlegen, indem Sie, je nach phpmyadmin-Version, auf den entsprechenden Link oder Button klicken und anschließend den Namen der neuen Datenbanktabelle eingeben. Alternativ können Sie auch oben auf SQL klicken und  folgendes Script verwenden. Dazu einfach das Script in das Code-Fenster eingeben und auf OK klicken.

CREATE TABLE IF NOT EXISTS `arduino_temperaturen` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `datumzeit` datetime NOT NULL,
  `temp1` float(10,2) NOT NULL,
  `temp2` float(10,2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci;

SaveTempToMySQL.php

<?php
/***********************************************************************************
  Autor:   Enrico Sadlowski                                                        *
  Kontakt: profwebapps@gmail.com                                                   *
                                                                                   *
  PROJEKT: Arduino-MultiSensor-Temperatur-Ueberwachung                             *
  -------------------------------------------------------------------------------  *
                                                                                   *
  Arduino ruft dieses Script auf, uebergibt Innen- und Aussentemperatur            *
  (TI und TA) sowie einen Key (key), der mit dem hier angegebenen Key              *
  identisch sein muss.                                                             *
  Wenn der Key identisch ist und beide Temperaturwerte uebergeben wurden,          *
  werden die Temperaturwerte und das aktuelle Datum in der Datenbank gespeichert.  *
                                                                                   *
***********************************************************************************/

define("KEY","MEINPASSWORT123");

include("../inc/db.inc.php");

if(isset($_GET['key']))
{
  if($_GET['key'] == KEY)
  {
    if(isset($_GET['T1']) && isset($_GET['T2']))
    {
      $TEMP1 = mysql_real_escape_string($_GET['T1']);
      $TEMP2 = mysql_real_escape_string($_GET['T2']);
      $DATUM = date("Y-m-d H:i:s");

      $result = mysql_query("INSERT INTO arduino_temperaturen (datumzeit, temp1, temp2) 
              VALUES('".$DATUM."', '".$TEMP1."', '".$TEMP2."') ") or die(mysql_error());

      if(mysql_affected_rows() == 1)
      {
        $result = "Temperaturwerte gespeichert";
      } else $result = "Fehler beim speichern der Daten in der MySQL-Datenbank";
    } else $result = "Keine Temperaturwerte übergeben";
  } else $result = "Falscher Key";
} else $result = "Kein Key übergeben";

print_r($result);
?>

Damit die Datei SaveTempToMySQL.php eine Verbindung zur MySQL-Datenbank aufbauen kann, benötigen wir die Datei db.inc.php die wir im Unterverzeichnis inc abspeichern.

inc/db.inc.php

<?php
define('DB_SERVER',"localhost");
define('DB_NAME',"DATENBANKNAME");
define('DB_USER',"DATENBANKUSER");
define('DB_PASSWORD',"DATENBANKPASSWORT");

$conn = mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD);
if(is_resource($conn))
{
  mysql_select_db(DB_NAME, $conn);
  mysql_query("SET NAMES 'utf8'", $conn);
  mysql_query("SET CHARACTER SET 'utf8'", $conn);
}
?>

Die durch den Arduino in der MySQL-Datenbank gespeicherten Werte kann man nun nach Belieben auslesen. Ich möchte jetzt nicht ins Detail gehen wie man mit StyleSheets die Ausgaben schön formatiert oder wie man die Daten in einem animierten Diagram ausgeben kann, denn das würde den Rahmen hier sprengen. Ich werde zwei Beispiele aufzeigen wie man die Daten auslesen kann. Im ersten Beispiel zeige ich, wie man die zuletzt gespeicherten Werte ganz normal als Text ausgibt. Im zweiten Beispiel werde ich die Werte der letzten 12 Stunden ausgeben. Beide Beispiele, wie gesagt, ohne irgendwelche besonderen Formatierungen.

Teil 3

Auslesen der zuletzt gespeicherten Werte

<?php
/***********************************************************************************
  Autor:   Enrico Sadlowski                                                        *
  Kontakt: profwebapps@gmail.com                                                   *
                                                                                   *
  PROJEKT: Ausgabe des durch den ARDUINO zuletzt generierten Temperaturwertes      *
                                                                                   *
***********************************************************************************/

include("../inc/db.inc.php"); 

$q_data  = mysql_query("SELECT DATE_FORMAT(datumzeit,'%d.%m.%Y') AS DATUM, DATE_FORMAT(datumzeit,'%H:%i') AS ZEIT, temp1, temp2 
                        FROM arduino_temperaturen ORDER BY datumzeit DESC LIMIT 1") or die(mysql_error());
if(mysql_num_rows($q_data) > 0)
{
  $r_data = mysql_fetch_array($q_data);
  $DATUM  = $r_data['DATUM'];
  $temp1  = number_format($r_data['temp1'], 2, '.', '');
  $temp2  = number_format($r_data['temp2'], 2, '.', '');
  $ZEIT   = $r_data['ZEIT']; 
}
else
{
  $E = 1;
  $M = "Es wurden keine Temperaturwerte in der Datenbank gefunden!";
}
?>

<!DOCTYPE HTML>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <meta name="viewport" content="user-scalable=yes, width=device-width"> 
  <title>ARDUINO - Aktuelle Temperatur</title>
</head>
<body>

<?php 
//Wenn Daten in der Datenbank gefunden wurden, diese ausgeben
if(!isset($E)) 
{
?>
  <h2>Letzter gespeicherter Temperatur-Messwert</h2>
  <h3><?php echo $DATUM.", ".$ZEIT." Uhr";?></h3>
  Innen: <?php echo $temp1;?>°C<br />
  Außen:<?php echo $temp2;?>°C
<?php            
} 
else 
{
// Meldung ausgeben wenn noch keine Daten in der Datenbank stehen 
  echo $M;
}
?>   

  </body>
</html>

 

Auslesen der Daten der letzten 12 Stunden

<?php
/********************************************************************************************
  Autor:   Enrico Sadlowski                                                                 *
  Kontakt: profwebapps@gmail.com                                                            *
                                                                                            *
  PROJEKT: Ausgabe der durch den Arduino generierten Temperaturwerte der letzten 12 Stunden *
                                                                                            *
********************************************************************************************/
?>

<!DOCTYPE HTML>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <meta name="viewport" content="user-scalable=yes, width=device-width"> 
  <title>ARDUINO - Aktuelle Temperatur</title>
</head>
<body>

<table>
  <tr>
    <td width="120">Datum</td>
    <td width="120">Zeit</td>
    <td width="120">Innen</td>
    <td width="120">Außen</td>
  </tr>

<?php
include("../inc/db.inc.php"); 

$q_data  = mysql_query("SELECT DATE_FORMAT(datumzeit,'%d.%m.%Y') AS DATUM, DATE_FORMAT(datumzeit,'%H:%i') AS ZEIT, temp1, temp2 FROM arduino_temperaturen WHERE `datumzeit` >= date_sub(now(), interval 12 hour) AND `datumzeit` <= now()  GROUP BY DATE_FORMAT(datumzeit, '%Y-%m-%d %H') ORDER BY datumzeit DESC") or die(mysql_error());
if(mysql_num_rows($q_data) > 0)
{
  while($r_data = mysql_fetch_array($q_data))
  {
    echo "<tr>\n";
    echo "  <td>".$r_data['DATUM']."</td>\n";
    echo "  <td>".$r_data['ZEIT']."</td>\n";
    echo "  <td>".number_format($r_data['temp1'], 2, '.', '')."°C</td>\n";
    echo "  <td>".number_format($r_data['temp2'], 2, '.', '')."°C</td>\n";
    echo "</tr>\n";
  }
}
else
{
  $E = 1;
  $M = "Es wurden keine Temperaturwerte in der Datenbank gefunden!";
}
?>

    </table>
  </body>
</html>

 

Die Arduino-Plattform bietet nicht nur eine sofort und sehr universell einsetzbare, komplette Mikrocontroller-Konfiguration, sondern auch eine besonders einfach erlernbare Programmierung auf einer eigenen, kostenlos via Internet verfügbaren Entwicklungsplattform.

Über Enrico S.

Programmierer, Webdesigner, Grafiker, Blogger, Screencaster, Arduino- und eMobility Enthusiast.

80 Kommentare zu “Arduino, MySQL – Temperatur-Sensoren über Webserver auslesen

  1. Super Website. Womit ist die Grafik erstellt worden. Möchte bei mir etwas ähnliches darstellen, nur nicht die Temperatur sondern gemessene Stromwerte mit einem Arduino.
    Ist es möglich den Code zu bekommen?

  2. Wirklich gut gemacht !
    Viele (NEIN – SEHR viele) Arduino Projekte werden im WorldWideWeb angefangen, 1000 Beiträge heiße Luft UND dann nicht am Ende komplett ins Netz gestellt. Bei dieser Art kann noch so mancher „Arduino Neuling“ was lernen.

    Das ist der richtige Weg!
    MfG Thomas

    • Vielen Dank für das Lob, so etwas hört man gern, nur viel zu selten.
      Ich versuche diesem Standard treu zu bleiben.

      Wenn Du Wünsche oder Anregungen hast was ich noch veröffentlichen könnte oder was Du hier gern lesen würdest, dann immer her damit!

  3. Hallo,
    tolle Seite und tolle Projekte !!

    Ich habe aber eine Frage, ich versuche gerade das o.Projekt nach zumachen, aber ich scheitere irgendwie an der Datenbank…
    Wie lege ich denn die Datenbank, damit der Arduino die Messwerte eintragen kann ?
    Bin auf dem Gebiet absoluter Neuling.
    Ich habe hier eine Synology DS111
    – PHPmyAdmin 3.5.3
    – MySQL Software-Version: 5.1.49
    – Apache/2.2.21 (Unix) PHP/5.3.6
    Datenbank-Client Version: libmysql – 5.1.49
    PHP-Erweiterung: mysqli

    Vielen Dank für Deine Hilfe

    Gruß
    Stean

    • Eine Datenbank sowie eine Datenbanktabelle kannst Du am einfachsten, wenn Du Dich mit MySQL nicht auskennst, mit phpmyadmin anlegen.
      Datenbank anlegen sollte klar sein, ist nur ein Klick.

      Datenbanktabelle anlegen ist auch nicht viel schwerer.
      Gehe dazu in die eben erstellte Datenbank und klicke oben auf SQL!
      Gib folgenden Code ein und bestätige mit OK!

      CREATE TABLE IF NOT EXISTS `arduino_temperaturen` (
      `id` bigint(11) NOT NULL AUTO_INCREMENT,
      `datumzeit` datetime NOT NULL,
      `temp1` float(10,2) NOT NULL,
      `temp2` float(10,2) NOT NULL,
      PRIMARY KEY (`id`)
      ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci;

      Zum Schluss noch die Datenbank-Zugangsdaten Deiner Datenbank im PHP-Script anpassen.

    • Hallo Cetax, ich habe den Blogbeitrag nun dahingehend erweitert dass dabei steht wie man die Datenbanktabelle anlegt. Bei weiteren Fragen kannst Du Dich gern wieder melden.

  4. Hi,
    Super vielen Dank!
    Hat geklappt, nun habe ich es auch verstanden… ;-)
    Läuft…

    Danke für die schnelle Hilfe !!

  5. Hallo,
    schade , doch zu früh gefreut. Ich bekomme immer eine Fehlermeldung.
    Im Serial_Monitor des Arduino steht folgendes:

    Warning: include(inc/db.inc.php): failed to open stream: No such file or directory in /volume1/web/Arduino/Temp/SaveTempToMySQL.php on line 19

    Warning: include(): Failed opening ‚inc/db.inc.php‘ for inclusion (include_path=‘.:/usr/syno/php/lib/php‘) in /volume1/web/Arduino/Temp/SaveTempToMySQL.php on line 19
    No database selectedDone.

    Hier mal meine Dateien, vieleicht kannst du ja mal drauf schauen und mir sagen warum es nicht klappt.

    Danke dir
    Sketch:
    https://dl.dropbox.com/u/80052077/Temp_Messung/Temp_SQL_PHP.ino
    SerialFehlermeldung:
    https://dl.dropbox.com/u/80052077/Temp_Messung/Serial_Fehler.txt
    https://dl.dropbox.com/u/80052077/Temp_Messung/SaveTempToMySQL.php
    https://dl.dropbox.com/u/80052077/Temp_Messung/db.inx.php

    • Die Fehlermeldung sagt es doch schon. Die Datei SaveTempToMySQL.php findet die Datei inc/db.inc.php nicht.
      Einfach den Pfad überprüfen und auf die Schreibweise der Daten achten. Du hast anstatt db.inc.php, db.inx.php stehen.

  6. Oh man wie peinlich….
    Vielen Dank,wer lesen kann, ist klar im Vorteil…

    Danke , jetzt speichert er die Werte.
    Nochmal ein riesen Dankeschön !!!

  7. Hallo und ein frohes neues Jahr.

    Ich habe diese Schaltung nachgebaut.
    Soweit funktioniert das auch. Nur leider liefern meine (6 Stk) DS18B20 alle ein viel höheres Ergebnis als tatsächlich vorhanden.

    Hier ein Beispiel …

    Temperaturwerte gespeichertDone.
    Temp1: 44.31
    Temp2: 46.56
    Verbunden, Sende Daten…
    GET /arduino/SaveTempToMySQL.php
    ?T1=44.31
    &T2=46.56
    &key=2902 HTTP/1.1
    Host: localhost
    User-Agent: Arduino
    Connection: close

    —————————————————–
    Gibt es eine Möglichkeit einen Wert in der MySql in einer zusätzlichen Spalte zu hinterlegen, welcher vor der Speicherung in der Datenbank vom übergebenen Wert abgezogen wird und somit die echte Temperatur speichert? So eine Art manuelle Kalibrierung.

    Vielen Dank Vorab …
    Thomas Berger

    • Sicher ist das möglich,ist nur die Frage ob das auch sinnvoll ist.
      Was hast du für einen Widerstand benutzt? Es muss ja einen Grund haben das der Wert zu hoch ist.

  8. Nun, zahlreiche Tutorials gehen von 4K7 aus, deine Schaltung geht von 10kOhm.
    Die Meßergebnisse sind die gleichen …

    Widerstand – 4K7
    ?T1=46.50
    &T2=47.63

    Widerstand 10K
    ?T1=46.50
    &T2=47.63

    Gruß Thomas

    • Ah ich sehe wo das Problem liegt. Das Script ist für den ds18s20 nicht für den ds18b20. Ich habe irgendwo noch ein Script für beide Typen rumliegen.
      In welchem Temperaturbereich willst Du messen, auch Minusgrade?
      Sorry dass ich das nicht explizit dazu geschrieben habe.

  9. Nene … jetzt wo Du es sagt fällt mir erst auf dass Du den „S“-Typen verwendest !
    Logisch das da nichts richtiges raus kommt …

    Ich habe die DS18B20 geschickt bekommen.
    Der Verkäufer hatte die als „DS1820“ deklariert …

    Ich habe mir jetzt erst einmal damit geholfen das Arduino-Skript mit Werten zu erweitern .. Ich weiß dass das nicht richtig ist, jedoch brauchte ich für meinen heutigen Tests die einiger massen richtigen Werte …

    float temp1 = getTemperature(sensor1)-18.67; // Temperatur von Sensor 1 ermitteln
    float temp2 = getTemperature(sensor2)-18.55; // Temperatur von Sensor 2 ermitteln

    Gruß Thomas

  10. Wo liegen den die Unterschiede in der Sketch-Programmierung zwischen DS18S20 und DS18B20 ? In der DallasTemperature.h sind doch meiner Meinug#ng nach die Varianten berücksichtigt und sollten alle gleich angesteuert werden können !?

    Vorab Danke und ein schönes Wochenende !!
    Thomas

  11. Wenn es mit einem Script Möglich ist, PLUS und Minus zu messen, dann natürlich auch den Minusbereich, da ich einen Sensor gerne außen am Fenster installieren möchte.

    Gruß Thomas !

  12. Hallo,

    ich probier gerade den webserver aus. Leider klappt bei mir das Schreiben der SQL Datenbank überhaupt nicht.
    Ich nutze kilu.de als hoster. Dort habe ich die Datenbank über phpmyAdmin erstellt.
    Jetzt stehe ich vor der Frage welche IP Adressen ich vergebe. Ich hänge mit meinem Laptop an einem öffentlichen Netzwerkkabel der Uni, daran betreibe ich einen Switch um das Signal zu verteilen. Soll ich den Arduino auch eine Adresse in dem 129.241.129…. geben? Welche Server ip stelle ich ein?

    Außerdem:
    – host ist bei mir kilu.de, ist die Eingabe so richtig?
    – url ist die Pfadangabe auf dem FTP server? also bei mir /data/multiserv/users/1046235/projects/2362856/www/inc/index.php
    – key muss ich in allen php files einstellen und ist gleichzusetzen mit dem Userpasswort von kilu.de?

    Ich freue mich sehr, wenn ihr mir antwortet. Ich habe schon ein paar Nächte herumexperimentiert ohne Ergebnisse:(

    • Hallo,

      hättest Du doch erst mal die Kommentare ganz oben gelesen. Da steht z.B. wie Du die IP herausfindest. Mit ping http://www.kilu.de erhältst Du die IP 188.40.138.148.

      $key musst Du nur in der SaveTempToMySQL.php eingeben da diese die Temperaturwerte in der Datenbank speichert.

      $url ist nicht die Pfadangabe auf dem Server so wie Du es angegeben hast.
      /data/multiserv/users/1046235/projects/2362856/www/ ist Dein Rootverzeichnis. Wenn Du die Daten über ein FTP-Programm also direkt da ablegst dann musst Du keinen Pfad sondern nur SaveTempToMySQL.php angeben.

      Ein Pfad wäre nur nötig wenn Du einen Unterordner anlegst in dem Du die Daten für dieses Projekt speichern willst. In meinem Fall habe ich alles im Ordner /ARDUINO/Temperatur/ gespeichert.

  13. Halloechen. Cooles tutorial, habe es abgeändert, damit es mit meinen 18B20 Sensoren funktioniert und die Anzahl Sensoren automatisch ausliest, die Definition der Sensoradressen ist somit nicht mehr nötig. Eine Frage: Hast Du eventuell diese wunderschönen Charts irgendwo als Vorlage hinterlegt? Danke und Gruss

    • Hallo,
      wie genau hast Du das denn gemacht dass Du die Sensoradressen nicht mehr eingeben brauchst?

      Als Vorlage habe ich diese Charts nicht, aber ich kann einen Beitrag veröffentlichen in dem ich zeige wie man diese Art Charts installiert, einrichtet und die Daten aus einer MySQL-Datenbank auslesen und visualisieren kann.

    • Halloechen nochmals.
      Super schnelle Antwort cool :) Ich habe auch mal angefangen, mit jquery und highcharts, blicke aber da noch nicht wirklich durch, vor allem das parsen der einzelnen daten…

      ich sende Dir heute Abend den Code für die 18B20 sowie das automatische „finden“ der Sensoren. Habe nichts selber programmiert, sondern verschiedene code Schnipsel kombiniert. Das einzige was ich jetzt noch nicht geschafft habe, ist auch die einzelnen Temperaturwerte „automatisch“, d.h. je nach Anzahl Sensoren, auszulesen, das ist noch hardcoded und wenn ein neuer Sensor dazu kommt muss ich eine zusätzliche Zeile einfügen…

      Sobald ich Zuhause bin sende ich Dir den Code zu.

      Ein Tutorial bezüglich den obigen Grafiken wäre natürlich der Oberhammer.

      Danke und Gruss

  14. Hallo profwebapps,

    danke für die schnelle Hilfe. Ich habe deine Ratschläge befolgt, jedoch steck ich wieder fest.

    Hier mal die Fehlerangabe nach Aufruf der Webseite.

    Warning: include(/db.inc.php) [function.include]: failed to open stream: No such file or directory in /data/multiserv/users/1046235/projects/2362856/www/SaveTempToMySQL.php on line 19

    Warning: include() [function.include]: Failed opening ‚/db.inc.php‘ for inclusion (include_path=‘.:/usr/lib/php‘) in /data/multiserv/users/1046235/projects/2362856/www/SaveTempToMySQL.php on line 19
    Kein Key übergeben

    Dazu mein arduino Quellcode:
    byte mac[] = { 0x5D, 0xA2, 0xFA, 0x2D, 0x76, 0x7C }; // MAC-Adresse des Arduino
    byte ip[] = { 192, 168, 0, 99 }; // IP-Adresse des Arduino
    //byte gateway[] = { 192, 168, 178, 1 }; // Gateway
    //byte subnet[] = { 255, 255, 255, 0 }; // SubNet
    byte server[] = { 176, 9, 149, 168 }; // IP-Adresse des Servers//herman.24.nl

    EthernetClient client;
    char host[] = „www.herman.24.nl“; // Domain
    char url[] = „www/SaveTempToMySQL.php“; // Pfad zur PHP-Datei
    char key[] = „ch5fn7sb“; // Kennwort aus PHP-Datei
    char c; // Variable für Rückgabe des Servers

    Ich weiß irgendwie nicht mehr weiter. Was mache ich falsch? Ich habe alle IP adressen die gegeben waren ausgetauscht. Erst http://www.kilu.de, dann www5.subdomain.com und als Letztes http://www.herman.24.nl. Nichts hat geholfen.

    Kann ich eventuell mit meiner privaten Adresse gar nicht auf äußere Adressen zugreifen?

    Bitte um Hilfe

    Grüße aus NO

    • Probiere mal anstatt

      char url[] = “www/SaveTempToMySQL.php”; // Pfad zur PHP-Datei

      einfach nur

      char url[] = “SaveTempToMySQL.php”; // Pfad zur PHP-Datei

      dann sollte es gehen

    • Halloechen nochmals :)

      es ging darum, dir den sketch zu zeigen, wie die Temperatursensoren nicht einzeln adressiert werden müssen. Sorry irgendwie habe ich den falschen Kommentar erwischt. Soweit ich weiss, kann ich hier ja keinen Code einfügen der dann auch einfach ersichtlich ist…

      Gruss

  15. Super Infos, klappt bei mir ausgezeichnet.

    Aber da ich PHP und SQL-Neuling bin ein Frage zum Anzeigen auf der Website:
    Bei der Variante mit dem Auslesen der letzten 12 Stunden sehe ich nur wenige Werte (zur Zeit schreibe ich alle 5 Minuten in die Datenbank.
    Angezeigt werden die Werte im stündlichen Abstand.

    Wie kann ich das zweite Beispiel ändern, dass ich:

    1. ALLE Werte der letzen X Stunden sehe (das müsste ja mit “ interval X hour “ gehen aber eben alle Werte). In welchem Teil steckt die Anweisung dass er stündliche Werte nehmen soll?

    2. Pauschal genau X Werte angezeigt bekomme (z.b. 30 Werte nach Datum sortiert…)?

    Danke schonmal, ist ein ausgezeichnetes Tutorial!

    Gruß,
    Andi

    • Hallo Andi,
      Danke für Dein Lob.
      In dieser Zeile findest Du die Angabe was alles geladen werden soll.

      $q_data = mysql_query(„SELECT DATE_FORMAT(datumzeit,’%d.%m.%Y‘) AS DATUM, DATE_FORMAT(datumzeit,’%H:%i‘) AS ZEIT, temp1, temp2 FROM arduino_temperaturen WHERE `datumzeit` >= date_sub(now(), interval 12 hour) AND `datumzeit` <= now() GROUP BY DATE_FORMAT(datumzeit, '%Y-%m-%d %H') ORDER BY datumzeit DESC") or die(mysql_error());

  16. Konkret musst Du dieses hier ändern:

    GROUP BY DATE_FORMAT(datumzeit, ‚%Y-%m-%d %H‘)

    in

    GROUP BY DATE_FORMAT(datumzeit, ‚%Y-%m-%d %H:%i‘)

    Dann wird, soweit ich das verstanden habe, nicht nur auf die volle Stunde gefiltert, sondern auf Minute, somit dann alle minütlichen Werte der letzten 12 Stunden…

    Gruss

  17. Hallo allerseits,

    ich habe das Arduino script auch als Vorlage für meine Auswertung der Heizungstemperaturen genommen. Ich habe im moment ein Problem wo ich nicht drauf komme. Die Temperatur zeigt Grunsätzlich -1.25 an egal welchen Sensor ich anschliesse.
    Denk der Fehler muss irgendwo im Bereich * Temperaturen der Sensoren auslesen * sein

    Weiss jemand wie ich das beheben kann bzw. hatte jemand schon mal ein ähnliches Problem? Die Adressen gibt er mir aus wenn ich mit einem anderen Script suchen lasse, somit schliesse ich mal einen Hardwarefehler aus.(bei 10 Sensoren wäre es komisch).

    Des weiteren hab ich noch ein kleines Problem mit der IP des Servers. Da ich an einem dyndns.org hänge wechselt die Adresse ja somit ist das manuelle ping nutzlos….Solange ich „im Haus bin“ kein Problem…

    Auf jeden Fall mal Danke für die tolle Seite. Ich find es einfach cool so können Andere leichter lernen.

    Gruß Andy

    • Hallo Andy, benutzt Du ds18s20 oder ds18b20 Sensoren?
      Dieses sketch habe ich nur für den ds18s20 geschrieben. Ich kann aber gern mal ein sketch zur Verfügung stellen mit dem man beide Sensorarten gleichermaßen auslesen kann.

    • Laut Reichelt wo ich sie bestellt hab sind es DS18S20. Er erkennt sie auch als diese. -> addr[0] != 0x10

    • ds18s20 so hab ich zumindest bei Reichelt gekauft. Wenn ich die Adressen auslese siehts auch danach aus :-D

  18. Hallo Enrico und Andy

    Also ich hatte ja auch das Problem mit den ds18b20 Sensoren, aber da hatte ich nicht -1.25 als Standartwert, sondern verschiedene Werte, die einfach nicht korrekt umgerechnet worden sind. Wenn überall -1.25 steht, ist unter Umständen der Fehler auch woanders…

    Das mit der IP-Adresse kapier ich nicht ganz, wo liegt da genau das Problem ? Was meinst Du mit manuellem Ping ?

    Gruss

    • Ich habe eine Dynamische Adresse am Server.. die ändert sich ein paar mal am Tag. Somit kann ich dem Arduino keine Feste IP des Servers zuweissen, ausser ich bin im lokalen Netzwerk mit dem Arduino. Dann gehts natürlich über 192.168.2.110 oder so was ähnliches.

  19. Hallo Enrico
    bekomme die übergabe der werte zu meinen webserver nicht hin:
    raspberry http://www.forum-raspberrypi.de/Thread-tutorial-raspberry-pi-als-webserver-phpmyadmin-installation
    Arduino TemperaturLogger
    Ethernet initialisieren…
    Temperatur-Sensoren ermitteln…
    5 Temperatur-Sensoren gefunden.
    Temp1: 71.62
    Temp2: 71.69
    Verbunden, Sende Daten…
    GET /ARDUINO/Temperatur/test.php
    ?T1=71.62
    &T2=71.69
    &key=1500 HTTP/1.1
    Host: 192.168.2.23
    User-Agent: Arduino
    Connection: close

    HTTP/1.1 200 OK
    Date: Sun, 23 Mar 2014 19:36:21 GMT
    Server: Apache/2.2.22 (Debian)
    X-Powered-By: PHP/5.4.4-14+deb7u8
    Vary: Accept-Encoding
    Content-Length: 66
    Connection: close
    Content-Type: text/html

    Access denied for user ‚www-data’@’localhost‘ (using password: NO)Done.
    Weiß lieder nicht mehr weiter. Mein Dank
    ali

    • Hallo,
      die Fehlermeldung lässt aber darauf schließen dass die Verbindung zur Datenbank nicht zustande kam. Das kannst Du ganz leicht testen indem Du die test.php mal direkt im Browser aufrufst. Entferne vorher die Abfragen ob der Key und eine Temperatur usw. übergeben wurden und gib Einen Text aus.

  20. das habe ich nun bekommen, nach dem ich die ersten beiden abfragen entfernt habe:

    Keine Temperaturwerte uebergeben

  21. Ich habe genau das gleiche Problem, dachte erst es liegt an dem User ‚www-data‘ nachdem ich diesem in der mySQL Datenbank root rechte gegeben habe kam immer wieder der Fehler: No database selected
    Wenn einer eine Lösung hat, wäre ich dankbar!

    • Ich nehme mal an Du hast die neueste php version installiert?
      So wie ich das sehe wird da neuerdings der Zugriff auf die Datenbank per mysqli vorausgesetzt.

  22. Hallo,
    ich bin leider was MySql angeht ziemlicher Neuling. Wenn ich bei Teil 2 die Datenbanktabelle per Script eingeben will kommt die Meldung „Formular ist leer“
    Und wie erzeuge ich und Speicher ich die benötigten php dateien?

    Vielen dank für die Hilfe

    gruß

    Thorsten

    • Hallo, also php-Dateien werden genauso erstellt wie Textdateien nur dass die Extension nicht txt sondern php ist.

      Die Datenbanktabellen brauchst Du auch nicht mit php zu erstellen sondern das kannst Du direkt in phpMyAdmin machen. In Teil 2 erkläre ich ja genau wie das geht.

  23. HTTP/1.1 200 OK
    Date: Fri, 27 Jun 2014 10:58:15 GMT
    Server: Apache
    Vary: Accept-Encoding
    Connection: close
    Transfer-Encoding: chunked
    Content-Type: text/html; charset=UTF-8

    14
    No database selected
    0

    Done.

    Ich habe eigentlich alles eingerichtet, hat bitte jemand einen Tipp?

  24. Hallo zuerst mal,

    super Projekt, hab allerdings einige Problem. Da ich nicht wirklich viel mit php und mysql Programierung am Hut habe liegst wohl an mir, wäre aber trotzdem für Hilfe dankbar.

    gibt es schon angepasste Skripte für die neueste PHP Versionen, da die mysql_ Befehle Fehler bringen und durch mysqli_ oder PDO ersetzt werden sollen. nur leider komme ich damit nicht klar.

    Gruß
    Martin

    • Hallo Martin,

      gib doch mal in die Suche mysqli ein, dann findest Du diesen Beitrag.

      Da habe ich erklärt wie man mit mysqli den Datenbankzugriff handelt.

  25. Hallo,

    super, danke für den Hinweis, funktioniert prima.

    Gruß
    Martin

  26. Hallo,

    gibts für die anderen PHP scripte auch schon irgendwo an den euen PHP Syntax angepasste scripte?

    ich bekomme es leider nicht hin, dazu kenne ich mich zu wenig mit PHP und MYSQL aus, sorry

    Gruß
    Martin

  27. ok, kein problem,

    aber hätte trotzdem noch ne Frage, in den kommentaren hab ich was gefunden, dass auch ds18b20 ausgelesen werden können, ist das im script mit drin und werden die dann auch automatisch erkanntß ich bekomme nämlich immer viel zu hohe Temperaturen

  28. Hey,
    ich lege echt die Ohren an. Super Beschreibung! Ausbaufähig und klasse gemacht!
    Danke für die Veröffentlichung dieses Themas!

    Gruss
    Christian

  29. Hallo,
    ich bin am ändern um meine 9 DHT22 Werte in eine SQLite DB zu übertragen.
    Bei der Zeite „Daten_senden (t1,h1,t2,h2,……) bekomme ich aber immer die Fehlermeldung „Daten_senden was not declared in this scope“.
    Bitte um Hilfe.
    LG
    Wolfgang

  30. Hallo Enrico
    Vielen Dank für die detaillierten Projektbeschreibungen! Die dargestellen Lösungen treffen genau den Ansatz ein ähnliches Projekt unzusetzen.
    Da ich in Sachen PHP, HTML und SQL bisher nur Grundkenntnisse besitze möchte ich das das Projekt wie oben verlinkt unter „http://msp-eichstaett.de/ARDUINO/“ gerne als „blueprint“ verwenden und nur leicht verändern. Besteht die Möglichkeit die entsprechenden Files ebenfalls zu veröffentlichen?

    Vielen Dank nochmals auch für die anderen Arduino-Tutorials!
    Grüße
    Tobias

  31. Hallo,
    super Projekt, alles funktioniert bestens und ist sehr gut dokumentiert. Ich habe 20 Temperaturfühler angeschlossen, alle werden in der Datenbank (Xampp) korrekt abgespeichert, kann sie auch am Bildschirm (Text) anzeigen. Mit Highchart kann ich leider nur 2 Serien anzeigen. Erhöhe ich den Wert Numsensors auf 3, so bleibt der Bildschirm weiß.

    Gruss
    Gerhard

  32. Hallo an alle,
    im arduino-forum bin ich noch auf ein weiteren sketch gestossen. Diesen habe ich auf meine Bedürfnisse angepasst, und er scheint ohne Ausfälle zu funktionieren.
    Hier ist der Code für das Arduino-Board, alle weiteren files aus Teil2 und Teil3 können weiter benutzt werden.
    Gruss Enrico

    /* Code-Quelle http://www.arduinoforum.de/arduino-Thread-Arduino_mitDS18B20-und-MySQL?page=2 *
    * Grundkonzept gefunden bei Enrico Sadlowski *
    * http://fluuux.de/2012/09/arduino-mysql-temperatur-sensoren-uber-webserver-auslesen/ *
    * geändert und eingekürzt durch Enrico Engelmann *
    * Kontakt: enrico.engelmann@wildenstein.km3.de *
    * http://www.solar-fan.net *
    * *
    ***********************************************************************************************
    * der Vorteil dieses sketches ist, dass für DS18B20 Sensoren keine zusätzlichen *
    * Berechnungen erforderlich sind, und eine 12bit-Auswertung erfolgt *
    * *
    ***********************************************************************************************/

    #include
    #include // library for ethernet functions
    #include // library for temperature sensors
    #include // library for the onewire bus

    OneWire ds(44); // pin für Temperatursensoren

    //DeviceAdressen der einzelnen ds1820 Temperatursensoren.
    DeviceAddress sensor1 = { 0x28, 0x59, 0x15, 0xDE, 0x06, 0x00, 0x00, 0xCD };
    DeviceAddress sensor2 = { 0x28, 0x57, 0xEE, 0xDC, 0x06, 0x00, 0x00, 0x0F };
    //ETHERNET-SETTINGS
    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // MAC-Adresse des Arduino
    byte ip[] = { 192, 168, xxx, xxx }; // IP-Adresse des Arduino
    //byte gateway[] = { 192, 168, xxx, 1 }; // Gateway
    //byte subnet[] = { 255, 255, 255, 0 }; // SubNet
    byte server[] = { 93, xxx, xxx, 131 }; // IP-Adresse des Servers

    EthernetClient client;
    char host[] = „localhost“; // Domain
    char url[] = „/solar/Arduino/SaveTempMySQL.php“; // Pfad zur PHP-Datei
    char key[] = „XXXXXX“; // Kennwort aus PHP-Datei
    char c; // Variable für Rückgabe des Servers

    long Interval = 59; // Upload-Interval in Sekunden
    DallasTemperature sensors(&ds);
    int numSensors; // Variable zum speichern der Anzahl der Temperatur-Sensoren
    float temp1,temp2; // Temperaturwerte der Sensoren

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    void setup()
    {
    delay(800);
    Serial.begin(9600);
    Serial.flush();
    delay(600);
    //Serial.println(„Arduino TemperaturLogger“);
    //Serial.println(„Ethernet initialisieren…“);
    Ethernet.begin(mac, ip);
    Interval = Interval * 1000; // Das in Sekunden angegebene Interval in Millisekunden umrechnen
    delay(1300); // warten, bis Ethernet gestartet
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    void loop()
    {
    sensors.requestTemperatures();
    temp1 = sensors.getTempC(sensor1);
    temp2 = sensors.getTempC(sensor2);
    if (temp1 == -127.00) Serial.print(„Fehler Sensor1“);
    else {
    Serial.print(„Temp1: „);
    Serial.println(temp1);
    }
    if (temp2 == -127.00) Serial.print(„Fehler Sensor2“);
    else {
    Serial.print(„Temp2: „);
    Serial.println(temp2);
    }
    if (temp1!= -127.00 && temp2!=-127.00) Daten_senden(temp1, temp2); // Temperaturdaten an Server übertragen
    delay(1000);
    byte maxReads = 10; //Seconds
    while ((maxReads– > 0) && client.connected()) // Antwort des Servers lesen
    {
    delay(1200);
    while (client.available())
    {
    char response = client.read();
    Serial.print(response);
    }
    }
    client.stop();
    Serial.println(„……..fertig.“);
    client.flush();
    delay(Interval);
    }
    /******************************
    *
    * Daten an Server schicken *
    *
    *******************************/
    void Daten_senden(float T1, float T2)
    {
    if (client.connect(server, 80)) // Verbindung zum Server aufbauen
    {
    Serial.println(„Verbunden, Sende Daten…“);
    client.print(„GET “ + String(url));
    client.print(„?T1=“);
    client.print(T1);
    client.print(„&T2=“);
    client.print(T2);
    client.print(„&key=“ + String(key));
    client.println(“ HTTP/1.1″);
    client.print(„Host: “ + String(host));
    client.println();
    client.println(„User-Agent: Arduino“);
    client.println(„Connection: close“);
    client.println();
    }
    else
    {
    Serial.println(“ ***** VERBINDUNG KANN NICHT HERGESTELLT WERDEN *****“);
    }
    }

  33. Hallo Herr webProf :)
    Könntest sie den Sketch für den Ds18b20 mir senden?.
    Vorausgesetzt sie haben ihn.
    Super Tutorial Vielen dank und Machen sie weiter so

    • Hallo david07037,
      momentan bin ich gerade dabei eine umfangreiche Siermenssteuerung auf ein Arduinomega2560 zu platzieren.
      Gerade weil ich große Leitungsstrecken zu überwinden habe, mußte ich mir auch etwas zu den vielen Temperatursensoren überlegen.
      Ich habe einen sketch, der mehere one-wire-pin einspricht mit meinem Sohn entwickelt.

      Wieviel Sensoren möchtest Du ansprechen, und wie weit sind diese untereinander entfernt? Oder ist alles noch in der Testphase auf dem Steckbrett?

      Falls meine Kontaktdaten hier nicht automatisch angefügt werden, sind diese zwei Kommentare weiter oben zu finden. Mit den DS18B20 habe ich inzwischen gute Erfahrungen.

      Grüße
      Enrico

  34. Hi, Ich habe mit Hilfe des Tutorials angefangen meine kleine Web Wetterstation zu bauen. Die Verbindung mit der Datenbank kann ich herstellen, als Response bekomme ich allerdings einen Error 400 Bad Request. Da ich in php ein ziemlicher Neuling bin, kann ich mir nicht herleiten woher der Error kommt. könnte mir da jemand eventuell auf die Sprünge helfen?

    Vielen Dank

    Flo

  35. Hallo Enrico!
    Zunächst vielen Dank für deine super Beschreibung! Ich habe noch nie mit php und mysql gearbeitet und glaube doch langsam dem Ziel näher zu kommen! Mein Sketch ist soweit funktionsfähig, die php-Dateien werden soweit gefunden und im Serial-Monitor erhalte ich:

    Temp1: 27.00
    Temp2: 44.00
    Verbunden, Sende Daten…
    GET /Arduino_Webserver/Temperaturlogger/SaveTempToMySQL.php
    ?T1=27.00
    &T2=44.00
    &key=MEINPASSWORT123 HTTP/1.1
    Host: Diskstation
    User-Agent: Arduino
    Connection: close

    HTTP/1.1 200 OK
    Date: Wed, 10 Feb 2016 22:05:03 GMT
    Server: Apache
    Vary: Accept-Encoding
    Connection: close
    Transfer-Encoding: chunked
    Content-Type: text/html; charset=UTF-8

    0

    Done.

    Leider werden keine Einträge in die SQL-Datenbank geschrieben. Ich hatte vorher auch das Problem, dass ich die Meldung: „No database selected“ erhalten habe und somit jeden Befehl von „mysql“ zu „mysqli“ umgeschrieben habe. War doch soweit richtig? Oder muss noch etwas geändert werden? Ich habe auch (wie in deinem Beitrag zur mysqli Klasse) eine info.php hochgeladen um zu schauen ob mysqli unterstützt wird: Ja. Was mir allerdings auch aufgefallen ist.. Es spielt gar keine Rolle was ich für einen Benutzernamen in die db.inc.php eintrage. Selbst wenn ich es weglasse, erhalte ich die gleiche abschließende Meldung im Serial Monitor: 0 – Done.

    Hast du eine Idee?

    Viele Grüße

  36. Noch etwas: es scheint völlig egal zu sein ob die db.inc.php vorhanden ist oder nicht. Ich habe die include – Zeile eben auskommentiert und erhalte ein identisches Ergebnis. Ändere ich den Key oder die Bezeichnung der Variablen für die Temperatur, erhalte ich die die gewünschte Fehlermeldung. Mittlerweile ist es sogar so weit, dass ich zwei Zahlen im Serial-Monitor erhalte:


    Transfer-Encoding: chunked
    Content-Type: text/html; charset=UTF-8

    1

    0

    Done.

    Die 1 verschwindet, sobald ich die db.inc.php auskommentiere. Allerdings frage ich mich, wo sie überhaupt entsteht? Welcher Befehl gibt denn diesen Wert an den Serial-Monitor zurück und warum erhalte ich keine Fehlermeldung: „Fehler beim speichern der Daten in der MySQL-Datenbank“ wenn ich die db.inc lösche/auskommentiere?

  37. hallo,
    bin neuling was arduino angeht und grade am rumprobieren mit Deinen script..hmm leider im arduino monitor wird mir meldung gezeigt dass Daten gesendet werden,
    aber wenn ich die seite aufrufe um die Daten anzuzeigen spuckt mir derBrowser aus dass keine Daten gespeichert wurden…bitte um Hilfe was mache ich nich richtig

  38. Hallo Leute,
    das Problem mit dem 400 Bad request und das nicht speichern in der Datenbank habe ich seit dieser Woche auch. Ich muss dazu sagen das meine Temperatursensoren ca. 20 Stck. jetzt 3 Jahre lang 24/7 gelaufen sind. Also schliesse ich Fehler am Script aus. Fehler hat diese Woche begonnen nach dem ich die mariadb und meine Synology upgedatet habe. Irgendwas ist seit dem anderst bin noch nicht drauf gekommen was… Vielleicht hat ja jemand eine Idee.

    • Mit MariaDB kenne ich mich nicht aus. Bei MySQL kann es sein dass die Datenbank aktualisiert und auf MySQLi erweitert wurde.
      Ich müsste das Script einfach dahingehend anpassen, was ich wohl im laufe der nächsten Tage mal in Angriff nehmen werde.

    • Hab ich auch vermutet das das mysqli da auch kommt. Müsste mich da erst mal wieder rein denken bzw. neu dazu lernen hab schon seit Jahren nix mehr programmiert. War glaub mein letztes Projekt in dem Bereich. Grad bin ich eher bei robusteren Sachen(Liegender Holzspalter, Kran, Hydraulikaggregat…) Werd ich wohl mal wieder ran müssen. Am besten ist ich wart bis du was hast dann kann ich abschreiben ;-) Glaub du bist da näher an der Materie…

  39. Hallo Enrico,

    ich verfolge deine Beiträge mit Aufmerksamkeit. Sie gefallen mir allesamt sehr gut.

    Leider kann ich deine Sketche noch nicht für meine Bedürfnisse umbauen, da ich mich mit dem Arduino Yun noch nicht so gut auskenne. Mein Ziel ist es, Werte eines Zählers in eine SQL-DB auf meinem NAS-Speicher abzulegen. Dazu habe ich eine MySQL-Datenbank angelegt.
    Mit dem oben gezeigten Sketch bekomme ich allerdings keine Verbindung zum Server. Gibt es beim Yun noch etwas Besonderes zu beachten?

    Gruß Michael

  40. Hallo,

    ich finde dein Projekt wirklich toll und würde es gerne nachbauen.

    Aber ich verstehe leider nicht was dieser Teil bedeutet:

    char host[] = „ihrewaesche.de“; // Domain

    welche Domain muss ich angeben?

    DANKE

  41. Vielen Dank,

    Da wäre noch etwas :)

    Bei der Datei db.inc.php

    <?php
    define('DB_SERVER',"localhost");

    Mit Localhost öffne ich nur Apache 2 und es wird mir lediglich die Index.html angezeigt.

    Dient dieser Teil nicht dazu sich bei PHPmyAdmin anzumelden?
    Denn dieses Fenster für die Anmeldung, wenn ich es im Browser eingebe, öffne ich mit
    localhost/phpmyadmin.

    Danke

    • localhost hat in dem Fall nichts damit zu tun welche Seite Du in Deinem Browser mit der Eingabe von localhost öffnest.
      Der Teil hat auch nichts mit phpMyAdmin zu tun sondern viel mehr um eine Verbindung zur MySQL Datenbank herzustellen.

  42. Heey,
    Erst mal vielen Dank für das Tutorial :D
    Ich habe nun nur noch ein Problem mit der Pfadangabe und zwar:
    Auf meinem Server, den ich mit bplaced.net erstellt habe, habe ich genau wie du ein Verzeichnis ARDUINO und Temperaturen angelegt. In letzterem Verzeichnis befindet sich noch der Ordner inc mit dem anderen php Script. Korrekt? So wie ich das jetzt verstanden habe kann ich ja den genau gleichen Pfad wie im Tutorial benutzen, doch wen ich den Sketch auf meinen Arduino lade, wir zuerst alles korrekt angezeigt (also IP, Temperatur etc.) und am Ende bekomme ich eine risige Fehlermeldung die aussagt das savetemptomySQL.php nicht vorhanden sei und db.inc.php nich geöffnet werden kann obwohl ja alles im Webserver gespeichert wurde.

    Hast du eine Idee was das sein könnte

    tobiaskaelin.bplaced.net

    LG Tobias

  43. Hallo,

    Erstmal vielen Dank für die tollen Anregungen. Als absoluter Neuling in Sachen SQL u. PHP hätte ich mich an die Materie sonst nicht ran getraut.

    Aber nun nochmal die Frage zur Fehlermeldung „400 Bad request “ gibts da vieleicht mittlerweile eine Lösung?
    Ich muss dazu sagen, dass wenn ich in der Browserzeile die php Datei aufrufe und von dort aus Temp Werte übergebe, werden diese auch abgespeichert.
    Wo ich dann der Meinung bin, dass es dieses SQLi Problem nicht sein kann. Arduino macht doch auch nichts anderes als die besagten Dateien aufzurufen und zur Ausführung zu bringen?

    Gruß
    Norman

  44. Hallo,

    mein geschildertes Problem hat sich inzwischen erledigt.
    Es funktioniert alles einwandfrei.
    Mein Fehler war, dass der Arduino eine falsche url gesendet hatte .
    Hatte sich wohl durch die veile Probiererei eingeschlichen…

    Trotzdem Danke !
    Super Seite.