Wetterdaten online (BME280) Im Folgenden wird erklärt, wie Luftfeuchtigkeits-, Druck- und Temperaturdaten mit Hilfe eines Sensors und eines WiFi-Moduls nach dem Client-Server-Prinzip in einer Datenbank abgelegt und über eine Website abgerufen werden können. Verwendete Hardware: Arduino UNO, WiFi-Breakout-Modul der Firma Adafruit und ein kompatibler Nachbau des BME280 von Bosch. Zusammenstellung der Teile Anschlüsse am WiFi-Modul GND 3,3V VIN CLK MISO MOSI CS VBEN IRQ Arduino-Pins GND --+5V 13 12 11 10 5 3 Anschlüsse am BME280 VCC SCL SDA GND Arduino-Pins +5V A5 A4 GND Die zur Programmierung benötigten Libraries cactus_io_BME280_I2C und Adafruit_CC3000_Library-master können als Zip-Dateien hier heruntergeladen werden. Arduino-Sketch #include <Adafruit_CC3000.h> #include <SPI.h> #include "cactus_io_BME280_I2C.h" //Pinbelegung am Adafruit Modul #define ADAFRUIT_CC3000_IRQ 3 // Interrupt-Pin #define ADAFRUIT_CC3000_VBAT 5 // VBEN #define ADAFRUIT_CC3000_CS 10 // CS // WLAN-Zugangsdaten #define ssid "Router-Kennung" #define password "Passwort" #define security WLAN_SEC_WPA2 // Zugangsdaten zum Webserver #define host "chik-sh.de" #define page "/Wetterstation/insertValues.php" // Sensormodul einbinden BME280_I2C bme; // Adafruit Modul einbinden Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT); // IP Adresse des Servers mit "getHostByName" aus der URL ermitteln uint32_t ip; // Zeit zwischen den Uploads festlegen long previousMillis = 0; long interval = 1; // Zeit in Minuten // Kürzel für die Messwerte vergeben int p; // Luftdruck int h; // Luftfeuchte int t; // Temperatur void setup(void) { // Die in Minuten angegebenen Zeiten in Millisekunden umrechnen interval = interval * 1000 * 60; //Seriellen Monitor starten, Baudrate und Text festlegen Serial.begin(115200); Serial.println("WiFi Wetter-Station nach"); Serial.println("dem Client-Server-Prinzip\n"); Serial.println("Initialisiere CC3000...\n"); // Fehlermeldung mit Bezug zum CC3000 if (!cc3000.begin()) { Serial.println("CC3000 - Verkabelung checken"); while (1); } // Fehlermeldung mit Bezug zum WLAN-Netz if (!cc3000.connectToAP(ssid, password, security)) { Serial.println(F("Fehlgeschlagen")); while (1); } // Erfolgsmeldung Serial.println("Verbunden"); // Das dynamische Konfigurationsprotokolle DHCP aufrufen while (!cc3000.checkDHCP()) { delay(1000); } // IP Adresse des Servers ermitteln und im seriellen Monitor ausgeben ip = 0; Serial.println(); Serial.print(host); Serial.print(" -> "); while (ip == 0) { // Fehlermeldung, wenn der Server nicht gefunden wird if (!cc3000.getHostByName(host, &ip)) { Serial.println("Konnte nicht aufgelöst werden!"); } } // Ausgabe der IP-Adresse cc3000.printIPdotsRev(ip); //Sensormodul starten bme.begin(); Serial.println(); } // In Intervallen Sensordaten ermitteln und im seriellen Monitor ausgeben void loop(void) { // Intervalle festlegen unsigned long currentMillis = millis(); if (currentMillis - previousMillis > interval) { previousMillis = currentMillis; // Luftdruck, Temperatur und Luftfeuchte ermitteln p = bme.getPressure() / 100.0F; h = bme.getHumidity(); t = bme.getTemperature_C(); // Messwerte im seriellen Monitor ausgeben Serial.println(); Serial.print("Luftdruck: "); Serial.println(p); Serial.print("Temperatur: "); Serial.println(t); Serial.print("Luftfeuchte: "); Serial.println(h); Serial.println(""); // Verbindung zum Server herstellen Adafruit_CC3000_Client client = cc3000.connectTCP(ip, 80); // Anfrage senden und Sensordaten übermitteln if (client.connected()) { client.print("GET "); client.print(page); client.print("?pres="); client.print(p); client.print("&temp="); client.print(t); client.print("&hum="); client.print(h); client.print(" HTTP/1.1\r\n"); client.print("Host: "); client.print(host); client.print("\r\n"); client.println(); } } } else { Serial.println("Verbindung fehlgeschlagen"); } // Antwort vom Server ausgeben while (client.connected()) { while (client.available()) { char c = client.read(); Serial.print(c); } } // Verbindung zum Server schließen client.close(); Serial.println(F("Verbindung geschlossen")); Serial.println(); Script zum Übertragen der Sensordaten des BME280 in die Datenbank : insertValues.php <?php header('Content-type: text/plain'); include("includes/mysqli.inc.php"); $press $humi $temp = mysqli_escape_string($db, $_GET['pres']); = mysqli_escape_string($db, $_GET['hum']); = mysqli_escape_string($db, $_GET['temp']); $DATUM = date("Y-m-d H:i:s"); $sql="INSERT INTO `arduino_Wetterstation` SET `Luftdruck` = '".$press."', `Luftfeuchte` = '".$humi."', `Temperatur` = '".$temp."', DatumZeit = '".$DATUM."'"; if (!mysqli_query($db,$sql)) { die('Error: ' . mysqli_error($db)); } else { echo ("Daten in Bank gespeichert"); } ?> Script mit den Zugangsdaten: mysqli.inc.php <?php if (__FILE__ == $_SERVER['SCRIPT_FILENAME']) exit('No direct access allowed.'); //Datenbank Zugangsdaten $DB_SERVER = "localhost"; $DB_NAME = "DATENBANKNAME"; $DB_USER = "DATENBANKUSER"; $DB_PASSWORD = "DATENBANKPASSWORT"; $db = new mysqli($DB_SERVER, $DB_USER, $DB_PASSWORD, $DB_NAME); if (mysqli_connect_errno()) { printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error()); exit(); } mysqli_set_charset($db,"utf8"); ?> Script für das Auslesen und Anzeigen der Sensordaten: index.php <?php include("includes/mysqli.inc.php"); function MySQLDateTimeToDateTime($datumzeit) { $OLDDATA = explode(" ",$datumzeit); $OLDDATE = explode("-",$OLDDATA[0]); $OLDTIME = explode(":",$OLDDATA[1]); $datum = $OLDDATE[2].".".$OLDDATE[1].".".$OLDDATE[0]; $zeit = $OLDTIME[0].":".$OLDTIME[1]; $ausgabe = $datum.', '.$zeit; return($ausgabe); } $q_values = $db->query("SELECT Luftdruck, Luftfeuchte, Temperatur, DatumZeit FROM `arduino_Wetterstation` ORDER BY DatumZeit DESC LIMIT 0, 1"); if(mysqli_num_rows($q_values) > 0) { $r_values = $q_values->fetch_object(); // Wert aus Datenbank auslesen $datu = MySQLDateTimeToDateTime($r_values->DatumZeit); $press = $r_values->Luftdruck; $temp = $r_values->Temperatur; $humi = $r_values->Luftfeuchte; echo "Arduino-Wetterstation"; echo "<div>******************</div>"; echo "<div>Luftdruck = $press </div>"; echo "<div>Temperatur = $temp </div>"; echo "<div>Luftfeuchte = $humi</div>"; echo "<div>Datum, Zeit = $datu</div>"; } ?> Wie die Wetterdaten in die Datenbank gelangen und von dort abgerufen werden können Zur Realisierung des Projekts wird der Webserver eines Internetdienstanbieters (Provider) benötigt, der sowohl die Website (Domäne) als auch die Datenbank samt PHP-Engine vorhalten muss. Auf der Website werden an ausgewählter Stelle die Dateien „index.php“ und „insertValues.php“ sowie der Ordner „includes“ abgelegt. Die Abbildung links zeigt die Dateistruktur, wie sie sich beim Einwählen mit einem FTP-Client ergibt. Der Ordner „includes“ enthält die Datei „mysqli.inc.php“. Das Ordnersymbol mit den zwei Punkten symbolisiert, dass sich die angezeigten Inhalte in einem weiteren Ordner befinden. Wie die Messdaten des Sensors ermittelt und an den Webserver übergeben werden sollen, wird im Arduino-Sketch geregelt. Unter anderem sind das die Einwahl ins WLAN-Netz, die Verbindung zum und Kommunikation mit dem Server sowie die Routinen, mit denen die Daten zur Datenbank übermittelt werden können. Letztere finden sich den Scripten „insertValues.php“ und „mysqli.inc.php“. Das Bereitstellen der Datenbank und der PHP-Engine ist Sache des Providers. Wie die Messdaten abgerufen und zur Anzeige gebracht werden können, ist in dem Script „index.php“ festgelegt, das automatisch aufgerufen wird, wenn jemand die Webadresse des Ordners anwählt. Der Webbrowser zeigt dann Angaben wie rechts beispielhaft wiedergegeben. Arduino-Wetterstation ******************* Luftdruck = 1006 Temperatur = 12 Luftfeuchte = 49 Datum, Zeit = 01.03.2017, 16:01