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

10/2018
Weltweiter Empfang

Diese Ausgabe als PDF kaufen

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

Stellenmarkt

Neuigkeiten

  • Physiklabor

    Der Java-Dialekt Processing zielt auf interaktive Animationen ab und eignet sich auch für Programmiernovizen.

  • Abstand halten

    Der VL53L0X misst präzise Entfernungen bis zu zwei Metern. Das macht ihn zum passenden Kandidaten für RasPi-Projekte.

  • Tux-Funk

    Der SDR-Empfänger RSP2pro von SDRplay bringt Amateurfunk auf den Raspberry Pi.

  • Himbeersieb

    Die aus Österreich stammende Upribox auf Basis des Raspberry Pi schützt wirkungsvoll vor Gefahren aus dem Internet. Jetzt ist das System in der zweiten Version erschienen.

  • Unter Kontrolle

    Das programmierbare Steuermodul Controllino bietet mit seinen zahlreichen Ein- und Ausgängen vielfältige Möglichkeiten.

  • Dehnübungen

    Ein RasPi eignet sich bestens zum Steuern eines Fischertechnik-Roboters. Damit dabei kein Chaos entsteht, gilt es, die Steuerung genau zu programmieren.

  • Klangmaschine

    Der RasPi bringt genügend Performance mit, um als kleine DAW zu dienen. Mit Waveform 9 haben Sie die passende Software zur Hand.

  • Fremdgehen

    Nicht jedes Programm gibt es auch für die ARM-Architektur. Der kommerzielle Emulator Exagear Desktop fungiert als Übersetzer zwischen der ARM- und x86-Welt.

  • Ausfallsicher

    Eine selbst gebaute USV für den RasPi verschafft Ihnen die entscheidenden Sekunden, um bei unerwarteten Stromausfällen einem Datenverlust vorzubeugen.

  • Am laufenden Band

    Die Kombination aus einem Fischertechnik-Bausatz und dem Controllino-Modul bietet eine ideale Basis, um ein funktionierendes Industriemodell zu gestalten.