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/2018
Coole Projekte

Diese Ausgabe als PDF kaufen

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

Stellenmarkt

Neuigkeiten

  • Bytes und Beats

    In Sonic Pi können Sie mit wenigen Codezeilen Klänge manipulieren, Beats zusammenstellen und ganze Songs komponieren.

  • Klein, aber fein

  • Trick or treat

    Das traditionelle RPG-Gruselkabinett glänzt dieses Jahr mit einer innovativen Umsetzung mittels Pneumatik und Elektropneumatik sowie ST-Programmierung.

  • Unter Kontrolle

    Traditionell stellen wir alljährlich ein selbst gebautes Halloween-Gespenst vor. Die pneumatischen und elektronischen Grundlagen erklärt dieser Artikel.

  • Go Pi Go!

    Der Bausatz GoPiGo3 liefert Bauteile und Software für ein kleines Roboterauto. Zusammen mit einem RasPi als Gehirn programmieren Sie den Roboter per Mausklick.

  • Handlicher Helfer

    Während die Folien der Präsentation durchlaufen, liefert ein kleiner Dokumentenserver auf Basis des GL-AR300M-ext zusätzliche Informationen aus.

  • Wiederverwertet

    Mithilfe eines einfachen Python-Programms recyceln Sie ein ausgedientes Smartphone als drahtlos angebundenes RasPi-Display.

  • Herzenssache

    Steigt beim Krimi der Herzschlag bedrohlich an? Mit einem Pulsmesser in Eigenbau ermitteln Sie einfach und kostengünstig, ob der Herzschlag noch in verträglichen Bereichen liegt.

  • Fernbedient

    Mit der Fernbedienung den RasPi steuern. In der Theorie möglich, in der Praxis oft beschwerlich. Die Libcec liefert praktische Tools zur Fehlersuche.

  • Musikwürfel

    Mit Musikcube machen Sie Ihre eigene Sammlung fit fürs Streamen. Der terminalbasierte Audioplayer lässt sich Fernsteuern und bietet eine App für Android-Smartphones.