MicroPython: веб-сервер ESP32/ESP8266 с DS18B20 (метеостанция)

В этом руководстве мы пошагово рассмотрим, как создать автономный веб-сервер на ESP32 или ESP8266 NodeMCU, который отображает показания датчика температуры DS18B20, используя прошивку MicroPython. Мы создадим веб-сервер ESP32/ESP8266, который адаптируется под мобильные устройства и доступен с любого устройства с браузером в вашей локальной сети.

MicroPython веб-сервер ESP32 ESP8266 DS18B20 температура

Если вы хотите узнать, как работает датчик DS18B20, прочитайте наше руководство по MicroPython: DS18B20 с ESP32 и ESP8266 (показания температуры)

У нас есть аналогичные руководства с использованием Arduino IDE:

Предварительные требования

Для выполнения этого руководства вам необходима прошивка MicroPython, установленная на плату ESP32 или ESP8266. Также вам нужна IDE для написания и загрузки кода на плату. Мы предлагаем использовать Thonny IDE или uPyCraft IDE:

Знакомство с датчиком температуры DS18B20

Датчик температуры DS18B20 — это цифровой датчик с интерфейсом 1-Wire. Это означает, что для связи с ESP32 или ESP8266 ему нужна всего одна линия данных (и GND).

Датчик может питаться от внешнего источника или получать питание от линии данных (так называемый «паразитный режим»), что устраняет необходимость во внешнем источнике питания.

Распиновка датчика температуры DS18B20

Необходимые компоненты

Для выполнения этого руководства вам понадобятся следующие компоненты:

Схема подключения — ESP32

Если вы используете ESP32, следуйте приведённой ниже схеме.

Схема подключения датчика DS18B20 к ESP32

Схема подключения — ESP8266

Если вы используете ESP8266, следуйте приведённой ниже схеме.

Схема подключения датчика DS18B20 к ESP8266

Примечание

В этом руководстве мы подключаем линию данных DS18B20 к GPIO 4, но вы можете использовать любой другой подходящий GPIO.

Код веб-сервера — показания температуры DS18B20

Отображение показаний температуры DS18B20 на веб-сервере MicroPython

Для этого примера вам понадобятся два файла:

  • 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">&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')

Посмотреть исходный код

Чтение датчика 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. Вы сможете увидеть веб-страницу с последними показаниями датчика в градусах Цельсия и Фаренгейта:

Показания температуры DS18B20 на веб-сервере ESP32 ESP8266

Заключение

Мы надеемся, что это руководство по MicroPython для датчика температуры DS18B20 с ESP32 и ESP8266 было для вас полезным. У нас есть другие проекты с ESP и MicroPython, которые могут вас заинтересовать: