Hjälp med webserver i Micropython på ESP32

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Rossen
Inlägg: 835
Blev medlem: 23 juni 2004, 21:06:35
Ort: Järfälla
Kontakt:

Hjälp med webserver i Micropython på ESP32

Inlägg av Rossen »

Hej hallå i julstöket!

Jag sitter och pillar med en ESP32 baserad temperaturcontroller och har i min modifikation av några copy/pasteade funktioner stött på patrull.
Programmerar i MicroPython.
Fel: Originalkoden med 1st sensor fungerar, jag använder dock 3st och knyter respektive mätvärde till ett visst namn "sensor0..sensor2".
Jag knyter respektive sensors unika ID till respektive namn, för att kunna hålla koll på vilken som är vilken.

Originalkoden läser ut värdet från 1st sensor och presenterar mätvärdet på en webserver, varje gång websidan uppdateras läser den in aktuellt mätvärde och presenterar det, efter några sekunder kopplar sedan webservern ner anslutningen, vilket presenteras i REPL.

I min modifierade kod så läses värdena bara in första vändan, och anslutningen bryts inte efter detta. Uppdaterar jag sidan får jag inga nya mätvärden.

Jag kan inte tillräckligt om kodning för att hitta felet, gissar dock att det har något med att jag plockat bort första stycket i originalkoden för att få till min önskade funktion med flera sensorer.

Originalkoden i main.py ser ut såhär:

Kod: Markera allt

# Complete project details at https://RandomNerdTutorials.com

def read_ds_sensor():
  roms = ds_sensor.scan()
  print('Found DS devices: ', roms)
  print('Temperatures: ')
  ds_sensor.convert_temp()
  for rom in roms:
    temp = ds_sensor.read_temp(rom)
    if isinstance(temp, float):
      msg = round(temp, 2)
      print(temp, end=' ')
      print('Valid temperature')
      return msg
  return b'0.0'
  
def web_page():
  temp = read_ds_sensor()
  html = """<!DOCTYPE HTML><html><head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
  <style> html { font-family: Arial; display: inline-block; margin: 0px auto; text-align: center; }
    h2 { font-size: 3.0rem; } p { font-size: 3.0rem; } .units { font-size: 1.2rem; } 
    .ds-labels{ font-size: 1.5rem; vertical-align:middle; padding-bottom: 15px; }
  </style></head><body><h2>ESP with DS18B20</h2>
  <p><i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 
    <span class="ds-labels">Temperature</span>
    <span id="temperature">""" + str(temp) + """</span>
    <sup class="units">&deg;C</sup>
  </p>
    <p><i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 
    <span class="ds-labels">Temperature</span>
    <span id="temperature">""" + str(round(temp * (9/5) + 32.0, 2)) + """</span>
    <sup class="units">&deg;F</sup>
  </p></body></html>"""
  return html

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(5)

while True:
  try:
    if gc.mem_free() < 102000:
      gc.collect()
    conn, addr = s.accept()
    conn.settimeout(3.0)
    print('Got a connection from %s' % str(addr))
    request = conn.recv(1024)
    conn.settimeout(None)
    request = str(request)
    print('Content = %s' % request)
    response = web_page()
    conn.send('HTTP/1.1 200 OK\n')
    conn.send('Content-Type: text/html\n')
    conn.send('Connection: close\n\n')
    conn.sendall(response)
    conn.close()
  except OSError as e:
    conn.close()
    print('Connection closed')
Och min kod:

Kod: Markera allt

#temp = DS18X20(ow)
#sensors = ow.scan()

sensor2_id = None
sensor1_id = None
sensor0_id = None

# Assign easy to understand names to OneWire devices on the bus at startup

for sensor in sensors:
    if sensor == bytearray(b"('=u\xd0\x01<\xac"):
        sensor2_id = sensor  # Assign above sensor to sensor2

    if sensor == bytearray(b"(\xd5bu\xd0\x01<J"):
        sensor1_id = sensor  # Assign above sensor to sensor1

    if sensor == bytearray(b"(\x99eu\xd0\x01<\x13"):
        sensor0_id = sensor  # Assign above sensor to sensor0


sensor2 = temp.read_temp_async(sensor2_id)
temp.start_conversion(sensor2_id)
time.sleep(1)

sensor1 = temp.read_temp_async(sensor1_id)
temp.start_conversion(sensor1_id)
time.sleep(1)

sensor0 = temp.read_temp_async(sensor0_id)
temp.start_conversion(sensor0_id)
# time.sleep(1)

# END SETTINGS

def web_page():
    temp0 = sensor0
    temp1 = sensor1
    temp2 = sensor2
    html = ("""<!DOCTYPE HTML><html><head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
    <style> html { font-family: Arial; display: inline-block; margin: 0px auto; text-align: center; }
        h2 { font-size: 3.0rem; } p { font-size: 3.0rem; } .units { font-size: 1.2rem; } 
        .ds-labels{ font-size: 1.5rem; vertical-align:middle; padding-bottom: 15px; }
    </style></head><body><h2>EKETOMTEN 19</h2>
    <p><i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 
        <span class="ds-labels">Vardagsrum</span>
        <span id="temp0">""" + str(temp0) + """</span>
        <sup class="units">&deg;C</sup>
    </p>
        <p><i class="fas fa-thermometer-half" style="color:#059e8a;"></i>
        <span class="ds-labels">Sovrum</span>
        <span id="temp1">""" + str(temp1) + """</span>
        <sup class="units">&deg;C</sup>
    </p>
        <p><i class="fas fa-thermometer-half" style="color:#059e8a;"></i>
        <span class="ds-labels">Utomhus</span>
        <span id="temp2">""" + str(temp2) + """</span>
        <sup class="units">&deg;C</sup>
    </p></body></html>""")
    return html


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(5)

while True:
    try:
        if gc.mem_free() < 102000:
            gc.collect()
        conn, addr = s.accept()
        conn.settimeout(3.0)
        print('Got a connection from %s' % str(addr))
        request = conn.recv(1024)
        conn.settimeout(None)
        request = str(request)
        print('Content = %s' % request)
        response = web_page()
        conn.send('HTTP/1.1 200 OK\n')
        conn.send('Content-Type: text/html\n')
        conn.send('Connection: close\n\n')
        conn.sendall(response)
        conn.close()
    except OSError as e:
        conn.close()
        print('Connection closed')
Boot.py ser ut såhär

Kod: Markera allt

try:
    import usocket as socket
except:
    import socket

import time
from time import sleep
from machine import Pin
from onewire import DS18X20
from onewire import OneWire

import network

import esp

esp.osdebug(None)

import gc

gc.collect()

# DS18B20 data line connected to pin P4
ow = OneWire(Pin(4))
temp = DS18X20(ow)
sensors = ow.scan()

ssid = "ConnectoPatronum"
password = "HEMLIS!!!"

station = network.WLAN(network.STA_IF)

station.active(True)
station.connect(ssid, password)

while station.isconnected() == False:
    pass

print("Connection successful")
print(station.ifconfig())
Användarvisningsbild
Icecap
Inlägg: 26151
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Hjälp med webserver i Micropython på ESP32

Inlägg av Icecap »

I min klocka som har 1-Wire bus kan jag läsa upp till 16 st. DS18B20, mer om jag ökar namnbufferns storlek.

Såklart har jag en sekvens för att detektera vilka enheter som finns på bussen, när de är hittat kan jag läsa deras ID och sedan - manuellt - lägga till ett namn, typ 'Inne', 'Ute' osv. om jag vill.

Sekvensen för att läsa temperatur är att det skickas en "Alla ska starta en konvertering". Denna konvertering tar upp till 750ms så efter kommandot är skickat får de lite tid.

Sedan frågar jag var o en av sensorerna om deras data från konverteringen, detta sker med deras specifika adress.
När alla sensorer har givit deras svar är det klart.

Varje sensor har ju deras unika ID och den ska läsas ut. Sedan ska den kopplas till deras "människonamn" men det får program-skrivaren klara.
I mitt fall sker det i en tabell som sparas i inställningarna.

Efter vad jag kan se, utför du inte denna "hitta alla sensorer på bussen" initialt, den behövs ju bara att köras en gång vid program-uppstart.
Skriv svar