ESP32/ESP8266: Запись данных в базу данных MySQL с помощью PHP и Arduino IDE

В этом проекте вы создадите клиент на ESP32 или ESP8266, который отправляет HTTP POST запрос к PHP-скрипту для записи данных (показаний датчиков) в базу данных MySQL.

ESP32 ESP8266 запись данных в базу данных MySQL с помощью PHP и Arduino IDE

Также у вас будет веб-страница, которая отображает показания датчиков, временные метки и другую информацию из базы данных. Вы сможете визуализировать свои данные из любой точки мира, обращаясь к собственному серверу.

В качестве примера мы будем использовать датчик BME280, подключённый к плате ESP32 или ESP8266. Вы можете изменить предоставленный код для отправки показаний другого датчика или использования нескольких плат.

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

  • ESP32 или ESP8266, программируемые в Arduino IDE

  • Хостинг-сервер и доменное имя

  • PHP-скрипт для записи данных в MySQL и их отображения на веб-странице

  • База данных MySQL для хранения показаний

Содержание

Проект разделён на следующие основные разделы:

  1. 1. Размещение PHP-приложения и базы данных MySQL

  2. 2. Подготовка базы данных MySQL

  3. 3. PHP-скрипт HTTP POST — запись данных в базу данных MySQL

  4. 4. PHP-скрипт — отображение содержимого базы данных

  5. 5. Настройка ESP32 или ESP8266

1. Размещение PHP-приложения и базы данных MySQL

Цель этого проекта — иметь собственное доменное имя и хостинг-аккаунт, позволяющий хранить показания датчиков ESP32 или ESP8266. Вы сможете просматривать показания из любой точки мира, обращаясь к своему серверному домену. Вот общая схема:

Обзор проекта — размещение PHP-приложения и базы данных MySQL для отправки показаний датчиков ESP32 или ESP8266

Рекомендуется использовать один из следующих хостинг-сервисов, которые соответствуют всем требованиям проекта:

  • Bluehost (удобный с cPanel): бесплатное доменное имя при подписке на 3-летний план. Рекомендуется выбрать вариант с неограниченным количеством сайтов;

  • Digital Ocean: Linux-сервер, управляемый через командную строку. Этот вариант рекомендуется только для опытных пользователей.

Эти два сервиса я использую лично и рекомендую, но вы можете использовать любой другой хостинг-сервис. Любой хостинг, предоставляющий PHP и MySQL, подойдёт для этого руководства. Если у вас нет хостинг-аккаунта, рекомендуется зарегистрироваться на Bluehost.

