Listing 1
#include <Wire.h>
#include <ESP8266WiFi.h>
// Konstantendefinition
const char* ssid = "SSID";
const char* pass = "Passwort";
const char* serverIp = "192.168.2.2";
const int serverPort = 8080;
const int i2caddress = 0x48;
const int intervall = 5;//sec
WiFiClient client;
int8_t getTemperature() {
int8_t high;
int8_t low;
// LM75 Wecken
Wire.beginTransmission(i2caddress);
Wire.write(01);
Wire.write(00);
Wire.endTransmission();
delay (1500);// Morgenmuffel
Wire.beginTransmission(i2caddress);
Wire.write(0);
Wire.endTransmission();
Wire.beginTransmission(i2caddress);
Wire.requestFrom(i2caddress, 2);
if (Wire.available()) {
high = Wire.read();
low = Wire.read();
}
Wire.endTransmission();
// LM75 schlafen legen
Wire.beginTransmission(i2caddress);
Wire.write(01);
Wire.write(01);
Wire.endTransmission();
return high;
}
void setup() {
int8_t temp;
// I2C Setup
Wire.begin(4, 5);
Wire.setClock(1000);
// Serial (USB Monitor) Setup
Serial.begin(115200);
Serial.println("\r\n") ;
//WLAN connect
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Verbunden mit ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// Messen
temp = getTemperature();
// Rest Request
Serial.println(temp);
if ( !client.connect(serverIp, serverPort) ) {
Serial.println("connect fail");
}
client.print("GET /rest/setTemp/temp/");
client.print(temp);
client.println(" HTTP/1.1");
client.print("Host: ");
client.println(serverIp);
client.println("Connection: close");
client.println();
client.stop();
// ESP8266 schlafen schicken
ESP.deepSleep(intervall*1000000);
}
void loop() {}
Ein Hardware-Reset von GPIO 16 auf den REST-Pin triggert das Aufwachen, die Hardware startet wieder in setup(). Die Variable intervall gibt in Sekunden an, wie lange der Baustein in den Stromsparmodus geht. Die restlichen Konstanten fallen weitgehend selbsterklärend aus: Bei ssid und pass handelt es sich um die Zugangsdaten für das WLAN. Mit serverIp und serverPort geben Sie an, auf welchem Rechner der REST-Service läuft. Die Konstante I2caddress nimmt die Adresse des LM75 auf.
Die Methode getTemperature() liefert die aktuelle Temperaturmessung des LM75 zurück. Intern weckt sie den Sensor erst auf und wartet dann einen Moment, bevor sie einen Messwert anfordert. Das liegt daran, dass es sich beim LM75 um einen echten Morgenmuffel handelt, der direkt nach dem Aufwecken erst einmal nur falsche Messwerte liefert. Er benötigt fast zwei Sekunden, um wieder genau zu messen.
Nach dem Auslesen des Messwerts legt die Methode den LM75 wieder schlafen. Der Einfachheit halber liest die Applikation nur volle Grad-Celsius-Werte aus dem LM75 aus. Ein Großteil des Programms dient dazu, um Debugging-Informationen über die USB-Schnittstelle bereitzustellen. Das umfasst alle Zeilen, die mit Serial. anfangen. Im produktiven Betrieb kommentieren Sie diese Zeilen aus.
Jetzt noch einmal zurück zum Anfang des Programms: Die ersten zwei Zeilen in der Methode setup() initialisieren den I2C-Bus, die nächste die serielle Schnittstelle. Der darauffolgende Block stellt die Verbindung zum WLAN her.
Jetzt ruft das Programm die Methode getTemperature() auf und übermittelt das Ergebnis an den REST-Server. Danach ist es wieder an der Zeit, den ESP8266 schlafen zu legen. In Abbildung 3 und**4 sehen Sie, wie sich der Energiebedarf unserer Anordnung ändert, sobald sie in den Schlafmodus geht. Das Programm als Arduino-Projekt finden Sie auf der Heft-DVD.

Abbildung 3: Stromverbrauch im normalen Betriebsmodus: Das Multimeter zeigt eine Stromstärke im Milliampere-Bereich.

Abbildung 4: Stromverbrauch im Energiesparmodus: Das Multimeter zeigt eine Stromstärke im Mikroampere-Bereich.
Java-Service
Die Grundlagen zu dem hier verwendeten REST-Service finden sich im Openbook “Java ist mehr als eine Insel” [5]. Der Service konsumiert einen Messwert und schreibt ihn mit Uhrzeit in die MySQL-Datenbank. Von dort steht er zum Weiterverarbeiten mit einem beliebigen Programm bereit.
Es erfordert einige vorbereitende Schritte für die Installation, um den REST-Server auf dem Raspberry Pi zum Laufen zu bekommen. Aufgrund des sprichwörtlichen Ressourcenhungers von Java lohnt es sich, zu einem RasPi 2 zu greifen.
Java-Installation
Als ersten Schritt bauen Sie den Server auf. Mittlerweile gibt es eine “Lite”-Version von Raspbian. Diese beinhaltet nur die nötigsten Komponenten, aber weder einen X-Server noch Office-Programme. Damit eignet sich diese Variante ideal als Grundlage für einen RasPi-basierten Server.
Haben Sie die Printausgabe erworben, finden Sie die Distribution auf dem beiliegenden Datenträger im Verzeichnis RPG/raspbian/. Ansonsten laden Sie mit den Befehlen aus Listing 2 das Image von der Homepage auf einen PC herunter, entpacken es und schreiben es mit Dd auf eine SD-Karte. Achten Sie dabei darauf, dass Sie beim Parameter of= die Geräte-Datei entsprechend anpassen. Das Datum des Images, das Sie online finden, fällt möglicherweise etwas neuer aus – dann müssen Sie auch den Image-Namen entsprechend ändern.
Listing 2
$ wget https://downloads.raspberrypi.org/raspbian_lite_latest $ unzip raspbian_lite_latest $ sudo dd if=2016-02-26-raspbian-jessie-lite.img of=/dev/sdd
Jetzt stecken Sie die frisch vorbereitete SD-Karte in den Rechner und booten. Danach aktivieren Sie den SSH-Daemon mittels raspi-config. So haben Sie später die Möglichkeit, sich mit ssh pi@IP-Adresse mit dem Rechner zu verbinden, um remote zu arbeiten. Alle weiteren Einstellungen nehmen Sie dann auf diesem Weg vor, Windows-User nutzen dazu Putty. Wichtig ist, das Filesystem der SD-Karte zu vergrößern, da die Datenbank recht viel Platz braucht.
Es gibt keine besonderen Anforderungen an das Java Development Kit (JDK). Sie brauchen also nicht das neueste JDK von der Oracle-Homepage herunterzuladen. Es genügt, das vorhandene Oracle-Java aus der Distribution zu installieren (Listing 3). Als Datenbank verwenden Sie MySQL, dessen Installation der Kasten “MySQL aufsetzen” beschreibt.
Listing 3
$ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get install oracle-java7-jdk





