Seite 1 von 1

WLAN-Wetter-Station

Verfasst: Fr 5. Mär 2021, 10:33
von Heinrichs
In dem Beitrag Wetter-Station wurde schon gezeigt, wie man die Klima-Daten Temperatur, Luftfeuchtigkeit und Luftdruck auf dem Display (und ggf. auch zusätzlich auf einem Terminal ausgeben kann. An dieser Stelle möchte ich zeigen, wie man diese Daten über WLAN in einem Browser anzeigen lassen kann. Dabei soll das TTGO-Modul als Station im Heimnetzwerk arbeiten.

Wie Daten über das WLAN an einen Browser übermittelt werden habe ich ausführlich in meinem Tutorium WLAN MIT DEM ESP32 am Beispiel eines Temperatur-Servers mit dem LM75A dargestellt (Kapitel 9). Für unseren "Klima-Server" brauchen wir das dort vorgestellte Programm sta_temp_server_0.py nur an drei Stellen ergänzen bzw. abändern:

1. Bei den Importen die Zeile

Code: Alles auswählen

import Bme280  # (Das Modul bme280.py finden Sie in der Anlage; es muss vorher auf den ESP32 hochgeladen werden.)
ergänzen

2. Den Block

Code: Alles auswählen

i2c = I2C(scl=Pin(22), sda=Pin(21), freq= 100000)  
adr = 0x48  # 7-Bit-Adresse im HEX-Format

def messwert():
  rohwert = i2c.readfrom_mem(adr, 0, 2)  
  temp_wert = rohwert[0] + rohwert[1]/256
  return str(temp_wert)
ersetzen durch

Code: Alles auswählen

i2c = I2C(scl=Pin(22), sda=Pin(21), freq=10000)
bme = Bme280.BME280(i2c=i2c)
3. Die Definition der html-Funktion ergänzen; sie lautet jetzt:

Code: Alles auswählen

def html():
  return '''  <html>
        <head>
          <title>Temperaturmessung</title>
        </head>
                <body>
                <h1>
                  <p> <font color='green'> Klima-Daten... </font><BR><BR>
                  </p><p>Temperatur:
  '''                             + bme.temperature + ''' &degC
                  </p><p> Luftfeuchtigkeit:
  '''                             + bme.humidity + ''' %
                  </p><p>Luftdruck:
  '''                             + bme.pressure + ''' hPa
                  </p></h1>
                </body>
              </html>
  '''
Man beachte dabei:
  • Die Properties temperature, humidity und pressure des Objekts bme liefern stets einen aktuellen Messwert.
  • Das Zeichen für ° wird in html mit &deg kodiert.
Das gesamte Programm lautet nun:

Code: Alles auswählen

# Klima-Daten-Server mit BME280
# Zum Beenden des Server-Programms: Ctrl-C.
# Vor dem Neustart Hard Boot mit Reset-Taster auslösen!

import network
import socket
from machine import Pin, I2C
from time import time
import Bme280  # Groß/Klein-Schreibung hier egal

# ESP32 - Pin assignment
i2c = I2C(scl=Pin(22), sda=Pin(21), freq=10000)
bme = Bme280.BME280(i2c=i2c)

# Wlan-Zugangsdaten; hier Ihre Wlan-Daten eintragen:
ssid = 'meine SSID'' # ersetzen!
password = 'mein Passwort' #ersetzen!


def html():
  return '''  <html>
        <head>
          <title>Temperaturmessung</title>
        </head>
                <body>
                <h1>
                  <p> <font color='green'> Klima-Daten... </font><BR><BR>
                  </p><p>Temperatur:
  '''                             + bme.temperature + ''' &degC
                  </p><p> Luftfeuchtigkeit:
  '''                             + bme.humidity + ''' %
                  </p><p>Luftdruck:
  '''                             + bme.pressure + ''' hPa
                  </p></h1>
                </body>
              </html>
  '''

def http_header():
  return '''HTTP/1.1 200 OK\r
Content-Type: text/html\r
Connection: close\r
\r
'''

# Konfiguration des Wlans:
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password)
time0 = time()
while (not station.isconnected()) and (time() - time0 < 5):
  pass

if station.isconnected():
  # Konfiguration des Sockets
  print('Wlan connected')
  print(station.ifconfig()) # zur Information
  s = socket.socket() # Socket des Servers 
  s.bind(('', 80))
  s.listen(5) 
  print('Server listening')
  print('--------------------------------------')

  # Daten holen
  counter = 0
  while True:
    connection, addr = s.accept()
    print("Client connected: ", addr)

    connection.send(http_header())
    connection.send(html())
    connection.close()

station.active(False)
print('Wlan deactivated')
print('Please reset!')

Der Browser meines Handys zeigt die Klima-Seite z. B. so an:

screenshot_Kllima_Browser.jpg
Browser-Screenshot
screenshot_Kllima_Browser.jpg (13.66 KiB) 9467 mal betrachtet
.