'''
Wetterstation V0.2
Webserver Access Point
Hardware: ESP32, DS18b20 OneWire Temperature Sensor
MicroPython v1.26.1 on 2025-09-11; Generic ESP32 module with ESP32
external libraries:
https://microdot.readthedocs.io/en/latest/intro.html
2025-01-19 mchris
'''
import network
import uasyncio as asyncio
from microdot import Microdot
import esp32
import machine
import onewire
import ds18x20
import time
async def ap_mode(ssid, password):
# Setup DS18B20 on GPIO 4
dat = machine.Pin(4)
ds = ds18x20.DS18X20(onewire.OneWire(dat))
sensors = ds.scan()
print('Found DS18B20 sensors:', sensors)
if not sensors:
print("No DS18B20 found on GPIO 4!")
ap = network.WLAN(network.AP_IF)
ap.config(essid=ssid, password=password)
ap.active(True)
while not ap.active():
await asyncio.sleep(0.1)
print('AP Active. IP:', ap.ifconfig()[0])
app = Microdot()
app.counter = 0
app.reset_count = 0
app.ds_sensors = sensors # Store sensor ROMs
app.ds_device = ds # Store DS18B20 object
@app.route('/')
async def index(request):
html = """
Wetterstation
Wetterstation
ESP32 intern:
-- C
DS18x20:
-- C
Alive Counter: --
Resets: --
"""
return html, 200, {'Content-Type': 'text/html'}
@app.route('/data')
async def get_data(request):
# Internal ESP32 temperature
temp_raw = esp32.raw_temperature()
internal_temp = round((temp_raw - 32) * 5/9, 1)
# External DS18B20 temperature
external_temp = -99 # Error value
if app.ds_sensors:
try:
app.ds_device.convert_temp()
await asyncio.sleep_ms(750) # DS18B20 conversion time
external_temp = round(app.ds_device.read_temp(app.ds_sensors[0]), 1)
except:
external_temp = -99
t = time.localtime()
timestamp = "{:02d}:{:02d}:{:02d}".format(t[3], t[4], t[5])
#app.counter += 1
app.counter=timestamp
return {
'internal': internal_temp,
'external': external_temp,
'counter': app.counter,
'resets': app.reset_count
}, 200, {'Content-Type': 'application/json'}
@app.route('/reset', methods=['POST'])
async def reset_handler(request):
app.counter = 0
app.reset_count += 1
return {'status': 'reset'}, 200, {'Content-Type': 'application/json'}
await app.start_server(port=80)
asyncio.run(ap_mode('pipico', '12345678'))