При покупке хостинг-аккаунта вам также нужно будет приобрести доменное имя. Именно это делает проект интересным: вы сможете перейти на своё доменное имя (https://example-domain.com) и увидеть показания датчиков ESP32 или ESP8266.

Примечание

Вы также можете запустить LAMP-сервер (Linux, Apache, MySQL, PHP) на Raspberry Pi для доступа к данным в локальной сети. Однако цель данного руководства — публикация показаний на собственном доменном имени, к которому можно получить доступ из любой точки мира. Это позволяет легко просматривать показания ESP без зависимости от сторонней IoT-платформы.

2. Подготовка базы данных MySQL

После регистрации хостинг-аккаунта и настройки доменного имени вы можете войти в cPanel или аналогичную панель управления. После этого выполните следующие шаги для создания базы данных, имени пользователя, пароля и SQL-таблицы.

Создание базы данных и пользователя

1. Введите «database» в строке поиска и выберите «MySQL Database Wizard».

CPanel — выбор MySQL Database Wizard для создания базы данных

2. Введите желаемое имя базы данных. В моём случае имя базы данных — esp_data. Затем нажмите кнопку «Next Step»:

ESP32 ESP8266 CPanel — создание базы данных MySQL

Примечание

Позже вам нужно будет использовать имя базы данных с префиксом, который выдаёт ваш хостинг. Далее я буду ссылаться на него как example_esp_data.

3. Введите имя пользователя базы данных и задайте пароль. Обязательно сохраните все эти данные, так как они понадобятся позже для установки соединения с базой данных в PHP-коде.

ESP32 ESP8266 CPanel — создание пользователя и пароля MySQL

Готово! Ваша новая база данных и пользователь успешно созданы. Сохраните все данные, так как они понадобятся позже:

  • Имя базы данных: example_esp_data

  • Имя пользователя: example_esp_board

  • Пароль: ваш пароль

Создание SQL-таблицы

После создания базы данных и пользователя вернитесь на панель управления cPanel и найдите «phpMyAdmin».

ESP32 ESP8266 CPanel — открытие phpMyAdmin

На левой панели выберите имя вашей базы данных example_esp_data и откройте вкладку «SQL».

ESP32 ESP8266 phpMyAdmin — открытие базы данных

Важно

Убедитесь, что вы открыли базу данных example_esp_data. Затем нажмите вкладку SQL. Если вы не выполните эти точные шаги и запустите SQL-запрос, вы можете создать таблицу в неправильной базе данных.

Скопируйте SQL-запрос из следующего фрагмента:

CREATE TABLE SensorData (
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    sensor VARCHAR(30) NOT NULL,
    location VARCHAR(30) NOT NULL,
    value1 VARCHAR(10),
    value2 VARCHAR(10),
    value3 VARCHAR(10),
    reading_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)

Исходный код

Вставьте его в поле SQL-запроса (выделено красным прямоугольником) и нажмите кнопку «Go» для создания таблицы:

ESP32 ESP8266 phpMyAdmin — создание SQL-таблицы

После этого вы должны увидеть вновь созданную таблицу SensorData в базе данных example_esp_data, как показано на рисунке ниже:

ESP32 ESP8266 phpMyAdmin — просмотр базы данных SQL

3. PHP-скрипт HTTP POST — запись данных в базу данных MySQL

В этом разделе мы создадим PHP-скрипт, который отвечает за приём входящих запросов от ESP32 или ESP8266 и запись данных в базу данных MySQL.

Если вы используете хостинг-провайдера с cPanel, найдите «File Manager»:

ESP32 ESP8266 CPanel — открытие и редактирование PHP-файлов

Затем выберите опцию public_html и нажмите кнопку «+ File» для создания нового файла .php.

ESP32 ESP8266 CPanel — создание нового PHP-файла

Примечание

Если вы следуете этому руководству и не знакомы с PHP или MySQL, рекомендуется создавать файлы с точно такими же именами. В противном случае вам нужно будет изменить скетч ESP с другими URL-путями.

Создайте новый файл в /public_html с таким именем и расширением: post-esp-data.php

Создание нового файла post-esp-data.php

Отредактируйте вновь созданный файл (post-esp-data.php) и скопируйте следующий код:

<?php

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp32-esp8266-mysql-database-php/

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

$servername = "localhost";

// REPLACE with your Database name
$dbname = "REPLACE_WITH_YOUR_DATABASE_NAME";
// REPLACE with Database user
$username = "REPLACE_WITH_YOUR_USERNAME";
// REPLACE with Database user password
$password = "REPLACE_WITH_YOUR_PASSWORD";

// Keep this API Key value to be compatible with the ESP32 code provided in the project page.
// If you change this value, the ESP32 sketch needs to match
$api_key_value = "tPmAT5Ab3j7F9";

$api_key= $sensor = $location = $value1 = $value2 = $value3 = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $api_key = test_input($_POST["api_key"]);
    if($api_key == $api_key_value) {
        $sensor = test_input($_POST["sensor"]);
        $location = test_input($_POST["location"]);
        $value1 = test_input($_POST["value1"]);
        $value2 = test_input($_POST["value2"]);
        $value3 = test_input($_POST["value3"]);

        // Create connection
        $conn = new mysqli($servername, $username, $password, $dbname);
        // Check connection
        if ($conn->connect_error) {
            die("Connection failed: " . $conn->connect_error);
        }

        $sql = "INSERT INTO SensorData (sensor, location, value1, value2, value3)
        VALUES ('" . $sensor . "', '" . $location . "', '" . $value1 . "', '" . $value2 . "', '" . $value3 . "')";

        if ($conn->query($sql) === TRUE) {
            echo "New record created successfully";
        }
        else {
            echo "Error: " . $sql . "<br>" . $conn->error;
        }

        $conn->close();
    }
    else {
        echo "Wrong API Key provided.";
    }

}
else {
    echo "No data posted with HTTP POST.";
}

