График погоды на Chart.js: температура и влажность из MySQL

Chart.js — мощная и бесплатная JavaScript-библиотека для построения красивых адаптивных графиков. В этом уроке мы подключим датчик DHT11 к ESP8266, сохраним температуру и влажность в базу MySQL, выведем данные в таблицу и построим два динамических графика: линейный для температуры и влажности за последние 50 измерений.

График погоды на Chart.js с данными из MySQL

Возможности проекта

  • Сбор данных с DHT11 через ESP8266
  • Запись температуры и влажности в MySQL по GET-запросу
  • Два отдельных графика Chart.js (температура и влажность)
  • Таблица с последними 30 измерениями
  • Адаптивный дизайн, анимация, подсказки
  • Лёгкая настройка цветов, типов графиков и масштаба

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

  • ESP8266 (NodeMCU или Wemos D1 mini)
  • Датчик DHT11 или DHT22
  • Локальный веб-сервер (XAMPP, OpenServer)
  • MySQL база данных

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

  • VCC → 3.3V
  • GND → GND
  • Data → D4 (GPIO2)
  • Подтягивающий резистор 4.7–10 кОм от Data к VCC

Структура файлов на сервере

  • index.php — главная страница с графиками и таблицей
  • connect.php — подключение к MySQL
  • insert.php — приём GET-запросов и запись в БД
  • js/Chart.min.js — библиотека Chart.js

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

CREATE DATABASE weather;
USE weather;
CREATE TABLE dht (
    id INT AUTO_INCREMENT PRIMARY KEY,
    temperature INT,
    humidity FLOAT,
    reading_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Создаёт базу данных weather.
Переключается на использование этой базы (USE weather).
Создаёт таблицу dht с полями:
id — уникальный идентификатор каждой записи, автоинкремент.
temperature — температура (целое число).
humidity — влажность (число с плавающей точкой).
reading_time — время записи, автоматически ставится текущее при вставке.

Пример insert.php

<?php
include 'connect.php';
if(isset($_GET['temp']) && isset($_GET['hum'])) {
    $temp = $_GET['temp'];
    $hum = $_GET['hum'];
    $sql = "INSERT INTO dht (temperature, humidity) VALUES ('$temp', '$hum')";
    mysqli_query($conn, $sql);
}
?>
Проверяет, переданы ли GET-параметры temp и hum.
Если да, то вставляет их в таблицу dht базы данных weather.
Поля temperature и humidity заполняются значениями из запроса, reading_time заполняется автоматически текущей меткой времени.

Скетч ESP8266

#include <ESP8266WiFi.h>
#include <DHT.h>
#define DHTPIN D4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

const char* ssid = "yourSSID";
const char* password = "yourPASS";
const char* host = "192.168.1.100"; // IP вашего ПК

void loop() {
  delay(2000);
  float h = dht.readHumidity();
  int t = dht.readTemperature();
  
  WiFiClient client;
  if (client.connect(host, 80)) {
    String url = "/insert.php?temp=" + String(t) + "&hum=" + String(h);
    client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
  }
}
Считывает температуру и влажность с DHT11 каждые 2 секунды.
Подключается к веб-серверу по HTTP на указанном IP.
Отправляет GET-запрос с данными (temp и hum) на insert.php для записи в базу.

Построение графиков в index.php

Данные извлекаются из MySQL, передаются в JavaScript-массивы и рисуются двумя canvas-элементами Chart.js.

Заключение

Chart.js позволяет создавать профессиональные интерактивные графики погоды за минуты. Проект легко расширить: добавить прогноз, уведомления, экспорт данных или отображение на отдельной странице.

FAQ — График погоды на Chart.js

Где скачать Chart.js?

С официального сайта chartjs.org или через CDN: https://cdn.jsdelivr.net/npm/chart.js

Можно ли объединить температуру и влажность на одном графике?

Да, используйте два dataset с разными осями Y (левая для температуры, правая для влажности).

Как изменить количество отображаемых точек?

Измение LIMIT в SQL-запросе (например, LIMIT 50) и соответствующее количество элементов в массивах labels/data.

График не адаптируется под мобильные устройства?

Chart.js полностью responsive. Добавьте options: { responsive: true, maintainAspectRatio: false }.

Можно использовать DHT22 вместо DHT11?

Да, просто измените DHTTYPE на DHT22 — точность выше.

Как обновлять график автоматически?

Добавьте setInterval с AJAX-запросом к PHP-скрипту, который возвращает JSON с новыми данными.

Где посмотреть все типы графиков?

На официальном сайте chartjs.org/samples — более 10 типов: line, bar, radar, pie, polarArea и другие.

📁 Скачать примеры