Stacja Meteorologiczna

Typ_projektu
microPython
Zdjecie główne
Krótki opis projektu

Poniższy projekt pozwala zbudować miniaturową stację meteorologiczną mierzącą w czasie rzeczywistym temperaturę, ciśnienie i wilgotność powietrza, 

Niezbędne elementy
  •  Płytka ESP8266 z zainstalowanym firmweare'em Micropython
  •  Moduł pomiaru ciśnienia i temperatury BME280
  •  Moduł pomiaru wilgotności DHT11
  •  Płytka prototypowa
  •  Przewody
Sprzęt
  •  Komputer z oprogramowaniem Thonny
  •  Kabel microUSB do podłączenia płytki
  •  Dostęp do sieci WiFi
Opis projektu

Projekt wykorzystuję możliwości WiFi płytki ESP8266 do publikowania w czasie rzeczywistym, na lokalnym serwerze, wyników pomiaru ciśnienia i temperatury modułem BME280 oraz pomiaru wilgotności modułem DHT11. Są to podstawowe trzy parametry meteorologiczne powietrza, dzięki którym można analizować pogodę, sprawność klimatyzacji lub badać niektóre zjawiska termodynamiczne.


Instrukcja
1. Połączyć układ zgodnie z opisem
2. Sprawdzić poprawność połączenia
3. Połączyć płytkę ESP8266 do komputera za pomocą kabla USB
4. Pobrać na komputer lub przepisać pliki programu: boot.py, main.py, weather.py
5. Pobrać i rozpakować bibliotekę bme280.zip
6. Umieścić wszystkie 3 pliki i rozpakowaną bibliotekę (z roszerzeniem .py) w jednym folderze
7. Otworzyć wszystkie 4 pliki w programie Thonny
8. W pliku main.py ustawić zmienne NAZWA_SIECI i HASLO na nazwę i hasło sieci WiFi do której mają być nadawane pomiary
9. Zgrać pliki bme280.py, weather.py do pamięci płytki
10. Wybrać interpreter płytki ESP8266 w ustawieniach i uruchomić na niej program main.py
11. W konsoli powinien pojawić się adres IP, postaci **192.168.0.XX**
12. Otworzyć przeglądarkę internetową na dowolnym urządzeniu podłączonym do tej samej sieci WiFi i w pasku adresu wpisać zapisany adres IP płytki. Powinna wyświetlić się prosta strona HTML z odczytami czujników. Wartości aktualizowane są po każdym odświeżeniu strony.
13. Stację można uruchomić również w trybie samodzielnym. W tym celu należy zgrać pliki boot.py, main.py, weather.py, razem z biblioteką bme280.py do pamięci płytki ESP8266 (poprzez *Zapisz jako...*), wtedy skrypt uruchamiający automatycznie rozpocznie wykonywanie programu main.py przy każdym zasileniu, np. z PowerBank'a lub zasilacza sieciowego USB. Tak uruchomiona płytka powinna dalej nadawać swoje odczyty po WiFi, na ten sam adres IP.

Zdjęcia
kod programu
# weather.py

from machine import Pin, I2C
from dht import DHT11
from bme280 import BME280

dht = DHT11(Pin(14, Pin.PULL_UP)) # czujnik wilgoci 

bus = I2C(scl = Pin(5), sda = Pin(4), freq = 10000)
    # czujnik ciśnienia i temperatury
    
# sprawdź połączenie I2C
try:
    bmp = BME280(i2c = bus)
except OSError:
    print("Brak połączenia z czujnikiem ciśnienia!")

def measure():
    try: 
        dht.measure()
    except OSError:
        print("Błąd pomiaru wilgotności!")
    else:
        #print(f"DHT:{dht.temperature()}C {dht.humidity()}%")
        wilg = dht.humidity() #% względnej

    try:
        bmp = BME280(i2c = bus)
    except OSError:
        print("Błąd pomiaru ciśnienia i temperatury!")
    else:
        #print(f"BMP:{bmp.temperature} {bmp.pressure}")
        temp = bmp.temperature
        cisn = bmp.pressure
        
    print(f"wilgotność: {wilg}%")
    print(f"temperatura: {temp}")
    print(f"ciśnienie: {cisn}")
    print("")
    
    return (wilg, temp, cisn)

# main.py

html = """<!DOCTYPE html>
<html>
    <head><title>Stacja Meteorologiczna</title></head>
    <body>
        <h1> Stacja Meteorologiczna </h1>
        <p> Temperatura: {} </p>
        <p> Cisnienie: {} </p>
        <p> Wilgotnosc: {}% </p>
    </body>
</html>
"""

NAZWA_SIECI = 'DLINK'
HASLO = '12345678'

import network
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect(NAZWA_SIECI, HASLO)
print('Connected to: ', wifi.ifconfig()[0])

import socket
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
try:
    s.bind(addr)
except OSError as err:
    print("Błąd sieci. Wyłącz i spróbuj ponownie")
    raise err
s.listen(1)

import weather

while True:
    w, t, c = weather.measure()
    content = html.format(t, c, w)

    conn,addr = s.accept()
    conn.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
    conn.send(content)
    conn.close()
Schemat
Tagi
EPS8266