MicroPython: веб-сервер ESP32/ESP8266 с DS18B20 (метеостанция)
В этом руководстве мы пошагово рассмотрим, как создать автономный веб-сервер на ESP32 или ESP8266 NodeMCU, который отображает показания датчика температуры DS18B20, используя прошивку MicroPython. Мы создадим веб-сервер ESP32/ESP8266, который адаптируется под мобильные устройства и доступен с любого устройства с браузером в вашей локальной сети.
Если вы хотите узнать, как работает датчик DS18B20, прочитайте наше руководство по MicroPython: DS18B20 с ESP32 и ESP8266 (показания температуры)
У нас есть аналогичные руководства с использованием Arduino IDE:
Предварительные требования
Для выполнения этого руководства вам необходима прошивка MicroPython, установленная на плату ESP32 или ESP8266. Также вам нужна IDE для написания и загрузки кода на плату. Мы предлагаем использовать Thonny IDE или uPyCraft IDE:
Thonny IDE:
uPyCraft IDE:
Знакомство с датчиком температуры DS18B20
Датчик температуры DS18B20 — это цифровой датчик с интерфейсом 1-Wire. Это означает, что для связи с ESP32 или ESP8266 ему нужна всего одна линия данных (и GND).
Датчик может питаться от внешнего источника или получать питание от линии данных (так называемый «паразитный режим»), что устраняет необходимость во внешнем источнике питания.
Необходимые компоненты
Для выполнения этого руководства вам понадобятся следующие компоненты:
ESP32 или ESP8266 (см. сравнение ESP32 и ESP8266)
Датчик температуры DS18B20 (один или несколько датчиков) — водонепроницаемая версия
Схема подключения — ESP32
Если вы используете ESP32, следуйте приведённой ниже схеме.
Схема подключения — ESP8266
Если вы используете ESP8266, следуйте приведённой ниже схеме.
Примечание
В этом руководстве мы подключаем линию данных DS18B20 к GPIO 4, но вы можете использовать любой другой подходящий GPIO.
Код веб-сервера — показания температуры DS18B20
Для этого примера вам понадобятся два файла:
boot.py: запускается при включении устройства и задаёт различные параметры конфигурации, такие как учётные данные сети, импорт библиотек, настройка выводов и т.д.
main.py: это основной скрипт, в котором мы обрабатываем веб-сервер. Он выполняется сразу после boot.py.
Примечание
Рекомендуется использовать файлы boot.py и main.py. Однако, если хотите, вы можете включить весь код в файл main.py.
boot.py (веб-сервер DS18B20)
Создайте новый файл в вашей IDE под названием boot.py и скопируйте следующий код.
# Полный код проекта на https://RandomNerdTutorials.com
try:
import usocket as socket
except:
import socket
from time import sleep
from machine import Pin
import onewire, ds18x20
import network
import esp
esp.osdebug(None)
import gc
gc.collect()
ds_pin = Pin(4)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
ssid = 'REPLACE_WITH_YOUR_SSID'
password = 'REPLACE_WITH_YOUR_PASSWORD'
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password)
while station.isconnected() == False:
pass
print('Connection successful')
print(station.ifconfig())
Этот файл импортирует необходимые библиотеки, настраивает датчик DS18B20 и подключается к вашей сети.
Здесь мы задаём вывод данных DS18B20 на GPIO 4, но вы можете использовать любой другой подходящий вывод:
ds_pin = Pin(4)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
Вы должны ввести свои учётные данные сети в следующие переменные, чтобы ESP мог подключиться к вашей сети.
ssid = 'REPLACE_WITH_YOUR_SSID'
password = 'REPLACE_WITH_YOUR_PASSWORD'
main.py (веб-сервер DS18B20)
В файле main.py мы создаём веб-сервер и обрабатываем запросы. Скопируйте следующий код в файл main.py.
# Полный код проекта на 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')
Чтение датчика DS18B20
Код начинается с создания функции read_ds_sensor(), которая получает температуру от датчика DS18B20. Если вы прошли предыдущий раздел, вы должны быть знакомы с используемыми здесь методами.
def read_ds_sensor():
roms = ds_sensor.scan()
print('Found DS devices: ', roms)
ds_sensor.convert_temp()
for rom in roms:
temp = ds_sensor.read_temp(rom)
if isinstance(temp, float):
temp = round(temp, 2)
print('Valid temperature')
return temp
return '0'
Веб-страница
Функция web_page() возвращает HTML-страницу с последними показаниями температуры.
Мы создали аналогичную веб-страницу в предыдущем руководстве. Если вы хотите узнать, как работает HTML, прочитайте статью: MicroPython: веб-сервер ESP32/ESP8266 с DHT11/DHT22
Создание веб-сервера
После этого выполняем стандартные процедуры для создания серверного сокета.
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')
Подробное объяснение этой процедуры вы найдёте в этом руководстве.
По сути, когда ESP получает запрос, мы отправляем веб-страницу с последними показаниями в качестве ответа:
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)
Демонстрация веб-сервера
После загрузки файлов boot.py и main.py на плату нажмите кнопку RST на ESP для запуска кода.
Затем откройте браузер и введите IP-адрес ESP. Вы сможете увидеть веб-страницу с последними показаниями датчика в градусах Цельсия и Фаренгейта:
Заключение
Мы надеемся, что это руководство по MicroPython для датчика температуры DS18B20 с ESP32 и ESP8266 было для вас полезным. У нас есть другие проекты с ESP и MicroPython, которые могут вас заинтересовать: