Wetter-Station(BME280)

Werbung
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
Herunterladen