От данных к графику:веб-путешествие с Flask и SQLite
Сбор реальных данных (RPi / DHT22), сохранение их в базе данных (SQLite), создание графиков (Matplotlib) и их представление на веб-странице (Flask).
Введение:от данных к графику. веб-путешествие с Flask и SQLite
В моем предыдущем руководстве Python WebServer с Flask и Raspberry Pi мы узнали, как взаимодействовать с физическим миром через интерфейсную веб-страницу, созданную с помощью Flask. Итак, следующий естественный шаг - собрать данные из реального мира, чтобы они были доступны для нас на веб-странице. Очень простой! Но что произойдет, если, например, мы захотим узнать, какая была ситуация накануне? Или провести какой-то анализ с этими данными? В таких случаях данные также должны храниться в базе данных.
Короче говоря, в этом новом руководстве мы:
Захват реальных данных (температура и относительная влажность воздуха) с помощью датчика DHT22; Загрузите эти данные в локальной базе данных , построенный с помощью SQLite; Создать графику с историческими данными используя Matplotlib; Показать данные с анимированными «датчиками», созданными с помощью JustGage; Сделайте все доступным в Интернете через локальный веб-сервер, созданный с помощью Python и Flask;
Блок-схема дает нам представление обо всем проекте:
Шаг 1:BoM - Bill of Materials
- Raspberry Pi V3 - 32 доллара США.
- Датчик температуры и относительной влажности DHT22 - 9,95 долларов США.
- Резистор 4К7 Ом
Шаг 2. Установка SQLite
Хорошо, общая идея состоит в том, чтобы собрать данные с датчика и сохранить их в базе данных.
Но какой «движок» базы данных следует использовать?
На рынке есть много вариантов, и, вероятно, 2 наиболее часто используемых с Raspberry Pi и датчиками - это MySQL и SQLite. MySQL очень известен, но немного «тяжел» для использования в простых проектах на базе Raspberry (кроме того, он принадлежит Oracle!). SQLite, вероятно, является наиболее подходящим выбором. Потому что он бессерверный, легкий, с открытым исходным кодом и поддерживает большую часть кода SQL (его лицензия - «Public Domain»). Еще одна удобная вещь - SQLite хранит данные в одном файле, который можно хранить где угодно.
Но что такое SQLite?
SQLite - это система управления реляционными базами данных, содержащаяся в библиотеке программирования C. В отличие от многих других систем управления базами данных, SQLite не является механизмом базы данных клиент-сервер. Скорее, он встроен в конечную программу.
SQLite - популярное общественное достояние выбор в качестве встроенного программного обеспечения базы данных для локального / клиентского хранилища в прикладном программном обеспечении, таком как веб-браузеры. Это, пожалуй, наиболее широко распространенный механизм баз данных, поскольку он используется сегодня, среди прочего, несколькими широко распространенными браузерами, операционными системами и встроенными системами (такими как мобильные телефоны). SQLite привязан ко многим языкам программирования, таким как Python, который используется в нашем проекте.
(Подробнее в Википедии)
Мы не будем вдаваться в подробности здесь, но полную документацию по SQLite можно найти по этой ссылке:https://www.sqlite.org/docs.html
Быть по сему! Давайте установим SQLite на наш Pi
Установка:
Чтобы создать базу данных, выполните следующие действия.
1. Установите SQLite в Raspberry Pi с помощью команды:
sudo apt-get install sqlite3
2. Создайте каталог для разработки проекта:
mkdir Sensors_Database
3. Переместитесь в этот каталог:
cd mkdir Sensors_Database /
3. Дайте имя и создайте базу данных, например databaseName.db . (в моем случае «sensorData.db»):
sqlite3 sizesData.db
Появится «оболочка», в которую вы можете войти с помощью команд SQLite. Мы вернемся к нему позже.
sqlite>
Команды начинаются с символа «.», Например «.help», «.quit» и т. Д.
4. Закройте оболочку, чтобы вернуться в Терминал:
sqlite> .quit
На приведенном выше экране печати терминала показано, что было объяснено.
Вышеупомянутый «sqlite>» предназначен только для иллюстрации того, как будет выглядеть оболочка SQLite. Вам не нужно его вводить. Он появится автоматически.
Шаг 3. Создание и заполнение таблицы
Чтобы зарегистрировать данные измерений датчика DHT в базе данных, мы должны создать таблицу (база данных может содержать несколько таблиц). Наша таблица будет называться «DHT_data» и будет иметь 3 столбца, в которых мы будем регистрировать собранные данные:Дата и Час (имя столбца: отметка времени ), Температура (название столбца: temp ) и влажности (название столбца: шум ).
Создание таблицы:
Чтобы создать таблицу, вы можете сделать это:
- Непосредственно в оболочке SQLite или
- Использование программы Python.
1. Использование оболочки:
Откройте базу данных, созданную на последнем шаге:
sqlite3 sizesData.db
И ввод с помощью операторов SQL:
sqlite> BEGIN; sqlite> СОЗДАТЬ ТАБЛИЦУ DHT_data (временная метка DATETIME, temp NUMERIC, hum NUMERIC); sqlite> COMMIT;
Все операторы SQL должны заканчиваться на «;». Также обычно эти заявления пишутся заглавными буквами. Это не обязательно, но это хорошая практика.
2. Использование Python
импортировать sqlite3 как liteimport syscon =lite.connect ('sizesData.db') с con:cur =con.cursor () cur.execute ("DROP TABLE IF EXISTS DHT_data ") cur.execute (" СОЗДАТЬ ТАБЛИЦУ DHT_data (временная метка DATETIME, temp NUMERIC, гудение NUMERIC) ")
Откройте приведенный выше код из моего GitHub:createTableDHT.py
Запустите его на своем Терминале:
python3 createTableDHT.py
Где бы ни использовался метод, таблица должна быть создана. Вы можете проверить это в SQLite Shell, используя команду «.table». Откройте оболочку базы данных:
sqlite3> sizesData.db
В оболочке после использования .table отобразятся имена созданных таблиц (в нашем случае будет только одно:«DHT_table». После этого выйдите из оболочки, используя .quit команда.
sqlite> .tableDHT_datasqlite> .quit
Вставка данных в таблицу:
Давайте введем в нашу базу данных 3 набора данных, каждый из которых будет иметь по 3 компонента:(отметка времени, температура и шум). Компонент отметка времени будут реальны и взяты из системы с помощью встроенной функции «сейчас» и temp и гудеть - фиктивные данные в ° C и% соответственно.
Примечание что время указано в формате «UTC», что хорошо, потому что вам не нужно беспокоиться о проблемах, связанных с переходом на летнее время и другими вопросами. Если вы хотите вывести дату в локализованном времени, просто преобразуйте ее в соответствующий часовой пояс позже.
То же самое было сделано с созданием таблицы, вы можете вставлять данные вручную через оболочку SQLite или через Python. В оболочке вы бы сделали это, данные за данными, используя такие операторы SQL (в нашем примере вы сделаете это 3 раза):
sqlite> ВСТАВИТЬ ЗНАЧЕНИЯ DHT_data (datetime ('now'), 20.5, 30);
И в Python вы бы сделали то же самое, но сразу:
импортировать sqlite3 как liteimport syscon =lite.connect ('sensorData.db') с con:cur =con.cursor () cur.execute ("ВСТАВИТЬ ЗНАЧЕНИЯ DHT_data (datetime ('now'), 20.5, 30) ") cur.execute (" INSERT INTO DHT_data VALUES (datetime ('now'), 25.8, 40) ") cur.execute (" INSERT INTO DHT_data VALUES (datetime (' now '), 30.3, 50) ")
Откройте приведенный выше код из моего GitHub:insertTableDHT.py
Запустите его на терминале Pi:
python3 insertTableDHT.py
Чтобы убедиться, что приведенный выше код работает, вы можете проверить данные в таблице через оболочку с помощью оператора SQL:
sqlite> SELECT * FROM DHT_DATA;
На приведенном выше экране печати терминала показано, как будут выглядеть строки таблицы.
Шаг 4. Вставка и проверка данных с помощью Python
Для начала давайте сделаем то же самое, что и раньше (ввод и получение данных), но сделаем и то, и другое с помощью python, а также распечатаем данные на терминале:
import sqlite3import sysconn =sqlite3.connect ('sizesData.db') curs =conn.cursor () # функция для вставки данных в tabledef add_data (temp, hum) :curs.execute ("INSERT INTO DHT_data values (datetime ('now'), (?), (?))", (temp, hum)) conn.commit () # вызвать функцию для вставки данныхadd_data (20.5, 30 ) add_data (25.8, 40) add_data (30.3, 50) # печать содержимого базы данных ("\ nВсе содержимое базы данных:\ n") для строки в curs.execute ("SELECT * FROM DHT_data"):print (row) # закрыть база данных после useconn.close ()
Откройте приведенный выше код из моего GitHub:insertDataTableDHT.py и запустите его на своем терминале:
python3 insertDataTableDHT.py
На приведенном выше экране печати терминала показан результат.
Шаг 5. Датчик температуры и влажности DHT22
Пока что мы создали таблицу в нашей базе данных, в которой будем сохранять все данные, которые будет считывать датчик. Мы также ввели туда фиктивные данные. Теперь пришло время использовать реальные данные для сохранения в нашей таблице температуры воздуха и относительной влажности. Для этого мы будем использовать старый и хороший DHTxx (DHT11 или DHT22). Сайт ADAFRUIT предоставляет отличную информацию об этих датчиках. Ниже приводится информация, полученная оттуда:
Обзор
Недорогие датчики температуры и влажности DHT очень простые и медленные, но отлично подходят для любителей, которые хотят выполнить базовую регистрацию данных. Датчики DHT состоят из двух частей:емкостного датчика влажности и термистора. Внутри также находится очень простой чип, который выполняет некоторое аналого-цифровое преобразование и выдает цифровой сигнал с температурой и влажностью. Цифровой сигнал довольно легко считывается с помощью любого микроконтроллера.
DHT11 против DHT22
У нас есть две версии датчика DHT, они немного похожи и имеют одинаковую распиновку, но разные характеристики. Вот спецификации:
DHT11 (обычно синий)
Подходит для показаний влажности 20-80% с точностью 5%. Подходит для показаний температуры 0-50 ° C с точностью ± 2 ° C. Частота дискретизации не более 1 Гц (один раз в секунду)
- Ультра низкая стоимость
- Питание от 3 до 5 В и ввод / вывод
- Максимальный ток 2,5 мА, используемый во время преобразования (при запросе данных).
- Размер корпуса 15,5 мм x 12 мм x 5,5 мм
- 4 контакта с шагом 0,1 дюйма
DHT22 (обычно белый)
Подходит для показаний влажности 0-100% с точностью 2-5% Подходит для показаний температуры от -40 до 125 ° C с точностью ± 0,5 ° C Частота дискретизации не более 0,5 Гц (один раз в 2 секунды)
- Низкая стоимость
- Питание от 3 до 5 В и ввод / вывод
- Максимальный ток 2,5 мА, используемый во время преобразования (при запросе данных).
- Размер корпуса 15,1 мм x 25 мм x 7,7 мм
- 4 контакта с шагом 0,1 дюйма
Как видите, DHT22 немного точнее и хорош в чуть большем диапазоне. Оба используют один цифровой контакт и работают «медленно» в том смысле, что вы не можете запрашивать их чаще, чем раз в секунду (DHT11) или два раза (DHT22).
Оба датчика будут работать нормально, сохраняя информацию внутри помещения в нашей базе данных.
DHTxx имеет 4 контакта (обращенный к датчику, контакт 1 - крайний левый):
- VCC (мы можем подключаться к внешнему 5 В или к 3,3 В от RPi);
- Данные отсутствуют;
- Не подключен
- Земля.
В нашем проекте мы будем использовать DHT22.
Как только вы обычно будете использовать датчик на расстоянии менее 20 м, между выводами Data и VCC необходимо подключить резистор 4K7 Ом. Вывод данных выхода DHT22 будет подключен к Raspberry GPIO 16.
Проверьте приведенную выше электрическую схему подключения датчика к контактам RPi, как показано ниже:
- Контакт 1 - Vcc ==> 3,3 В
- Контакт 2 - Данные ==> GPIO 16
- Контакт 3 - не подключается
- Контакт 4 - Gnd ==> Gnd
Не забудьте установить резистор 4K7 Ом между выводами Vcc и Data. После подключения датчика мы также должны установить его библиотеку на наш RPi. Мы сделаем это на следующем шаге.
Шаг 6. Установка библиотеки DHT
На Raspberry, начиная с / home, перейдите в / Documents:
документы на компакт-диске
Создайте каталог для установки библиотеки и перейдите туда:
mkdir DHT22_Sensorcd DHT22_Sensor
В своем браузере перейдите на Adafruit GITHub:https://github.com/adafruit/Adafruit_Python_DHT
Загрузите библиотеку, щелкнув ссылку загрузки zip справа, и распакуйте архив в недавно созданной папке Raspberry Pi. Затем перейдите в каталог библиотеки (подпапка, которая автоматически создается при распаковке файла) и выполните команду:
sudo python3 setup.py install
Откройте тестовую программу (DHT22_test.py) с моего GITHUB:
import Adafruit_DHTDHT22Sensor =Adafruit_DHT.DHT22DHTpin =16humidity, temperature =Adafruit_DHT.read_retry (DHT22Sensor, DHTpin), если влажность не None и температура не None:print ('Temp ={0:0.1f} * C Humidity ={1:0.1f}% '. Format (температура, влажность)) else:print (' Не удалось получить показания. Повторите попытку! ')
Запустите программу с помощью команды:
python3 DHT22_test.py
На приведенном выше экране печати терминала показан результат.
Шаг 7. Сбор реальных данных
Теперь, когда у нас есть и датчик, и наша база данных, все установлено и настроено, пора читать и сохранять реальные данные.
Для этого мы будем использовать код:
import timeimport sqlite3import Adafruit_DHTdbname ='sensorData.db'sampleFreq =2 # время в секундах # получение данных из DHT sensordef getDHTdata ():DHT22Sensor =Adafruit_DHT.DHT22 DHTpin =16 hum, temp =Adafruit_DHT.read_retry (DHT22Sensor, DHTpin), если шум не равен None, а temp не равен None:hum =round (hum) temp =round (temp, 1) logData (temp, hum) # записать данные датчика в databasedef logData (temp, hum):conn =sqlite3.connect (dbname) curs =conn.cursor () curs.execute ("INSERT INTO DHT_data values (datetime ('now'), (?), (?))", (temp , hum)) conn.commit () conn.close () # отображение данных базы данныхdef displayData ():conn =sqlite3.connect (dbname) curs =conn.cursor () print ("\ nВсе содержимое базы данных:\ n") для строка в curs.execute ("SELECT * FROM DHT_data"):print (row) conn.close () # main functiondef main ():for i in range (0,3):getDHTdata () time.sleep (sampleFreq) displayData () # Выполнить программу main ()
Откройте указанный выше файл из моего GitHub:appDHT.py и запустите его на своем Терминале:
python3 appDHT.py
Функция getDHTdata () захватывает 3 образца датчика DHT, проверяет их на наличие ошибок и, если все в порядке, сохраняет данные в базе данных с помощью функции logData (temp, hum) . Последняя часть кода вызывает функцию displayData () который печатает все содержимое нашей таблицы в Терминале.
На приведенном выше экране печати показан результат. Обратите внимание, что последние 3 строки (строки) - это реальные данные, полученные с помощью этой программы, а 3 предыдущие строки были теми, которые ранее были введены вручную.
На самом деле appDHT.py - плохое имя. Как правило, appSomething.py используется со скриптами Python на веб-серверах, как мы увидим далее в этом руководстве. Но, конечно, вы можете использовать это здесь.
Шаг 8. Автоматический сбор данных
На этом этапе мы должны реализовать механизм для автоматического чтения и вставки данных в нашу базу данных, наш «Регистратор».
Откройте новое окно терминала и введите следующий код Python:
import timeimport sqlite3import Adafruit_DHTdbname ='sensorData.db'sampleFreq =1 * 60 # время в секундах ==> Выборка каждые 1 мин # получение данных из DHT sensordef getDHTdata () :DHT22Sensor =Adafruit_DHT.DHT22 DHTpin =16 гул, temp =Adafruit_DHT.read_retry (DHT22Sensor, DHTpin), если гул не равен None, а темп не равен None:hum =round (гул) temp =round (temp, 1) вернуть темп, гул # записать данные датчика в базу данных ?)) ", (temp, hum)) conn.commit () conn.close () # main functiondef main ():while True:temp, hum =getDHTdata () logData (temp, hum) time.sleep (sampleFreq) # ------------ Выполнить программу main ()
Или получите его с моего GitHub:logDHT.py. Запустите его в Терминале:
python3 logDHT.py
Что делает функция main ():
Вызов функции getDHTdata () , который вернет данные, полученные датчиком DHT22. Возьмите эти данные (температуру и влажность) и передайте их другой функции: logData (temp, hum) которые вставляют их вместе с фактической датой и временем в нашу таблицу. И переходит в спящий режим, ожидая следующего запланированного времени для сбора данных (определяется параметром sampleFreq , что в этом примере составляет 1 минуту).
Оставьте окно Терминала открытым.
Например, до тех пор, пока вы не завершите программу нажатием [Ctr + z], программа будет постоянно захватывать данные, передавая их в нашу базу данных. Я оставил его работать на некоторое время с периодичностью в 1 минуту, чтобы быстрее заполнить базу данных, и изменил частоту через несколько часов на 10 минут.
Существуют и другие механизмы, гораздо более эффективные для выполнения такого «автоматического журнала», чем использование «time.sleep», но приведенный выше код отлично подойдет для нашей цели. В любом случае, если вы хотите реализовать лучший «планировщик», вы можете использовать Crontab , который представляет собой удобный инструмент UNIX для планирования заданий. Хорошее объяснение того, что такое Crontab, можно найти в этом руководстве:«Планирование задач в Linux с помощью Crontab» Кевина ван Зонневельда.
Шаг 9. Запросы
Теперь, когда наша база данных загружается автоматически, мы должны найти способы работать со всеми этими данными. Мы делаем это с помощью запросов!
Что такое запрос?
Одна из наиболее важных особенностей работы с языком SQL над базами данных - это возможность создавать «запросы к базе данных». Другими словами, запросы извлекают данные из базы данных, форматируя их в удобочитаемой форме. Запрос должен быть написан на языке SQL . , который использует SELECT оператор для выбора конкретных данных.
Фактически, мы использовали его «в широком смысле» на последнем шаге:«SELECT * FROM DHT_data».
Примеры:
Давайте создадим несколько запросов к данным в таблице, которую мы уже создали. Для этого введите следующий код:
import sqlite3conn =sqlite3.connect ('sizesData.db') curs =conn.cursor () maxTemp =27.6print ("\ nВсе содержимое базы данных:\ n") для строки в curs.execute ("SELECT * FROM DHT_data"):print (row) print ("\ nЗаписи базы данных для определенного значения влажности:\ n") для строки в curs.execute ("SELECT * FROM DHT_data WHERE hum ='29' "):print (row) print (" \ nЗаписи базы данных, где температура выше 30oC:\ n ") для строки в curs.execute (" SELECT * FROM DHT_data WHERE temp>
30.0 "):print (row) print ("\ nЗаписи базы данных, где температура выше x:\ n") для строки в curs.execute ("SELECT * FROM DHT_data WHERE temp>
(?)", (maxTemp,)):print (row)
Или получите его с моего GitHub:queryTableDHT.py и запустите в Терминале:
python3 queryTableDHT.py
Вы можете увидеть результат на экране печати Терминала выше. Это простые примеры, чтобы дать вам представление о запросах. Найдите время, чтобы понять операторы SQL в приведенном выше коде.
Если вы хотите узнать больше о языке SQL, хорошим источником является W3School SQL Tutorial.
Шаг 10. Последние данные, введенные в таблицу:
Очень важный запрос - получить последние введенные данные . (или вошли) на стол. Мы можем сделать это прямо в оболочке SQLite с помощью команды:
sqlite> SELECT * FROM DHT_data ORDER BY timestamp DESC LIMIT 1;
Или запустите простой код Python, как показано ниже:
import sqlite3conn =sqlite3.connect ('sizesData.db') curs =conn.cursor () print ("\ nПоследние данные, зарегистрированные в базе данных:\ n") для строка в curs.execute ("ВЫБРАТЬ * ИЗ DHT_data ORDER BY timestamp DESC LIMIT 1"):print (row)
Вы можете увидеть результат на первом экране печати Терминала выше.
Обратите внимание, что результат будет представлен в виде «кортежа значений»:(«отметка времени», темп, шум).
Кортеж вернул содержимое последней строки нашей таблицы, состоящей из трех элементов:
- row [0] =timestamp [string]
- row [1] =temp [float]
- row [2] =гудеть [float]
Итак, мы можем улучшить наш код, чтобы получать «чистые» данные из таблицы, например:
import sqlite3conn =sqlite3.connect ('sizesData.db') curs =conn.cursor () print ("\ nПоследние необработанные данные, зарегистрированные в базе данных:\ n") для строки в curs.execute ("SELECT * FROM DHT_data ORDER BY timestamp DESC LIMIT 1"):print (str (row [0]) + "==> Temp =" + str (row [1]) + "Hum ="+ str (строка [2]))
Откройте файл с моего GitHub:lastLogDataTableDHT.py и запустите его в Терминале:
python3 lastLogDataTableDHT.py
Вы можете увидеть результат на втором экране печати терминала выше.
Шаг 11. Веб-интерфейс для визуализации данных
В моем последнем руководстве:Python WebServer с Flask и Raspberry Pi мы узнали, как реализовать веб-сервер (используя Flask) для сбора данных с датчиков и отображения их статуса на веб-странице.
Этого мы и здесь хотим добиться. Разница заключается в данных, которые будут отправлены на наш интерфейс, которые будут взяты из базы данных . а не напрямую с датчиков, как мы делали в этом руководстве.
Создание среды веб-сервера:
Первое, что нужно сделать, это установить Flask на Raspberry Pi. Если у вас его нет, зайдите в Терминал и введите:
sudo apt-get install python3-flask
Лучшее, когда вы начинаете новый проект, - это создать папку, в которой будут организованы ваши файлы. Например:
Из дома перейдите в наш рабочий каталог:
cd Documents / Sensors_Database
Создайте новую папку, например:
mkdir dhtWebServer
Приведенная выше команда создаст папку с именем «dhtWebServer», в которой мы будем сохранять наши скрипты python:
/ home / pi / Documents / Sensor_Database / rpiWebServer
Теперь в этой папке создадим две подпапки: static для CSS и, возможно, файлов JavaScript и шаблонов для файлов HTML . Перейдите в новую созданную папку:
cd dhtWebServer
И создайте 2 новые подпапки:
mkdir static
и
шаблоны mkdir
Окончательное «дерево» каталогов будет выглядеть так:
├── Sensors_Database ├── sizesData.db ├── logDHT.py ├── dhtWebSensor ├── templates └── static
Мы оставим нашу созданную базу данных в каталоге / Sensor_Database, поэтому вам нужно будет подключить SQLite с «../sensorsData.db».
В ПОРЯДКЕ! Создав нашу среду, давайте соберем части и создадим наше приложение Python WebServer . . Приведенная выше диаграмма дает нам представление о том, что нужно делать!
Шаг 12. Приложение Python WebServer
Начиная с последней диаграммы, давайте создадим веб-сервер на Python с помощью Flask. Я предлагаю Geany в качестве IDE, как только вы сможете работать одновременно с разными типами файлов (.py, .html и .css).
Приведенный ниже код представляет собой сценарий Python, который будет использоваться на нашем первом веб-сервере:
from flask import Flask, render_template, requestapp =Flask (__ name __) import sqlite3 # Получить данные из databasedef getData ():conn =sqlite3.connect ('../ sensorData .db ') curs =conn.cursor () для строки в curs.execute ("ВЫБРАТЬ * ИЗ DHT_data ORDER BY timestamp DESC LIMIT 1"):time =str (row [0]) temp =row [1] hum =row [2] conn.close () return time, temp, hum # main route @ app.route ("/") def index ():time, temp, hum =getData () templateData ={'time':time, ' temp ':temp,' hum ':hum} return render_template (' index.html ', ** templateData) if __name__ =="__main__":app.run (host =' 0.0.0.0 ', port =80, debug =Ложь)
Вы можете получить скрипт python appDhtWebServer.py с моего GitHub. Приведенный выше код делает следующее:
С помощью этого запроса первое, что делается в коде, - это берет данные из базы данных с помощью функции time, temp, hum =getData (). Эта функция в основном представляет собой тот же запрос, который использовался ранее для получения данных, хранящихся в таблице. Имея под рукой данные, наш скрипт возвращается на веб-страницу ( index.html ): время , темп и гудеть в ответ на предыдущий запрос.
- Каждый раз, когда кто-то «нажимает» ‘на« / », то есть на главной странице (index.html) нашей веб-страницы, генерируется запрос GET;
Итак, давайте посмотрим на index.html и style.css файлы, которые будут использоваться для создания нашего интерфейса:
index.html
Данные датчика DHT Данные датчика DHT
TEMPERATURE ==> {{tempLab}} oC
ВЛАЖНОСТЬ (отн.) ==> { {humLab}}%
Последнее считывание датчиков:{{time}} ==> REFRESH
@ 2018 Разработано MJRoBot.org