Arduino + MySQL + PHP: como gravar dados de sensores em um banco de dados
📡 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:
| Campo | Função |
|---|---|
id | Identificador do registro |
temperatura | Temperatura enviada pelo Arduino |
data_hora | Data 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.