Startseite>Mit ESP8266 und LM75 Temperaturdaten erfassen
Aus Raspberry Pi Geek 03/2016

Mit ESP8266 und LM75 Temperaturdaten erfassen

© Jager, 123RF

Präziser Gradmesser

Martin Mohr

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 1: Der Schaltplan für den externen Temperatursensor.

Abbildung 2: Der Aufbau auf dem Prototyping-Board.

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() {}
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 7 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
€0,99 – Kaufen
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland