构建基于 PHP 的 Web 界面控制 Arduino Uno
组件与物料
| 组件 | 数量 |
|---|---|
| Arduino UNO | 1 |
| Arduino Ethernet Shield 2 | 1 |
| DHT11 温湿度传感器 (4引脚) | 1 |
| 双路继电器模块 | 4 |
| 迷你面包板 | 1 |
| 火焰传感器 | 1 |
| MQ4 甲烷气体传感器 | 1 |
| LDR 光敏电阻 | 1 |
| 土壤湿度传感器 | 3 |
| ADSL 路由器网线 | 1 |
| 单孔插头 | 7 |
| 单孔插座 | 7 |
| 9V 电池 | 1 |
| 9V 电池扣带 DC 插头 | 1 |
必要工具与设备
- 热熔胶枪
应用与在线服务
- Apache HTTP Server
- Notepad++
- Arduino IDE
项目详解
更新
如何利用 TheAmplituhedron.com 改进物联网项目?是我的新项目,帮你处理服务端编程。用它做主机,可轻松通过互联网收发数据包。支持我的项目请访问我的网站。
项目描述
创建专业网站控制家里的水族箱和灌溉系统,外出时也能获取家庭信息,是本项目核心。为此我创建了 Arduinautomotion 项目,在 Apache 本地服务器包含 4 个 PHP 页面:Arduinautomotion.php、Arduinautomotioncontrol.php、Arduinautomotionformvalue.php、Arduinautomotioncommunication.php。Arduino Ethernet Shield 另托管一个 HTML 页面 ArduinoSide.php,通过指定 IP 与网站通信。
两周度假时无法调整水族箱(如关闭内部过滤器防溢氧、远程投喂),萌生此念。网站提供 6 个水族箱控制选项 + 1 个灌溉启动选项。还能通过以太网盾获取家庭数据:DHT11 温湿度、MQ4 甲烷浓度等。Arduinautomotion 网站提供直观界面收发 Arduino 数据。
需掌握 HTML、CSS、JavaScript、PHP、jQuery 才能完全理解,本文仅作展示。懂这些语言可在下方代码区查看完整 PHP 文件。注:我用 Notepad++ 编写网页。


两个 PHP 页面间如何收发数据
使用 HTML 表单、PHP 方法和 $_SESSION[]。GET 方法通信更易但 POST 更安全,除 ArduinoSide 页面外均用 POST。Arduino 端用 GET 更容易实现 HTTP GET 请求。$_SESSION[] 可在多页面间持久保存数据。
在 Apache HTTP Server (Localhost) 上搭建网站
Apache 高效适配,也可用 XAMPP 等。我的路径:AppServ >> www >> Arduinautomotion.php。用自己的 IP 访问 (如 https://192.168.1.20/Arduinautomotion.php)。

所有 Arduinautomotion.php 内容见下方代码区。
从 Android 设备访问 Localhost
Windows 与 Mac 不同,参考:StackOverflow 问答。同一 Wi-Fi 下即可用自己的 IP 访问。
通过 Wi-Fi 访问 Localhost (外网)
需用外网 IP,确保只有你知道(否则危险)。参考:跨局域网访问。还需端口转发访问 ArduinoSide.php,IP 为 Arduino 代码中设定的地址。端口转发百科
Arduinautomotion.php - 主控页面
与 Arduino 以太网盾通信的主页,可下发指令、获取家庭数据。Change Menu 通过颜色区分传感器/执行器。变化的圆圈显示传感器数值和执行器状态。








1) 房间区域 - 显示来自 Arduinautomotioncommunication.php 的所有房间数据。
2) 水族箱区域 - 通过 HTML 表单选择水族箱部件组合,提交到 Arduinautomotionformvalue.php,经 Arduinautomotioncontrol.php 返回显示。
3) 植物区域 - 观察土壤湿度传感器数值,决定是否启动灌溉。数据流向同水族箱区域。
4) 指南区域 - 内嵌 Arduinautomotionformvalue.php 复查表单选择,含项目说明和通信流程图。
5) 警报框 - 任意传感器数值进入危险范围,页面重载时弹出蜘蛛侠视频+音频(“蜘蛛感应在刺痛”)。
6) 界面构成 - 响应式布局指南、所有变化圆圈、页脚等截图展示。
Arduinautomotioncontrol.php - 数据聚合页
内嵌在主页,从 Arduinautomotionformvalue.php 和 Arduinautomotioncommunication.php 获取所有 $_SESSION[] 数据,实现跨页面持久保存。
Arduinautomotionformvalue.php - 表单处理页
接收主页表单选择,转发给 ArduinoSide 和 Arduinautomotioncontrol.php。内嵌在指南区,也可新标签页直接访问。

Arduinautomotioncommunication.php - 通信页
接收 ArduinoSide 数据保存到 Session,自动转发给 Arduinautomotioncontrol.php。

ArduinoSide - 设备端网页
由 Arduino Ethernet Shield 通过 DNS 托管,通过代码中设定的 IP 访问 (如 https://yourChosenIPAddress)。

接线连接
按 ArduinoSide 代码注释和下方 Fritzing 图接线。将单孔插头/插座接到双路继电器,所有元件固定在软木板等平面上。
Arduino 引脚分配: DHT11 模块 → Pin 2 双路继电器 (1) → Pin 3, 4 双路继电器 (2) → Pin 5, 6 双路继电器 (3) → Pin 7, 8 双路继电器 (4) → Pin 9 Arduino Ethernet Shield → Pin 10, 11, 12, 13 (占用) LDR → A0 火焰传感器 → A1 MQ4 传感器 → A2 土壤湿度模块 (1) → A3 土壤湿度模块 (2) → A4 土壤湿度模块 (3) → A5








Arduino 代码基于 Ethernet 库的 WebServer 示例,仅添加传感器读取和执行网站指令的逻辑。连接 ADSL 网线从以太网盾到路由器。代码运行后,网站通过 LAN/Wi-Fi 与 Arduino 收发数据。
测试视频
接入水族箱和灌溉系统(水泵)测试,运行良好 :) 视频用 Filmora 试用版剪辑,保留水印尊重版权。电脑端/安卓端测试视频见原项目链接。
代码
Arduinautomotion.php PHP
<?php session_start(); ?>
<!DOCTYPE html>
<html>
<?php include 'Arduinautomotioncontrol.php'; ?>
<head>
<link rel="shortcut icon" href="Arduinautomotion.ico" type="image/x-icon">
<style>
/* 大量 CSS 样式,含动画、布局、颜色变换等,此处省略以节省篇幅 */
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
// jQuery 交互逻辑:菜单切换、iframe 自适应等
// JavaScript 函数:getDataFromArduino() 从 PHP Session 读取传感器/执行器状态,
// 更新 SVG 圆圈颜色、仪表盘数值,触发危险值警报框(openAlert)
</script>
</head>
<body onpageshow="getDataFromArduino()">
/* 主体 HTML 结构:背景图、指南 iframe、信息面板、SVG 可视化图形、
四大区域选择器、表单提交区、页脚动画等 */
</body>
</html>
Arduinautomotioncontrol.php PHP
<?php session_start(); ?>
<!DOCTYPE html>
<html>
<head>
<title>Arduinautomotion</title>
<link rel="shortcut icon" href="Arduinautomotion.ico" type="image/x-icon">
<?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'];
?>
</head>
</html>
Arduinautomotionformvalue.php PHP
<?php session_start(); ?>
<!DOCTYPE html>
<html>
<head>
<title>FormValue</title>
<link rel="shortcut icon" href="Arduinautomotion.ico" type="image/x-icon">
<?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"];
?>
<style> /* 绿色主题样式 */ </style>
</head>
<body>
<div class="serverpage">
<h1>Server has received the data from Arduinautomotion.</h1>
</div>
<p>Airpump= <?php echo $_SESSION['Airpump'];?></p><br>
<p>Lamp=<?php echo $_SESSION['Lamp'];?></p><br>
<p>Feeding=<?php echo $_SESSION['Feeding'];?></p><br>
<p>Heater=<?php echo $_SESSION['Heater'];?></p><br>
<p>Filterex=<?php echo $_SESSION['Filterex'];?></p><br>
<p>Filterin=<?php echo $_SESSION['Filterin'];?></p><br>
<p>Irrigation=<?php echo $_SESSION['Irrigation'];?></p><br>
<form action="https://192.168.1.21/" method="get" target="_blank">
<input type="hidden" value="<?php echo $_SESSION['Airpump'];?>" name="airpump">
<input type="hidden" value="<?php echo $_SESSION['Lamp'];?>" name="lamp">
<input type="hidden" value="<?php echo $_SESSION['Feeding'];?>" name="feed">
<input type="hidden" value="<?php echo $_SESSION['Heater'];?>" name="heater">
<input type="hidden" value="<?php echo $_SESSION['Filterex'];?>" name="filterex">
<input type="hidden" value="<?php echo $_SESSION['Filterin'];?>" name="filterin">
<input type="hidden" value="<?php echo $_SESSION['Irrigation'];?>" name="irrigation">
<input type="submit" value="Send and Get Data" class="subMit">
</form>
</body>
</html>
Arduinautomotioncommunication.php PHP
<?php session_start(); ?>
<!DOCTYPE html>
<html>
<head>
<title>Communication</title>
<link rel="shortcut icon" href="Arduinautomotion.ico" type="image/x-icon">
<style> body{ background-image: url("https://i.ytimg.com/vi/kkVGBn-haDo/maxresdefault.jpg"); } </style>
<?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"];
?>
</head>
<body></body>
</html>
ArduinoSide_Code.ino Arduino
/////////////////////////////////////////////////////////////////
// -ARDUINAUTOMOTON-
// 创建专业网站与 Arduino 通信 (兼容 Android)
// by Kutluhan Aktar
/////////////////////////////////////////////////////////////////
#include <SPI.h>
#include <Ethernet.h>
#include "DHT.h"
DHT dht;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 21);
EthernetServer server(80);
int pump = 3, lamp = 4, feed = 5, heater = 6, 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);
digitalWrite(pump, HIGH); digitalWrite(lamp, HIGH); digitalWrite(feed, HIGH);
digitalWrite(heater, HIGH); digitalWrite(filterex, HIGH); digitalWrite(filterin, HIGH);
digitalWrite(irrigation, HIGH);
dht.setup(2);
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}
void loop() {
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 HygValueA = analogRead(A3);
int HygValueB = analogRead(A4);
int HygValueC = analogRead(A5);
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (readString.length() < 135) readString += c;
Serial.println(readString);
if (c == '\n') {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type:text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html style=\"background-color:black;\">");
client.println("<head><title>ArduinoSide</title>");
client.println("<link rel=\"icon\" href=\"https://www.clker.com/cliparts/D/W/n/h/n/W/house-logo-hi.png\">");
client.println("</head><body>");
client.println("<form action=\"https://192.168.1.20/Arduinautomotioncommunication.php?\" method=\"get\" target=\"_blank\">");
client.println("<input type=\"hidden\" name=\"temperatureCelsius\" >");
client.println("value="); client.println(temperature); client.println(">");
client.println("<input type=\"hidden\" name=\"temperatureFahrenheit\" >");
client.println("value="); client.println(fahrenheit); client.println(">");
client.println("<input type=\"hidden\" name=\"humidity\" >");
client.println("value="); client.println(humidity); client.println(">");
client.println("<input type=\"hidden\" name=\"flame\" >");
client.println("value="); client.println(flameValue); client.println(">");
client.println("<input type=\"hidden\" name=\"MQ4sensor\" >");
client.println("value="); client.println(MQ4Value); client.println(">");
client.println("<input type=\"hidden\" name=\"LDRsensor\" >");
client.println("value="); client.println(ldrValue); client.println(">");
client.println("<input type=\"hidden\" name=\"plant1H\" >");
client.println("value="); client.println(HygValueA); client.println(">");
client.println("<input type=\"hidden\" name=\"plant2H\" >");
client.println("value="); client.println(HygValueB); client.println(">");
client.println("<input type=\"hidden\" name=\"plant3H\" >");
client.println("value="); client.println(HygValueC); client.println(">");
client.println("<input type=\"submit\" value=\"Communication\" style=\"width:500px;height:200px;font-weight:bold;background-color:black;color:green;\">");
client.println("</form></body></html>");
break;
}
}
}
delay(1);
client.stop();
// 解析来自网站的指令控制继电器
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("client disconnected");
}
}
自定义部件与外壳
- arduinautomotion_wNJ69zA666.ico
- spidersense_Ge3umcKzBw.mp4
- spidermanvoice_EqWLILohmW.mp3
原理图


制造工艺
- 树莓派 PIR 运动传感器控制 LED 实战指南
- 两块 Arduino 通过 Firebase 传递温湿度数据
- 用 Arduino 制作万能红外遥控器:分步指南
- 基于 Arduino Uno 的人体检测救援机器人:传感器集成分步指南
- Arduino 红外心率传感器 DIY:低成本高精度,串口绘图器实时波形
- DIY 数字身高仪:Arduino Nano + VL53L0X 激光测距 + OLED 显示
- 智能物联网罐:ESP8266 + Arduino + 超声波传感器实时监测罐内物位
- 用 Arduino 测量地球质量:DIY 分步指南
- Arduino Cloud 传感器塔:温度、动作与气体监测
- 智能停车计数系统:Arduino + Processing + PHP 实时车位追踪上云
- Arduino 实时数字罗盘:HMC5883L + Processing 可视化教程
- 构建您的第一个AWS CloudFormation模板——实操指南