function test_input($data) {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}

Исходный код

Перед сохранением файла необходимо изменить переменные $dbname, $username и $password на ваши собственные данные:

// Your Database name
$dbname = "example_esp_data";
// Your Database user
$username = "example_esp_board";
// Your Database user password
$password = "YOUR_USER_PASSWORD";

После добавления имени базы данных, имени пользователя и пароля сохраните файл и продолжайте работу с руководством. Если вы попробуете обратиться к вашему доменному имени по следующему URL-пути, вы увидите следующее:

https://example-domain.com/post-esp-data.php
ESP32 ESP8266 — тест URL post-esp-data.php

4. PHP-скрипт — отображение содержимого базы данных

Создайте ещё один PHP-файл в каталоге /public_html, который будет отображать всё содержимое базы данных на веб-странице. Назовите новый файл: esp-data.php

Создание нового файла esp-data.php

Отредактируйте вновь созданный файл (esp-data.php) и скопируйте следующий код:

<!DOCTYPE html>
<html><body>
<?php
/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp32-esp8266-mysql-database-php/

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

$servername = "localhost";

// REPLACE with your Database name
$dbname = "REPLACE_WITH_YOUR_DATABASE_NAME";
// REPLACE with Database user
$username = "REPLACE_WITH_YOUR_USERNAME";
// REPLACE with Database user password
$password = "REPLACE_WITH_YOUR_PASSWORD";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT id, sensor, location, value1, value2, value3, reading_time FROM SensorData ORDER BY id DESC";

echo '<table cellspacing="5" cellpadding="5">
      <tr>
        <td>ID</td>
        <td>Sensor</td>
        <td>Location</td>
        <td>Value 1</td>
        <td>Value 2</td>
        <td>Value 3</td>
        <td>Timestamp</td>
      </tr>';

if ($result = $conn->query($sql)) {
    while ($row = $result->fetch_assoc()) {
        $row_id = $row["id"];
        $row_sensor = $row["sensor"];
        $row_location = $row["location"];
        $row_value1 = $row["value1"];
        $row_value2 = $row["value2"];
        $row_value3 = $row["value3"];
        $row_reading_time = $row["reading_time"];
        // Uncomment to set timezone to - 1 hour (you can change 1 to any number)
        //$row_reading_time = date("Y-m-d H:i:s", strtotime("$row_reading_time - 1 hours"));

        // Uncomment to set timezone to + 4 hours (you can change 4 to any number)
        //$row_reading_time = date("Y-m-d H:i:s", strtotime("$row_reading_time + 4 hours"));

        echo '<tr>
                <td>' . $row_id . '</td>
                <td>' . $row_sensor . '</td>
                <td>' . $row_location . '</td>
                <td>' . $row_value1 . '</td>
                <td>' . $row_value2 . '</td>
                <td>' . $row_value3 . '</td>
                <td>' . $row_reading_time . '</td>
              </tr>';
    }
    $result->free();
}

$conn->close();
?>
</table>
</body>
</html>

Исходный код

После добавления $dbname, $username и $password сохраните файл и продолжайте работу с проектом.

// Your Database name
$dbname = "example_esp_data";
// Your Database user
$username = "example_esp_board";
// Your Database user password
$password = "YOUR_USER_PASSWORD";

Если вы попробуете обратиться к вашему доменному имени по следующему URL-пути, вы увидите следующее:

https://example-domain.com/esp-data.php
ESP32 ESP8266 — тест URL esp-data.php

Готово! Если вы видите пустую таблицу в браузере, значит всё готово. В следующем разделе вы узнаете, как вставлять данные с ESP32 или ESP8266 в базу данных.

5. Настройка ESP32 или ESP8266

Этот проект совместим как с платами ESP32, так и с ESP8266. Вам нужно лишь собрать простую схему и загрузить предоставленный скетч для записи температуры, влажности, давления и других данных в базу данных каждые 30 секунд. Скетч немного отличается для каждой платы.

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

Для этого примера мы будем получать показания с датчика BME280. Вот список деталей, необходимых для сборки схемы:

Схемы подключения

Модуль датчика BME280, который мы используем, общается по протоколу I2C, поэтому его нужно подключить к пинам I2C ESP32 или ESP8266.

Подключение BME280 к ESP32

Пины I2C на ESP32:

  • GPIO 22: SCL (SCK)

  • GPIO 21: SDA (SDI)

Соберите схему, как показано на следующей диаграмме (полное руководство ESP32 с BME280).

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

Рекомендуемое чтение: Справочник по распиновке ESP32

Подключение BME280 к ESP8266

Пины I2C на ESP8266:

  • GPIO 5 (D1): SCL (SCK)

  • GPIO 4 (D2): SDA (SDI)

Соберите схему, как показано на следующей диаграмме, если вы используете плату ESP8266 (полное руководство ESP8266 с BME280).

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

Рекомендуемое чтение: Справочник по распиновке ESP8266

Установка библиотек

Мы будем программировать ESP32/ESP8266 в Arduino IDE, поэтому у вас должно быть установлено дополнение ESP32/ESP8266 в Arduino IDE. Следуйте одному из руководств в зависимости от используемой платы:

Код для ESP32

Следуйте этому разделу, если вы используете ESP32. Для ESP8266 перейдите к разделу Код для ESP8266.

После установки необходимых дополнений и библиотек скопируйте следующий код в Arduino IDE, но пока не загружайте его. Сначала нужно внести некоторые изменения.

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp32-esp8266-mysql-database-php/

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.

*/

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

// Replace with your network credentials
const char* ssid     = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

// REPLACE with your Domain name and URL path or IP address with path
const char* serverName = "https://example.com/post-esp-data.php";

// Keep this API Key value to be compatible with the PHP code provided in the project page.
// If you change the apiKeyValue value, the PHP file /post-esp-data.php also needs to have the same key
String apiKeyValue = "tPmAT5Ab3j7F9";

String sensorName = "BME280";
String sensorLocation = "Office";

/*#include <SPI.h>
#define BME_SCK 18
#define BME_MISO 19
#define BME_MOSI 23
#define BME_CS 5*/

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme;  // I2C
//Adafruit_BME280 bme(BME_CS);  // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);  // software SPI

void setup() {
  Serial.begin(115200);

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());

  // (you can also pass in a Wire library object like &Wire2)
  bool status = bme.begin(0x76);
  if (!status) {
    Serial.println("Could not find a valid BME280 sensor, check wiring or change I2C address!");
    while (1);
  }
}

void loop() {
  //Check WiFi connection status
  if(WiFi.status()== WL_CONNECTED){
    WiFiClientSecure *client = new WiFiClientSecure;
    client->setInsecure(); //don't use SSL certificate
    HTTPClient https;

    // Your Domain name with URL path or IP address with path
    https.begin(*client, serverName);

    // Specify content-type header
    https.addHeader("Content-Type", "application/x-www-form-urlencoded");

    // Prepare your HTTP POST request data
    String httpRequestData = "api_key=" + apiKeyValue + "&sensor=" + sensorName
                          + "&location=" + sensorLocation + "&value1=" + String(bme.readTemperature())
                          + "&value2=" + String(bme.readHumidity()) + "&value3=" + String(bme.readPressure()/100.0F) + "";
    Serial.print("httpRequestData: ");
    Serial.println(httpRequestData);

    // You can comment the httpRequestData variable above
    // then, use the httpRequestData variable below (for testing purposes without the BME280 sensor)
    //String httpRequestData = "api_key=tPmAT5Ab3j7F9&sensor=BME280&location=Office&value1=24.75&value2=49.54&value3=1005.14";

    // Send HTTP POST request
    int httpResponseCode = https.POST(httpRequestData);

    // If you need an HTTP request with a content type: text/plain
    //https.addHeader("Content-Type", "text/plain");
    //int httpResponseCode = https.POST("Hello, World!");

    // If you need an HTTP request with a content type: application/json, use the following:
    //https.addHeader("Content-Type", "application/json");
    //int httpResponseCode = https.POST("{\"value1\":\"19\",\"value2\":\"67\",\"value3\":\"78\"}");

    if (httpResponseCode>0) {
      Serial.print("HTTP Response code: ");
      Serial.println(httpResponseCode);
    }
    else {
      Serial.print("Error code: ");
      Serial.println(httpResponseCode);
    }
    // Free resources
    https.end();
  }
  else {
    Serial.println("WiFi Disconnected");
  }
  //Send an HTTP POST request every 30 seconds
  delay(30000);
}

