Arduino + MySQL + PHP: como gravar dados de sensores em um banco de dados

0
image

📡 Arduino + Ethernet + PHP + MySQL: transforme seu Arduino em um sistema de monitoramento

Você já imaginou utilizar um Arduino para coletar dados de sensores e armazená-los automaticamente em um banco de dados MySQL?

É exatamente isso que vamos fazer neste projeto.

Neste tutorial, vamos montar uma estrutura em que o Arduino coleta informações de um sensor, utiliza uma conexão Ethernet para acessar um servidor e envia os valores para uma aplicação PHP.

O PHP recebe os dados e grava tudo em um banco de dados MySQL.

A arquitetura final será:

┌──────────────┐
│    SENSOR    │
│ Temperatura  │
└──────┬───────┘
       │
       ▼
┌──────────────┐
│   ARDUINO    │
│              │
│ Leitura dos  │
│ sensores     │
└──────┬───────┘
       │
       │ Ethernet
       ▼
┌──────────────┐
│     PHP      │
│              │
│ Recebe dados │
└──────┬───────┘
       │
       │ SQL
       ▼
┌──────────────┐
│    MySQL     │
│              │
│ Histórico    │
│ dos sensores │
└──────────────┘

Esse tipo de arquitetura é extremamente útil para projetos de:

  • automação;
  • Internet das Coisas (IoT);
  • monitoramento industrial;
  • controle de temperatura;
  • monitoramento de máquinas;
  • estações meteorológicas;
  • sistemas de segurança;
  • telemetria;
  • monitoramento de energia;
  • projetos acadêmicos.

O projeto apresentado neste artigo também está relacionado ao vídeo do Tech Mundo, onde mostramos um exemplo de Arduino + Shield Ethernet W5100 enviando dados de sensores de temperatura para um banco MySQL.


🧠 Como funciona o projeto?

Antes de começar a programar, é importante entender uma coisa:

O Arduino não precisa acessar diretamente o MySQL.

Essa é uma decisão importante de arquitetura.

Em vez de fazer:

Arduino ───────────────► MySQL

vamos utilizar:

Arduino ───► PHP ───► MySQL

O Arduino faz uma requisição HTTP para o servidor.

Por exemplo:

http://192.168.1.100/grava.php?temperatura=25.4

O PHP recebe:

temperatura = 25.4

e executa uma instrução SQL:

INSERT INTO sensores (temperatura)
VALUES (25.4);

Dessa maneira, o Arduino não precisa conhecer detalhes de autenticação ou funcionamento interno do banco de dados.


🔧 Materiais necessários

Para reproduzir o projeto, você precisará de:

  • Arduino Uno;
  • Shield Ethernet W5100;
  • cabo de rede;
  • sensor de temperatura;
  • servidor com Apache;
  • PHP;
  • MySQL;
  • computador ou servidor na mesma rede.

O projeto original do Tech Mundo utiliza justamente um Arduino com Shield Ethernet W5100 para enviar os dados.


🖥️ Servidor necessário

Podemos utilizar praticamente qualquer computador ou servidor capaz de executar:

Apache
PHP
MySQL

Por exemplo:

Ubuntu Server
        +
Apache
        +
PHP
        +
MySQL

Também é possível utilizar:

  • XAMPP;
  • WAMP;
  • LAMP;
  • servidores Linux;
  • Raspberry Pi;
  • VPS;
  • servidor local.

Para este exemplo, vamos imaginar que o servidor possua o endereço:

192.168.1.100

🗄️ Criando o banco de dados

Primeiro vamos criar o banco:

CREATE DATABASE arduino;

Depois:

USE arduino;

Agora podemos criar nossa tabela.

CREATE TABLE sensores (
    id INT AUTO_INCREMENT PRIMARY KEY,
    temperatura DECIMAL(5,2) NOT NULL,
    data_hora TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Nossa tabela terá três campos:

CampoFunção
idIdentificador do registro
temperaturaTemperatura enviada pelo Arduino
data_horaData e hora da gravação

Podemos testar:

INSERT INTO sensores (temperatura)
VALUES (25.50);

E consultar:

SELECT * FROM sensores;

O resultado será semelhante a:

+----+-------------+---------------------+
| id | temperatura | data_hora           |
+----+-------------+---------------------+
|  1 |       25.50 | 2026-08-24 10:30:00 |
+----+-------------+---------------------+

🐘 Criando o PHP

Agora precisamos criar uma aplicação PHP responsável por receber os dados.

Vamos criar:

grava.php

Uma implementação moderna pode utilizar PDO, que fornece uma interface consistente para acesso a bancos de dados no PHP. O driver PDO_MYSQL é responsável especificamente pela comunicação com o MySQL.

Exemplo:

<?php

$host = "localhost";
$db   = "arduino";
$user = "arduino";
$pass = "SUA_SENHA";

try {

    $pdo = new PDO(
        "mysql:host=$host;dbname=$db;charset=utf8mb4",
        $user,
        $pass,
        [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_EMULATE_PREPARES => false
        ]
    );

    if (!isset($_GET['temperatura'])) {
        http_response_code(400);
        exit("Temperatura não informada");
    }

    $temperatura = filter_input(
        INPUT_GET,
        'temperatura',
        FILTER_VALIDATE_FLOAT
    );

    if ($temperatura === false || $temperatura === null) {
        http_response_code(400);
        exit("Temperatura inválida");
    }

    $sql = "
        INSERT INTO sensores (temperatura)
        VALUES (:temperatura)
    ";

    $stmt = $pdo->prepare($sql);

    $stmt->execute([
        ':temperatura' => $temperatura
    ]);

    echo "OK";

} catch (PDOException $e) {

    http_response_code(500);

    echo "Erro ao gravar dados";

}

O DSN do PDO_MYSQL utiliza informações como host, porta, banco de dados, usuário e senha para estabelecer a conexão.


🧪 Testando o PHP antes do Arduino

Essa etapa é extremamente importante.

Antes de tentar descobrir se o problema está no Arduino, na rede ou no PHP, vamos testar o servidor.

Abra no navegador:

http://192.168.1.100/grava.php?temperatura=25.7

Se tudo estiver funcionando, devemos receber:

OK

Agora consulte o banco:

SELECT * FROM sensores;

Deveremos encontrar:

1 | 25.70 | 2026-08-24 10:35:00

Se isso aconteceu:

PHP + MySQL estão funcionando.

Agora podemos partir para o Arduino.


🌐 Configurando o Arduino Ethernet

No Arduino precisamos definir:

  • endereço MAC;
  • endereço IP;
  • gateway;
  • servidor;
  • porta.

Um exemplo:

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};

IPAddress ip(192, 168, 1, 50);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);

EthernetClient client;

O Arduino receberá:

192.168.1.50

enquanto o servidor será:

192.168.1.100

🌡️ Lendo o sensor

Para facilitar o entendimento, vamos inicialmente utilizar um valor simulado.

float temperatura = 25.7;

Depois podemos substituir por um sensor real.

Por exemplo:

DHT11
DHT22
DS18B20
LM35

Assim conseguimos separar os problemas:

Arduino
   ↓
Ethernet
   ↓
PHP
   ↓
MySQL

Primeiro fazemos a comunicação funcionar.

Depois adicionamos o sensor.


📡 Enviando os dados para o PHP

Agora vem a parte mais interessante.

O Arduino fará uma requisição HTTP:

if (client.connect(server, 80)) {

    client.print("GET /grava.php?temperatura=");
    client.print(temperatura);
    client.println(" HTTP/1.1");

    client.println("Host: 192.168.1.100");
    client.println("Connection: close");
    client.println();

}

Na prática, estamos fazendo:

Arduino
   │
   │ GET
   ▼
/grava.php?temperatura=25.7
   │
   ▼
PHP
   │
   ▼
MySQL

🔄 Programa completo do Arduino

Podemos juntar tudo em um exemplo simples:

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};

IPAddress ip(192, 168, 1, 50);
IPAddress server(192, 168, 1, 100);

EthernetClient client;

void setup() {

    Serial.begin(9600);

    Ethernet.begin(mac, ip);

    delay(1000);

    Serial.println("Ethernet iniciado");

}

void loop() {

    float temperatura = 25.7;

    Serial.print("Temperatura: ");
    Serial.println(temperatura);

    if (client.connect(server, 80)) {

        Serial.println("Conectado ao servidor");

        client.print("GET /grava.php?temperatura=");
        client.print(temperatura);
        client.println(" HTTP/1.1");

        client.println("Host: 192.168.1.100");
        client.println("Connection: close");
        client.println();

        delay(1000);

        while (client.available()) {

            char c = client.read();

            Serial.write(c);

        }

        client.stop();

        Serial.println();
        Serial.println("Dados enviados");

    } else {

        Serial.println("Falha na conexão");

    }

    delay(60000);
}

Nesse exemplo, o Arduino envia uma leitura aproximadamente a cada:

60 segundos

📊 O que acontece quando o Arduino envia um valor?

Imagine que o sensor esteja medindo:

28.4 °C

O Arduino envia:

/grava.php?temperatura=28.4

O PHP recebe:

28.4

E executa:

INSERT INTO sensores (temperatura)
VALUES (28.4);

O MySQL armazena:

ID | Temperatura | Data/Hora
1  | 28.40       | 10:00
2  | 28.50       | 10:01
3  | 28.60       | 10:02
4  | 28.40       | 10:03

Depois de algumas horas, teremos um histórico completo.


📈 E agora podemos criar gráficos

Essa é uma das grandes vantagens de armazenar os dados em um banco.

Podemos criar um gráfico:

Temperatura
   │
30 │             ╭──╮
   │          ╭──╯  ╰─╮
28 │     ╭────╯        ╰──
   │  ╭──╯
26 │──╯
   │
   └────────────────────────
       10h  11h  12h  13h

Com PHP podemos consultar:

SELECT
    data_hora,
    temperatura
FROM sensores
ORDER BY data_hora;

E transformar os dados em:

  • gráficos;
  • tabelas;
  • dashboards;
  • relatórios;
  • alertas.

🖥️ Criando um painel de monitoramento

Podemos evoluir o projeto para uma página como:

┌────────────────────────────────────┐
│       MONITORAMENTO ARDUINO        │
├────────────────────────────────────┤
│                                    │
│       🌡️ 28,4 °C                  │
│                                    │
│       Status: ONLINE               │
│                                    │
├────────────────────────────────────┤
│                                    │
│     Histórico de temperatura      │
│                                    │
│  30 ┤          ╭────╮              │
│  28 ┤     ╭────╯    ╰──             │
│  26 ┤────╯                          │
│     └────────────────────          │
│                                    │
└────────────────────────────────────┘

A partir daqui já estamos muito próximos de um sistema IoT completo.


🚨 Podemos criar alertas

Outra possibilidade é criar regras.

Por exemplo:

Temperatura > 80 °C

Então o PHP pode gerar:

⚠️ ALERTA

Temperatura elevada!

Máquina: Motor 01
Temperatura: 82,4 °C
Horário: 14:32

E enviar essa informação para:

  • e-mail;
  • Telegram;
  • WhatsApp via API;
  • MQTT;
  • aplicativo;
  • dashboard;
  • sistema de manutenção.

🏭 Aplicações industriais

Esse tipo de arquitetura é particularmente interessante para automação.

Imagine um motor elétrico equipado com:

Sensor de temperatura
        +
Sensor de vibração
        +
Arduino
        +
Ethernet

O Arduino pode enviar:

temperatura
vibração
rotação
corrente
tensão
status

para o servidor.

O banco passa a construir um histórico da máquina.

Isso permite posteriormente analisar:

  • tendência de temperatura;
  • aumento de vibração;
  • horas de operação;
  • falhas;
  • manutenção;
  • comportamento do equipamento.

🔐 Segurança: não coloque o MySQL diretamente na internet

Essa é uma das partes mais importantes deste projeto.

Evite criar uma arquitetura como:

Internet
    │
    ▼
MySQL

O ideal é:

Arduino
   │
   ▼
Servidor Web
   │
   ▼
PHP
   │
   ▼
MySQL

O banco de dados não precisa ficar exposto diretamente para a internet.

Além disso, crie um usuário específico para a aplicação.

Por exemplo:

CREATE USER 'arduino'@'localhost'
IDENTIFIED BY 'SENHA_FORTE';

Depois conceda somente os privilégios necessários:

GRANT INSERT, SELECT
ON arduino.*
TO 'arduino'@'localhost';

Assim, caso a aplicação seja comprometida, o usuário do Arduino não terá necessariamente privilégios administrativos sobre todo o MySQL.


🔒 Não coloque a senha do MySQL no Arduino

Outro ponto importante:

A senha do banco deve ficar no servidor PHP.

Não faça:

Arduino → MySQL

com usuário e senha do banco dentro do firmware.

Prefira:

Arduino
   ↓
HTTP
   ↓
PHP
   ↓
MySQL

Dessa maneira, as credenciais do banco permanecem no servidor.


🚀 Melhorando o projeto

O exemplo deste artigo é apenas o começo.

Podemos evoluir a arquitetura para:

                    ┌───────────────┐
                    │    MySQL      │
                    └───────▲───────┘
                            │
                            │
                    ┌───────┴───────┐
                    │      PHP      │
                    │      API      │
                    └───────▲───────┘
                            │
                     Ethernet / HTTP
                            │
               ┌────────────┴────────────┐
               │                         │
          ┌────▼────┐              ┌────▼────┐
          │ Arduino │              │ ESP32   │
          └────▲────┘              └────▲────┘
               │                         │
          ┌────┴────┐              ┌─────┴────┐
          │ Sensores│              │ Sensores │
          └─────────┘              └──────────┘

E substituir o Arduino por:

  • ESP8266;
  • ESP32;
  • Raspberry Pi;
  • PLC;
  • dispositivos industriais.

