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">°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">°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')
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">°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">°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">°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')
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())