Исходный код

Настройка сетевых учётных данных

Вам нужно изменить следующие строки, указав свои сетевые учётные данные: SSID и пароль. В коде чётко указаны комментарии, где именно нужно внести изменения.

// Replace with your network credentials
const char* ssid     = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Настройка serverName

Вам также нужно ввести своё доменное имя, чтобы ESP отправлял показания на ваш сервер.

const char* serverName = "https://example-domain.com/post-esp-data.php";

Теперь вы можете загрузить код на плату.

Примечание

Большинство серверов требуют выполнения HTTPS-запросов. Приведённый выше код выполняет HTTPS-запросы для соответствия требованиям большинства современных облачных серверов.

Ваш сервер не поддерживает HTTPS? Используйте этот код.

Как работает код

Краткое описание работы кода:

  • Импорт всех необходимых библиотек;

  • Установка переменных, которые вы можете изменить (apiKeyValue, sensorName, sensorLocation);

  • apiKeyValue — это просто случайная строка, которую вы можете изменить. Она используется для безопасности, чтобы только тот, кто знает ваш API-ключ, мог публиковать данные в базу данных;

  • Инициализация последовательной связи для отладки;

  • Установление Wi-Fi соединения с маршрутизатором;

  • Инициализация BME280 для получения показаний;

  • Инициализация защищённого WiFi-клиента.

Затем в цикле loop() выполняется HTTP POST запрос каждые 30 секунд с последними показаниями BME280:

// Your Domain name with URL path or IP address with path
http.begin(client, serverName);

// Specify content-type header
http.addHeader("Content-Type", "application/x-www-form-urlencoded");

// Prepare your HTTP POST request data
String httpRequestData = "api_key=" + apiKeyValue + "&sensor=" + sensorName
                      + "&location=" + sensorLocation + "&value1=" + String(bme.readTemperature())
                      + "&value2=" + String(bme.readHumidity()) + "&value3=" + String(bme.readPressure()/100.0F) + "";

int httpResponseCode = http.POST(httpRequestData);

Вы можете закомментировать переменную httpRequestData выше, которая объединяет все показания BME280, и использовать переменную httpRequestData ниже для тестирования:

String httpRequestData = "api_key=tPmAT5Ab3j7F9&sensor=BME280&location=Office&value1=24.75&value2=49.54&value3=1005.14";

Подробнее об HTTPS-запросах с ESP32: ESP32 HTTPS Requests (Arduino IDE).

Код для ESP8266

Следуйте этому разделу, если вы используете ESP8266. Для ESP32 смотрите раздел выше.

После установки необходимых дополнений и библиотек скопируйте следующий код в Arduino IDE, но пока не загружайте его. Сначала нужно внести некоторые изменения.

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp32-esp8266-mysql-database-php/

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.

*/

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

// Replace with your network credentials
const char* ssid     = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

// REPLACE with your Domain name and URL path or IP address with path
const char* serverName = "https://example.com/post-esp-data.php";

// Keep this API Key value to be compatible with the PHP code provided in the project page.
// If you change the apiKeyValue value, the PHP file /post-esp-data.php also needs to have the same key
String apiKeyValue = "tPmAT5Ab3j7F9";

String sensorName = "BME280";
String sensorLocation = "Office";

/*#include <SPI.h>
#define BME_SCK 18
#define BME_MISO 19
#define BME_MOSI 23
#define BME_CS 5*/

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme;  // I2C
//Adafruit_BME280 bme(BME_CS);  // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);  // software SPI

void setup() {
  Serial.begin(115200);

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());

  // (you can also pass in a Wire library object like &Wire2)
  bool status = bme.begin(0x76);
  if (!status) {
    Serial.println("Could not find a valid BME280 sensor, check wiring or change I2C address!");
    while (1);
  }
}

void loop() {
  //Check WiFi connection status
  if(WiFi.status()== WL_CONNECTED){

    std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);

    // Ignore SSL certificate validation
    client->setInsecure();

    //create an HTTPClient instance
    HTTPClient https;

    // Your Domain name with URL path or IP address with path
    https.begin(*client, serverName);

    // Specify content-type header
    https.addHeader("Content-Type", "application/x-www-form-urlencoded");

    // Prepare your HTTP POST request data
    String httpRequestData = "api_key=" + apiKeyValue + "&sensor=" + sensorName
                          + "&location=" + sensorLocation + "&value1=" + String(bme.readTemperature())
                          + "&value2=" + String(bme.readHumidity()) + "&value3=" + String(bme.readPressure()/100.0F) + "";
    Serial.print("httpRequestData: ");
    Serial.println(httpRequestData);

    // You can comment the httpRequestData variable above
    // then, use the httpRequestData variable below (for testing purposes without the BME280 sensor)
    //String httpRequestData = "api_key=tPmAT5Ab3j7F9&sensor=BME280&location=Office&value1=24.75&value2=49.54&value3=1005.14";

    // Send HTTP POST request
    int httpResponseCode = https.POST(httpRequestData);

    // If you need an HTTP request with a content type: text/plain
    //http.addHeader("Content-Type", "text/plain");
    //int httpResponseCode = https.POST("Hello, World!");

    // If you need an HTTP request with a content type: application/json, use the following:
    //http.addHeader("Content-Type", "application/json");
    //int httpResponseCode = https.POST("{\"value1\":\"19\",\"value2\":\"67\",\"value3\":\"78\"}");

    if (httpResponseCode>0) {
      Serial.print("HTTP Response code: ");
      Serial.println(httpResponseCode);
    }
    else {
      Serial.print("Error code: ");
      Serial.println(httpResponseCode);
    }
    // Free resources
    https.end();
  }
  else {
    Serial.println("WiFi Disconnected");
  }
  //Send an HTTP POST request every 30 seconds
  delay(30000);
}

Исходный код

Настройка сетевых учётных данных (ESP8266)

Вам нужно изменить следующие строки, указав свои сетевые учётные данные: SSID и пароль. В коде чётко указаны комментарии, где именно нужно внести изменения.

// Replace with your network credentials
const char* ssid     = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Настройка serverName (ESP8266)

Вам также нужно ввести своё доменное имя, чтобы ESP отправлял показания на ваш сервер.

const char* serverName = "https://example-domain.com/post-esp-data.php";

Теперь вы можете загрузить код на плату.

Примечание

Большинство серверов требуют выполнения HTTPS-запросов. Приведённый выше код выполняет HTTPS-запросы для соответствия требованиям большинства современных облачных серверов.

Ваш сервер не поддерживает HTTPS? Используйте этот код.

Подробнее об HTTPS-запросах с ESP8266: ESP8266 NodeMCU HTTPS Requests (Arduino IDE).

Демонстрация

После выполнения всех шагов дайте вашей плате ESP собрать несколько показаний и опубликовать их на сервер.

ESP32 BME280 Arduino IDE MySQL

Если всё правильно, вот что вы должны увидеть в Serial Monitor Arduino IDE:

ESP32 ESP8266 BME280 — показания в Serial Monitor Arduino IDE

Если вы откроете своё доменное имя по следующему URL-пути:

https://example-domain.com/esp-data.php

Вы должны увидеть все показания, сохранённые в базе данных. Обновите веб-страницу, чтобы увидеть последние показания:

ESP32 ESP8266 — просмотр показаний датчиков на веб-странице PHP

Вы также можете зайти в phpMyAdmin для управления данными, хранящимися в таблице SensorData. Вы можете удалять, редактировать данные и т.д.

ESP32 ESP8266 — просмотр показаний датчиков в phpMyAdmin SQL Database

Заключение

В этом руководстве вы узнали, как публиковать данные датчиков в базу данных на собственном серверном домене, к которому можно получить доступ из любой точки мира. Для этого необходимо иметь собственный сервер и доменное имя (для локального доступа можно использовать Raspberry Pi).

Приведённый пример максимально прост, чтобы вы поняли, как всё работает. Разобравшись с ним, вы можете изменить внешний вид таблицы, публиковать другие показания датчиков, отправлять данные с нескольких плат ESP и многое другое.

Вам также может быть интересно:

Примечание

Данная статья является переводом оригинальной публикации с сайта Random Nerd Tutorials.