Interface Web em PHP para Controlar Arduino Uno via Ethernet Shield
Componentes e Materiais
| Componente | Quantidade |
|---|---|
| Arduino UNO | 1 |
| Arduino Ethernet Shield 2 (W5500) | 1 |
| Sensor DHT11 Temperatura/Umidade (4 pinos) | 1 |
| Módulo Relé 2 Canais | 4 |
| Mini Protoboard | 1 |
| Sensor de Chama (Flame) | 1 |
| Sensor Gás MQ-4 (Metano/Gás Natural) | 1 |
| LDR (Sensor de Luz) | 1 |
| Sensor Higrômetro Solo (YL-69 ou similar) | 3 |
| Cabo ADSL/RJ45 (Ethernet) | 1 |
| Plugues e Tomadas (1 via) – para relés | 7 cada |
| Bateria 9V + Conector Barril | 1 |
Ferramentas
- Pistola de cola quente
Software e Serviços
- Servidor Apache HTTP (ou XAMPP/WAMP) – Hospeda o painel PHP
- Notepad++ – Editor de código
- Arduino IDE – Firmware do Arduino
Sobre o Projeto
O Arduinautomotion é um sistema de automação residencial que permite monitorar e controlar aquário, irrigação e sensores ambientais via interface web PHP hospedada localmente (Apache), comunicando-se com o Arduino via Ethernet Shield.
Arquitetura
- Lado Servidor (Apache/localhost): 4 páginas PHP interligadas por sessões (
$_SESSION) e formulários POST/GET. - Lado Arduino (Ethernet Shield): Mini servidor web que lê sensores, recebe comandos via GET e envia dados de volta ao servidor PHP.
Páginas PHP (Lado Servidor)
| Arquivo | Função |
|---|---|
Arduinautomotion.php |
Painel principal: dashboard visual (SVG/JS), botões de controle, alertas, abas Sala/Aquário/Plantas/Guia. |
Arduinautomotioncontrol.php |
Incluído no painel principal; lê variáveis de sessão para popular o dashboard. |
Arduinautomotionformvalue.php |
Recebe POST do painel principal, salva comandos em $_SESSION e envia via GET ao Arduino (botão "Send and Get Data"). |
Arduinautomotioncommunication.php |
Recebe GET do Arduino (dados dos sensores) e salva em $_SESSION. |
Fluxo de Comunicação
- Usuário interage no
Arduinautomotion.php→ submete formulário →Arduinautomotionformvalue.php(POST). Arduinautomotionformvalue.phpsalva em$_SESSIONe abre nova aba com GET parahttps://IP_ARDUINO/.- Arduino recebe GET, aciona relés, lê sensores e responde com página HTML contendo formulário oculto POST/GET para
Arduinautomotioncommunication.php. - Usuário clica "Communication" na página do Arduino → dados vão para
Arduinautomotioncommunication.php(GET) → salva em$_SESSION. - Usuário recarrega
Arduinautomotion.php→ dashboard atualizado viaArduinautomotioncontrol.php.
Ligações (Pinout Arduino UNO + Ethernet Shield)
| Dispositivo | Pino Arduino | Observação |
|---|---|---|
| DHT11 (Dados) | D2 | |
| Relé 1 (Bomba ar / Bomba água) | D3, D4 | 2 canais |
| Relé 2 (Lâmpada / Alimentador) | D5, D6 | 2 canais |
| Relé 3 (Aquecedor / Filtro externo) | D7, D8 | 2 canais |
| Relé 4 (Filtro interno / Irrigação) | D9, (D10 reservado) | D10–D13 usados pelo Ethernet Shield (SPI) |
| Ethernet Shield (SPI) | D10 (CS), D11 (MOSI), D12 (MISO), D13 (SCK) | Não use estes pinos para outros fins |
| LDR | A0 | |
| Sensor Chama | A1 | |
| MQ-4 Gás | A2 | |
| Higrômetro 1 (Planta 1) | A3 | |
| Higrômetro 2 (Planta 2) | A4 | |
| Higrômetro 3 (Planta 3) | A5 |
Importante: Pinos D10–D13 são reservados ao Ethernet Shield (SPI). Use pinos analógicos como digitais (A0–A5) para sensores e D2–D9 para atuadores.
Código Principal – Arduino (ArduinoSide_Code.ino)
#include <SPI.h>
#include <Ethernet.h>
#include "DHT.h"
DHT dht;
// Configuração de rede
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 21); // IP fixo do Arduino na LAN
EthernetServer server(80); // Porta HTTP
// Pinos dos relés (LOW = ligado, módulo relé ativo em LOW)
int pump = 3, lamp = 4, feed = 5, heater = 6;
int filterex = 7, filterin = 8, irrigation = 9;
String readString;
void setup() {
Serial.begin(9600);
pinMode(pump, OUTPUT); pinMode(lamp, OUTPUT); pinMode(feed, OUTPUT);
pinMode(heater, OUTPUT); pinMode(filterex, OUTPUT); pinMode(filterin, OUTPUT);
pinMode(irrigation, OUTPUT);
// Relés desligados (HIGH) por padrão
digitalWrite(pump, HIGH); digitalWrite(lamp, HIGH); digitalWrite(feed, HIGH);
digitalWrite(heater, HIGH); digitalWrite(filterex, HIGH); digitalWrite(filterin, HIGH);
digitalWrite(irrigation, HIGH);
dht.setup(2); // DHT11 no D2
Ethernet.begin(mac, ip);
server.begin();
Serial.print("Servidor em: ");
Serial.println(Ethernet.localIP());
}
void loop() {
// Leitura sensores (respeita tempo mínimo DHT11)
delay(dht.getMinimumSamplingPeriod());
float humidity = dht.getHumidity();
float temperature = dht.getTemperature();
float fahrenheit = dht.toFahrenheit(temperature);
int ldrValue = analogRead(A0);
int flameValue = analogRead(A1);
int mq4Value = analogRead(A2);
int hyg1 = analogRead(A3);
int hyg2 = analogRead(A4);
int hyg3 = analogRead(A5);
EthernetClient client = server.available();
if (client) {
Serial.println("Novo cliente");
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (readString.length() < 200) readString += c;
if (c == '\n' && currentLineIsBlank) {
// Resposta HTTP + página HTML com formulário de retorno
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("");
client.println("ArduinoSide ");
client.println("");
client.println("");
// Formulário GET para enviar dados de volta ao PHP
client.println("");
client.println("");
break;
}
if (c == '\n') currentLineIsBlank = true;
else if (c != '\r') currentLineIsBlank = false;
}
}
delay(1);
client.stop();
// Processa comandos recebidos via GET (ex: ?airpump=pumpIsOn&...)
if (readString.indexOf("?airpump=pumpIsOn") > 0) digitalWrite(pump, LOW);
else if (readString.indexOf("?airpump=pumpIsOff") > 0) digitalWrite(pump, HIGH);
if (readString.indexOf("&lamp=lampIsOn") > 0) digitalWrite(lamp, LOW);
else if (readString.indexOf("&lamp=lampIsOff") > 0) digitalWrite(lamp, HIGH);
if (readString.indexOf("&feed=feedIsOn") > 0) digitalWrite(feed, LOW);
else if (readString.indexOf("&feed=feedIsOff") > 0) digitalWrite(feed, HIGH);
if (readString.indexOf("&heater=heaterIsOn") > 0) digitalWrite(heater, LOW);
else if (readString.indexOf("&heater=heaterIsOff") > 0) digitalWrite(heater, HIGH);
if (readString.indexOf("&filterex=exIsOn") > 0) digitalWrite(filterex, LOW);
else if (readString.indexOf("&filterex=exIsOff") > 0) digitalWrite(filterex, HIGH);
if (readString.indexOf("&filterin=inIsOn") > 0) digitalWrite(filterin, LOW);
else if (readString.indexOf("&filterin=inIsOff") > 0) digitalWrite(filterin, HIGH);
if (readString.indexOf("&irrigation=start") > 0) digitalWrite(irrigation, LOW);
else if (readString.indexOf("&irrigation=stop") > 0) digitalWrite(irrigation, HIGH);
readString = "";
Serial.println("Cliente desconectado");
}
}
Arquivos PHP Principais (Resumo)
Arduinautomotioncontrol.php
<?php session_start(); ?>
<?php
$temperatureCelsiusValue = $_SESSION['TemperatureCelsius'];
$temperatureFahrenheitValue = $_SESSION['TemperatureFahrenheit'];
$humidityValue = $_SESSION['Humidity'];
$flamesensorValue = $_SESSION['Flame'];
$MQ4sensorValue = $_SESSION['MQ4Sensor'];
$LdrValue = $_SESSION['LDRSensor'];
$pumpValue = $_SESSION['Airpump'];
$lampValue = $_SESSION['Lamp'];
$feedingValue = $_SESSION['Feeding'];
$heaterValue = $_SESSION['Heater'];
$filterexValue = $_SESSION['Filterex'];
$filterinValue = $_SESSION['Filterin'];
$plant1Value = $_SESSION['Plant1H'];
$plant2Value = $_SESSION['Plant2H'];
$plant3Value = $_SESSION['Plant3H'];
$irrigationValue = $_SESSION['Irrigation'];
?>
Arduinautomotionformvalue.php
<?php session_start(); ?>
<?php
$_SESSION['Airpump'] = $_POST["pump"];
$_SESSION['Lamp'] = $_POST["lamp"];
$_SESSION['Feeding'] = $_POST["feed"];
$_SESSION['Heater'] = $_POST["heater"];
$_SESSION['Filterex'] = $_POST["filterexternal"];
$_SESSION['Filterin'] = $_POST["filterinternal"];
$_SESSION['Irrigation'] = $_POST["irrigationsystem"];
?>
<!-- Exibe valores e botão para enviar ao Arduino via GET -->
<form action="https://192.168.1.21/" method="get" target="_blank">
<input type="hidden" name="airpump" value="<?php echo $_SESSION['Airpump'];?>">
<input type="hidden" name="lamp" value="<?php echo $_SESSION['Lamp'];?>">
<input type="hidden" name="feed" value="<?php echo $_SESSION['Feeding'];?>">
<input type="hidden" name="heater" value="<?php echo $_SESSION['Heater'];?>">
<input type="hidden" name="filterex" value="<?php echo $_SESSION['Filterex'];?>">
<input type="hidden" name="filterin" value="<?php echo $_SESSION['Filterin'];?>">
<input type="hidden" name="irrigation" value="<?php echo $_SESSION['Irrigation'];?>">
<input type="submit" value="Send and Get Data" class="subMit">
</form>
Arduinautomotioncommunication.php
<?php session_start(); ?>
<?php
$_SESSION['TemperatureCelsius'] = $_GET["temperatureCelsius"];
$_SESSION['TemperatureFahrenheit'] = $_GET["temperatureFahrenheit"];
$_SESSION['Humidity'] = $_GET["humidity"];
$_SESSION['Flame'] = $_GET["flame"];
$_SESSION['MQ4Sensor'] = $_GET["MQ4sensor"];
$_SESSION['LDRSensor'] = $_GET["LDRsensor"];
$_SESSION['Plant1H'] = $_GET["plant1H"];
$_SESSION['Plant2H'] = $_GET["plant2H"];
$_SESSION['Plant3H'] = $_GET["plant3H"];
?>
Configuração do Servidor Apache (Localhost)
- Instale Apache + PHP (ex: XAMPP, WAMP, AppServ).
- Coloque os arquivos PHP em
htdocs/Arduinautomotion/(ouwww/). - Acesse via
https://SEU_IP_LOCAL/Arduinautomotion/Arduinautomotion.php. - No Arduino, defina
IPAddress ip(192,168,1,21);(IP fixo na mesma sub-rede). - No PHP, use o IP do Arduino (
192.168.1.21) e do servidor (192.168.1.20).
Acesso Remoto (Opcional)
- Na mesma Wi-Fi: Use o IP local do servidor no celular/tablet.
- Via Internet: Configure Port Forwarding no roteador (porta 80 → IP do servidor Apache) e use IP público ou DDNS. Atenção: Expor localhost na internet traz riscos; use VPN ou autenticação forte.
Melhorias Sugeridas
- Substituir comunicação GET/POST manual por WebSockets ou MQTT para tempo real.
- Adicionar autenticação (login/senha) no painel PHP.
- Usar HTTPS com certificado auto-assinado ou Let's Encrypt.
- Migrar para ESP32/ESP8266 com Wi-Fi nativo (dispensa Ethernet Shield).
- Armazenar histórico em banco de dados (SQLite/MySQL) e gerar gráficos (Chart.js).
Arquivos Extras (Custom Parts)
arduinautomotion_wNJ69zA666.ico– Faviconspidersense_Ge3umcKzBw.mp4– Vídeo alerta (Homem-Aranha)spidermanvoice_EqWLILohmW.mp3– Áudio "Spider-sense tingling"
Processo de manufatura
- Crie Seu Primeiro Template AWS CloudFormation — Um Guia Prático
- Controle um LED com Sensor de Movimento PIR no Raspberry Pi
- Transferência de Dados de Temperatura e Umidade entre Dois Arduinos via Firebase
- Construa um Controle Remoto IR Universal com Arduino: Guia Passo a Passo
- Robô de Detecção Humana Baseado em Arduino Uno: Integração de Sensores Passo a Passo
- Construa um Sensor de Batimento Cardíaco Infravermelho Confiável com Arduino: Guia Passo a Passo
- Construa um Estadiómetro Digital: Acompanhe a Altura com Arduino e Sensor a Laser
- Construa um Pote Inteligente IoT com ESP8266, Arduino e Sensor Ultrassônico – Monitoramento em Tempo Real
- Medir a Massa da Terra com Arduino: Guia DIY Passo a Passo
- Construa uma Bússola Digital em Tempo Real com Arduino e Processing