🌐 Podemos transformar o PHP em uma API

Em projetos maiores, em vez de utilizar simplesmente:

grava.php?temperatura=25.7

podemos criar uma API:

POST /api/sensores

enviando:

{
    "dispositivo": "arduino01",
    "temperatura": 25.7
}

Essa arquitetura é muito mais adequada para projetos que crescerão.

Podemos inclusive utilizar:

Arduino
   ↓
REST API
   ↓
PHP
   ↓
MySQL
   ↓
Dashboard

📡 HTTP ou MQTT?

Para projetos pequenos, HTTP é extremamente simples.

Arduino → HTTP → PHP → MySQL

Mas quando temos muitos dispositivos, o MQTT passa a ser muito interessante.

Por exemplo:

Arduino 01 ─┐
Arduino 02 ─┤
Arduino 03 ─┼──► MQTT Broker
ESP32 01 ───┤
ESP32 02 ───┘
                   │
                   ▼
               Aplicação
                   │
                   ▼
                MySQL

Isso permite construir uma arquitetura IoT muito mais escalável.


🧪 Como diagnosticar quando não funciona?

Se o Arduino não estiver gravando dados, não tente verificar tudo ao mesmo tempo.

Faça os testes nesta ordem:

1️⃣ Teste o MySQL

SELECT * FROM sensores;

2️⃣ Teste o PHP

Abra:

http://192.168.1.100/grava.php?temperatura=25

Se aparecer:

OK

o PHP está funcionando.


3️⃣ Verifique o banco

SELECT * FROM sensores
ORDER BY id DESC;

Se apareceu o registro:

25.00

o servidor está funcionando.


4️⃣ Teste a rede

Do computador:

ping 192.168.1.100

Depois:

curl "http://192.168.1.100/grava.php?temperatura=30"

5️⃣ Finalmente teste o Arduino

Verifique no Serial Monitor:

Ethernet iniciado
Temperatura: 25.70
Conectado ao servidor
OK
Dados enviados

Assim fica muito mais fácil identificar onde está o problema.


💡 O que aprendemos neste projeto?

Neste projeto construímos uma pequena arquitetura IoT utilizando tecnologias relativamente simples:

Arduino
+
Ethernet
+
HTTP
+
PHP
+
MySQL

Mas a partir desses componentes podemos construir sistemas muito maiores.

Podemos monitorar:

  • temperatura;
  • umidade;
  • pressão;
  • vibração;
  • luminosidade;
  • energia;
  • corrente;
  • tensão;
  • nível;
  • presença;
  • rotação.

E todos esses dados podem ser armazenados historicamente.


🎥 Vídeo completo

No vídeo do Tech Mundo mostramos na prática um projeto de Arduino + Shield Ethernet W5100, utilizando sensores de temperatura e gravando os dados em um banco MySQL.

▶️ Arduino + MySQL + PHP: Arduino gravando dados no MySQL completo

Assistir ao tutorial no YouTube


🏁 Conclusão

O mais interessante desse projeto é perceber que não precisamos de equipamentos extremamente sofisticados para começar a construir uma solução de IoT.

Com um:

Arduino + Ethernet + sensor

já conseguimos coletar informações.

Com:

PHP + MySQL

conseguimos transformar essas informações em dados históricos.

E, adicionando:

Dashboard + gráficos + alertas

podemos transformar um simples experimento em um verdadeiro sistema de monitoramento.

A arquitetura básica fica:

        SENSOR
           │
           ▼
        ARDUINO
           │
           │ Ethernet
           ▼
         PHP
           │
           │ SQL
           ▼
         MySQL
           │
           ▼
      DASHBOARD
           │
           ▼
        ALERTAS

E essa mesma ideia pode ser utilizada desde um projeto escolar até sistemas de monitoramento industrial.

Esse é apenas o começo. A partir daqui podemos adicionar múltiplos sensores, vários Arduinos, dashboards, gráficos históricos, autenticação, APIs, MQTT e até inteligência artificial para analisar os dados coletados.


📌 Próximo projeto

Uma evolução natural deste tutorial seria criar um dashboard completo para visualizar os dados do Arduino em tempo real, mostrando:

  • 🌡️ temperatura atual;
  • 💧 umidade;
  • 📈 gráfico histórico;
  • 🟢 status do dispositivo;
  • ⏱️ última comunicação;
  • 🚨 alertas;
  • 📊 valores mínimos e máximos;
  • 📅 filtros por período.

Assim, o projeto deixa de ser apenas “Arduino gravando dados no MySQL” e passa a ser um verdadeiro sistema de monitoramento IoT acessível pelo navegador.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *