Mit ESP8266 und LM75 Temperaturdaten erfassen

© Jager, 123RF

Präziser Gradmesser

Der ESP8266 geht auf Sendung: Von einem Sensor erhält er Temperaturdaten und sendet diese via REST an einen RasPi, der sie in einer Datenbank speichert.

Im ersten Teil dieser Artikelreihe haben wir den Aufbau einer funktionierenden Entwicklungsumgebung demonstriert. Diesmal dreht sich nun alles darum, die WLAN-Schnittstelle des ESP8266 [1] zu aktivieren und einzusetzen. Das Modul liest Messwerte über den I2C-Bus aus einem Temperatursensor Modell LM75 [2] aus und sendet diese über eine Webschnittstelle an eine MySQL-Datenbank, die auf dem Raspberry Pi läuft.

Dabei gilt es zu bedenken, dass der Sensor eine Batterie als Stromquelle braucht. Der ESP8266 schluckt im Betrieb bis zu 200 Milliampere. Haben Sie den Sensor durchgehend in Betrieb, benötigen Sie entsprechend dimensionierte Batterien. Eleganter und kostengünstiger wäre es aber, das Modul nur ein bis zwei Sekunden einzuschalten, um den Messwert zu ermitteln und zu senden, und es danach wieder zu deaktivieren.

Dabei wäre die Frage zu klären, wie viele Messungen Sie tatsächlich brauchen. Jede Sekunde eine oder eine pro Stunde – offensichtlich haben die Konstrukteure der beiden Bausteine ebenfalls über solche Situationen nachgedacht und die Elemente mit einer Energiesparfunktion ausgestattet. Die erlaubt es, den ESP8266 und den LM75 auf einen Stromverbrauch von wenigen Mikroampere herunterzufahren. Wollen Sie eine komplexe Stromversorgung vermeiden, legen Sie die Halbleiter einfach schlafen, solange Sie sie nicht brauchen.

Im ersten Testlauf nimmt der ESP8266 jede Minute eine Messung vor und sendet das Ergebnis per REST-Schnittstelle an die Datenbank. Die Zeiten dazwischen gehen beide ICs in den Ruhezustand. Im realen Einsatz bietet es sich dann an, das Intervall zu vergrößern, um Energie zu sparen. Für eine private Wetterstation genügen viertelstündliche Messungen.

Es ist an der Zeit, den Schaltplan (Abbildung 1) zum Projekt anzusehen und den ersten Prototyp (Abbildung 2) aufzubauen. Den Schaltplan finden Sie im gEDA-Format auf der Heft-DVD.

Abbildung 1: Der Schaltplan für den externen Temperatursensor.
Abbildung 2: Der Aufbau auf dem Prototyping-Board.

Auf dem Schaltplan sehen Sie zwei Jumper, die dazu dienen, den ESP8266 in den Bootloader-Modus zu versetzen. Sind sie geschlossen, lässt sich ein neues Programm laden. Stehen sie offen, befindet sich der Mikrocontroller im Normalbetrieb und führt das hochgeladene Programm aus.

Den LM75 kennen Sie unter Umständen schon aus Teil 3 unserer Reihe über den I2C-Bus [3] (siehe Kasten "I2C"). Der Baustein liefert die Werte für die Temperatur im Klartext. In der im Plan abgebildeten Beschaltung hat er die Adresse 0x48h. Möchten Sie das Projekt noch ausbauen, schließen Sie mit den vorhandenen Eingängen noch sieben weitere LM75-Chips an den Bus an.

I<+>2<+>C

Der serielle I2C-Datenbus (gesprochen: "I-Quadrat-Ze") ist für die Kommunikation über kürze Distanzen gedacht, also nur innerhalb von Platinen oder Geräten. Die Daten fließen dabei synchron über zwei Leitungen: die Datenleitung SDA und die Taktleitung SCL. Beide Leitungen ziehen Sie über Pullup-Widerstände auf ein positives Potenzial.

Der Busmaster initiiert immer die Kommunikation. Der Bus verfügt über einen 7-Bit-Adressbereich, das entspricht 128 Teilnehmern. 16 Adressen sind reserviert, also bleiben netto 112 Adressen frei. Üblicherweise dürfen Sie nur die unteren 3 Bits der Adressen an den Clients frei wählen, die oberen Bits sind fest verdrahtet. Die möglichen Adressen für einen Baustein entnehmen Sie dem Datenblatt. Die Tabelle "Baustein-Beispiele" nennt einige exemplarische Werte.

Der Bus überträgt Daten byte- oder wortweise. Die Geschwindigkeit liegt zwischen 100 kbit/s bidirektional (Standard) und 5 Mbit/s unidirektional ("Ultra Fast Mode"). Es gibt verschiedene Möglichkeiten, die Reichweite des I2C-Busses zu erhöhen. Dabei reichen die Spielarten vom Verringern der Pullup-Widerstände bis zum Tunneln durch CAN-Bus-Treiber.

Baustein-Beispiele

Modell

Funktion

Adressbereich

Anmerkung

PCF8574

Port-Expander

0x20-0x27

siehe Artikel in diesem Heft [7]

PCF8574A

Port-Expander

0x38-0x3F

anderer Adressraum, sonst baugleich zu PCF8574

PCF8591

A/D- und D/A-Konverter

0x90-0x9F

PCF8583

Uhr/Kalender + 240 x 8-Bit-RAM

0xA0-0xA2

Auf dem Schaltplan findet sich eine Brücke zwischen GPIO16 und REST (hier ist der Pin des ESP8266 gemeint, nicht der Webservice). Diese braucht der ESP8266, um sich selbst wieder aus dem Energiesparmodus aufzuwecken. Die restlichen Widerstände dienen dazu, den Bootloader zu konfigurieren und das WLAN-Modul zu aktivieren.

Um die korrekte Spannungsversorgung der Halbleiter kümmert sich ein MCP1700-330. Er hat einen extrem geringen Querstrom (1,6 µA), die Differenz der Spannung zwischen In und Out liegt mit 178 mV ausreichend niedrig. Dieser Spannungsregler wurde exakt für Fälle wie den vorliegenden entworfen, also für batteriebetriebene Schaltungen, die kurzzeitig einen hohen Strombedarf (hier 250 mA) haben.

Die zwei 1-µF-Kondensatoren sollen verhindern, dass der Spannungsregler anfängt zu schwingen. Die Spannungsversorgung stellen vier NiMH-Akkus sicher. Das Setup käme im Prinzip mit drei Batterien oder Akkus aus, das Testsystem enthielt aber einen Halter für vier Batterien.

Zu guter Letzt findet sich im Aufbau noch ein Reset-Taster, der es überflüssig macht, zum Neustart die Spannungsversorgung zu unterbrechen, wenn Sie ein neues Programm hochladen wollen. Um das Programm zu entwickeln, kommt die Arduino-IDE zum Einsatz. Tipps zu deren Installation finden Sie in Teil 1 dieser Reihe [4].

ESP8266-Programm

Das C-Programm (Listing 1) für den ESP8266 weist einen etwas unüblichen Aufbau auf: Das komplette Programm befindet sich in der Methode setup(), die das Programm nur einmal aufruft. Die Funktion loop() bleibt leer – das stellt kein Problem dar, weil der ESP8266 sich am Ende der setup()-Methode schlafen legt.

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.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 7 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Raspberry Pi Geek kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

Aktuelle Ausgabe

12/2019
RasPi-Alternativen

Diese Ausgabe als PDF kaufen

Preis € 9,99
(inkl. 19% MwSt.)

Stellenmarkt

Neuigkeiten

  • Grußbotschaften

    Mit Sonic Pi zaubern Sie komplexe Sounds, die Sie bei Bedarf sogar noch während des Abspielens modifizieren.

  • Das Runde und das Eckige

    Mit dem MCP4725 ergänzen Sie einen RasPi um einem D/A-Wandler, der bei Bedarf noch weitere Funktionen erfüllt.

  • Alles unter Kontrolle

    Schon ein einfaches Mikrocontrollerboard wie das CY8CKIT-049-42xx bietet erstaunlich viele Möglichkeiten beim Ansteuern von Hardware.

  • Viele Kerne

    Das Spresense Development Board von Sony lässt sich mit der Arduino IDE programmieren und bringt auch ein eigenes Entwickler-SDK mit.

  • Exotische Früchte

    Der aus China stammende Orange Pi positioniert sich mit einem guten Preis und interessanten Features gegen die RasPi-Truppe. Kann er sich auch behaupten?

  • Flexibler Surfer

    Mit dem neuen RasPi 4 setzen Sie einen öffentlichen Webkiosk schnell und kostengünstig auf.

  • Auskunftsfreudig

    Viele Devices, so auch der E.ON-Aura-Controller, verwenden eine Schnittstelle namens REST, um Zustandsdaten zu übermitteln. Mit ein wenig Bastelei lesen Sie diese auch über Ihr Smartphone aus.

  • Doppelt gemessen

    Mit wenig Aufwand und einem Pi Zero realisieren Sie einen mobilen Zweikanal-Spannungsprüfer.

  • Elegant zusammengeführt

    Tizonia streamt Musik von Online-Quellen und lokalen Sammlungen. Die schlanke Architektur macht den Player zur guten Wahl für den Einsatz auf dem RasPi.

  • Kommunikativ

    Nicht jeder traut sich zu, sein eigenes Smartphone zu bauen. Allerdings kann jeder Linux-Nutzer den Raspberry Pi im Handumdrehen zu einem VoIP-Telefon aufrüsten.